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