1 /* test_ccm_mode.c - TinyCrypt AES-CCM tests (RFC 3610 tests) */
2 
3 /*
4  *  Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions are met:
8  *
9  *    - Redistributions of source code must retain the above copyright notice,
10  *     this list of conditions and the following disclaimer.
11  *
12  *    - Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  *    - Neither the name of Intel Corporation nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  *  POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  *  DESCRIPTION
35  * This module tests the following AES-CCM Mode routines:
36  *
37  *  Scenarios tested include:
38  *  - AES128 CCM mode encryption RFC 3610 test vector #1
39  *  - AES128 CCM mode encryption RFC 3610 test vector #2
40  *  - AES128 CCM mode encryption RFC 3610 test vector #3
41  *  - AES128 CCM mode encryption RFC 3610 test vector #7
42  *  - AES128 CCM mode encryption RFC 3610 test vector #8
43  *  - AES128 CCM mode encryption RFC 3610 test vector #9
44  *  - AES128 CCM mode encryption No associated data
45  *  - AES128 CCM mode encryption No payload data
46  */
47 
48 #include <tinycrypt/ccm_mode.h>
49 #include <tinycrypt/constants.h>
50 #include <test_utils.h>
51 
52 #include <string.h>
53 
54 #define TC_CCM_MAX_CT_SIZE 50
55 #define TC_CCM_MAX_PT_SIZE 25
56 #define NUM_NIST_KEYS 16
57 #define NONCE_LEN 13
58 #define HEADER_LEN 8
59 #define M_LEN8 8
60 #define M_LEN10 10
61 #define DATA_BUF_LEN23 23
62 #define DATA_BUF_LEN24 24
63 #define DATA_BUF_LEN25 25
64 #define EXPECTED_BUF_LEN31 31
65 #define EXPECTED_BUF_LEN32 32
66 #define EXPECTED_BUF_LEN33 33
67 #define EXPECTED_BUF_LEN34 34
68 #define EXPECTED_BUF_LEN35 35
69 
do_test(const uint8_t * key,uint8_t * nonce,size_t nlen,const uint8_t * hdr,size_t hlen,const uint8_t * data,size_t dlen,const uint8_t * expected,size_t elen,const int mlen)70 int do_test(const uint8_t *key, uint8_t *nonce,
71 	    size_t nlen, const uint8_t *hdr,
72 	    size_t hlen, const uint8_t *data,
73 	    size_t dlen, const uint8_t *expected,
74 	    size_t elen, const int mlen)
75 {
76 
77 	int result = TC_PASS;
78 
79 	uint8_t ciphertext[TC_CCM_MAX_CT_SIZE];
80 	uint8_t decrypted[TC_CCM_MAX_PT_SIZE];
81 	struct tc_ccm_mode_struct c;
82 	struct tc_aes_key_sched_struct sched;
83 
84 	tc_aes128_set_encrypt_key(&sched, key);
85 
86 	result = tc_ccm_config(&c, &sched, nonce, nlen, mlen);
87 	if (result == 0) {
88 		TC_ERROR("CCM config failed in %s.\n", __func__);
89 
90 		result = TC_FAIL;
91 		goto exitTest1;
92 	}
93 
94 	result = tc_ccm_generation_encryption(ciphertext, TC_CCM_MAX_CT_SIZE, hdr,
95 					      hlen, data, dlen, &c);
96 	if (result == 0) {
97 		TC_ERROR("ccm_encrypt failed in %s.\n", __func__);
98 
99 		result = TC_FAIL;
100 		goto exitTest1;
101 	}
102 
103 
104 	if (memcmp(expected, ciphertext, elen) != 0) {
105 		TC_ERROR("ccm_encrypt produced wrong ciphertext in %s.\n",
106 			 __func__);
107 		show_str("\t\tExpected", expected, elen);
108 		show_str("\t\tComputed", ciphertext, elen);
109 
110 		result = TC_FAIL;
111 		goto exitTest1;
112 	}
113 
114 	result = tc_ccm_decryption_verification(decrypted, TC_CCM_MAX_PT_SIZE, hdr,
115 						hlen, ciphertext, dlen+mlen, &c);
116 	if (result == 0) {
117 		TC_ERROR("ccm_decrypt failed in %s.\n", __func__);
118 		show_str("\t\tExpected", data, dlen);
119 		show_str("\t\tComputed", decrypted, sizeof(decrypted));
120 
121 		result = TC_FAIL;
122 		goto exitTest1;
123 	}
124 
125 	result = TC_PASS;
126 
127 exitTest1:
128 	TC_END_RESULT(result);
129 	return result;
130 }
131 
test_vector_1(void)132 int test_vector_1(void)
133 {
134 	int result = TC_PASS;
135 	/* RFC 3610 test vector #1 */
136 	const uint8_t key[NUM_NIST_KEYS] = {
137 		0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
138 		0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
139 	};
140 	uint8_t nonce[NONCE_LEN] = {
141 		0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0xa0,
142 		0xa1, 0xa2, 0xa3, 0xa4, 0xa5
143 	};
144 	const uint8_t hdr[HEADER_LEN] = {
145 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
146 	};
147 	const uint8_t data[DATA_BUF_LEN23] = {
148 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
149 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
150 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e
151 	};
152 	const uint8_t expected[EXPECTED_BUF_LEN31] = {
153 		0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2,
154 		0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80,
155 		0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84, 0x17,
156 		0xe8, 0xd1, 0x2c, 0xfd, 0xf9, 0x26, 0xe0
157 	};
158 	uint16_t mlen = M_LEN8;
159 
160 	TC_PRINT("%s: Performing CCM test #1 (RFC 3610 test vector #1):\n",
161 		 __func__);
162 
163 	result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
164 			 data, sizeof(data), expected, sizeof(expected), mlen);
165 
166 	return result;
167 }
168 
test_vector_2(void)169 int test_vector_2(void)
170 {
171 	int result = TC_PASS;
172 	/* RFC 3610 test vector #2 */
173 	const uint8_t key[NUM_NIST_KEYS] = {
174 		0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
175 		0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
176 	};
177 	uint8_t nonce[NONCE_LEN] = {
178 		0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0xa0,
179 		0xa1, 0xa2, 0xa3, 0xa4, 0xa5
180 	};
181 	const uint8_t hdr[HEADER_LEN] = {
182 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
183 	};
184 	const uint8_t data[DATA_BUF_LEN24] = {
185 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
186 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
187 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
188 	};
189 	const uint8_t expected[EXPECTED_BUF_LEN32] = {
190 		0x72, 0xc9, 0x1a, 0x36, 0xe1, 0x35, 0xf8, 0xcf,
191 		0x29, 0x1c, 0xa8, 0x94, 0x08, 0x5c, 0x87, 0xe3,
192 		0xcc, 0x15, 0xc4, 0x39, 0xc9, 0xe4, 0x3a, 0x3b,
193 		0xa0, 0x91, 0xd5, 0x6e, 0x10, 0x40, 0x09, 0x16
194 	};
195 	uint16_t mlen = M_LEN8;
196 
197 	TC_PRINT("%s: Performing CCM test #2 (RFC 3610 test vector #2):\n",
198 		 __func__);
199 
200 	result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
201 			 data, sizeof(data), expected, sizeof(expected), mlen);
202 
203 	return result;
204 }
205 
test_vector_3(void)206 int test_vector_3(void)
207 {
208 	int result = TC_PASS;
209 	/* RFC 3610 test vector #3  */
210 	const uint8_t key[NUM_NIST_KEYS] = {
211 		0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
212 		0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
213 	};
214 	uint8_t nonce[NONCE_LEN] = {
215 		0x00, 0x00, 0x00, 0x05, 0x04, 0x03, 0x02, 0xa0,
216 		0xa1, 0xa2, 0xa3, 0xa4, 0xa5
217 	};
218 	const uint8_t hdr[HEADER_LEN] = {
219 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
220 	};
221 	const uint8_t data[DATA_BUF_LEN25] = {
222 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
223 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
224 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
225 		0x20
226 	};
227 	const uint8_t expected[EXPECTED_BUF_LEN33] = {
228 		0x51, 0xb1, 0xe5, 0xf4, 0x4a, 0x19, 0x7d, 0x1d,
229 		0xa4, 0x6b, 0x0f, 0x8e, 0x2d, 0x28, 0x2a, 0xe8,
230 		0x71, 0xe8, 0x38, 0xbb, 0x64, 0xda, 0x85, 0x96,
231 		0x57, 0x4a, 0xda, 0xa7, 0x6f, 0xbd, 0x9f, 0xb0,
232 		0xc5
233 	};
234 	uint16_t mlen = M_LEN8;
235 
236 	TC_PRINT("%s: Performing CCM test #3 (RFC 3610 test vector #3):\n",
237 		 __func__);
238 
239 	result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), data,
240 			 sizeof(data), expected, sizeof(expected), mlen);
241 
242 	return result;
243 }
244 
test_vector_4(void)245 int test_vector_4(void)
246 {
247 	int result = TC_PASS;
248 	/* RFC 3610 test vector #7  */
249 	const uint8_t key[NUM_NIST_KEYS] = {
250 		0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
251 		0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
252 	};
253 	uint8_t nonce[NONCE_LEN] = {
254 		0x00, 0x00, 0x00, 0x09, 0x08, 0x07, 0x06, 0xa0,
255 		0xa1, 0xa2, 0xa3, 0xa4, 0xa5
256 	};
257 	const uint8_t hdr[HEADER_LEN] = {
258 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
259 	};
260 	const uint8_t data[DATA_BUF_LEN23] = {
261 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
262 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
263 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e
264 	};
265 	const uint8_t expected[EXPECTED_BUF_LEN33] = {
266 		0x01, 0x35, 0xD1, 0xB2,  0xC9, 0x5F, 0x41, 0xD5,
267 		0xD1, 0xD4, 0xFE, 0xC1,  0x85, 0xD1, 0x66, 0xB8,
268 		0x09, 0x4E, 0x99, 0x9D,  0xFE, 0xD9, 0x6C, 0x04,
269 		0x8C, 0x56, 0x60, 0x2C,  0x97, 0xAC, 0xBB, 0x74,
270 		0x90
271 	};
272 	uint16_t mlen = M_LEN10;
273 
274 	TC_PRINT("%s: Performing CCM test #4 (RFC 3610 test vector #7):\n",
275 		 __func__);
276 
277 	result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
278 			 data, sizeof(data), expected, sizeof(expected), mlen);
279 
280 	return result;
281 }
282 
test_vector_5(void)283 int test_vector_5(void)
284 {
285 	int result = TC_PASS;
286 	/* RFC 3610 test vector #8  */
287 	const uint8_t key[NUM_NIST_KEYS] = {
288 		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
289 		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
290 	};
291 	uint8_t nonce[NONCE_LEN] = {
292 		0x00, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x07, 0xA0,
293 		0xA1, 0xA2, 0xA3, 0xA4, 0xA5
294 	};
295 	const uint8_t hdr[HEADER_LEN] = {
296 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
297 	};
298 	const uint8_t data[DATA_BUF_LEN24] = {
299 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
300 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
301 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
302 	};
303 	const uint8_t expected[EXPECTED_BUF_LEN34] = {
304 		0x7B, 0x75, 0x39, 0x9A, 0xC0, 0x83, 0x1D, 0xD2,
305 		0xF0, 0xBB, 0xD7, 0x58, 0x79, 0xA2, 0xFD, 0x8F,
306 		0x6C, 0xAE, 0x6B, 0x6C, 0xD9, 0xB7, 0xDB, 0x24,
307 		0xC1, 0x7B, 0x44, 0x33, 0xF4, 0x34, 0x96, 0x3F,
308 		0x34, 0xB4
309 	};
310 	uint16_t mlen = M_LEN10;
311 
312 	TC_PRINT("%s: Performing CCM test #5 (RFC 3610 test vector #8):\n",
313 		 __func__);
314 
315 	result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
316 			 data, sizeof(data), expected, sizeof(expected), mlen);
317 
318 	return result;
319 }
320 
test_vector_6(void)321 int test_vector_6(void)
322 {
323 	int result = TC_PASS;
324 	/* RFC 3610 test vector #9  */
325 	const uint8_t key[NUM_NIST_KEYS] = {
326 		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
327 		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
328 	};
329 	uint8_t nonce[NONCE_LEN] = {
330 		0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x08, 0xA0,
331 		0xA1, 0xA2, 0xA3, 0xA4, 0xA5
332 	};
333 	const uint8_t hdr[HEADER_LEN] = {
334 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
335 	};
336 	const uint8_t data[DATA_BUF_LEN25] = {
337 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
338 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
339 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
340 		0x20
341 	};
342 	const uint8_t expected[EXPECTED_BUF_LEN35] = {
343 		0x82, 0x53, 0x1a, 0x60, 0xCC, 0x24, 0x94, 0x5a,
344 		0x4b, 0x82, 0x79, 0x18, 0x1a, 0xb5, 0xc8, 0x4d,
345 		0xf2, 0x1c, 0xe7, 0xf9, 0xb7, 0x3f, 0x42, 0xe1,
346 		0x97, 0xea, 0x9c, 0x07, 0xe5, 0x6b, 0x5e, 0xb1,
347 		0x7e, 0x5f, 0x4e
348 	};
349 	uint16_t mlen = M_LEN10;
350 
351 	TC_PRINT("%s: Performing CCM test #6 (RFC 3610 test vector #9):\n",
352 		 __func__);
353 
354 	result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
355 			 data, sizeof(data), expected, sizeof(expected), mlen);
356 
357 	return result;
358 }
359 
test_vector_7(void)360 int test_vector_7(void)
361 {
362 	int result = TC_PASS;
363 	/* Test based on RFC 3610 test vector #9 but with no associated data */
364 	const uint8_t key[NUM_NIST_KEYS] = {
365 		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
366 		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
367 	};
368 	uint8_t nonce[NONCE_LEN] = {
369 		0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x08, 0xA0,
370 		0xA1, 0xA2, 0xA3, 0xA4, 0xA5
371 	};
372 	uint8_t *hdr = NULL;
373 
374 	uint8_t data[DATA_BUF_LEN25] = {
375 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
376 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
377 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
378 		0x20
379 	};
380 	struct tc_ccm_mode_struct c;
381 	struct tc_aes_key_sched_struct sched;
382 	uint8_t decrypted[TC_CCM_MAX_PT_SIZE];
383 	uint8_t ciphertext[TC_CCM_MAX_CT_SIZE];
384 	uint16_t mlen = M_LEN10;
385 
386 	TC_PRINT("%s: Performing CCM test #7 (no associated data):\n",
387 		 __func__);
388 
389 	tc_aes128_set_encrypt_key(&sched, key);
390 	if (tc_ccm_config(&c, &sched, nonce, sizeof(nonce), mlen) == 0) {
391 		TC_ERROR("ccm_config failed in %s.\n", __func__);
392 
393 		result = TC_FAIL;
394 		goto exitTest1;
395 	}
396 
397 	result = tc_ccm_generation_encryption(ciphertext, TC_CCM_MAX_CT_SIZE, hdr,
398 					      0, data, sizeof(data), &c);
399 	if (result == 0) {
400 		TC_ERROR("ccm_encryption failed in %s.\n", __func__);
401 
402 		result = TC_FAIL;
403 		goto exitTest1;
404 	}
405 
406 	result = tc_ccm_decryption_verification (decrypted, TC_CCM_MAX_PT_SIZE, hdr,
407 						0, ciphertext, sizeof(data)+mlen, &c);
408 	if (result == 0) {
409 		TC_ERROR("ccm_decrypt failed in %s.\n", __func__);
410 		show_str("\t\tExpected", data, sizeof(data));
411 		show_str("\t\tComputed", decrypted, sizeof(decrypted));
412 
413 		result = TC_FAIL;
414 		goto exitTest1;
415 	}
416 
417 	result = TC_PASS;
418 
419 exitTest1:
420 	TC_END_RESULT(result);
421 	return result;
422 
423 }
424 
test_vector_8(void)425 int test_vector_8(void)
426 {
427 	int result = TC_PASS;
428 	/* Test based on RFC 3610 test vector #9 but with no payload data */
429 	const uint8_t key[NUM_NIST_KEYS] = {
430 		0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
431 		0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
432 	};
433 	uint8_t nonce[NONCE_LEN] = {
434 		0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x08, 0xA0,
435 		0xA1, 0xA2, 0xA3, 0xA4, 0xA5
436 	};
437 	const uint8_t hdr[8] = {
438 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
439 	};
440 
441 	uint8_t *data = NULL;
442 
443 	struct tc_ccm_mode_struct c;
444 	struct tc_aes_key_sched_struct sched;
445 
446 	uint8_t decrypted[TC_CCM_MAX_PT_SIZE];
447 	uint8_t ciphertext[TC_CCM_MAX_CT_SIZE];
448 
449 	uint16_t mlen = M_LEN10;
450 
451 	TC_PRINT("%s: Performing CCM test #8 (no payload data):\n", __func__);
452 
453 	tc_aes128_set_encrypt_key(&sched, key);
454 	if (tc_ccm_config(&c, &sched, nonce, sizeof(nonce), mlen) == 0) {
455 		TC_ERROR("CCM config failed in %s.\n", __func__);
456 
457 		result = TC_FAIL;
458 		goto exitTest1;
459 	}
460 
461 	result = tc_ccm_generation_encryption(ciphertext, TC_CCM_MAX_CT_SIZE, hdr,
462 					      sizeof(hdr), data, 0, &c);
463 	if (result == 0) {
464 		TC_ERROR("ccm_encrypt failed in %s.\n", __func__);
465 
466 		result = TC_FAIL;
467 		goto exitTest1;
468 	}
469 
470 	result = tc_ccm_decryption_verification(decrypted, TC_CCM_MAX_PT_SIZE, hdr,
471 						sizeof(hdr), ciphertext, mlen, &c);
472 	if (result == 0) {
473 		TC_ERROR("ccm_decrypt failed in %s.\n", __func__);
474 		show_str("\t\tExpected", data, sizeof(data));
475 		show_str("\t\tComputed", decrypted, sizeof(decrypted));
476 
477 		result = TC_FAIL;
478 		goto exitTest1;
479 	}
480 
481 	result = TC_PASS;
482 
483 exitTest1:
484 	TC_END_RESULT(result);
485 	return result;
486 }
487 
488 /*
489  * Main task to test CCM
490  */
main(void)491 int main(void)
492 {
493 	int result = TC_PASS;
494 
495 	TC_START("Performing CCM tests:");
496 
497 	result = test_vector_1();
498 	if (result == TC_FAIL) { /* terminate test */
499 		TC_ERROR("CCM test #1 (RFC 3610 test vector #1) failed.\n");
500 		goto exitTest;
501 	}
502 	result = test_vector_2();
503 	if (result == TC_FAIL) { /* terminate test */
504 		TC_ERROR("CCM test #2 failed.\n");
505 		goto exitTest;
506 	}
507 	result = test_vector_3();
508 	if (result == TC_FAIL) { /* terminate test */
509 		TC_ERROR("CCM test #3 failed.\n");
510 		goto exitTest;
511 	}
512 	result = test_vector_4();
513 	if (result == TC_FAIL) { /* terminate test */
514 		TC_ERROR("CCM test #4 failed.\n");
515 		goto exitTest;
516 	}
517 	result = test_vector_5();
518 	if (result == TC_FAIL) { /* terminate test */
519 		TC_ERROR("CCM test #5 failed.\n");
520 		goto exitTest;
521 	}
522 	result = test_vector_6();
523 	if (result == TC_FAIL) { /* terminate test */
524 		TC_ERROR("CCM test #6 failed.\n");
525 		goto exitTest;
526 	}
527 	result = test_vector_7();
528 	if (result == TC_FAIL) { /* terminate test */
529 		TC_ERROR("CCM test #7 failed.\n");
530 		goto exitTest;
531 	}
532 	result = test_vector_8();
533 	if (result == TC_FAIL) { /* terminate test */
534 		TC_ERROR("CCM test #8 (no payload data) failed.\n");
535 		goto exitTest;
536 	}
537 
538 	TC_PRINT("All CCM tests succeeded!\n");
539 
540 exitTest:
541 	TC_END_RESULT(result);
542 	TC_END_REPORT(result);
543 
544 	return result;
545 }
546