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