blob: dee4dfe86ddb2bc1b9bb52b5a9825c677624272a [file] [log] [blame]
Andres Amaya Garciaaf610a02016-12-14 10:13:43 +00001/**
Brian Murray53e23b62016-09-13 14:00:15 -07002 * \file cmac.c
Simon Butcher327398a2016-10-05 14:09:11 +01003 *
Simon Butcher69283e52016-10-06 12:49:58 +01004 * \brief NIST SP800-38B compliant CMAC implementation for AES and 3DES
Robert Cragie3d23b1d2015-12-15 07:38:11 +00005 *
Brian Murray53e23b62016-09-13 14:00:15 -07006 * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
Robert Cragie3d23b1d2015-12-15 07:38:11 +00007 * 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/*
Brian Murray53e23b62016-09-13 14:00:15 -070025 * References:
Simon Butcher327398a2016-10-05 14:09:11 +010026 *
27 * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The
28 * CMAC Mode for Authentication
Janos Follathcd13bd22016-12-13 11:51:04 +000029 * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf
Simon Butcher327398a2016-10-05 14:09:11 +010030 *
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 *
Robert Cragie3d23b1d2015-12-15 07:38:11 +000041 */
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"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050052#include "mbedtls/platform_util.h"
Robert Cragie3d23b1d2015-12-15 07:38:11 +000053
54#include <string.h>
55
Brian Murray8b4111c2016-09-13 15:58:46 -070056
Robert Cragie3d23b1d2015-12-15 07:38:11 +000057#if defined(MBEDTLS_PLATFORM_C)
58#include "mbedtls/platform.h"
59#else
Brian Murray8b4111c2016-09-13 15:58:46 -070060#include <stdlib.h>
61#define mbedtls_calloc calloc
62#define mbedtls_free free
Simon Butcherd241f1c2016-10-06 10:39:49 +010063#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +000064#include <stdio.h>
Brian Murray8b4111c2016-09-13 15:58:46 -070065#define mbedtls_printf printf
Brian J Murray2adecba2016-11-06 04:45:15 -080066#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +000067#endif /* MBEDTLS_PLATFORM_C */
Brian Murray8b4111c2016-09-13 15:58:46 -070068
Ron Eldor621080d2017-12-21 10:57:43 +020069#if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST)
Steven Cooreman63342772017-04-04 11:47:16 +020070
Unknown2384f7f2018-12-24 05:10:59 -050071#define CMAC_VALIDATE_RET(cond) \
Unknown1ad679e2018-12-14 05:37:29 -050072 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA )
Unknown1ad679e2018-12-14 05:37:29 -050073
Robert Cragie3d23b1d2015-12-15 07:38:11 +000074/*
Brian Murrayb0c3c432016-05-18 14:29:51 -070075 * Multiplication by u in the Galois field of GF(2^n)
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +000076 *
Brian Murray72b69e32016-09-13 14:21:01 -070077 * As explained in NIST SP 800-38B, this can be computed:
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +000078 *
Simon Butcher327398a2016-10-05 14:09:11 +010079 * If MSB(p) = 0, then p = (p << 1)
80 * If MSB(p) = 1, then p = (p << 1) ^ R_n
81 * with R_64 = 0x1B and R_128 = 0x87
82 *
83 * Input and output MUST NOT point to the same buffer
Brian J Murray2adecba2016-11-06 04:45:15 -080084 * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000085 */
Brian Murrayb0c3c432016-05-18 14:29:51 -070086static int cmac_multiply_by_u( unsigned char *output,
87 const unsigned char *input,
Brian Murray53e23b62016-09-13 14:00:15 -070088 size_t blocksize )
Robert Cragie3d23b1d2015-12-15 07:38:11 +000089{
Brian Murrayb0c3c432016-05-18 14:29:51 -070090 const unsigned char R_128 = 0x87;
91 const unsigned char R_64 = 0x1B;
92 unsigned char R_n, mask;
93 unsigned char overflow = 0x00;
Simon Butcher327398a2016-10-05 14:09:11 +010094 int i;
Brian Murrayb0c3c432016-05-18 14:29:51 -070095
Simon Butcher69283e52016-10-06 12:49:58 +010096 if( blocksize == MBEDTLS_AES_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -070097 {
Brian Murrayb0c3c432016-05-18 14:29:51 -070098 R_n = R_128;
Simon Butcher327398a2016-10-05 14:09:11 +010099 }
Simon Butcher69283e52016-10-06 12:49:58 +0100100 else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700101 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700102 R_n = R_64;
Simon Butcher327398a2016-10-05 14:09:11 +0100103 }
104 else
Brian Murray6a3c0d22016-05-20 18:25:43 -0700105 {
Simon Butcher327398a2016-10-05 14:09:11 +0100106 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700107 }
108
Simon B3249cb72016-11-03 01:11:37 +0000109 for( i = (int)blocksize - 1; i >= 0; i-- )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000110 {
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000111 output[i] = input[i] << 1 | overflow;
112 overflow = input[i] >> 7;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000113 }
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000114
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000115 /* mask = ( input[0] >> 7 ) ? 0xff : 0x00
116 * using bit operations to avoid branches */
Simon Butcher327398a2016-10-05 14:09:11 +0100117
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000118 /* MSVC has a warning about unary minus on unsigned, but this is
119 * well-defined and precisely what we want to do here */
120#if defined(_MSC_VER)
121#pragma warning( push )
122#pragma warning( disable : 4146 )
123#endif
124 mask = - ( input[0] >> 7 );
125#if defined(_MSC_VER)
126#pragma warning( pop )
127#endif
128
Simon Butcher327398a2016-10-05 14:09:11 +0100129 output[ blocksize - 1 ] ^= R_n & mask;
130
Brian Murrayb439d452016-05-19 16:02:42 -0700131 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000132}
133
134/*
135 * Generate subkeys
Simon Butcher327398a2016-10-05 14:09:11 +0100136 *
137 * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000138 */
Simon Butcher327398a2016-10-05 14:09:11 +0100139static int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx,
140 unsigned char* K1, unsigned char* K2 )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000141{
Brian Murray57863ad2016-05-19 16:38:36 -0700142 int ret;
Simon Butcher69283e52016-10-06 12:49:58 +0100143 unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700144 size_t olen, block_size;
145
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500146 mbedtls_platform_zeroize( L, sizeof( L ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700147
Simon Butcher327398a2016-10-05 14:09:11 +0100148 block_size = ctx->cipher_info->block_size;
149
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000150 /* Calculate Ek(0) */
Simon Butcher327398a2016-10-05 14:09:11 +0100151 if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700152 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000153
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000154 /*
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000155 * Generate K1 and K2
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000156 */
Simon Butcher327398a2016-10-05 14:09:11 +0100157 if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700158 goto exit;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000159
Simon Butcher327398a2016-10-05 14:09:11 +0100160 if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 )
161 goto exit;
162
163exit:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500164 mbedtls_platform_zeroize( L, sizeof( L ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100165
166 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000167}
Ron Eldor621080d2017-12-21 10:57:43 +0200168#endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000169
Ron Eldor621080d2017-12-21 10:57:43 +0200170#if !defined(MBEDTLS_CMAC_ALT)
Simon Butcher69283e52016-10-06 12:49:58 +0100171static void cmac_xor_block( unsigned char *output, const unsigned char *input1,
172 const unsigned char *input2,
173 const size_t block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000174{
Hanno Becker61937d42017-04-26 15:01:23 +0100175 size_t idx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000176
Hanno Becker61937d42017-04-26 15:01:23 +0100177 for( idx = 0; idx < block_size; idx++ )
178 output[ idx ] = input1[ idx ] ^ input2[ idx ];
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000179}
180
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000181/*
182 * Create padded last block from (partial) last block.
183 *
184 * We can't use the padding option from the cipher layer, as it only works for
185 * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition.
186 */
Simon Butcher69283e52016-10-06 12:49:58 +0100187static void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX],
Brian Murray53e23b62016-09-13 14:00:15 -0700188 size_t padded_block_len,
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000189 const unsigned char *last_block,
Brian Murrayb0c3c432016-05-18 14:29:51 -0700190 size_t last_block_len )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000191{
192 size_t j;
193
Brian Murrayb0c3c432016-05-18 14:29:51 -0700194 for( j = 0; j < padded_block_len; j++ )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000195 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700196 if( j < last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000197 padded_block[j] = last_block[j];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700198 else if( j == last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000199 padded_block[j] = 0x80;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000200 else
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000201 padded_block[j] = 0x00;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000202 }
203}
204
Simon Butcher327398a2016-10-05 14:09:11 +0100205int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,
Simon Butcher94ffde72016-10-05 15:33:53 +0100206 const unsigned char *key, size_t keybits )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000207{
Simon Butcher327398a2016-10-05 14:09:11 +0100208 mbedtls_cipher_type_t type;
209 mbedtls_cmac_context_t *cmac_ctx;
Simon Butcher327398a2016-10-05 14:09:11 +0100210 int retval;
211
Unknown2384f7f2018-12-24 05:10:59 -0500212 CMAC_VALIDATE_RET( ctx != NULL );
213 CMAC_VALIDATE_RET( ctx->cipher_info != NULL );
214 CMAC_VALIDATE_RET( key != NULL );
Simon Butcher327398a2016-10-05 14:09:11 +0100215
Simon B3249cb72016-11-03 01:11:37 +0000216 if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits,
Simon Butcher327398a2016-10-05 14:09:11 +0100217 MBEDTLS_ENCRYPT ) ) != 0 )
218 return( retval );
219
Simon Butcher327398a2016-10-05 14:09:11 +0100220 type = ctx->cipher_info->type;
221
222 switch( type )
223 {
224 case MBEDTLS_CIPHER_AES_128_ECB:
225 case MBEDTLS_CIPHER_AES_192_ECB:
226 case MBEDTLS_CIPHER_AES_256_ECB:
227 case MBEDTLS_CIPHER_DES_EDE3_ECB:
228 break;
229 default:
230 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
231 }
232
233 /* Allocated and initialise in the cipher context memory for the CMAC
234 * context */
235 cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) );
236 if( cmac_ctx == NULL )
237 return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );
238
239 ctx->cmac_ctx = cmac_ctx;
240
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500241 mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100242
243 return 0;
244}
245
246int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,
247 const unsigned char *input, size_t ilen )
248{
249 mbedtls_cmac_context_t* cmac_ctx;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700250 unsigned char *state;
Simon B3249cb72016-11-03 01:11:37 +0000251 int ret = 0;
252 size_t n, j, olen, block_size;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700253
Unknown2384f7f2018-12-24 05:10:59 -0500254 CMAC_VALIDATE_RET( ctx != NULL );
255 CMAC_VALIDATE_RET( ctx->cipher_info != NULL );
256 CMAC_VALIDATE_RET( ilen == 0 || input != NULL );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700257
Simon Butcher327398a2016-10-05 14:09:11 +0100258 cmac_ctx = ctx->cmac_ctx;
259 block_size = ctx->cipher_info->block_size;
260 state = ctx->cmac_ctx->state;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000261
Simon Butcher6b0774a2016-10-10 21:37:42 +0100262 /* Is there data still to process from the last call, that's greater in
263 * size than a block? */
Simon Butcher327398a2016-10-05 14:09:11 +0100264 if( cmac_ctx->unprocessed_len > 0 &&
Andres AGa592dcc2016-10-06 15:23:39 +0100265 ilen > block_size - cmac_ctx->unprocessed_len )
Brian Murray57863ad2016-05-19 16:38:36 -0700266 {
Simon Butcher327398a2016-10-05 14:09:11 +0100267 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
268 input,
269 block_size - cmac_ctx->unprocessed_len );
270
271 cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size );
272
273 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
274 &olen ) ) != 0 )
275 {
276 goto exit;
277 }
278
Simon Butcher6b0774a2016-10-10 21:37:42 +0100279 input += block_size - cmac_ctx->unprocessed_len;
280 ilen -= block_size - cmac_ctx->unprocessed_len;
Simon Butcher327398a2016-10-05 14:09:11 +0100281 cmac_ctx->unprocessed_len = 0;
Brian Murray57863ad2016-05-19 16:38:36 -0700282 }
283
Simon Butcher327398a2016-10-05 14:09:11 +0100284 /* n is the number of blocks including any final partial block */
285 n = ( ilen + block_size - 1 ) / block_size;
286
Simon B3249cb72016-11-03 01:11:37 +0000287 /* Iterate across the input data in block sized chunks, excluding any
288 * final partial or complete block */
289 for( j = 1; j < n; j++ )
Brian Murray57863ad2016-05-19 16:38:36 -0700290 {
Simon Butcher327398a2016-10-05 14:09:11 +0100291 cmac_xor_block( state, input, state, block_size );
292
293 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
294 &olen ) ) != 0 )
295 goto exit;
296
297 ilen -= block_size;
298 input += block_size;
Brian Murray57863ad2016-05-19 16:38:36 -0700299 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000300
Simon Butcher327398a2016-10-05 14:09:11 +0100301 /* If there is data left over that wasn't aligned to a block */
302 if( ilen > 0 )
303 {
Simon Butcher6b0774a2016-10-10 21:37:42 +0100304 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
305 input,
306 ilen );
307 cmac_ctx->unprocessed_len += ilen;
Simon Butcher327398a2016-10-05 14:09:11 +0100308 }
309
310exit:
311 return( ret );
312}
313
314int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,
315 unsigned char *output )
316{
317 mbedtls_cmac_context_t* cmac_ctx;
Simon Butcher69283e52016-10-06 12:49:58 +0100318 unsigned char *state, *last_block;
319 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
320 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
321 unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100322 int ret;
323 size_t olen, block_size;
324
Unknown2384f7f2018-12-24 05:10:59 -0500325 CMAC_VALIDATE_RET( ctx != NULL );
326 CMAC_VALIDATE_RET( ctx->cipher_info != NULL );
327 CMAC_VALIDATE_RET( ctx->cmac_ctx != NULL );
Simon Butcher327398a2016-10-05 14:09:11 +0100328
329 cmac_ctx = ctx->cmac_ctx;
330 block_size = ctx->cipher_info->block_size;
331 state = cmac_ctx->state;
332
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500333 mbedtls_platform_zeroize( K1, sizeof( K1 ) );
334 mbedtls_platform_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100335 cmac_generate_subkeys( ctx, K1, K2 );
336
Simon Butcher69283e52016-10-06 12:49:58 +0100337 last_block = cmac_ctx->unprocessed_block;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000338
339 /* Calculate last block */
Janos Follathe3d882a2016-10-11 10:49:26 +0100340 if( cmac_ctx->unprocessed_len < block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000341 {
Simon Butcher327398a2016-10-05 14:09:11 +0100342 cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len );
343 cmac_xor_block( M_last, M_last, K2, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000344 }
345 else
346 {
Manuel Pégourié-Gonnard2c063062016-01-13 14:27:55 +0000347 /* Last block is complete block */
Simon Butcher327398a2016-10-05 14:09:11 +0100348 cmac_xor_block( M_last, last_block, K1, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000349 }
350
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000351
Simon Butcher327398a2016-10-05 14:09:11 +0100352 cmac_xor_block( state, M_last, state, block_size );
353 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
354 &olen ) ) != 0 )
355 {
356 goto exit;
357 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000358
Simon Butcher327398a2016-10-05 14:09:11 +0100359 memcpy( output, state, block_size );
360
361exit:
362 /* Wipe the generated keys on the stack, and any other transients to avoid
363 * side channel leakage */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500364 mbedtls_platform_zeroize( K1, sizeof( K1 ) );
365 mbedtls_platform_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100366
367 cmac_ctx->unprocessed_len = 0;
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500368 mbedtls_platform_zeroize( cmac_ctx->unprocessed_block,
369 sizeof( cmac_ctx->unprocessed_block ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100370
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500371 mbedtls_platform_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX );
Simon Butcher327398a2016-10-05 14:09:11 +0100372 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000373}
374
Simon Butcher327398a2016-10-05 14:09:11 +0100375int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000376{
Simon Butcher327398a2016-10-05 14:09:11 +0100377 mbedtls_cmac_context_t* cmac_ctx;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000378
Unknown2384f7f2018-12-24 05:10:59 -0500379 CMAC_VALIDATE_RET( ctx != NULL );
380 CMAC_VALIDATE_RET( ctx->cipher_info != NULL );
381 CMAC_VALIDATE_RET( ctx->cmac_ctx != NULL );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700382
Simon Butcher327398a2016-10-05 14:09:11 +0100383 cmac_ctx = ctx->cmac_ctx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000384
Simon Butcher327398a2016-10-05 14:09:11 +0100385 /* Reset the internal state */
386 cmac_ctx->unprocessed_len = 0;
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500387 mbedtls_platform_zeroize( cmac_ctx->unprocessed_block,
388 sizeof( cmac_ctx->unprocessed_block ) );
389 mbedtls_platform_zeroize( cmac_ctx->state,
390 sizeof( cmac_ctx->state ) );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000391
Simon Butcher327398a2016-10-05 14:09:11 +0100392 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000393}
394
Simon Butcher327398a2016-10-05 14:09:11 +0100395int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
396 const unsigned char *key, size_t keylen,
397 const unsigned char *input, size_t ilen,
398 unsigned char *output )
399{
400 mbedtls_cipher_context_t ctx;
401 int ret;
402
Unknown2384f7f2018-12-24 05:10:59 -0500403 CMAC_VALIDATE_RET( cipher_info != NULL );
404 CMAC_VALIDATE_RET( key != NULL );
405 CMAC_VALIDATE_RET( ilen == 0 || input != NULL );
406 CMAC_VALIDATE_RET( output != NULL );
Simon Butcher327398a2016-10-05 14:09:11 +0100407
408 mbedtls_cipher_init( &ctx );
409
410 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
411 goto exit;
412
413 ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen );
Simon Butcher327398a2016-10-05 14:09:11 +0100414 if( ret != 0 )
415 goto exit;
Simon Butcher327398a2016-10-05 14:09:11 +0100416
417 ret = mbedtls_cipher_cmac_update( &ctx, input, ilen );
418 if( ret != 0 )
419 goto exit;
420
Simon Butcher69283e52016-10-06 12:49:58 +0100421 ret = mbedtls_cipher_cmac_finish( &ctx, output );
Simon Butcher327398a2016-10-05 14:09:11 +0100422
423exit:
Simon Butcher69283e52016-10-06 12:49:58 +0100424 mbedtls_cipher_free( &ctx );
425
Simon Butcher327398a2016-10-05 14:09:11 +0100426 return( ret );
427}
Simon Butcher327398a2016-10-05 14:09:11 +0100428
Simon Butcher69283e52016-10-06 12:49:58 +0100429#if defined(MBEDTLS_AES_C)
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000430/*
Simon Butcher69283e52016-10-06 12:49:58 +0100431 * Implementation of AES-CMAC-PRF-128 defined in RFC 4615
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000432 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700433int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length,
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000434 const unsigned char *input, size_t in_len,
Simon Butcher327398a2016-10-05 14:09:11 +0100435 unsigned char *output )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000436{
437 int ret;
Simon Butcher327398a2016-10-05 14:09:11 +0100438 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100439 unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE];
440 unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE];
441
Unknown2384f7f2018-12-24 05:10:59 -0500442 CMAC_VALIDATE_RET( key != NULL );
443 CMAC_VALIDATE_RET( in_len == 0 || input != NULL );
444 CMAC_VALIDATE_RET( output != NULL );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000445
Simon Butcher327398a2016-10-05 14:09:11 +0100446 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
447 if( cipher_info == NULL )
448 {
449 /* Failing at this point must be due to a build issue */
450 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
451 goto exit;
452 }
Brian Murrayb0c3c432016-05-18 14:29:51 -0700453
Simon Butcher69283e52016-10-06 12:49:58 +0100454 if( key_length == MBEDTLS_AES_BLOCK_SIZE )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000455 {
456 /* Use key as is */
Simon Butcher69283e52016-10-06 12:49:58 +0100457 memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000458 }
459 else
460 {
Simon Butcher69283e52016-10-06 12:49:58 +0100461 memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE );
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000462
Simon Butcher327398a2016-10-05 14:09:11 +0100463 ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key,
464 key_length, int_key );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000465 if( ret != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700466 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000467 }
468
Simon Butcher327398a2016-10-05 14:09:11 +0100469 ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len,
470 output );
Manuel Pégourié-Gonnardd6cf7542016-01-13 11:30:00 +0000471
Simon Butcher327398a2016-10-05 14:09:11 +0100472exit:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500473 mbedtls_platform_zeroize( int_key, sizeof( int_key ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700474
Simon Butcher327398a2016-10-05 14:09:11 +0100475 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000476}
Brian Murrayb439d452016-05-19 16:02:42 -0700477#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000478
Steven Cooreman63342772017-04-04 11:47:16 +0200479#endif /* !MBEDTLS_CMAC_ALT */
480
Simon Butcher69283e52016-10-06 12:49:58 +0100481#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000482/*
Janos Follathcd13bd22016-12-13 11:51:04 +0000483 * CMAC test data for SP800-38B
484 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf
485 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf
Brian Murray0f6af732016-05-19 15:59:23 -0700486 *
487 * AES-CMAC-PRF-128 test data from RFC 4615
488 * https://tools.ietf.org/html/rfc4615#page-4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000489 */
490
Brian Murray0f6af732016-05-19 15:59:23 -0700491#define NB_CMAC_TESTS_PER_KEY 4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000492#define NB_PRF_TESTS 3
Simon Butcher327398a2016-10-05 14:09:11 +0100493
Brian Murray0f6af732016-05-19 15:59:23 -0700494#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)
495/* All CMAC test inputs are truncated from the same 64 byte buffer. */
496static const unsigned char test_message[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000497 /* PT */
498 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
499 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
500 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
501 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
502 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
503 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
504 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
505 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000506};
Simon Butcher69283e52016-10-06 12:49:58 +0100507#endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */
Brian Murray0cf14c12016-05-23 12:49:50 -0700508
Simon Butcher69283e52016-10-06 12:49:58 +0100509#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700510/* Truncation point of message for AES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700511static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000512 /* Mlen */
Brian Murray0f6af732016-05-19 15:59:23 -0700513 0,
514 16,
Janos Follathcd13bd22016-12-13 11:51:04 +0000515 20,
Brian Murray0f6af732016-05-19 15:59:23 -0700516 64
517};
518
Janos Follathcd13bd22016-12-13 11:51:04 +0000519/* CMAC-AES128 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700520static const unsigned char aes_128_key[16] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000521 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
522 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
Brian Murray0f6af732016-05-19 15:59:23 -0700523};
Simon Butcher69283e52016-10-06 12:49:58 +0100524static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700525 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000526 /* K1 */
527 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66,
528 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde
Brian Murray0f6af732016-05-19 15:59:23 -0700529 },
530 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000531 /* K2 */
532 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc,
533 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b
Brian Murray0f6af732016-05-19 15:59:23 -0700534 }
535};
Simon Butcher69283e52016-10-06 12:49:58 +0100536static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000537 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000538 /* Example #1 */
539 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
540 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000541 },
542 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000543 /* Example #2 */
544 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
545 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000546 },
547 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000548 /* Example #3 */
549 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8,
550 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000551 },
552 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000553 /* Example #4 */
554 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
555 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000556 }
557};
558
Janos Follathcd13bd22016-12-13 11:51:04 +0000559/* CMAC-AES192 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700560static const unsigned char aes_192_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000561 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
562 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
563 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000564};
Simon Butcher69283e52016-10-06 12:49:58 +0100565static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700566 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000567 /* K1 */
568 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27,
569 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96
Brian Murrayb0c3c432016-05-18 14:29:51 -0700570 },
571 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000572 /* K2 */
573 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e,
574 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c
Brian Murrayb0c3c432016-05-18 14:29:51 -0700575 }
576};
Simon Butcher69283e52016-10-06 12:49:58 +0100577static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700578 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000579 /* Example #1 */
580 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5,
581 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67
Brian Murrayb0c3c432016-05-18 14:29:51 -0700582 },
583 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000584 /* Example #2 */
585 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90,
586 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84
Brian Murrayb0c3c432016-05-18 14:29:51 -0700587 },
588 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000589 /* Example #3 */
590 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04,
591 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8
Brian Murrayb0c3c432016-05-18 14:29:51 -0700592 },
593 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000594 /* Example #4 */
595 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79,
596 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11
Brian Murrayb0c3c432016-05-18 14:29:51 -0700597 }
598};
599
Janos Follathcd13bd22016-12-13 11:51:04 +0000600/* CMAC-AES256 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700601static const unsigned char aes_256_key[32] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000602 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
603 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
604 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
605 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
Brian Murray0f6af732016-05-19 15:59:23 -0700606};
Simon Butcher69283e52016-10-06 12:49:58 +0100607static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700608 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000609 /* K1 */
610 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac,
611 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f
Brian Murray0f6af732016-05-19 15:59:23 -0700612 },
613 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000614 /* K2 */
615 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58,
616 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700617 }
618};
Simon Butcher69283e52016-10-06 12:49:58 +0100619static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700620 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000621 /* Example #1 */
622 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e,
623 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83
Brian Murray0f6af732016-05-19 15:59:23 -0700624 },
625 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000626 /* Example #2 */
627 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82,
628 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c
Brian Murray0f6af732016-05-19 15:59:23 -0700629 },
630 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000631 /* Example #3 */
632 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a,
633 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93
Brian Murray0f6af732016-05-19 15:59:23 -0700634 },
635 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000636 /* Example #4 */
637 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5,
638 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10
Brian Murray0f6af732016-05-19 15:59:23 -0700639 }
640};
641#endif /* MBEDTLS_AES_C */
642
Simon Butcher69283e52016-10-06 12:49:58 +0100643#if defined(MBEDTLS_DES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700644/* Truncation point of message for 3DES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700645static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700646 0,
Janos Follathcd13bd22016-12-13 11:51:04 +0000647 16,
Brian Murray0f6af732016-05-19 15:59:23 -0700648 20,
649 32
650};
651
Janos Follathcd13bd22016-12-13 11:51:04 +0000652/* CMAC-TDES (Generation) - 2 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700653static const unsigned char des3_2key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000654 /* Key1 */
655 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
656 /* Key2 */
657 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01,
658 /* Key3 */
659 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
Brian Murray0f6af732016-05-19 15:59:23 -0700660};
661static const unsigned char des3_2key_subkeys[2][8] = {
662 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000663 /* K1 */
664 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700665 },
666 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000667 /* K2 */
668 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2
Brian Murray0f6af732016-05-19 15:59:23 -0700669 }
670};
Simon Butcher69283e52016-10-06 12:49:58 +0100671static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700672 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000673 /* Sample #1 */
674 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60
Brian Murrayb0c3c432016-05-18 14:29:51 -0700675 },
676 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000677 /* Sample #2 */
678 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b
Brian Murrayb0c3c432016-05-18 14:29:51 -0700679 },
680 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000681 /* Sample #3 */
682 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69
Brian Murrayb0c3c432016-05-18 14:29:51 -0700683 },
684 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000685 /* Sample #4 */
686 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb
Brian Murrayb0c3c432016-05-18 14:29:51 -0700687 }
688};
689
Janos Follathcd13bd22016-12-13 11:51:04 +0000690/* CMAC-TDES (Generation) - 3 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700691static const unsigned char des3_3key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000692 /* Key1 */
693 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef,
694 /* Key2 */
695 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,
696 /* Key3 */
697 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23
Brian Murray0f6af732016-05-19 15:59:23 -0700698};
699static const unsigned char des3_3key_subkeys[2][8] = {
700 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000701 /* K1 */
702 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0
Brian Murray0f6af732016-05-19 15:59:23 -0700703 },
704 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000705 /* K2 */
706 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b
Brian Murray0f6af732016-05-19 15:59:23 -0700707 }
708};
Simon Butcher69283e52016-10-06 12:49:58 +0100709static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700710 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000711 /* Sample #1 */
712 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50
Brian Murrayb0c3c432016-05-18 14:29:51 -0700713 },
714 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000715 /* Sample #2 */
716 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09
Brian Murrayb0c3c432016-05-18 14:29:51 -0700717 },
718 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000719 /* Sample #3 */
720 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2
Brian Murrayb0c3c432016-05-18 14:29:51 -0700721 },
722 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000723 /* Sample #4 */
724 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5
Brian Murrayb0c3c432016-05-18 14:29:51 -0700725 }
726};
727
Brian Murray0f6af732016-05-19 15:59:23 -0700728#endif /* MBEDTLS_DES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700729
Simon Butcher69283e52016-10-06 12:49:58 +0100730#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700731/* AES AES-CMAC-PRF-128 Test Data */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000732static const unsigned char PRFK[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000733 /* Key */
734 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
735 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000736 0xed, 0xcb
737};
738
739/* Sizes in bytes */
740static const size_t PRFKlen[NB_PRF_TESTS] = {
741 18,
742 16,
743 10
744};
745
Janos Follathcd13bd22016-12-13 11:51:04 +0000746/* Message */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000747static const unsigned char PRFM[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000748 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
749 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000750 0x10, 0x11, 0x12, 0x13
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000751};
752
753static const unsigned char PRFT[NB_PRF_TESTS][16] = {
754 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000755 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b,
756 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000757 },
758 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000759 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52,
760 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000761 },
762 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000763 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee,
764 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000765 }
766};
Brian Murray0f6af732016-05-19 15:59:23 -0700767#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000768
Simon Butcher327398a2016-10-05 14:09:11 +0100769static int cmac_test_subkeys( int verbose,
770 const char* testname,
771 const unsigned char* key,
772 int keybits,
773 const unsigned char* subkeys,
774 mbedtls_cipher_type_t cipher_type,
775 int block_size,
776 int num_tests )
777{
Brian Murray2fab5c92016-12-15 18:51:13 -0800778 int i, ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100779 mbedtls_cipher_context_t ctx;
780 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100781 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
782 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100783
784 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
785 if( cipher_info == NULL )
786 {
787 /* Failing at this point must be due to a build issue */
Simon Butcher69283e52016-10-06 12:49:58 +0100788 return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
Simon Butcher327398a2016-10-05 14:09:11 +0100789 }
790
791 for( i = 0; i < num_tests; i++ )
792 {
793 if( verbose != 0 )
Simon Butcher69283e52016-10-06 12:49:58 +0100794 mbedtls_printf( " %s CMAC subkey #%u: ", testname, i + 1 );
Simon Butcher327398a2016-10-05 14:09:11 +0100795
Janos Follathd4443582016-10-12 10:00:42 +0100796 mbedtls_cipher_init( &ctx );
797
Simon Butcher327398a2016-10-05 14:09:11 +0100798 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
799 {
800 if( verbose != 0 )
801 mbedtls_printf( "test execution failed\n" );
802
Janos Follathd4443582016-10-12 10:00:42 +0100803 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100804 }
805
806 if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits,
807 MBEDTLS_ENCRYPT ) ) != 0 )
808 {
809 if( verbose != 0 )
810 mbedtls_printf( "test execution failed\n" );
811
Janos Follathd4443582016-10-12 10:00:42 +0100812 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100813 }
814
815 ret = cmac_generate_subkeys( &ctx, K1, K2 );
816 if( ret != 0 )
817 {
818 if( verbose != 0 )
819 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100820
821 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100822 }
823
Simon Butcher420be4e2016-10-07 12:55:43 +0100824 if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0 ||
825 ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100826 {
827 if( verbose != 0 )
828 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100829
830 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100831 }
832
833 if( verbose != 0 )
834 mbedtls_printf( "passed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100835
836 mbedtls_cipher_free( &ctx );
Simon Butcher327398a2016-10-05 14:09:11 +0100837 }
838
Gilles Peskinedf761d52018-03-01 22:18:14 +0100839 ret = 0;
Janos Follathd4443582016-10-12 10:00:42 +0100840 goto exit;
841
842cleanup:
Simon Butcher69283e52016-10-06 12:49:58 +0100843 mbedtls_cipher_free( &ctx );
844
Janos Follathd4443582016-10-12 10:00:42 +0100845exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100846 return( ret );
847}
848
Simon Butcher69283e52016-10-06 12:49:58 +0100849static int cmac_test_wth_cipher( int verbose,
850 const char* testname,
851 const unsigned char* key,
852 int keybits,
853 const unsigned char* messages,
854 const unsigned int message_lengths[4],
855 const unsigned char* expected_result,
856 mbedtls_cipher_type_t cipher_type,
857 int block_size,
858 int num_tests )
Brian Murray00dc5f02016-05-19 14:23:50 -0700859{
Simon Butcher327398a2016-10-05 14:09:11 +0100860 const mbedtls_cipher_info_t *cipher_info;
Brian Murray2fab5c92016-12-15 18:51:13 -0800861 int i, ret = 0;
Simon Butcher69283e52016-10-06 12:49:58 +0100862 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murray57863ad2016-05-19 16:38:36 -0700863
Simon Butcher327398a2016-10-05 14:09:11 +0100864 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
865 if( cipher_info == NULL )
Brian Murray00dc5f02016-05-19 14:23:50 -0700866 {
Simon Butcher327398a2016-10-05 14:09:11 +0100867 /* Failing at this point must be due to a build issue */
868 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
Brian Murray00dc5f02016-05-19 14:23:50 -0700869 goto exit;
870 }
871
872 for( i = 0; i < num_tests; i++ )
873 {
874 if( verbose != 0 )
Andres AGa592dcc2016-10-06 15:23:39 +0100875 mbedtls_printf( " %s CMAC #%u: ", testname, i + 1 );
Brian Murray00dc5f02016-05-19 14:23:50 -0700876
Simon Butcher327398a2016-10-05 14:09:11 +0100877 if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages,
878 message_lengths[i], output ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700879 {
880 if( verbose != 0 )
881 mbedtls_printf( "failed\n" );
882 goto exit;
883 }
Brian Murray9ce2e092016-05-24 22:46:43 -0700884
Simon Butcher327398a2016-10-05 14:09:11 +0100885 if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700886 {
887 if( verbose != 0 )
888 mbedtls_printf( "failed\n" );
889 goto exit;
890 }
891
Brian Murray9ce2e092016-05-24 22:46:43 -0700892 if( verbose != 0 )
893 mbedtls_printf( "passed\n" );
Brian Murray00dc5f02016-05-19 14:23:50 -0700894 }
Gilles Peskinedf761d52018-03-01 22:18:14 +0100895 ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100896
Simon Butcher69283e52016-10-06 12:49:58 +0100897exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100898 return( ret );
Brian Murray00dc5f02016-05-19 14:23:50 -0700899}
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000900
Simon Butcher69283e52016-10-06 12:49:58 +0100901#if defined(MBEDTLS_AES_C)
902static int test_aes128_cmac_prf( int verbose )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700903{
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000904 int i;
905 int ret;
Simon Butcher69283e52016-10-06 12:49:58 +0100906 unsigned char output[MBEDTLS_AES_BLOCK_SIZE];
Simon Butcher327398a2016-10-05 14:09:11 +0100907
Brian Murrayb0c3c432016-05-18 14:29:51 -0700908 for( i = 0; i < NB_PRF_TESTS; i++ )
909 {
Brian Murray0f6af732016-05-19 15:59:23 -0700910 mbedtls_printf( " AES CMAC 128 PRF #%u: ", i );
Simon Butcher327398a2016-10-05 14:09:11 +0100911 ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700912 if( ret != 0 ||
Simon Butcher69283e52016-10-06 12:49:58 +0100913 memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700914 {
Simon Butcher327398a2016-10-05 14:09:11 +0100915
Brian Murrayb0c3c432016-05-18 14:29:51 -0700916 if( verbose != 0 )
917 mbedtls_printf( "failed\n" );
918
Brian Murray0f6af732016-05-19 15:59:23 -0700919 return( ret );
Simon Butcher69283e52016-10-06 12:49:58 +0100920 }
921 else if( verbose != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700922 {
923 mbedtls_printf( "passed\n" );
924 }
925 }
Brian Murray0f6af732016-05-19 15:59:23 -0700926 return( ret );
927}
928#endif /* MBEDTLS_AES_C */
929
930int mbedtls_cmac_self_test( int verbose )
931{
932 int ret;
Simon Butcher327398a2016-10-05 14:09:11 +0100933
Simon Butcher69283e52016-10-06 12:49:58 +0100934#if defined(MBEDTLS_AES_C)
Simon Butcher327398a2016-10-05 14:09:11 +0100935 /* AES-128 */
936 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100937 "AES 128",
938 aes_128_key,
939 128,
940 (const unsigned char*)aes_128_subkeys,
941 MBEDTLS_CIPHER_AES_128_ECB,
942 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100943 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100944 {
945 return( ret );
946 }
947
Brian Murrayae1cb122016-05-23 15:01:59 -0700948 if( ( ret = cmac_test_wth_cipher( verbose,
949 "AES 128",
950 aes_128_key,
951 128,
952 test_message,
953 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100954 (const unsigned char*)aes_128_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100955 MBEDTLS_CIPHER_AES_128_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100956 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100957 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100958 {
959 return( ret );
960 }
961
962 /* AES-192 */
963 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100964 "AES 192",
965 aes_192_key,
966 192,
967 (const unsigned char*)aes_192_subkeys,
968 MBEDTLS_CIPHER_AES_192_ECB,
969 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100970 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -0700971 {
972 return( ret );
973 }
Brian Murray0f6af732016-05-19 15:59:23 -0700974
Brian Murrayae1cb122016-05-23 15:01:59 -0700975 if( ( ret = cmac_test_wth_cipher( verbose,
976 "AES 192",
977 aes_192_key,
978 192,
979 test_message,
980 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100981 (const unsigned char*)aes_192_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100982 MBEDTLS_CIPHER_AES_192_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100983 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100984 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100985 {
Simon Butcher327398a2016-10-05 14:09:11 +0100986 return( ret );
987 }
988
989 /* AES-256 */
990 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100991 "AES 256",
992 aes_256_key,
993 256,
994 (const unsigned char*)aes_256_subkeys,
995 MBEDTLS_CIPHER_AES_256_ECB,
996 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100997 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -0700998 {
999 return( ret );
1000 }
Brian Murray0f6af732016-05-19 15:59:23 -07001001
Simon Butcher69283e52016-10-06 12:49:58 +01001002 if( ( ret = cmac_test_wth_cipher ( verbose,
Brian Murrayae1cb122016-05-23 15:01:59 -07001003 "AES 256",
1004 aes_256_key,
1005 256,
1006 test_message,
1007 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001008 (const unsigned char*)aes_256_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001009 MBEDTLS_CIPHER_AES_256_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001010 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001011 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001012 {
1013 return( ret );
1014 }
Brian Murray0f6af732016-05-19 15:59:23 -07001015#endif /* MBEDTLS_AES_C */
1016
Simon Butcher69283e52016-10-06 12:49:58 +01001017#if defined(MBEDTLS_DES_C)
Simon Butcher327398a2016-10-05 14:09:11 +01001018 /* 3DES 2 key */
1019 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001020 "3DES 2 key",
1021 des3_2key_key,
1022 192,
1023 (const unsigned char*)des3_2key_subkeys,
1024 MBEDTLS_CIPHER_DES_EDE3_ECB,
1025 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001026 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001027 {
1028 return( ret );
1029 }
1030
Brian Murrayae1cb122016-05-23 15:01:59 -07001031 if( ( ret = cmac_test_wth_cipher( verbose,
1032 "3DES 2 key",
1033 des3_2key_key,
1034 192,
1035 test_message,
1036 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001037 (const unsigned char*)des3_2key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001038 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001039 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001040 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001041 {
1042 return( ret );
1043 }
Brian Murray0f6af732016-05-19 15:59:23 -07001044
Simon Butcher327398a2016-10-05 14:09:11 +01001045 /* 3DES 3 key */
1046 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001047 "3DES 3 key",
1048 des3_3key_key,
1049 192,
1050 (const unsigned char*)des3_3key_subkeys,
1051 MBEDTLS_CIPHER_DES_EDE3_ECB,
1052 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001053 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001054 {
1055 return( ret );
1056 }
1057
Brian Murrayae1cb122016-05-23 15:01:59 -07001058 if( ( ret = cmac_test_wth_cipher( verbose,
1059 "3DES 3 key",
1060 des3_3key_key,
1061 192,
1062 test_message,
1063 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001064 (const unsigned char*)des3_3key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001065 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001066 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001067 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001068 {
1069 return( ret );
1070 }
Brian Murray0f6af732016-05-19 15:59:23 -07001071#endif /* MBEDTLS_DES_C */
1072
Simon Butcher69283e52016-10-06 12:49:58 +01001073#if defined(MBEDTLS_AES_C)
Simon Butcher420be4e2016-10-07 12:55:43 +01001074 if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001075 return( ret );
Brian Murray0f6af732016-05-19 15:59:23 -07001076#endif /* MBEDTLS_AES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -07001077
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001078 if( verbose != 0 )
1079 mbedtls_printf( "\n" );
Brian Murray0f6af732016-05-19 15:59:23 -07001080
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001081 return( 0 );
1082}
1083
Brian Murray0f6af732016-05-19 15:59:23 -07001084#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001085
1086#endif /* MBEDTLS_CMAC_C */