1 /**
2 * \file cmac.c
3 *
4 * \brief NIST SP800-38B compliant CMAC implementation for AES and 3DES
5 *
6 * Copyright The Mbed TLS Contributors
7 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
8 */
9
10 /*
11 * References:
12 *
13 * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The
14 * CMAC Mode for Authentication
15 * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf
16 *
17 * - RFC 4493 - The AES-CMAC Algorithm
18 * https://tools.ietf.org/html/rfc4493
19 *
20 * - RFC 4615 - The Advanced Encryption Standard-Cipher-based Message
21 * Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128)
22 * Algorithm for the Internet Key Exchange Protocol (IKE)
23 * https://tools.ietf.org/html/rfc4615
24 *
25 * Additional test vectors: ISO/IEC 9797-1
26 *
27 */
28
29 #include "common.h"
30
31 #if defined(MBEDTLS_CMAC_C)
32
33 #include "mbedtls/cmac.h"
34 #include "mbedtls/platform_util.h"
35 #include "mbedtls/error.h"
36 #include "mbedtls/platform.h"
37
38 #include <string.h>
39
40 #if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST)
41
42 /*
43 * Multiplication by u in the Galois field of GF(2^n)
44 *
45 * As explained in NIST SP 800-38B, this can be computed:
46 *
47 * If MSB(p) = 0, then p = (p << 1)
48 * If MSB(p) = 1, then p = (p << 1) ^ R_n
49 * with R_64 = 0x1B and R_128 = 0x87
50 *
51 * Input and output MUST NOT point to the same buffer
52 * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES.
53 */
cmac_multiply_by_u(unsigned char * output,const unsigned char * input,size_t blocksize)54 static int cmac_multiply_by_u(unsigned char *output,
55 const unsigned char *input,
56 size_t blocksize)
57 {
58 const unsigned char R_128 = 0x87;
59 const unsigned char R_64 = 0x1B;
60 unsigned char R_n, mask;
61 unsigned char overflow = 0x00;
62 int i;
63
64 if (blocksize == MBEDTLS_AES_BLOCK_SIZE) {
65 R_n = R_128;
66 } else if (blocksize == MBEDTLS_DES3_BLOCK_SIZE) {
67 R_n = R_64;
68 } else {
69 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
70 }
71
72 for (i = (int) blocksize - 1; i >= 0; i--) {
73 output[i] = input[i] << 1 | overflow;
74 overflow = input[i] >> 7;
75 }
76
77 /* mask = ( input[0] >> 7 ) ? 0xff : 0x00
78 * using bit operations to avoid branches */
79
80 /* MSVC has a warning about unary minus on unsigned, but this is
81 * well-defined and precisely what we want to do here */
82 #if defined(_MSC_VER)
83 #pragma warning( push )
84 #pragma warning( disable : 4146 )
85 #endif
86 mask = -(input[0] >> 7);
87 #if defined(_MSC_VER)
88 #pragma warning( pop )
89 #endif
90
91 output[blocksize - 1] ^= R_n & mask;
92
93 return 0;
94 }
95
96 /*
97 * Generate subkeys
98 *
99 * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm
100 */
cmac_generate_subkeys(mbedtls_cipher_context_t * ctx,unsigned char * K1,unsigned char * K2)101 static int cmac_generate_subkeys(mbedtls_cipher_context_t *ctx,
102 unsigned char *K1, unsigned char *K2)
103 {
104 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
105 unsigned char L[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
106 size_t olen, block_size;
107
108 mbedtls_platform_zeroize(L, sizeof(L));
109
110 block_size = mbedtls_cipher_info_get_block_size(ctx->cipher_info);
111
112 /* Calculate Ek(0) */
113 if ((ret = mbedtls_cipher_update(ctx, L, block_size, L, &olen)) != 0) {
114 goto exit;
115 }
116
117 /*
118 * Generate K1 and K2
119 */
120 if ((ret = cmac_multiply_by_u(K1, L, block_size)) != 0) {
121 goto exit;
122 }
123
124 if ((ret = cmac_multiply_by_u(K2, K1, block_size)) != 0) {
125 goto exit;
126 }
127
128 exit:
129 mbedtls_platform_zeroize(L, sizeof(L));
130
131 return ret;
132 }
133 #endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */
134
135 #if !defined(MBEDTLS_CMAC_ALT)
136
137 /*
138 * Create padded last block from (partial) last block.
139 *
140 * We can't use the padding option from the cipher layer, as it only works for
141 * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition.
142 */
cmac_pad(unsigned char padded_block[MBEDTLS_CMAC_MAX_BLOCK_SIZE],size_t padded_block_len,const unsigned char * last_block,size_t last_block_len)143 static void cmac_pad(unsigned char padded_block[MBEDTLS_CMAC_MAX_BLOCK_SIZE],
144 size_t padded_block_len,
145 const unsigned char *last_block,
146 size_t last_block_len)
147 {
148 size_t j;
149
150 for (j = 0; j < padded_block_len; j++) {
151 if (j < last_block_len) {
152 padded_block[j] = last_block[j];
153 } else if (j == last_block_len) {
154 padded_block[j] = 0x80;
155 } else {
156 padded_block[j] = 0x00;
157 }
158 }
159 }
160
mbedtls_cipher_cmac_starts(mbedtls_cipher_context_t * ctx,const unsigned char * key,size_t keybits)161 int mbedtls_cipher_cmac_starts(mbedtls_cipher_context_t *ctx,
162 const unsigned char *key, size_t keybits)
163 {
164 mbedtls_cipher_type_t type;
165 mbedtls_cmac_context_t *cmac_ctx;
166 int retval;
167
168 if (ctx == NULL || ctx->cipher_info == NULL || key == NULL) {
169 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
170 }
171
172 if ((retval = mbedtls_cipher_setkey(ctx, key, (int) keybits,
173 MBEDTLS_ENCRYPT)) != 0) {
174 return retval;
175 }
176
177 type = mbedtls_cipher_info_get_type(ctx->cipher_info);
178
179 switch (type) {
180 case MBEDTLS_CIPHER_AES_128_ECB:
181 case MBEDTLS_CIPHER_AES_192_ECB:
182 case MBEDTLS_CIPHER_AES_256_ECB:
183 case MBEDTLS_CIPHER_DES_EDE3_ECB:
184 break;
185 default:
186 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
187 }
188
189 /* Allocated and initialise in the cipher context memory for the CMAC
190 * context */
191 cmac_ctx = mbedtls_calloc(1, sizeof(mbedtls_cmac_context_t));
192 if (cmac_ctx == NULL) {
193 return MBEDTLS_ERR_CIPHER_ALLOC_FAILED;
194 }
195
196 ctx->cmac_ctx = cmac_ctx;
197
198 mbedtls_platform_zeroize(cmac_ctx->state, sizeof(cmac_ctx->state));
199
200 return 0;
201 }
202
mbedtls_cipher_cmac_update(mbedtls_cipher_context_t * ctx,const unsigned char * input,size_t ilen)203 int mbedtls_cipher_cmac_update(mbedtls_cipher_context_t *ctx,
204 const unsigned char *input, size_t ilen)
205 {
206 mbedtls_cmac_context_t *cmac_ctx;
207 unsigned char *state;
208 int ret = 0;
209 size_t n, j, olen, block_size;
210
211 if (ctx == NULL || ctx->cipher_info == NULL || input == NULL ||
212 ctx->cmac_ctx == NULL) {
213 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
214 }
215
216 cmac_ctx = ctx->cmac_ctx;
217 block_size = mbedtls_cipher_info_get_block_size(ctx->cipher_info);
218 state = ctx->cmac_ctx->state;
219
220 /* Is there data still to process from the last call, that's greater in
221 * size than a block? */
222 if (cmac_ctx->unprocessed_len > 0 &&
223 ilen > block_size - cmac_ctx->unprocessed_len) {
224 memcpy(&cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
225 input,
226 block_size - cmac_ctx->unprocessed_len);
227
228 mbedtls_xor_no_simd(state, cmac_ctx->unprocessed_block, state, block_size);
229
230 if ((ret = mbedtls_cipher_update(ctx, state, block_size, state,
231 &olen)) != 0) {
232 goto exit;
233 }
234
235 input += block_size - cmac_ctx->unprocessed_len;
236 ilen -= block_size - cmac_ctx->unprocessed_len;
237 cmac_ctx->unprocessed_len = 0;
238 }
239
240 /* n is the number of blocks including any final partial block */
241 n = (ilen + block_size - 1) / block_size;
242
243 /* Iterate across the input data in block sized chunks, excluding any
244 * final partial or complete block */
245 for (j = 1; j < n; j++) {
246 mbedtls_xor_no_simd(state, input, state, block_size);
247
248 if ((ret = mbedtls_cipher_update(ctx, state, block_size, state,
249 &olen)) != 0) {
250 goto exit;
251 }
252
253 ilen -= block_size;
254 input += block_size;
255 }
256
257 /* If there is data left over that wasn't aligned to a block */
258 if (ilen > 0) {
259 memcpy(&cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
260 input,
261 ilen);
262 cmac_ctx->unprocessed_len += ilen;
263 }
264
265 exit:
266 return ret;
267 }
268
mbedtls_cipher_cmac_finish(mbedtls_cipher_context_t * ctx,unsigned char * output)269 int mbedtls_cipher_cmac_finish(mbedtls_cipher_context_t *ctx,
270 unsigned char *output)
271 {
272 mbedtls_cmac_context_t *cmac_ctx;
273 unsigned char *state, *last_block;
274 unsigned char K1[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
275 unsigned char K2[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
276 unsigned char M_last[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
277 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
278 size_t olen, block_size;
279
280 if (ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ||
281 output == NULL) {
282 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
283 }
284
285 cmac_ctx = ctx->cmac_ctx;
286 block_size = mbedtls_cipher_info_get_block_size(ctx->cipher_info);
287 state = cmac_ctx->state;
288
289 mbedtls_platform_zeroize(K1, sizeof(K1));
290 mbedtls_platform_zeroize(K2, sizeof(K2));
291 cmac_generate_subkeys(ctx, K1, K2);
292
293 last_block = cmac_ctx->unprocessed_block;
294
295 /* Calculate last block */
296 if (cmac_ctx->unprocessed_len < block_size) {
297 cmac_pad(M_last, block_size, last_block, cmac_ctx->unprocessed_len);
298 mbedtls_xor(M_last, M_last, K2, block_size);
299 } else {
300 /* Last block is complete block */
301 mbedtls_xor(M_last, last_block, K1, block_size);
302 }
303
304
305 mbedtls_xor(state, M_last, state, block_size);
306 if ((ret = mbedtls_cipher_update(ctx, state, block_size, state,
307 &olen)) != 0) {
308 goto exit;
309 }
310
311 memcpy(output, state, block_size);
312
313 exit:
314 /* Wipe the generated keys on the stack, and any other transients to avoid
315 * side channel leakage */
316 mbedtls_platform_zeroize(K1, sizeof(K1));
317 mbedtls_platform_zeroize(K2, sizeof(K2));
318
319 cmac_ctx->unprocessed_len = 0;
320 mbedtls_platform_zeroize(cmac_ctx->unprocessed_block,
321 sizeof(cmac_ctx->unprocessed_block));
322
323 mbedtls_platform_zeroize(state, MBEDTLS_CMAC_MAX_BLOCK_SIZE);
324 return ret;
325 }
326
mbedtls_cipher_cmac_reset(mbedtls_cipher_context_t * ctx)327 int mbedtls_cipher_cmac_reset(mbedtls_cipher_context_t *ctx)
328 {
329 mbedtls_cmac_context_t *cmac_ctx;
330
331 if (ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL) {
332 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
333 }
334
335 cmac_ctx = ctx->cmac_ctx;
336
337 /* Reset the internal state */
338 cmac_ctx->unprocessed_len = 0;
339 mbedtls_platform_zeroize(cmac_ctx->unprocessed_block,
340 sizeof(cmac_ctx->unprocessed_block));
341 mbedtls_platform_zeroize(cmac_ctx->state,
342 sizeof(cmac_ctx->state));
343
344 return 0;
345 }
346
mbedtls_cipher_cmac(const mbedtls_cipher_info_t * cipher_info,const unsigned char * key,size_t keylen,const unsigned char * input,size_t ilen,unsigned char * output)347 int mbedtls_cipher_cmac(const mbedtls_cipher_info_t *cipher_info,
348 const unsigned char *key, size_t keylen,
349 const unsigned char *input, size_t ilen,
350 unsigned char *output)
351 {
352 mbedtls_cipher_context_t ctx;
353 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
354
355 if (cipher_info == NULL || key == NULL || input == NULL || output == NULL) {
356 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
357 }
358
359 mbedtls_cipher_init(&ctx);
360
361 if ((ret = mbedtls_cipher_setup(&ctx, cipher_info)) != 0) {
362 goto exit;
363 }
364
365 ret = mbedtls_cipher_cmac_starts(&ctx, key, keylen);
366 if (ret != 0) {
367 goto exit;
368 }
369
370 ret = mbedtls_cipher_cmac_update(&ctx, input, ilen);
371 if (ret != 0) {
372 goto exit;
373 }
374
375 ret = mbedtls_cipher_cmac_finish(&ctx, output);
376
377 exit:
378 mbedtls_cipher_free(&ctx);
379
380 return ret;
381 }
382
383 #if defined(MBEDTLS_AES_C)
384 /*
385 * Implementation of AES-CMAC-PRF-128 defined in RFC 4615
386 */
mbedtls_aes_cmac_prf_128(const unsigned char * key,size_t key_length,const unsigned char * input,size_t in_len,unsigned char output[16])387 int mbedtls_aes_cmac_prf_128(const unsigned char *key, size_t key_length,
388 const unsigned char *input, size_t in_len,
389 unsigned char output[16])
390 {
391 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
392 const mbedtls_cipher_info_t *cipher_info;
393 unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE];
394 unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE];
395
396 if (key == NULL || input == NULL || output == NULL) {
397 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
398 }
399
400 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB);
401 if (cipher_info == NULL) {
402 /* Failing at this point must be due to a build issue */
403 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
404 goto exit;
405 }
406
407 if (key_length == MBEDTLS_AES_BLOCK_SIZE) {
408 /* Use key as is */
409 memcpy(int_key, key, MBEDTLS_AES_BLOCK_SIZE);
410 } else {
411 memset(zero_key, 0, MBEDTLS_AES_BLOCK_SIZE);
412
413 ret = mbedtls_cipher_cmac(cipher_info, zero_key, 128, key,
414 key_length, int_key);
415 if (ret != 0) {
416 goto exit;
417 }
418 }
419
420 ret = mbedtls_cipher_cmac(cipher_info, int_key, 128, input, in_len,
421 output);
422
423 exit:
424 mbedtls_platform_zeroize(int_key, sizeof(int_key));
425
426 return ret;
427 }
428 #endif /* MBEDTLS_AES_C */
429
430 #endif /* !MBEDTLS_CMAC_ALT */
431
432 #if defined(MBEDTLS_SELF_TEST)
433 /*
434 * CMAC test data for SP800-38B
435 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf
436 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf
437 *
438 * AES-CMAC-PRF-128 test data from RFC 4615
439 * https://tools.ietf.org/html/rfc4615#page-4
440 */
441
442 #define NB_CMAC_TESTS_PER_KEY 4
443 #define NB_PRF_TESTS 3
444
445 #if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)
446 /* All CMAC test inputs are truncated from the same 64 byte buffer. */
447 static const unsigned char test_message[] = {
448 /* PT */
449 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
450 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
451 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
452 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
453 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
454 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
455 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
456 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
457 };
458 #endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */
459
460 #if defined(MBEDTLS_AES_C)
461 /* Truncation point of message for AES CMAC tests */
462 static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
463 /* Mlen */
464 0,
465 16,
466 20,
467 64
468 };
469
470 /* CMAC-AES128 Test Data */
471 static const unsigned char aes_128_key[16] = {
472 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
473 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
474 };
475 static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
476 {
477 /* K1 */
478 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66,
479 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde
480 },
481 {
482 /* K2 */
483 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc,
484 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b
485 }
486 };
487 static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] =
488 {
489 {
490 /* Example #1 */
491 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
492 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
493 },
494 {
495 /* Example #2 */
496 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
497 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
498 },
499 {
500 /* Example #3 */
501 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8,
502 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde
503 },
504 {
505 /* Example #4 */
506 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
507 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
508 }
509 };
510
511 /* CMAC-AES192 Test Data */
512 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
513 static const unsigned char aes_192_key[24] = {
514 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
515 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
516 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
517 };
518 static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
519 {
520 /* K1 */
521 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27,
522 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96
523 },
524 {
525 /* K2 */
526 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e,
527 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c
528 }
529 };
530 static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] =
531 {
532 {
533 /* Example #1 */
534 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5,
535 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67
536 },
537 {
538 /* Example #2 */
539 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90,
540 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84
541 },
542 {
543 /* Example #3 */
544 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04,
545 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8
546 },
547 {
548 /* Example #4 */
549 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79,
550 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11
551 }
552 };
553 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
554
555 /* CMAC-AES256 Test Data */
556 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
557 static const unsigned char aes_256_key[32] = {
558 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
559 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
560 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
561 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
562 };
563 static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
564 {
565 /* K1 */
566 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac,
567 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f
568 },
569 {
570 /* K2 */
571 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58,
572 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9
573 }
574 };
575 static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] =
576 {
577 {
578 /* Example #1 */
579 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e,
580 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83
581 },
582 {
583 /* Example #2 */
584 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82,
585 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c
586 },
587 {
588 /* Example #3 */
589 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a,
590 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93
591 },
592 {
593 /* Example #4 */
594 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5,
595 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10
596 }
597 };
598 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
599 #endif /* MBEDTLS_AES_C */
600
601 #if defined(MBEDTLS_DES_C)
602 /* Truncation point of message for 3DES CMAC tests */
603 static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
604 0,
605 16,
606 20,
607 32
608 };
609
610 /* CMAC-TDES (Generation) - 2 Key Test Data */
611 static const unsigned char des3_2key_key[24] = {
612 /* Key1 */
613 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
614 /* Key2 */
615 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01,
616 /* Key3 */
617 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
618 };
619 static const unsigned char des3_2key_subkeys[2][8] = {
620 {
621 /* K1 */
622 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9
623 },
624 {
625 /* K2 */
626 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2
627 }
628 };
629 static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE]
630 = {
631 {
632 /* Sample #1 */
633 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60
634 },
635 {
636 /* Sample #2 */
637 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b
638 },
639 {
640 /* Sample #3 */
641 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69
642 },
643 {
644 /* Sample #4 */
645 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb
646 }
647 };
648
649 /* CMAC-TDES (Generation) - 3 Key Test Data */
650 static const unsigned char des3_3key_key[24] = {
651 /* Key1 */
652 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef,
653 /* Key2 */
654 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,
655 /* Key3 */
656 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23
657 };
658 static const unsigned char des3_3key_subkeys[2][8] = {
659 {
660 /* K1 */
661 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0
662 },
663 {
664 /* K2 */
665 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b
666 }
667 };
668 static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE]
669 = {
670 {
671 /* Sample #1 */
672 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50
673 },
674 {
675 /* Sample #2 */
676 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09
677 },
678 {
679 /* Sample #3 */
680 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2
681 },
682 {
683 /* Sample #4 */
684 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5
685 }
686 };
687
688 #endif /* MBEDTLS_DES_C */
689
690 #if defined(MBEDTLS_AES_C)
691 /* AES AES-CMAC-PRF-128 Test Data */
692 static const unsigned char PRFK[] = {
693 /* Key */
694 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
695 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
696 0xed, 0xcb
697 };
698
699 /* Sizes in bytes */
700 static const size_t PRFKlen[NB_PRF_TESTS] = {
701 18,
702 16,
703 10
704 };
705
706 /* Message */
707 static const unsigned char PRFM[] = {
708 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
709 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
710 0x10, 0x11, 0x12, 0x13
711 };
712
713 static const unsigned char PRFT[NB_PRF_TESTS][16] = {
714 {
715 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b,
716 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a
717 },
718 {
719 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52,
720 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d
721 },
722 {
723 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee,
724 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d
725 }
726 };
727 #endif /* MBEDTLS_AES_C */
728
cmac_test_subkeys(int verbose,const char * testname,const unsigned char * key,int keybits,const unsigned char * subkeys,mbedtls_cipher_type_t cipher_type,int block_size,int num_tests)729 static int cmac_test_subkeys(int verbose,
730 const char *testname,
731 const unsigned char *key,
732 int keybits,
733 const unsigned char *subkeys,
734 mbedtls_cipher_type_t cipher_type,
735 int block_size,
736 int num_tests)
737 {
738 int i, ret = 0;
739 mbedtls_cipher_context_t ctx;
740 const mbedtls_cipher_info_t *cipher_info;
741 unsigned char K1[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
742 unsigned char K2[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
743
744 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
745 if (cipher_info == NULL) {
746 /* Failing at this point must be due to a build issue */
747 return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
748 }
749
750 for (i = 0; i < num_tests; i++) {
751 if (verbose != 0) {
752 mbedtls_printf(" %s CMAC subkey #%d: ", testname, i + 1);
753 }
754
755 mbedtls_cipher_init(&ctx);
756
757 if ((ret = mbedtls_cipher_setup(&ctx, cipher_info)) != 0) {
758 if (verbose != 0) {
759 mbedtls_printf("test execution failed\n");
760 }
761
762 goto cleanup;
763 }
764
765 if ((ret = mbedtls_cipher_setkey(&ctx, key, keybits,
766 MBEDTLS_ENCRYPT)) != 0) {
767 /* When CMAC is implemented by an alternative implementation, or
768 * the underlying primitive itself is implemented alternatively,
769 * AES-192 may be unavailable. This should not cause the selftest
770 * function to fail. */
771 if ((ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED ||
772 ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) &&
773 cipher_type == MBEDTLS_CIPHER_AES_192_ECB) {
774 if (verbose != 0) {
775 mbedtls_printf("skipped\n");
776 }
777 goto next_test;
778 }
779
780 if (verbose != 0) {
781 mbedtls_printf("test execution failed\n");
782 }
783
784 goto cleanup;
785 }
786
787 ret = cmac_generate_subkeys(&ctx, K1, K2);
788 if (ret != 0) {
789 if (verbose != 0) {
790 mbedtls_printf("failed\n");
791 }
792
793 goto cleanup;
794 }
795
796 if ((ret = memcmp(K1, subkeys, block_size)) != 0 ||
797 (ret = memcmp(K2, &subkeys[block_size], block_size)) != 0) {
798 if (verbose != 0) {
799 mbedtls_printf("failed\n");
800 }
801
802 goto cleanup;
803 }
804
805 if (verbose != 0) {
806 mbedtls_printf("passed\n");
807 }
808
809 next_test:
810 mbedtls_cipher_free(&ctx);
811 }
812
813 ret = 0;
814 goto exit;
815
816 cleanup:
817 mbedtls_cipher_free(&ctx);
818
819 exit:
820 return ret;
821 }
822
cmac_test_wth_cipher(int verbose,const char * testname,const unsigned char * key,int keybits,const unsigned char * messages,const unsigned int message_lengths[4],const unsigned char * expected_result,mbedtls_cipher_type_t cipher_type,int block_size,int num_tests)823 static int cmac_test_wth_cipher(int verbose,
824 const char *testname,
825 const unsigned char *key,
826 int keybits,
827 const unsigned char *messages,
828 const unsigned int message_lengths[4],
829 const unsigned char *expected_result,
830 mbedtls_cipher_type_t cipher_type,
831 int block_size,
832 int num_tests)
833 {
834 const mbedtls_cipher_info_t *cipher_info;
835 int i, ret = 0;
836 unsigned char output[MBEDTLS_CMAC_MAX_BLOCK_SIZE];
837
838 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
839 if (cipher_info == NULL) {
840 /* Failing at this point must be due to a build issue */
841 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
842 goto exit;
843 }
844
845 for (i = 0; i < num_tests; i++) {
846 if (verbose != 0) {
847 mbedtls_printf(" %s CMAC #%d: ", testname, i + 1);
848 }
849
850 if ((ret = mbedtls_cipher_cmac(cipher_info, key, keybits, messages,
851 message_lengths[i], output)) != 0) {
852 /* When CMAC is implemented by an alternative implementation, or
853 * the underlying primitive itself is implemented alternatively,
854 * AES-192 and/or 3DES may be unavailable. This should not cause
855 * the selftest function to fail. */
856 if ((ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED ||
857 ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) &&
858 (cipher_type == MBEDTLS_CIPHER_AES_192_ECB ||
859 cipher_type == MBEDTLS_CIPHER_DES_EDE3_ECB)) {
860 if (verbose != 0) {
861 mbedtls_printf("skipped\n");
862 }
863 continue;
864 }
865
866 if (verbose != 0) {
867 mbedtls_printf("failed\n");
868 }
869 goto exit;
870 }
871
872 if ((ret = memcmp(output, &expected_result[i * block_size], block_size)) != 0) {
873 if (verbose != 0) {
874 mbedtls_printf("failed\n");
875 }
876 goto exit;
877 }
878
879 if (verbose != 0) {
880 mbedtls_printf("passed\n");
881 }
882 }
883 ret = 0;
884
885 exit:
886 return ret;
887 }
888
889 #if defined(MBEDTLS_AES_C)
test_aes128_cmac_prf(int verbose)890 static int test_aes128_cmac_prf(int verbose)
891 {
892 int i;
893 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
894 unsigned char output[MBEDTLS_AES_BLOCK_SIZE];
895
896 for (i = 0; i < NB_PRF_TESTS; i++) {
897 mbedtls_printf(" AES CMAC 128 PRF #%d: ", i);
898 ret = mbedtls_aes_cmac_prf_128(PRFK, PRFKlen[i], PRFM, 20, output);
899 if (ret != 0 ||
900 memcmp(output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE) != 0) {
901
902 if (verbose != 0) {
903 mbedtls_printf("failed\n");
904 }
905
906 return ret;
907 } else if (verbose != 0) {
908 mbedtls_printf("passed\n");
909 }
910 }
911 return ret;
912 }
913 #endif /* MBEDTLS_AES_C */
914
mbedtls_cmac_self_test(int verbose)915 int mbedtls_cmac_self_test(int verbose)
916 {
917 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
918
919 #if defined(MBEDTLS_AES_C)
920 /* AES-128 */
921 if ((ret = cmac_test_subkeys(verbose,
922 "AES 128",
923 aes_128_key,
924 128,
925 (const unsigned char *) aes_128_subkeys,
926 MBEDTLS_CIPHER_AES_128_ECB,
927 MBEDTLS_AES_BLOCK_SIZE,
928 NB_CMAC_TESTS_PER_KEY)) != 0) {
929 return ret;
930 }
931
932 if ((ret = cmac_test_wth_cipher(verbose,
933 "AES 128",
934 aes_128_key,
935 128,
936 test_message,
937 aes_message_lengths,
938 (const unsigned char *) aes_128_expected_result,
939 MBEDTLS_CIPHER_AES_128_ECB,
940 MBEDTLS_AES_BLOCK_SIZE,
941 NB_CMAC_TESTS_PER_KEY)) != 0) {
942 return ret;
943 }
944
945 /* AES-192 */
946 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
947 if ((ret = cmac_test_subkeys(verbose,
948 "AES 192",
949 aes_192_key,
950 192,
951 (const unsigned char *) aes_192_subkeys,
952 MBEDTLS_CIPHER_AES_192_ECB,
953 MBEDTLS_AES_BLOCK_SIZE,
954 NB_CMAC_TESTS_PER_KEY)) != 0) {
955 return ret;
956 }
957
958 if ((ret = cmac_test_wth_cipher(verbose,
959 "AES 192",
960 aes_192_key,
961 192,
962 test_message,
963 aes_message_lengths,
964 (const unsigned char *) aes_192_expected_result,
965 MBEDTLS_CIPHER_AES_192_ECB,
966 MBEDTLS_AES_BLOCK_SIZE,
967 NB_CMAC_TESTS_PER_KEY)) != 0) {
968 return ret;
969 }
970 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
971
972 /* AES-256 */
973 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
974 if ((ret = cmac_test_subkeys(verbose,
975 "AES 256",
976 aes_256_key,
977 256,
978 (const unsigned char *) aes_256_subkeys,
979 MBEDTLS_CIPHER_AES_256_ECB,
980 MBEDTLS_AES_BLOCK_SIZE,
981 NB_CMAC_TESTS_PER_KEY)) != 0) {
982 return ret;
983 }
984
985 if ((ret = cmac_test_wth_cipher(verbose,
986 "AES 256",
987 aes_256_key,
988 256,
989 test_message,
990 aes_message_lengths,
991 (const unsigned char *) aes_256_expected_result,
992 MBEDTLS_CIPHER_AES_256_ECB,
993 MBEDTLS_AES_BLOCK_SIZE,
994 NB_CMAC_TESTS_PER_KEY)) != 0) {
995 return ret;
996 }
997 #endif /* !MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
998 #endif /* MBEDTLS_AES_C */
999
1000 #if defined(MBEDTLS_DES_C)
1001 /* 3DES 2 key */
1002 if ((ret = cmac_test_subkeys(verbose,
1003 "3DES 2 key",
1004 des3_2key_key,
1005 192,
1006 (const unsigned char *) des3_2key_subkeys,
1007 MBEDTLS_CIPHER_DES_EDE3_ECB,
1008 MBEDTLS_DES3_BLOCK_SIZE,
1009 NB_CMAC_TESTS_PER_KEY)) != 0) {
1010 return ret;
1011 }
1012
1013 if ((ret = cmac_test_wth_cipher(verbose,
1014 "3DES 2 key",
1015 des3_2key_key,
1016 192,
1017 test_message,
1018 des3_message_lengths,
1019 (const unsigned char *) des3_2key_expected_result,
1020 MBEDTLS_CIPHER_DES_EDE3_ECB,
1021 MBEDTLS_DES3_BLOCK_SIZE,
1022 NB_CMAC_TESTS_PER_KEY)) != 0) {
1023 return ret;
1024 }
1025
1026 /* 3DES 3 key */
1027 if ((ret = cmac_test_subkeys(verbose,
1028 "3DES 3 key",
1029 des3_3key_key,
1030 192,
1031 (const unsigned char *) des3_3key_subkeys,
1032 MBEDTLS_CIPHER_DES_EDE3_ECB,
1033 MBEDTLS_DES3_BLOCK_SIZE,
1034 NB_CMAC_TESTS_PER_KEY)) != 0) {
1035 return ret;
1036 }
1037
1038 if ((ret = cmac_test_wth_cipher(verbose,
1039 "3DES 3 key",
1040 des3_3key_key,
1041 192,
1042 test_message,
1043 des3_message_lengths,
1044 (const unsigned char *) des3_3key_expected_result,
1045 MBEDTLS_CIPHER_DES_EDE3_ECB,
1046 MBEDTLS_DES3_BLOCK_SIZE,
1047 NB_CMAC_TESTS_PER_KEY)) != 0) {
1048 return ret;
1049 }
1050 #endif /* MBEDTLS_DES_C */
1051
1052 #if defined(MBEDTLS_AES_C)
1053 if ((ret = test_aes128_cmac_prf(verbose)) != 0) {
1054 return ret;
1055 }
1056 #endif /* MBEDTLS_AES_C */
1057
1058 if (verbose != 0) {
1059 mbedtls_printf("\n");
1060 }
1061
1062 return 0;
1063 }
1064
1065 #endif /* MBEDTLS_SELF_TEST */
1066
1067 #endif /* MBEDTLS_CMAC_C */
1068