blob: 3a48a620434496d36150151b3632a4b9cc11d1cc [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
Gilles Peskinedb09ef62020-06-03 01:43:33 +020043#include "common.h"
Robert Cragie3d23b1d2015-12-15 07:38:11 +000044
45#if defined(MBEDTLS_CMAC_C)
46
47#include "mbedtls/cmac.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050048#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000049#include "mbedtls/error.h"
Robert Cragie3d23b1d2015-12-15 07:38:11 +000050
51#include <string.h>
52
Brian Murray8b4111c2016-09-13 15:58:46 -070053
Robert Cragie3d23b1d2015-12-15 07:38:11 +000054#if defined(MBEDTLS_PLATFORM_C)
55#include "mbedtls/platform.h"
56#else
Brian Murray8b4111c2016-09-13 15:58:46 -070057#include <stdlib.h>
58#define mbedtls_calloc calloc
59#define mbedtls_free free
Simon Butcherd241f1c2016-10-06 10:39:49 +010060#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +000061#include <stdio.h>
Brian Murray8b4111c2016-09-13 15:58:46 -070062#define mbedtls_printf printf
Brian J Murray2adecba2016-11-06 04:45:15 -080063#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +000064#endif /* MBEDTLS_PLATFORM_C */
Brian Murray8b4111c2016-09-13 15:58:46 -070065
Ron Eldor621080d2017-12-21 10:57:43 +020066#if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST)
Steven Cooreman63342772017-04-04 11:47:16 +020067
Robert Cragie3d23b1d2015-12-15 07:38:11 +000068/*
Brian Murrayb0c3c432016-05-18 14:29:51 -070069 * Multiplication by u in the Galois field of GF(2^n)
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +000070 *
Brian Murray72b69e32016-09-13 14:21:01 -070071 * As explained in NIST SP 800-38B, this can be computed:
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +000072 *
Simon Butcher327398a2016-10-05 14:09:11 +010073 * If MSB(p) = 0, then p = (p << 1)
74 * If MSB(p) = 1, then p = (p << 1) ^ R_n
75 * with R_64 = 0x1B and R_128 = 0x87
76 *
77 * Input and output MUST NOT point to the same buffer
Brian J Murray2adecba2016-11-06 04:45:15 -080078 * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000079 */
Brian Murrayb0c3c432016-05-18 14:29:51 -070080static int cmac_multiply_by_u( unsigned char *output,
81 const unsigned char *input,
Brian Murray53e23b62016-09-13 14:00:15 -070082 size_t blocksize )
Robert Cragie3d23b1d2015-12-15 07:38:11 +000083{
Brian Murrayb0c3c432016-05-18 14:29:51 -070084 const unsigned char R_128 = 0x87;
85 const unsigned char R_64 = 0x1B;
86 unsigned char R_n, mask;
87 unsigned char overflow = 0x00;
Simon Butcher327398a2016-10-05 14:09:11 +010088 int i;
Brian Murrayb0c3c432016-05-18 14:29:51 -070089
Simon Butcher69283e52016-10-06 12:49:58 +010090 if( blocksize == MBEDTLS_AES_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -070091 {
Brian Murrayb0c3c432016-05-18 14:29:51 -070092 R_n = R_128;
Simon Butcher327398a2016-10-05 14:09:11 +010093 }
Simon Butcher69283e52016-10-06 12:49:58 +010094 else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -070095 {
Brian Murrayb0c3c432016-05-18 14:29:51 -070096 R_n = R_64;
Simon Butcher327398a2016-10-05 14:09:11 +010097 }
98 else
Brian Murray6a3c0d22016-05-20 18:25:43 -070099 {
Simon Butcher327398a2016-10-05 14:09:11 +0100100 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700101 }
102
Simon B3249cb72016-11-03 01:11:37 +0000103 for( i = (int)blocksize - 1; i >= 0; i-- )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000104 {
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000105 output[i] = input[i] << 1 | overflow;
106 overflow = input[i] >> 7;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000107 }
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000108
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000109 /* mask = ( input[0] >> 7 ) ? 0xff : 0x00
110 * using bit operations to avoid branches */
Simon Butcher327398a2016-10-05 14:09:11 +0100111
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000112 /* MSVC has a warning about unary minus on unsigned, but this is
113 * well-defined and precisely what we want to do here */
114#if defined(_MSC_VER)
115#pragma warning( push )
116#pragma warning( disable : 4146 )
117#endif
118 mask = - ( input[0] >> 7 );
119#if defined(_MSC_VER)
120#pragma warning( pop )
121#endif
122
Simon Butcher327398a2016-10-05 14:09:11 +0100123 output[ blocksize - 1 ] ^= R_n & mask;
124
Brian Murrayb439d452016-05-19 16:02:42 -0700125 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000126}
127
128/*
129 * Generate subkeys
Simon Butcher327398a2016-10-05 14:09:11 +0100130 *
131 * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000132 */
Simon Butcher327398a2016-10-05 14:09:11 +0100133static int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx,
134 unsigned char* K1, unsigned char* K2 )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000135{
Janos Follath24eed8d2019-11-22 13:21:35 +0000136 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher69283e52016-10-06 12:49:58 +0100137 unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700138 size_t olen, block_size;
139
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500140 mbedtls_platform_zeroize( L, sizeof( L ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700141
Simon Butcher327398a2016-10-05 14:09:11 +0100142 block_size = ctx->cipher_info->block_size;
143
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000144 /* Calculate Ek(0) */
Simon Butcher327398a2016-10-05 14:09:11 +0100145 if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700146 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000147
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000148 /*
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000149 * Generate K1 and K2
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000150 */
Simon Butcher327398a2016-10-05 14:09:11 +0100151 if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700152 goto exit;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000153
Simon Butcher327398a2016-10-05 14:09:11 +0100154 if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 )
155 goto exit;
156
157exit:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500158 mbedtls_platform_zeroize( L, sizeof( L ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100159
160 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000161}
Ron Eldor621080d2017-12-21 10:57:43 +0200162#endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000163
Ron Eldor621080d2017-12-21 10:57:43 +0200164#if !defined(MBEDTLS_CMAC_ALT)
Simon Butcher69283e52016-10-06 12:49:58 +0100165static void cmac_xor_block( unsigned char *output, const unsigned char *input1,
166 const unsigned char *input2,
167 const size_t block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000168{
Hanno Becker61937d42017-04-26 15:01:23 +0100169 size_t idx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000170
Hanno Becker61937d42017-04-26 15:01:23 +0100171 for( idx = 0; idx < block_size; idx++ )
172 output[ idx ] = input1[ idx ] ^ input2[ idx ];
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000173}
174
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000175/*
176 * Create padded last block from (partial) last block.
177 *
178 * We can't use the padding option from the cipher layer, as it only works for
179 * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition.
180 */
Simon Butcher69283e52016-10-06 12:49:58 +0100181static void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX],
Brian Murray53e23b62016-09-13 14:00:15 -0700182 size_t padded_block_len,
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000183 const unsigned char *last_block,
Brian Murrayb0c3c432016-05-18 14:29:51 -0700184 size_t last_block_len )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000185{
186 size_t j;
187
Brian Murrayb0c3c432016-05-18 14:29:51 -0700188 for( j = 0; j < padded_block_len; j++ )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000189 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700190 if( j < last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000191 padded_block[j] = last_block[j];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700192 else if( j == last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000193 padded_block[j] = 0x80;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000194 else
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000195 padded_block[j] = 0x00;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000196 }
197}
198
Simon Butcher327398a2016-10-05 14:09:11 +0100199int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,
Simon Butcher94ffde72016-10-05 15:33:53 +0100200 const unsigned char *key, size_t keybits )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000201{
Simon Butcher327398a2016-10-05 14:09:11 +0100202 mbedtls_cipher_type_t type;
203 mbedtls_cmac_context_t *cmac_ctx;
Simon Butcher327398a2016-10-05 14:09:11 +0100204 int retval;
205
206 if( ctx == NULL || ctx->cipher_info == NULL || key == NULL )
207 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
208
Simon B3249cb72016-11-03 01:11:37 +0000209 if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits,
Simon Butcher327398a2016-10-05 14:09:11 +0100210 MBEDTLS_ENCRYPT ) ) != 0 )
211 return( retval );
212
Simon Butcher327398a2016-10-05 14:09:11 +0100213 type = ctx->cipher_info->type;
214
215 switch( type )
216 {
217 case MBEDTLS_CIPHER_AES_128_ECB:
218 case MBEDTLS_CIPHER_AES_192_ECB:
219 case MBEDTLS_CIPHER_AES_256_ECB:
220 case MBEDTLS_CIPHER_DES_EDE3_ECB:
221 break;
222 default:
223 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
224 }
225
226 /* Allocated and initialise in the cipher context memory for the CMAC
227 * context */
228 cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) );
229 if( cmac_ctx == NULL )
230 return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );
231
232 ctx->cmac_ctx = cmac_ctx;
233
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500234 mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100235
236 return 0;
237}
238
239int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,
240 const unsigned char *input, size_t ilen )
241{
242 mbedtls_cmac_context_t* cmac_ctx;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700243 unsigned char *state;
Simon B3249cb72016-11-03 01:11:37 +0000244 int ret = 0;
245 size_t n, j, olen, block_size;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700246
Simon Butcher327398a2016-10-05 14:09:11 +0100247 if( ctx == NULL || ctx->cipher_info == NULL || input == NULL ||
248 ctx->cmac_ctx == NULL )
249 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700250
Simon Butcher327398a2016-10-05 14:09:11 +0100251 cmac_ctx = ctx->cmac_ctx;
252 block_size = ctx->cipher_info->block_size;
253 state = ctx->cmac_ctx->state;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000254
Simon Butcher6b0774a2016-10-10 21:37:42 +0100255 /* Is there data still to process from the last call, that's greater in
256 * size than a block? */
Simon Butcher327398a2016-10-05 14:09:11 +0100257 if( cmac_ctx->unprocessed_len > 0 &&
Andres AGa592dcc2016-10-06 15:23:39 +0100258 ilen > block_size - cmac_ctx->unprocessed_len )
Brian Murray57863ad2016-05-19 16:38:36 -0700259 {
Simon Butcher327398a2016-10-05 14:09:11 +0100260 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
261 input,
262 block_size - cmac_ctx->unprocessed_len );
263
264 cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size );
265
266 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
267 &olen ) ) != 0 )
268 {
269 goto exit;
270 }
271
Simon Butcher6b0774a2016-10-10 21:37:42 +0100272 input += block_size - cmac_ctx->unprocessed_len;
273 ilen -= block_size - cmac_ctx->unprocessed_len;
Simon Butcher327398a2016-10-05 14:09:11 +0100274 cmac_ctx->unprocessed_len = 0;
Brian Murray57863ad2016-05-19 16:38:36 -0700275 }
276
Simon Butcher327398a2016-10-05 14:09:11 +0100277 /* n is the number of blocks including any final partial block */
278 n = ( ilen + block_size - 1 ) / block_size;
279
Simon B3249cb72016-11-03 01:11:37 +0000280 /* Iterate across the input data in block sized chunks, excluding any
281 * final partial or complete block */
282 for( j = 1; j < n; j++ )
Brian Murray57863ad2016-05-19 16:38:36 -0700283 {
Simon Butcher327398a2016-10-05 14:09:11 +0100284 cmac_xor_block( state, input, state, block_size );
285
286 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
287 &olen ) ) != 0 )
288 goto exit;
289
290 ilen -= block_size;
291 input += block_size;
Brian Murray57863ad2016-05-19 16:38:36 -0700292 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000293
Simon Butcher327398a2016-10-05 14:09:11 +0100294 /* If there is data left over that wasn't aligned to a block */
295 if( ilen > 0 )
296 {
Simon Butcher6b0774a2016-10-10 21:37:42 +0100297 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
298 input,
299 ilen );
300 cmac_ctx->unprocessed_len += ilen;
Simon Butcher327398a2016-10-05 14:09:11 +0100301 }
302
303exit:
304 return( ret );
305}
306
307int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,
308 unsigned char *output )
309{
310 mbedtls_cmac_context_t* cmac_ctx;
Simon Butcher69283e52016-10-06 12:49:58 +0100311 unsigned char *state, *last_block;
312 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
313 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
314 unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX];
Janos Follath24eed8d2019-11-22 13:21:35 +0000315 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher327398a2016-10-05 14:09:11 +0100316 size_t olen, block_size;
317
318 if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ||
319 output == NULL )
320 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
321
322 cmac_ctx = ctx->cmac_ctx;
323 block_size = ctx->cipher_info->block_size;
324 state = cmac_ctx->state;
325
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500326 mbedtls_platform_zeroize( K1, sizeof( K1 ) );
327 mbedtls_platform_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100328 cmac_generate_subkeys( ctx, K1, K2 );
329
Simon Butcher69283e52016-10-06 12:49:58 +0100330 last_block = cmac_ctx->unprocessed_block;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000331
332 /* Calculate last block */
Janos Follathe3d882a2016-10-11 10:49:26 +0100333 if( cmac_ctx->unprocessed_len < block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000334 {
Simon Butcher327398a2016-10-05 14:09:11 +0100335 cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len );
336 cmac_xor_block( M_last, M_last, K2, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000337 }
338 else
339 {
Manuel Pégourié-Gonnard2c063062016-01-13 14:27:55 +0000340 /* Last block is complete block */
Simon Butcher327398a2016-10-05 14:09:11 +0100341 cmac_xor_block( M_last, last_block, K1, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000342 }
343
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000344
Simon Butcher327398a2016-10-05 14:09:11 +0100345 cmac_xor_block( state, M_last, state, block_size );
346 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
347 &olen ) ) != 0 )
348 {
349 goto exit;
350 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000351
Simon Butcher327398a2016-10-05 14:09:11 +0100352 memcpy( output, state, block_size );
353
354exit:
355 /* Wipe the generated keys on the stack, and any other transients to avoid
356 * side channel leakage */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500357 mbedtls_platform_zeroize( K1, sizeof( K1 ) );
358 mbedtls_platform_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100359
360 cmac_ctx->unprocessed_len = 0;
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500361 mbedtls_platform_zeroize( cmac_ctx->unprocessed_block,
362 sizeof( cmac_ctx->unprocessed_block ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100363
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500364 mbedtls_platform_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX );
Simon Butcher327398a2016-10-05 14:09:11 +0100365 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000366}
367
Simon Butcher327398a2016-10-05 14:09:11 +0100368int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000369{
Simon Butcher327398a2016-10-05 14:09:11 +0100370 mbedtls_cmac_context_t* cmac_ctx;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000371
Simon Butcher327398a2016-10-05 14:09:11 +0100372 if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL )
373 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700374
Simon Butcher327398a2016-10-05 14:09:11 +0100375 cmac_ctx = ctx->cmac_ctx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000376
Simon Butcher327398a2016-10-05 14:09:11 +0100377 /* Reset the internal state */
378 cmac_ctx->unprocessed_len = 0;
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500379 mbedtls_platform_zeroize( cmac_ctx->unprocessed_block,
380 sizeof( cmac_ctx->unprocessed_block ) );
381 mbedtls_platform_zeroize( cmac_ctx->state,
382 sizeof( cmac_ctx->state ) );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000383
Simon Butcher327398a2016-10-05 14:09:11 +0100384 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000385}
386
Simon Butcher327398a2016-10-05 14:09:11 +0100387int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
388 const unsigned char *key, size_t keylen,
389 const unsigned char *input, size_t ilen,
390 unsigned char *output )
391{
392 mbedtls_cipher_context_t ctx;
Janos Follath24eed8d2019-11-22 13:21:35 +0000393 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher327398a2016-10-05 14:09:11 +0100394
395 if( cipher_info == NULL || key == NULL || input == NULL || output == NULL )
396 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
397
398 mbedtls_cipher_init( &ctx );
399
400 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
401 goto exit;
402
403 ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen );
Simon Butcher327398a2016-10-05 14:09:11 +0100404 if( ret != 0 )
405 goto exit;
Simon Butcher327398a2016-10-05 14:09:11 +0100406
407 ret = mbedtls_cipher_cmac_update( &ctx, input, ilen );
408 if( ret != 0 )
409 goto exit;
410
Simon Butcher69283e52016-10-06 12:49:58 +0100411 ret = mbedtls_cipher_cmac_finish( &ctx, output );
Simon Butcher327398a2016-10-05 14:09:11 +0100412
413exit:
Simon Butcher69283e52016-10-06 12:49:58 +0100414 mbedtls_cipher_free( &ctx );
415
Simon Butcher327398a2016-10-05 14:09:11 +0100416 return( ret );
417}
Simon Butcher327398a2016-10-05 14:09:11 +0100418
Simon Butcher69283e52016-10-06 12:49:58 +0100419#if defined(MBEDTLS_AES_C)
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000420/*
Simon Butcher69283e52016-10-06 12:49:58 +0100421 * Implementation of AES-CMAC-PRF-128 defined in RFC 4615
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000422 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700423int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length,
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000424 const unsigned char *input, size_t in_len,
Simon Butcher327398a2016-10-05 14:09:11 +0100425 unsigned char *output )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000426{
Janos Follath24eed8d2019-11-22 13:21:35 +0000427 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher327398a2016-10-05 14:09:11 +0100428 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100429 unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE];
430 unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE];
431
432 if( key == NULL || input == NULL || output == NULL )
433 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000434
Simon Butcher327398a2016-10-05 14:09:11 +0100435 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
436 if( cipher_info == NULL )
437 {
438 /* Failing at this point must be due to a build issue */
439 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
440 goto exit;
441 }
Brian Murrayb0c3c432016-05-18 14:29:51 -0700442
Simon Butcher69283e52016-10-06 12:49:58 +0100443 if( key_length == MBEDTLS_AES_BLOCK_SIZE )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000444 {
445 /* Use key as is */
Simon Butcher69283e52016-10-06 12:49:58 +0100446 memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000447 }
448 else
449 {
Simon Butcher69283e52016-10-06 12:49:58 +0100450 memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE );
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000451
Simon Butcher327398a2016-10-05 14:09:11 +0100452 ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key,
453 key_length, int_key );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000454 if( ret != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700455 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000456 }
457
Simon Butcher327398a2016-10-05 14:09:11 +0100458 ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len,
459 output );
Manuel Pégourié-Gonnardd6cf7542016-01-13 11:30:00 +0000460
Simon Butcher327398a2016-10-05 14:09:11 +0100461exit:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500462 mbedtls_platform_zeroize( int_key, sizeof( int_key ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700463
Simon Butcher327398a2016-10-05 14:09:11 +0100464 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000465}
Brian Murrayb439d452016-05-19 16:02:42 -0700466#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000467
Steven Cooreman63342772017-04-04 11:47:16 +0200468#endif /* !MBEDTLS_CMAC_ALT */
469
Simon Butcher69283e52016-10-06 12:49:58 +0100470#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000471/*
Janos Follathcd13bd22016-12-13 11:51:04 +0000472 * CMAC test data for SP800-38B
473 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf
474 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf
Brian Murray0f6af732016-05-19 15:59:23 -0700475 *
476 * AES-CMAC-PRF-128 test data from RFC 4615
477 * https://tools.ietf.org/html/rfc4615#page-4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000478 */
479
Brian Murray0f6af732016-05-19 15:59:23 -0700480#define NB_CMAC_TESTS_PER_KEY 4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000481#define NB_PRF_TESTS 3
Simon Butcher327398a2016-10-05 14:09:11 +0100482
Brian Murray0f6af732016-05-19 15:59:23 -0700483#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)
484/* All CMAC test inputs are truncated from the same 64 byte buffer. */
485static const unsigned char test_message[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000486 /* PT */
487 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
488 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
489 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
490 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
491 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
492 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
493 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
494 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000495};
Simon Butcher69283e52016-10-06 12:49:58 +0100496#endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */
Brian Murray0cf14c12016-05-23 12:49:50 -0700497
Simon Butcher69283e52016-10-06 12:49:58 +0100498#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700499/* Truncation point of message for AES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700500static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000501 /* Mlen */
Brian Murray0f6af732016-05-19 15:59:23 -0700502 0,
503 16,
Janos Follathcd13bd22016-12-13 11:51:04 +0000504 20,
Brian Murray0f6af732016-05-19 15:59:23 -0700505 64
506};
507
Janos Follathcd13bd22016-12-13 11:51:04 +0000508/* CMAC-AES128 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700509static const unsigned char aes_128_key[16] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000510 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
511 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
Brian Murray0f6af732016-05-19 15:59:23 -0700512};
Simon Butcher69283e52016-10-06 12:49:58 +0100513static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700514 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000515 /* K1 */
516 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66,
517 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde
Brian Murray0f6af732016-05-19 15:59:23 -0700518 },
519 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000520 /* K2 */
521 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc,
522 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b
Brian Murray0f6af732016-05-19 15:59:23 -0700523 }
524};
Simon Butcher69283e52016-10-06 12:49:58 +0100525static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000526 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000527 /* Example #1 */
528 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
529 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000530 },
531 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000532 /* Example #2 */
533 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
534 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000535 },
536 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000537 /* Example #3 */
538 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8,
539 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000540 },
541 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000542 /* Example #4 */
543 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
544 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000545 }
546};
547
Janos Follathcd13bd22016-12-13 11:51:04 +0000548/* CMAC-AES192 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700549static const unsigned char aes_192_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000550 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
551 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
552 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000553};
Simon Butcher69283e52016-10-06 12:49:58 +0100554static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700555 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000556 /* K1 */
557 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27,
558 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96
Brian Murrayb0c3c432016-05-18 14:29:51 -0700559 },
560 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000561 /* K2 */
562 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e,
563 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c
Brian Murrayb0c3c432016-05-18 14:29:51 -0700564 }
565};
Simon Butcher69283e52016-10-06 12:49:58 +0100566static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700567 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000568 /* Example #1 */
569 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5,
570 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67
Brian Murrayb0c3c432016-05-18 14:29:51 -0700571 },
572 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000573 /* Example #2 */
574 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90,
575 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84
Brian Murrayb0c3c432016-05-18 14:29:51 -0700576 },
577 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000578 /* Example #3 */
579 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04,
580 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8
Brian Murrayb0c3c432016-05-18 14:29:51 -0700581 },
582 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000583 /* Example #4 */
584 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79,
585 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11
Brian Murrayb0c3c432016-05-18 14:29:51 -0700586 }
587};
588
Janos Follathcd13bd22016-12-13 11:51:04 +0000589/* CMAC-AES256 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700590static const unsigned char aes_256_key[32] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000591 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
592 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
593 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
594 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
Brian Murray0f6af732016-05-19 15:59:23 -0700595};
Simon Butcher69283e52016-10-06 12:49:58 +0100596static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700597 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000598 /* K1 */
599 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac,
600 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f
Brian Murray0f6af732016-05-19 15:59:23 -0700601 },
602 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000603 /* K2 */
604 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58,
605 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700606 }
607};
Simon Butcher69283e52016-10-06 12:49:58 +0100608static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700609 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000610 /* Example #1 */
611 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e,
612 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83
Brian Murray0f6af732016-05-19 15:59:23 -0700613 },
614 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000615 /* Example #2 */
616 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82,
617 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c
Brian Murray0f6af732016-05-19 15:59:23 -0700618 },
619 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000620 /* Example #3 */
621 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a,
622 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93
Brian Murray0f6af732016-05-19 15:59:23 -0700623 },
624 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000625 /* Example #4 */
626 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5,
627 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10
Brian Murray0f6af732016-05-19 15:59:23 -0700628 }
629};
630#endif /* MBEDTLS_AES_C */
631
Simon Butcher69283e52016-10-06 12:49:58 +0100632#if defined(MBEDTLS_DES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700633/* Truncation point of message for 3DES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700634static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700635 0,
Janos Follathcd13bd22016-12-13 11:51:04 +0000636 16,
Brian Murray0f6af732016-05-19 15:59:23 -0700637 20,
638 32
639};
640
Janos Follathcd13bd22016-12-13 11:51:04 +0000641/* CMAC-TDES (Generation) - 2 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700642static const unsigned char des3_2key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000643 /* Key1 */
644 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
645 /* Key2 */
646 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01,
647 /* Key3 */
648 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
Brian Murray0f6af732016-05-19 15:59:23 -0700649};
650static const unsigned char des3_2key_subkeys[2][8] = {
651 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000652 /* K1 */
653 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700654 },
655 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000656 /* K2 */
657 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2
Brian Murray0f6af732016-05-19 15:59:23 -0700658 }
659};
Simon Butcher69283e52016-10-06 12:49:58 +0100660static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700661 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000662 /* Sample #1 */
663 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60
Brian Murrayb0c3c432016-05-18 14:29:51 -0700664 },
665 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000666 /* Sample #2 */
667 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b
Brian Murrayb0c3c432016-05-18 14:29:51 -0700668 },
669 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000670 /* Sample #3 */
671 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69
Brian Murrayb0c3c432016-05-18 14:29:51 -0700672 },
673 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000674 /* Sample #4 */
675 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb
Brian Murrayb0c3c432016-05-18 14:29:51 -0700676 }
677};
678
Janos Follathcd13bd22016-12-13 11:51:04 +0000679/* CMAC-TDES (Generation) - 3 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700680static const unsigned char des3_3key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000681 /* Key1 */
682 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef,
683 /* Key2 */
684 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,
685 /* Key3 */
686 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23
Brian Murray0f6af732016-05-19 15:59:23 -0700687};
688static const unsigned char des3_3key_subkeys[2][8] = {
689 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000690 /* K1 */
691 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0
Brian Murray0f6af732016-05-19 15:59:23 -0700692 },
693 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000694 /* K2 */
695 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b
Brian Murray0f6af732016-05-19 15:59:23 -0700696 }
697};
Simon Butcher69283e52016-10-06 12:49:58 +0100698static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700699 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000700 /* Sample #1 */
701 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50
Brian Murrayb0c3c432016-05-18 14:29:51 -0700702 },
703 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000704 /* Sample #2 */
705 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09
Brian Murrayb0c3c432016-05-18 14:29:51 -0700706 },
707 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000708 /* Sample #3 */
709 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2
Brian Murrayb0c3c432016-05-18 14:29:51 -0700710 },
711 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000712 /* Sample #4 */
713 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5
Brian Murrayb0c3c432016-05-18 14:29:51 -0700714 }
715};
716
Brian Murray0f6af732016-05-19 15:59:23 -0700717#endif /* MBEDTLS_DES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700718
Simon Butcher69283e52016-10-06 12:49:58 +0100719#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700720/* AES AES-CMAC-PRF-128 Test Data */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000721static const unsigned char PRFK[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000722 /* Key */
723 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
724 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000725 0xed, 0xcb
726};
727
728/* Sizes in bytes */
729static const size_t PRFKlen[NB_PRF_TESTS] = {
730 18,
731 16,
732 10
733};
734
Janos Follathcd13bd22016-12-13 11:51:04 +0000735/* Message */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000736static const unsigned char PRFM[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000737 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
738 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000739 0x10, 0x11, 0x12, 0x13
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000740};
741
742static const unsigned char PRFT[NB_PRF_TESTS][16] = {
743 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000744 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b,
745 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000746 },
747 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000748 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52,
749 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000750 },
751 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000752 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee,
753 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000754 }
755};
Brian Murray0f6af732016-05-19 15:59:23 -0700756#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000757
Simon Butcher327398a2016-10-05 14:09:11 +0100758static int cmac_test_subkeys( int verbose,
759 const char* testname,
760 const unsigned char* key,
761 int keybits,
762 const unsigned char* subkeys,
763 mbedtls_cipher_type_t cipher_type,
764 int block_size,
765 int num_tests )
766{
Brian Murray2fab5c92016-12-15 18:51:13 -0800767 int i, ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100768 mbedtls_cipher_context_t ctx;
769 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100770 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
771 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100772
773 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
774 if( cipher_info == NULL )
775 {
776 /* Failing at this point must be due to a build issue */
Simon Butcher69283e52016-10-06 12:49:58 +0100777 return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
Simon Butcher327398a2016-10-05 14:09:11 +0100778 }
779
780 for( i = 0; i < num_tests; i++ )
781 {
782 if( verbose != 0 )
Kenneth Soerensen518d4352020-04-01 17:22:45 +0200783 mbedtls_printf( " %s CMAC subkey #%d: ", testname, i + 1 );
Simon Butcher327398a2016-10-05 14:09:11 +0100784
Janos Follathd4443582016-10-12 10:00:42 +0100785 mbedtls_cipher_init( &ctx );
786
Simon Butcher327398a2016-10-05 14:09:11 +0100787 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
788 {
789 if( verbose != 0 )
790 mbedtls_printf( "test execution failed\n" );
791
Janos Follathd4443582016-10-12 10:00:42 +0100792 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100793 }
794
795 if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits,
796 MBEDTLS_ENCRYPT ) ) != 0 )
797 {
798 if( verbose != 0 )
799 mbedtls_printf( "test execution failed\n" );
800
Janos Follathd4443582016-10-12 10:00:42 +0100801 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100802 }
803
804 ret = cmac_generate_subkeys( &ctx, K1, K2 );
805 if( ret != 0 )
806 {
807 if( verbose != 0 )
808 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100809
810 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100811 }
812
Simon Butcher420be4e2016-10-07 12:55:43 +0100813 if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0 ||
814 ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100815 {
816 if( verbose != 0 )
817 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100818
819 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100820 }
821
822 if( verbose != 0 )
823 mbedtls_printf( "passed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100824
825 mbedtls_cipher_free( &ctx );
Simon Butcher327398a2016-10-05 14:09:11 +0100826 }
827
Gilles Peskinedf761d52018-03-01 22:18:14 +0100828 ret = 0;
Janos Follathd4443582016-10-12 10:00:42 +0100829 goto exit;
830
831cleanup:
Simon Butcher69283e52016-10-06 12:49:58 +0100832 mbedtls_cipher_free( &ctx );
833
Janos Follathd4443582016-10-12 10:00:42 +0100834exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100835 return( ret );
836}
837
Simon Butcher69283e52016-10-06 12:49:58 +0100838static int cmac_test_wth_cipher( int verbose,
839 const char* testname,
840 const unsigned char* key,
841 int keybits,
842 const unsigned char* messages,
843 const unsigned int message_lengths[4],
844 const unsigned char* expected_result,
845 mbedtls_cipher_type_t cipher_type,
846 int block_size,
847 int num_tests )
Brian Murray00dc5f02016-05-19 14:23:50 -0700848{
Simon Butcher327398a2016-10-05 14:09:11 +0100849 const mbedtls_cipher_info_t *cipher_info;
Brian Murray2fab5c92016-12-15 18:51:13 -0800850 int i, ret = 0;
Simon Butcher69283e52016-10-06 12:49:58 +0100851 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murray57863ad2016-05-19 16:38:36 -0700852
Simon Butcher327398a2016-10-05 14:09:11 +0100853 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
854 if( cipher_info == NULL )
Brian Murray00dc5f02016-05-19 14:23:50 -0700855 {
Simon Butcher327398a2016-10-05 14:09:11 +0100856 /* Failing at this point must be due to a build issue */
857 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
Brian Murray00dc5f02016-05-19 14:23:50 -0700858 goto exit;
859 }
860
861 for( i = 0; i < num_tests; i++ )
862 {
863 if( verbose != 0 )
Kenneth Soerensen518d4352020-04-01 17:22:45 +0200864 mbedtls_printf( " %s CMAC #%d: ", testname, i + 1 );
Brian Murray00dc5f02016-05-19 14:23:50 -0700865
Simon Butcher327398a2016-10-05 14:09:11 +0100866 if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages,
867 message_lengths[i], output ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700868 {
869 if( verbose != 0 )
870 mbedtls_printf( "failed\n" );
871 goto exit;
872 }
Brian Murray9ce2e092016-05-24 22:46:43 -0700873
Simon Butcher327398a2016-10-05 14:09:11 +0100874 if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700875 {
876 if( verbose != 0 )
877 mbedtls_printf( "failed\n" );
878 goto exit;
879 }
880
Brian Murray9ce2e092016-05-24 22:46:43 -0700881 if( verbose != 0 )
882 mbedtls_printf( "passed\n" );
Brian Murray00dc5f02016-05-19 14:23:50 -0700883 }
Gilles Peskinedf761d52018-03-01 22:18:14 +0100884 ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100885
Simon Butcher69283e52016-10-06 12:49:58 +0100886exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100887 return( ret );
Brian Murray00dc5f02016-05-19 14:23:50 -0700888}
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000889
Simon Butcher69283e52016-10-06 12:49:58 +0100890#if defined(MBEDTLS_AES_C)
891static int test_aes128_cmac_prf( int verbose )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700892{
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000893 int i;
Janos Follath24eed8d2019-11-22 13:21:35 +0000894 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher69283e52016-10-06 12:49:58 +0100895 unsigned char output[MBEDTLS_AES_BLOCK_SIZE];
Simon Butcher327398a2016-10-05 14:09:11 +0100896
Brian Murrayb0c3c432016-05-18 14:29:51 -0700897 for( i = 0; i < NB_PRF_TESTS; i++ )
898 {
Kenneth Soerensen518d4352020-04-01 17:22:45 +0200899 mbedtls_printf( " AES CMAC 128 PRF #%d: ", i );
Simon Butcher327398a2016-10-05 14:09:11 +0100900 ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700901 if( ret != 0 ||
Simon Butcher69283e52016-10-06 12:49:58 +0100902 memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700903 {
Simon Butcher327398a2016-10-05 14:09:11 +0100904
Brian Murrayb0c3c432016-05-18 14:29:51 -0700905 if( verbose != 0 )
906 mbedtls_printf( "failed\n" );
907
Brian Murray0f6af732016-05-19 15:59:23 -0700908 return( ret );
Simon Butcher69283e52016-10-06 12:49:58 +0100909 }
910 else if( verbose != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700911 {
912 mbedtls_printf( "passed\n" );
913 }
914 }
Brian Murray0f6af732016-05-19 15:59:23 -0700915 return( ret );
916}
917#endif /* MBEDTLS_AES_C */
918
919int mbedtls_cmac_self_test( int verbose )
920{
Janos Follath24eed8d2019-11-22 13:21:35 +0000921 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher327398a2016-10-05 14:09:11 +0100922
Simon Butcher69283e52016-10-06 12:49:58 +0100923#if defined(MBEDTLS_AES_C)
Simon Butcher327398a2016-10-05 14:09:11 +0100924 /* AES-128 */
925 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100926 "AES 128",
927 aes_128_key,
928 128,
929 (const unsigned char*)aes_128_subkeys,
930 MBEDTLS_CIPHER_AES_128_ECB,
931 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100932 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100933 {
934 return( ret );
935 }
936
Brian Murrayae1cb122016-05-23 15:01:59 -0700937 if( ( ret = cmac_test_wth_cipher( verbose,
938 "AES 128",
939 aes_128_key,
940 128,
941 test_message,
942 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100943 (const unsigned char*)aes_128_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100944 MBEDTLS_CIPHER_AES_128_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100945 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100946 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100947 {
948 return( ret );
949 }
950
951 /* AES-192 */
952 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100953 "AES 192",
954 aes_192_key,
955 192,
956 (const unsigned char*)aes_192_subkeys,
957 MBEDTLS_CIPHER_AES_192_ECB,
958 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100959 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -0700960 {
961 return( ret );
962 }
Brian Murray0f6af732016-05-19 15:59:23 -0700963
Brian Murrayae1cb122016-05-23 15:01:59 -0700964 if( ( ret = cmac_test_wth_cipher( verbose,
965 "AES 192",
966 aes_192_key,
967 192,
968 test_message,
969 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100970 (const unsigned char*)aes_192_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100971 MBEDTLS_CIPHER_AES_192_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100972 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100973 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100974 {
Simon Butcher327398a2016-10-05 14:09:11 +0100975 return( ret );
976 }
977
978 /* AES-256 */
979 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100980 "AES 256",
981 aes_256_key,
982 256,
983 (const unsigned char*)aes_256_subkeys,
984 MBEDTLS_CIPHER_AES_256_ECB,
985 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100986 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -0700987 {
988 return( ret );
989 }
Brian Murray0f6af732016-05-19 15:59:23 -0700990
Simon Butcher69283e52016-10-06 12:49:58 +0100991 if( ( ret = cmac_test_wth_cipher ( verbose,
Brian Murrayae1cb122016-05-23 15:01:59 -0700992 "AES 256",
993 aes_256_key,
994 256,
995 test_message,
996 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100997 (const unsigned char*)aes_256_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100998 MBEDTLS_CIPHER_AES_256_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100999 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001000 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001001 {
1002 return( ret );
1003 }
Brian Murray0f6af732016-05-19 15:59:23 -07001004#endif /* MBEDTLS_AES_C */
1005
Simon Butcher69283e52016-10-06 12:49:58 +01001006#if defined(MBEDTLS_DES_C)
Simon Butcher327398a2016-10-05 14:09:11 +01001007 /* 3DES 2 key */
1008 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001009 "3DES 2 key",
1010 des3_2key_key,
1011 192,
1012 (const unsigned char*)des3_2key_subkeys,
1013 MBEDTLS_CIPHER_DES_EDE3_ECB,
1014 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001015 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001016 {
1017 return( ret );
1018 }
1019
Brian Murrayae1cb122016-05-23 15:01:59 -07001020 if( ( ret = cmac_test_wth_cipher( verbose,
1021 "3DES 2 key",
1022 des3_2key_key,
1023 192,
1024 test_message,
1025 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001026 (const unsigned char*)des3_2key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001027 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001028 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001029 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001030 {
1031 return( ret );
1032 }
Brian Murray0f6af732016-05-19 15:59:23 -07001033
Simon Butcher327398a2016-10-05 14:09:11 +01001034 /* 3DES 3 key */
1035 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001036 "3DES 3 key",
1037 des3_3key_key,
1038 192,
1039 (const unsigned char*)des3_3key_subkeys,
1040 MBEDTLS_CIPHER_DES_EDE3_ECB,
1041 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001042 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001043 {
1044 return( ret );
1045 }
1046
Brian Murrayae1cb122016-05-23 15:01:59 -07001047 if( ( ret = cmac_test_wth_cipher( verbose,
1048 "3DES 3 key",
1049 des3_3key_key,
1050 192,
1051 test_message,
1052 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001053 (const unsigned char*)des3_3key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001054 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001055 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001056 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001057 {
1058 return( ret );
1059 }
Brian Murray0f6af732016-05-19 15:59:23 -07001060#endif /* MBEDTLS_DES_C */
1061
Simon Butcher69283e52016-10-06 12:49:58 +01001062#if defined(MBEDTLS_AES_C)
Simon Butcher420be4e2016-10-07 12:55:43 +01001063 if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001064 return( ret );
Brian Murray0f6af732016-05-19 15:59:23 -07001065#endif /* MBEDTLS_AES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -07001066
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001067 if( verbose != 0 )
1068 mbedtls_printf( "\n" );
Brian Murray0f6af732016-05-19 15:59:23 -07001069
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001070 return( 0 );
1071}
1072
Brian Murray0f6af732016-05-19 15:59:23 -07001073#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001074
1075#endif /* MBEDTLS_CMAC_C */