1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2015 Nexenta Systems, Inc. All rights reserved. 14 * Copyright 2019 Joyent, Inc. 15 */ 16 17 #include <aes/aes_impl.h> 18 #include <strings.h> 19 #include <stdio.h> 20 #include <sys/debug.h> 21 #include "cryptotest.h" 22 #include "aes_ccm.h" 23 24 /* 25 * Size of param (in 8-byte chunks for alignment) large enough for both 26 * CK_CCM_PARAMS and CK_AES_CCM_PARAMS. 27 */ 28 #define PARAM_SIZE_64 8 29 30 static size_t updatelens[] = { 31 1, AES_BLOCK_LEN, AES_BLOCK_LEN + 1, 2*AES_BLOCK_LEN, 32 CTEST_UPDATELEN_WHOLE, CTEST_UPDATELEN_END 33 }; 34 35 int 36 main(void) 37 { 38 int errs = 0; 39 int i; 40 uint8_t N[1024]; 41 uint64_t param[PARAM_SIZE_64]; 42 43 cryptotest_t args = { 44 .out = N, 45 .outlen = sizeof (N), 46 .mechname = SUN_CKM_AES_CCM, 47 .updatelens = updatelens 48 }; 49 50 args.key = CCM_KEY1; 51 args.keylen = sizeof (CCM_KEY1); 52 for (i = 0; i < 12; i++) { 53 bzero(param, sizeof (param)); 54 ccm_init_params(param, DATALEN[i] - AUTHLEN[i], NONCE[i], 55 NONCELEN[i], CCM_DATA1, AUTHLEN[i], MACLEN[i]); 56 57 args.param = param; 58 args.plen = ccm_param_len(); 59 60 VERIFY3U(args.plen, <=, sizeof (param)); 61 62 args.in = CCM_DATA1 + AUTHLEN[i]; 63 args.inlen = DATALEN[i] - AUTHLEN[i]; 64 65 errs += run_test(&args, RES[i] + AUTHLEN[i], 66 RESLEN[i] - AUTHLEN[i], ENCR_FG); 67 (void) fprintf(stderr, "----------\n"); 68 } 69 70 args.key = CCM_KEY2; 71 args.keylen = sizeof (CCM_KEY2); 72 for (i = 12; i < 24; i++) { 73 bzero(param, sizeof (param)); 74 ccm_init_params(param, DATALEN[i] - AUTHLEN[i], NONCE[i], 75 NONCELEN[i], DATA_2[i-12], AUTHLEN[i], MACLEN[i]); 76 77 args.param = param; 78 args.plen = ccm_param_len(); 79 80 VERIFY3U(args.plen, <=, sizeof (param)); 81 82 args.in = DATA_2[i-12] + AUTHLEN[i]; 83 args.inlen = DATALEN[i] - AUTHLEN[i]; 84 85 errs += run_test(&args, RES[i] + AUTHLEN[i], 86 RESLEN[i] - AUTHLEN[i], ENCR_FG); 87 (void) fprintf(stderr, "----------\n"); 88 } 89 90 (void) fprintf(stderr, "\t\t\t=== decrypt ===\n----------\n\n"); 91 92 args.key = CCM_KEY1; 93 args.keylen = sizeof (CCM_KEY1); 94 for (i = 0; i < 12; i++) { 95 bzero(param, sizeof (param)); 96 ccm_init_params(param, RESLEN[i] - AUTHLEN[i], NONCE[i], 97 NONCELEN[i], CCM_DATA1, AUTHLEN[i], MACLEN[i]); 98 99 args.param = param; 100 args.plen = ccm_param_len(); 101 102 VERIFY3U(args.plen, <=, sizeof (param)); 103 104 args.in = RES[i] + AUTHLEN[i]; 105 args.inlen = RESLEN[i] - AUTHLEN[i]; 106 107 errs += run_test(&args, CCM_DATA1 + AUTHLEN[i], 108 DATALEN[i] - AUTHLEN[i], DECR_FG); 109 (void) fprintf(stderr, "----------\n"); 110 } 111 112 args.key = CCM_KEY2; 113 args.keylen = sizeof (CCM_KEY2); 114 for (i = 12; i < 24; i++) { 115 bzero(param, sizeof (param)); 116 ccm_init_params(param, RESLEN[i] - AUTHLEN[i], NONCE[i], 117 NONCELEN[i], DATA_2[i-12], AUTHLEN[i], MACLEN[i]); 118 119 args.param = param; 120 args.plen = ccm_param_len(); 121 122 VERIFY3U(args.plen, <=, sizeof (param)); 123 124 args.in = RES[i] + AUTHLEN[i]; 125 args.inlen = RESLEN[i] - AUTHLEN[i]; 126 127 errs += run_test(&args, DATA_2[i-12] + AUTHLEN[i], 128 DATALEN[i] - AUTHLEN[i], ENCR_FG); 129 (void) fprintf(stderr, "----------\n"); 130 } 131 132 if (errs != 0) 133 (void) fprintf(stderr, "%d tests failed\n", errs); 134 135 return (errs); 136 } 137