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