blob: 3f76344a7f1655ac45e76719d95304f13d83ea5d [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 *
Bence Szépkúti44bfbe32020-08-19 16:54:51 +02006 * Copyright The Mbed TLS Contributors
Bence Szépkúti4e9f7122020-06-05 13:02:18 +02007 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
8 *
9 * This file is provided under the Apache License 2.0, or the
10 * GNU General Public License v2.0 or later.
11 *
12 * **********
13 * Apache License 2.0:
Robert Cragie3d23b1d2015-12-15 07:38:11 +000014 *
15 * Licensed under the Apache License, Version 2.0 (the "License"); you may
16 * not use this file except in compliance with the License.
17 * You may obtain a copy of the License at
18 *
19 * http://www.apache.org/licenses/LICENSE-2.0
20 *
21 * Unless required by applicable law or agreed to in writing, software
22 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
23 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24 * See the License for the specific language governing permissions and
25 * limitations under the License.
26 *
Bence Szépkúti4e9f7122020-06-05 13:02:18 +020027 * **********
28 *
29 * **********
30 * GNU General Public License v2.0 or later:
31 *
32 * This program is free software; you can redistribute it and/or modify
33 * it under the terms of the GNU General Public License as published by
34 * the Free Software Foundation; either version 2 of the License, or
35 * (at your option) any later version.
36 *
37 * This program is distributed in the hope that it will be useful,
38 * but WITHOUT ANY WARRANTY; without even the implied warranty of
39 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40 * GNU General Public License for more details.
41 *
42 * You should have received a copy of the GNU General Public License along
43 * with this program; if not, write to the Free Software Foundation, Inc.,
44 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
45 *
46 * **********
Robert Cragie3d23b1d2015-12-15 07:38:11 +000047 */
48
49/*
Brian Murray53e23b62016-09-13 14:00:15 -070050 * References:
Simon Butcher327398a2016-10-05 14:09:11 +010051 *
52 * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The
53 * CMAC Mode for Authentication
Janos Follathcd13bd22016-12-13 11:51:04 +000054 * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf
Simon Butcher327398a2016-10-05 14:09:11 +010055 *
56 * - RFC 4493 - The AES-CMAC Algorithm
57 * https://tools.ietf.org/html/rfc4493
58 *
59 * - RFC 4615 - The Advanced Encryption Standard-Cipher-based Message
60 * Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128)
61 * Algorithm for the Internet Key Exchange Protocol (IKE)
62 * https://tools.ietf.org/html/rfc4615
63 *
64 * Additional test vectors: ISO/IEC 9797-1
65 *
Robert Cragie3d23b1d2015-12-15 07:38:11 +000066 */
67
68#if !defined(MBEDTLS_CONFIG_FILE)
69#include "mbedtls/config.h"
70#else
71#include MBEDTLS_CONFIG_FILE
72#endif
73
74#if defined(MBEDTLS_CMAC_C)
75
76#include "mbedtls/cmac.h"
77
78#include <string.h>
79
Brian Murray8b4111c2016-09-13 15:58:46 -070080
Robert Cragie3d23b1d2015-12-15 07:38:11 +000081#if defined(MBEDTLS_PLATFORM_C)
82#include "mbedtls/platform.h"
83#else
Brian Murray8b4111c2016-09-13 15:58:46 -070084#include <stdlib.h>
85#define mbedtls_calloc calloc
86#define mbedtls_free free
Simon Butcherd241f1c2016-10-06 10:39:49 +010087#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +000088#include <stdio.h>
Brian Murray8b4111c2016-09-13 15:58:46 -070089#define mbedtls_printf printf
Brian J Murray2adecba2016-11-06 04:45:15 -080090#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +000091#endif /* MBEDTLS_PLATFORM_C */
Brian Murray8b4111c2016-09-13 15:58:46 -070092
Ron Eldor621080d2017-12-21 10:57:43 +020093#if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST)
Steven Cooreman63342772017-04-04 11:47:16 +020094
Robert Cragie3d23b1d2015-12-15 07:38:11 +000095/* Implementation that should never be optimized out by the compiler */
96static void mbedtls_zeroize( void *v, size_t n ) {
Simon Butcher327398a2016-10-05 14:09:11 +010097 volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
Robert Cragie3d23b1d2015-12-15 07:38:11 +000098}
99
100/*
Brian Murrayb0c3c432016-05-18 14:29:51 -0700101 * Multiplication by u in the Galois field of GF(2^n)
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000102 *
Brian Murray72b69e32016-09-13 14:21:01 -0700103 * As explained in NIST SP 800-38B, this can be computed:
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000104 *
Simon Butcher327398a2016-10-05 14:09:11 +0100105 * If MSB(p) = 0, then p = (p << 1)
106 * If MSB(p) = 1, then p = (p << 1) ^ R_n
107 * with R_64 = 0x1B and R_128 = 0x87
108 *
109 * Input and output MUST NOT point to the same buffer
Brian J Murray2adecba2016-11-06 04:45:15 -0800110 * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES.
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000111 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700112static int cmac_multiply_by_u( unsigned char *output,
113 const unsigned char *input,
Brian Murray53e23b62016-09-13 14:00:15 -0700114 size_t blocksize )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000115{
Brian Murrayb0c3c432016-05-18 14:29:51 -0700116 const unsigned char R_128 = 0x87;
117 const unsigned char R_64 = 0x1B;
118 unsigned char R_n, mask;
119 unsigned char overflow = 0x00;
Simon Butcher327398a2016-10-05 14:09:11 +0100120 int i;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700121
Simon Butcher69283e52016-10-06 12:49:58 +0100122 if( blocksize == MBEDTLS_AES_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700123 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700124 R_n = R_128;
Simon Butcher327398a2016-10-05 14:09:11 +0100125 }
Simon Butcher69283e52016-10-06 12:49:58 +0100126 else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700127 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700128 R_n = R_64;
Simon Butcher327398a2016-10-05 14:09:11 +0100129 }
130 else
Brian Murray6a3c0d22016-05-20 18:25:43 -0700131 {
Simon Butcher327398a2016-10-05 14:09:11 +0100132 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700133 }
134
Simon B3249cb72016-11-03 01:11:37 +0000135 for( i = (int)blocksize - 1; i >= 0; i-- )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000136 {
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000137 output[i] = input[i] << 1 | overflow;
138 overflow = input[i] >> 7;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000139 }
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000140
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000141 /* mask = ( input[0] >> 7 ) ? 0xff : 0x00
142 * using bit operations to avoid branches */
Simon Butcher327398a2016-10-05 14:09:11 +0100143
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000144 /* MSVC has a warning about unary minus on unsigned, but this is
145 * well-defined and precisely what we want to do here */
146#if defined(_MSC_VER)
147#pragma warning( push )
148#pragma warning( disable : 4146 )
149#endif
150 mask = - ( input[0] >> 7 );
151#if defined(_MSC_VER)
152#pragma warning( pop )
153#endif
154
Simon Butcher327398a2016-10-05 14:09:11 +0100155 output[ blocksize - 1 ] ^= R_n & mask;
156
Brian Murrayb439d452016-05-19 16:02:42 -0700157 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000158}
159
160/*
161 * Generate subkeys
Simon Butcher327398a2016-10-05 14:09:11 +0100162 *
163 * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000164 */
Simon Butcher327398a2016-10-05 14:09:11 +0100165static int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx,
166 unsigned char* K1, unsigned char* K2 )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000167{
Brian Murray57863ad2016-05-19 16:38:36 -0700168 int ret;
Simon Butcher69283e52016-10-06 12:49:58 +0100169 unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700170 size_t olen, block_size;
171
Simon Butcher327398a2016-10-05 14:09:11 +0100172 mbedtls_zeroize( L, sizeof( L ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700173
Simon Butcher327398a2016-10-05 14:09:11 +0100174 block_size = ctx->cipher_info->block_size;
175
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000176 /* Calculate Ek(0) */
Simon Butcher327398a2016-10-05 14:09:11 +0100177 if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700178 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000179
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000180 /*
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000181 * Generate K1 and K2
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000182 */
Simon Butcher327398a2016-10-05 14:09:11 +0100183 if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700184 goto exit;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000185
Simon Butcher327398a2016-10-05 14:09:11 +0100186 if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 )
187 goto exit;
188
189exit:
190 mbedtls_zeroize( L, sizeof( L ) );
191
192 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000193}
Ron Eldor621080d2017-12-21 10:57:43 +0200194#endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000195
Ron Eldor621080d2017-12-21 10:57:43 +0200196#if !defined(MBEDTLS_CMAC_ALT)
Simon Butcher69283e52016-10-06 12:49:58 +0100197static void cmac_xor_block( unsigned char *output, const unsigned char *input1,
198 const unsigned char *input2,
199 const size_t block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000200{
Hanno Becker61937d42017-04-26 15:01:23 +0100201 size_t idx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000202
Hanno Becker61937d42017-04-26 15:01:23 +0100203 for( idx = 0; idx < block_size; idx++ )
204 output[ idx ] = input1[ idx ] ^ input2[ idx ];
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000205}
206
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000207/*
208 * Create padded last block from (partial) last block.
209 *
210 * We can't use the padding option from the cipher layer, as it only works for
211 * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition.
212 */
Simon Butcher69283e52016-10-06 12:49:58 +0100213static void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX],
Brian Murray53e23b62016-09-13 14:00:15 -0700214 size_t padded_block_len,
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000215 const unsigned char *last_block,
Brian Murrayb0c3c432016-05-18 14:29:51 -0700216 size_t last_block_len )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000217{
218 size_t j;
219
Brian Murrayb0c3c432016-05-18 14:29:51 -0700220 for( j = 0; j < padded_block_len; j++ )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000221 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700222 if( j < last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000223 padded_block[j] = last_block[j];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700224 else if( j == last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000225 padded_block[j] = 0x80;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000226 else
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000227 padded_block[j] = 0x00;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000228 }
229}
230
Simon Butcher327398a2016-10-05 14:09:11 +0100231int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,
Simon Butcher94ffde72016-10-05 15:33:53 +0100232 const unsigned char *key, size_t keybits )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000233{
Simon Butcher327398a2016-10-05 14:09:11 +0100234 mbedtls_cipher_type_t type;
235 mbedtls_cmac_context_t *cmac_ctx;
Simon Butcher327398a2016-10-05 14:09:11 +0100236 int retval;
237
238 if( ctx == NULL || ctx->cipher_info == NULL || key == NULL )
239 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
240
Simon B3249cb72016-11-03 01:11:37 +0000241 if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits,
Simon Butcher327398a2016-10-05 14:09:11 +0100242 MBEDTLS_ENCRYPT ) ) != 0 )
243 return( retval );
244
Simon Butcher327398a2016-10-05 14:09:11 +0100245 type = ctx->cipher_info->type;
246
247 switch( type )
248 {
249 case MBEDTLS_CIPHER_AES_128_ECB:
250 case MBEDTLS_CIPHER_AES_192_ECB:
251 case MBEDTLS_CIPHER_AES_256_ECB:
252 case MBEDTLS_CIPHER_DES_EDE3_ECB:
253 break;
254 default:
255 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
256 }
257
258 /* Allocated and initialise in the cipher context memory for the CMAC
259 * context */
260 cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) );
261 if( cmac_ctx == NULL )
262 return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );
263
264 ctx->cmac_ctx = cmac_ctx;
265
266 mbedtls_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100267
268 return 0;
269}
270
271int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,
272 const unsigned char *input, size_t ilen )
273{
274 mbedtls_cmac_context_t* cmac_ctx;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700275 unsigned char *state;
Simon B3249cb72016-11-03 01:11:37 +0000276 int ret = 0;
277 size_t n, j, olen, block_size;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700278
Simon Butcher327398a2016-10-05 14:09:11 +0100279 if( ctx == NULL || ctx->cipher_info == NULL || input == NULL ||
280 ctx->cmac_ctx == NULL )
281 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700282
Simon Butcher327398a2016-10-05 14:09:11 +0100283 cmac_ctx = ctx->cmac_ctx;
284 block_size = ctx->cipher_info->block_size;
285 state = ctx->cmac_ctx->state;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000286
Simon Butcher6b0774a2016-10-10 21:37:42 +0100287 /* Is there data still to process from the last call, that's greater in
288 * size than a block? */
Simon Butcher327398a2016-10-05 14:09:11 +0100289 if( cmac_ctx->unprocessed_len > 0 &&
Andres AGa592dcc2016-10-06 15:23:39 +0100290 ilen > block_size - cmac_ctx->unprocessed_len )
Brian Murray57863ad2016-05-19 16:38:36 -0700291 {
Simon Butcher327398a2016-10-05 14:09:11 +0100292 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
293 input,
294 block_size - cmac_ctx->unprocessed_len );
295
296 cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size );
297
298 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
299 &olen ) ) != 0 )
300 {
301 goto exit;
302 }
303
Simon Butcher6b0774a2016-10-10 21:37:42 +0100304 input += block_size - cmac_ctx->unprocessed_len;
305 ilen -= block_size - cmac_ctx->unprocessed_len;
Simon Butcher327398a2016-10-05 14:09:11 +0100306 cmac_ctx->unprocessed_len = 0;
Brian Murray57863ad2016-05-19 16:38:36 -0700307 }
308
Simon Butcher327398a2016-10-05 14:09:11 +0100309 /* n is the number of blocks including any final partial block */
310 n = ( ilen + block_size - 1 ) / block_size;
311
Simon B3249cb72016-11-03 01:11:37 +0000312 /* Iterate across the input data in block sized chunks, excluding any
313 * final partial or complete block */
314 for( j = 1; j < n; j++ )
Brian Murray57863ad2016-05-19 16:38:36 -0700315 {
Simon Butcher327398a2016-10-05 14:09:11 +0100316 cmac_xor_block( state, input, state, block_size );
317
318 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
319 &olen ) ) != 0 )
320 goto exit;
321
322 ilen -= block_size;
323 input += block_size;
Brian Murray57863ad2016-05-19 16:38:36 -0700324 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000325
Simon Butcher327398a2016-10-05 14:09:11 +0100326 /* If there is data left over that wasn't aligned to a block */
327 if( ilen > 0 )
328 {
Simon Butcher6b0774a2016-10-10 21:37:42 +0100329 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
330 input,
331 ilen );
332 cmac_ctx->unprocessed_len += ilen;
Simon Butcher327398a2016-10-05 14:09:11 +0100333 }
334
335exit:
336 return( ret );
337}
338
339int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,
340 unsigned char *output )
341{
342 mbedtls_cmac_context_t* cmac_ctx;
Simon Butcher69283e52016-10-06 12:49:58 +0100343 unsigned char *state, *last_block;
344 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
345 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
346 unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100347 int ret;
348 size_t olen, block_size;
349
350 if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ||
351 output == NULL )
352 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
353
354 cmac_ctx = ctx->cmac_ctx;
355 block_size = ctx->cipher_info->block_size;
356 state = cmac_ctx->state;
357
Simon Butcher69283e52016-10-06 12:49:58 +0100358 mbedtls_zeroize( K1, sizeof( K1 ) );
359 mbedtls_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100360 cmac_generate_subkeys( ctx, K1, K2 );
361
Simon Butcher69283e52016-10-06 12:49:58 +0100362 last_block = cmac_ctx->unprocessed_block;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000363
364 /* Calculate last block */
Janos Follathe3d882a2016-10-11 10:49:26 +0100365 if( cmac_ctx->unprocessed_len < block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000366 {
Simon Butcher327398a2016-10-05 14:09:11 +0100367 cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len );
368 cmac_xor_block( M_last, M_last, K2, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000369 }
370 else
371 {
Manuel Pégourié-Gonnard2c063062016-01-13 14:27:55 +0000372 /* Last block is complete block */
Simon Butcher327398a2016-10-05 14:09:11 +0100373 cmac_xor_block( M_last, last_block, K1, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000374 }
375
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000376
Simon Butcher327398a2016-10-05 14:09:11 +0100377 cmac_xor_block( state, M_last, state, block_size );
378 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
379 &olen ) ) != 0 )
380 {
381 goto exit;
382 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000383
Simon Butcher327398a2016-10-05 14:09:11 +0100384 memcpy( output, state, block_size );
385
386exit:
387 /* Wipe the generated keys on the stack, and any other transients to avoid
388 * side channel leakage */
Simon Butcher69283e52016-10-06 12:49:58 +0100389 mbedtls_zeroize( K1, sizeof( K1 ) );
390 mbedtls_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100391
392 cmac_ctx->unprocessed_len = 0;
393 mbedtls_zeroize( cmac_ctx->unprocessed_block,
Simon Butcher69283e52016-10-06 12:49:58 +0100394 sizeof( cmac_ctx->unprocessed_block ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100395
Simon Butcher69283e52016-10-06 12:49:58 +0100396 mbedtls_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX );
Simon Butcher327398a2016-10-05 14:09:11 +0100397 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000398}
399
Simon Butcher327398a2016-10-05 14:09:11 +0100400int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000401{
Simon Butcher327398a2016-10-05 14:09:11 +0100402 mbedtls_cmac_context_t* cmac_ctx;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000403
Simon Butcher327398a2016-10-05 14:09:11 +0100404 if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL )
405 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700406
Simon Butcher327398a2016-10-05 14:09:11 +0100407 cmac_ctx = ctx->cmac_ctx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000408
Simon Butcher327398a2016-10-05 14:09:11 +0100409 /* Reset the internal state */
410 cmac_ctx->unprocessed_len = 0;
411 mbedtls_zeroize( cmac_ctx->unprocessed_block,
Andres AGa592dcc2016-10-06 15:23:39 +0100412 sizeof( cmac_ctx->unprocessed_block ) );
Simon Butcherd241f1c2016-10-06 10:39:49 +0100413 mbedtls_zeroize( cmac_ctx->state,
414 sizeof( cmac_ctx->state ) );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000415
Simon Butcher327398a2016-10-05 14:09:11 +0100416 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000417}
418
Simon Butcher327398a2016-10-05 14:09:11 +0100419int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
420 const unsigned char *key, size_t keylen,
421 const unsigned char *input, size_t ilen,
422 unsigned char *output )
423{
424 mbedtls_cipher_context_t ctx;
425 int ret;
426
427 if( cipher_info == NULL || key == NULL || input == NULL || output == NULL )
428 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
429
430 mbedtls_cipher_init( &ctx );
431
432 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
433 goto exit;
434
435 ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen );
Simon Butcher327398a2016-10-05 14:09:11 +0100436 if( ret != 0 )
437 goto exit;
Simon Butcher327398a2016-10-05 14:09:11 +0100438
439 ret = mbedtls_cipher_cmac_update( &ctx, input, ilen );
440 if( ret != 0 )
441 goto exit;
442
Simon Butcher69283e52016-10-06 12:49:58 +0100443 ret = mbedtls_cipher_cmac_finish( &ctx, output );
Simon Butcher327398a2016-10-05 14:09:11 +0100444
445exit:
Simon Butcher69283e52016-10-06 12:49:58 +0100446 mbedtls_cipher_free( &ctx );
447
Simon Butcher327398a2016-10-05 14:09:11 +0100448 return( ret );
449}
Simon Butcher327398a2016-10-05 14:09:11 +0100450
Simon Butcher69283e52016-10-06 12:49:58 +0100451#if defined(MBEDTLS_AES_C)
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000452/*
Simon Butcher69283e52016-10-06 12:49:58 +0100453 * Implementation of AES-CMAC-PRF-128 defined in RFC 4615
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000454 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700455int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length,
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000456 const unsigned char *input, size_t in_len,
Rodrigo Dias Correa375366a2020-11-10 01:38:00 -0300457 unsigned char output[16] )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000458{
459 int ret;
Simon Butcher327398a2016-10-05 14:09:11 +0100460 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100461 unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE];
462 unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE];
463
464 if( key == NULL || input == NULL || output == NULL )
465 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000466
Simon Butcher327398a2016-10-05 14:09:11 +0100467 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
468 if( cipher_info == NULL )
469 {
470 /* Failing at this point must be due to a build issue */
471 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
472 goto exit;
473 }
Brian Murrayb0c3c432016-05-18 14:29:51 -0700474
Simon Butcher69283e52016-10-06 12:49:58 +0100475 if( key_length == MBEDTLS_AES_BLOCK_SIZE )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000476 {
477 /* Use key as is */
Simon Butcher69283e52016-10-06 12:49:58 +0100478 memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000479 }
480 else
481 {
Simon Butcher69283e52016-10-06 12:49:58 +0100482 memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE );
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000483
Simon Butcher327398a2016-10-05 14:09:11 +0100484 ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key,
485 key_length, int_key );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000486 if( ret != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700487 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000488 }
489
Simon Butcher327398a2016-10-05 14:09:11 +0100490 ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len,
491 output );
Manuel Pégourié-Gonnardd6cf7542016-01-13 11:30:00 +0000492
Simon Butcher327398a2016-10-05 14:09:11 +0100493exit:
494 mbedtls_zeroize( int_key, sizeof( int_key ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700495
Simon Butcher327398a2016-10-05 14:09:11 +0100496 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000497}
Brian Murrayb439d452016-05-19 16:02:42 -0700498#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000499
Steven Cooreman63342772017-04-04 11:47:16 +0200500#endif /* !MBEDTLS_CMAC_ALT */
501
Simon Butcher69283e52016-10-06 12:49:58 +0100502#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000503/*
Janos Follathcd13bd22016-12-13 11:51:04 +0000504 * CMAC test data for SP800-38B
505 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf
506 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf
Brian Murray0f6af732016-05-19 15:59:23 -0700507 *
508 * AES-CMAC-PRF-128 test data from RFC 4615
509 * https://tools.ietf.org/html/rfc4615#page-4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000510 */
511
Brian Murray0f6af732016-05-19 15:59:23 -0700512#define NB_CMAC_TESTS_PER_KEY 4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000513#define NB_PRF_TESTS 3
Simon Butcher327398a2016-10-05 14:09:11 +0100514
Brian Murray0f6af732016-05-19 15:59:23 -0700515#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)
516/* All CMAC test inputs are truncated from the same 64 byte buffer. */
517static const unsigned char test_message[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000518 /* PT */
519 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
520 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
521 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
522 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
523 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
524 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
525 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
526 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000527};
Simon Butcher69283e52016-10-06 12:49:58 +0100528#endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */
Brian Murray0cf14c12016-05-23 12:49:50 -0700529
Simon Butcher69283e52016-10-06 12:49:58 +0100530#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700531/* Truncation point of message for AES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700532static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000533 /* Mlen */
Brian Murray0f6af732016-05-19 15:59:23 -0700534 0,
535 16,
Janos Follathcd13bd22016-12-13 11:51:04 +0000536 20,
Brian Murray0f6af732016-05-19 15:59:23 -0700537 64
538};
539
Janos Follathcd13bd22016-12-13 11:51:04 +0000540/* CMAC-AES128 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700541static const unsigned char aes_128_key[16] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000542 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
543 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
Brian Murray0f6af732016-05-19 15:59:23 -0700544};
Simon Butcher69283e52016-10-06 12:49:58 +0100545static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700546 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000547 /* K1 */
548 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66,
549 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde
Brian Murray0f6af732016-05-19 15:59:23 -0700550 },
551 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000552 /* K2 */
553 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc,
554 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b
Brian Murray0f6af732016-05-19 15:59:23 -0700555 }
556};
Simon Butcher69283e52016-10-06 12:49:58 +0100557static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000558 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000559 /* Example #1 */
560 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
561 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000562 },
563 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000564 /* Example #2 */
565 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
566 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000567 },
568 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000569 /* Example #3 */
570 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8,
571 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000572 },
573 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000574 /* Example #4 */
575 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
576 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000577 }
578};
579
Janos Follathcd13bd22016-12-13 11:51:04 +0000580/* CMAC-AES192 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700581static const unsigned char aes_192_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000582 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
583 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
584 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000585};
Simon Butcher69283e52016-10-06 12:49:58 +0100586static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700587 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000588 /* K1 */
589 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27,
590 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96
Brian Murrayb0c3c432016-05-18 14:29:51 -0700591 },
592 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000593 /* K2 */
594 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e,
595 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c
Brian Murrayb0c3c432016-05-18 14:29:51 -0700596 }
597};
Simon Butcher69283e52016-10-06 12:49:58 +0100598static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700599 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000600 /* Example #1 */
601 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5,
602 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67
Brian Murrayb0c3c432016-05-18 14:29:51 -0700603 },
604 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000605 /* Example #2 */
606 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90,
607 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84
Brian Murrayb0c3c432016-05-18 14:29:51 -0700608 },
609 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000610 /* Example #3 */
611 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04,
612 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8
Brian Murrayb0c3c432016-05-18 14:29:51 -0700613 },
614 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000615 /* Example #4 */
616 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79,
617 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11
Brian Murrayb0c3c432016-05-18 14:29:51 -0700618 }
619};
620
Janos Follathcd13bd22016-12-13 11:51:04 +0000621/* CMAC-AES256 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700622static const unsigned char aes_256_key[32] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000623 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
624 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
625 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
626 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
Brian Murray0f6af732016-05-19 15:59:23 -0700627};
Simon Butcher69283e52016-10-06 12:49:58 +0100628static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700629 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000630 /* K1 */
631 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac,
632 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f
Brian Murray0f6af732016-05-19 15:59:23 -0700633 },
634 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000635 /* K2 */
636 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58,
637 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700638 }
639};
Simon Butcher69283e52016-10-06 12:49:58 +0100640static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700641 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000642 /* Example #1 */
643 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e,
644 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83
Brian Murray0f6af732016-05-19 15:59:23 -0700645 },
646 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000647 /* Example #2 */
648 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82,
649 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c
Brian Murray0f6af732016-05-19 15:59:23 -0700650 },
651 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000652 /* Example #3 */
653 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a,
654 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93
Brian Murray0f6af732016-05-19 15:59:23 -0700655 },
656 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000657 /* Example #4 */
658 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5,
659 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10
Brian Murray0f6af732016-05-19 15:59:23 -0700660 }
661};
662#endif /* MBEDTLS_AES_C */
663
Simon Butcher69283e52016-10-06 12:49:58 +0100664#if defined(MBEDTLS_DES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700665/* Truncation point of message for 3DES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700666static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700667 0,
Janos Follathcd13bd22016-12-13 11:51:04 +0000668 16,
Brian Murray0f6af732016-05-19 15:59:23 -0700669 20,
670 32
671};
672
Janos Follathcd13bd22016-12-13 11:51:04 +0000673/* CMAC-TDES (Generation) - 2 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700674static const unsigned char des3_2key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000675 /* Key1 */
676 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
677 /* Key2 */
678 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01,
679 /* Key3 */
680 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
Brian Murray0f6af732016-05-19 15:59:23 -0700681};
682static const unsigned char des3_2key_subkeys[2][8] = {
683 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000684 /* K1 */
685 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700686 },
687 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000688 /* K2 */
689 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2
Brian Murray0f6af732016-05-19 15:59:23 -0700690 }
691};
Simon Butcher69283e52016-10-06 12:49:58 +0100692static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700693 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000694 /* Sample #1 */
695 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60
Brian Murrayb0c3c432016-05-18 14:29:51 -0700696 },
697 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000698 /* Sample #2 */
699 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b
Brian Murrayb0c3c432016-05-18 14:29:51 -0700700 },
701 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000702 /* Sample #3 */
703 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69
Brian Murrayb0c3c432016-05-18 14:29:51 -0700704 },
705 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000706 /* Sample #4 */
707 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb
Brian Murrayb0c3c432016-05-18 14:29:51 -0700708 }
709};
710
Janos Follathcd13bd22016-12-13 11:51:04 +0000711/* CMAC-TDES (Generation) - 3 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700712static const unsigned char des3_3key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000713 /* Key1 */
714 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef,
715 /* Key2 */
716 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,
717 /* Key3 */
718 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23
Brian Murray0f6af732016-05-19 15:59:23 -0700719};
720static const unsigned char des3_3key_subkeys[2][8] = {
721 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000722 /* K1 */
723 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0
Brian Murray0f6af732016-05-19 15:59:23 -0700724 },
725 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000726 /* K2 */
727 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b
Brian Murray0f6af732016-05-19 15:59:23 -0700728 }
729};
Simon Butcher69283e52016-10-06 12:49:58 +0100730static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700731 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000732 /* Sample #1 */
733 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50
Brian Murrayb0c3c432016-05-18 14:29:51 -0700734 },
735 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000736 /* Sample #2 */
737 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09
Brian Murrayb0c3c432016-05-18 14:29:51 -0700738 },
739 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000740 /* Sample #3 */
741 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2
Brian Murrayb0c3c432016-05-18 14:29:51 -0700742 },
743 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000744 /* Sample #4 */
745 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5
Brian Murrayb0c3c432016-05-18 14:29:51 -0700746 }
747};
748
Brian Murray0f6af732016-05-19 15:59:23 -0700749#endif /* MBEDTLS_DES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700750
Simon Butcher69283e52016-10-06 12:49:58 +0100751#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700752/* AES AES-CMAC-PRF-128 Test Data */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000753static const unsigned char PRFK[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000754 /* Key */
755 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
756 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000757 0xed, 0xcb
758};
759
760/* Sizes in bytes */
761static const size_t PRFKlen[NB_PRF_TESTS] = {
762 18,
763 16,
764 10
765};
766
Janos Follathcd13bd22016-12-13 11:51:04 +0000767/* Message */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000768static const unsigned char PRFM[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000769 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
770 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000771 0x10, 0x11, 0x12, 0x13
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000772};
773
774static const unsigned char PRFT[NB_PRF_TESTS][16] = {
775 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000776 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b,
777 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000778 },
779 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000780 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52,
781 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000782 },
783 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000784 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee,
785 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000786 }
787};
Brian Murray0f6af732016-05-19 15:59:23 -0700788#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000789
Simon Butcher327398a2016-10-05 14:09:11 +0100790static int cmac_test_subkeys( int verbose,
791 const char* testname,
792 const unsigned char* key,
793 int keybits,
794 const unsigned char* subkeys,
795 mbedtls_cipher_type_t cipher_type,
796 int block_size,
797 int num_tests )
798{
Brian Murray2fab5c92016-12-15 18:51:13 -0800799 int i, ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100800 mbedtls_cipher_context_t ctx;
801 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100802 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
803 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100804
805 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
806 if( cipher_info == NULL )
807 {
808 /* Failing at this point must be due to a build issue */
Simon Butcher69283e52016-10-06 12:49:58 +0100809 return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
Simon Butcher327398a2016-10-05 14:09:11 +0100810 }
811
812 for( i = 0; i < num_tests; i++ )
813 {
814 if( verbose != 0 )
Simon Butcher69283e52016-10-06 12:49:58 +0100815 mbedtls_printf( " %s CMAC subkey #%u: ", testname, i + 1 );
Simon Butcher327398a2016-10-05 14:09:11 +0100816
Janos Follathd4443582016-10-12 10:00:42 +0100817 mbedtls_cipher_init( &ctx );
818
Simon Butcher327398a2016-10-05 14:09:11 +0100819 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
820 {
821 if( verbose != 0 )
822 mbedtls_printf( "test execution failed\n" );
823
Janos Follathd4443582016-10-12 10:00:42 +0100824 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100825 }
826
827 if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits,
828 MBEDTLS_ENCRYPT ) ) != 0 )
829 {
830 if( verbose != 0 )
831 mbedtls_printf( "test execution failed\n" );
832
Janos Follathd4443582016-10-12 10:00:42 +0100833 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100834 }
835
836 ret = cmac_generate_subkeys( &ctx, K1, K2 );
837 if( ret != 0 )
838 {
839 if( verbose != 0 )
840 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100841
842 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100843 }
844
Simon Butcher420be4e2016-10-07 12:55:43 +0100845 if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0 ||
846 ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100847 {
848 if( verbose != 0 )
849 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100850
851 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100852 }
853
854 if( verbose != 0 )
855 mbedtls_printf( "passed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100856
857 mbedtls_cipher_free( &ctx );
Simon Butcher327398a2016-10-05 14:09:11 +0100858 }
859
Gilles Peskinedf761d52018-03-01 22:18:14 +0100860 ret = 0;
Janos Follathd4443582016-10-12 10:00:42 +0100861 goto exit;
862
863cleanup:
Simon Butcher69283e52016-10-06 12:49:58 +0100864 mbedtls_cipher_free( &ctx );
865
Janos Follathd4443582016-10-12 10:00:42 +0100866exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100867 return( ret );
868}
869
Simon Butcher69283e52016-10-06 12:49:58 +0100870static int cmac_test_wth_cipher( int verbose,
871 const char* testname,
872 const unsigned char* key,
873 int keybits,
874 const unsigned char* messages,
875 const unsigned int message_lengths[4],
876 const unsigned char* expected_result,
877 mbedtls_cipher_type_t cipher_type,
878 int block_size,
879 int num_tests )
Brian Murray00dc5f02016-05-19 14:23:50 -0700880{
Simon Butcher327398a2016-10-05 14:09:11 +0100881 const mbedtls_cipher_info_t *cipher_info;
Brian Murray2fab5c92016-12-15 18:51:13 -0800882 int i, ret = 0;
Simon Butcher69283e52016-10-06 12:49:58 +0100883 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murray57863ad2016-05-19 16:38:36 -0700884
Simon Butcher327398a2016-10-05 14:09:11 +0100885 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
886 if( cipher_info == NULL )
Brian Murray00dc5f02016-05-19 14:23:50 -0700887 {
Simon Butcher327398a2016-10-05 14:09:11 +0100888 /* Failing at this point must be due to a build issue */
889 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
Brian Murray00dc5f02016-05-19 14:23:50 -0700890 goto exit;
891 }
892
893 for( i = 0; i < num_tests; i++ )
894 {
895 if( verbose != 0 )
Andres AGa592dcc2016-10-06 15:23:39 +0100896 mbedtls_printf( " %s CMAC #%u: ", testname, i + 1 );
Brian Murray00dc5f02016-05-19 14:23:50 -0700897
Simon Butcher327398a2016-10-05 14:09:11 +0100898 if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages,
899 message_lengths[i], output ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700900 {
901 if( verbose != 0 )
902 mbedtls_printf( "failed\n" );
903 goto exit;
904 }
Brian Murray9ce2e092016-05-24 22:46:43 -0700905
Simon Butcher327398a2016-10-05 14:09:11 +0100906 if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700907 {
908 if( verbose != 0 )
909 mbedtls_printf( "failed\n" );
910 goto exit;
911 }
912
Brian Murray9ce2e092016-05-24 22:46:43 -0700913 if( verbose != 0 )
914 mbedtls_printf( "passed\n" );
Brian Murray00dc5f02016-05-19 14:23:50 -0700915 }
Gilles Peskinedf761d52018-03-01 22:18:14 +0100916 ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100917
Simon Butcher69283e52016-10-06 12:49:58 +0100918exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100919 return( ret );
Brian Murray00dc5f02016-05-19 14:23:50 -0700920}
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000921
Simon Butcher69283e52016-10-06 12:49:58 +0100922#if defined(MBEDTLS_AES_C)
923static int test_aes128_cmac_prf( int verbose )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700924{
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000925 int i;
926 int ret;
Simon Butcher69283e52016-10-06 12:49:58 +0100927 unsigned char output[MBEDTLS_AES_BLOCK_SIZE];
Simon Butcher327398a2016-10-05 14:09:11 +0100928
Brian Murrayb0c3c432016-05-18 14:29:51 -0700929 for( i = 0; i < NB_PRF_TESTS; i++ )
930 {
Brian Murray0f6af732016-05-19 15:59:23 -0700931 mbedtls_printf( " AES CMAC 128 PRF #%u: ", i );
Simon Butcher327398a2016-10-05 14:09:11 +0100932 ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700933 if( ret != 0 ||
Simon Butcher69283e52016-10-06 12:49:58 +0100934 memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700935 {
Simon Butcher327398a2016-10-05 14:09:11 +0100936
Brian Murrayb0c3c432016-05-18 14:29:51 -0700937 if( verbose != 0 )
938 mbedtls_printf( "failed\n" );
939
Brian Murray0f6af732016-05-19 15:59:23 -0700940 return( ret );
Simon Butcher69283e52016-10-06 12:49:58 +0100941 }
942 else if( verbose != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700943 {
944 mbedtls_printf( "passed\n" );
945 }
946 }
Brian Murray0f6af732016-05-19 15:59:23 -0700947 return( ret );
948}
949#endif /* MBEDTLS_AES_C */
950
951int mbedtls_cmac_self_test( int verbose )
952{
953 int ret;
Simon Butcher327398a2016-10-05 14:09:11 +0100954
Simon Butcher69283e52016-10-06 12:49:58 +0100955#if defined(MBEDTLS_AES_C)
Simon Butcher327398a2016-10-05 14:09:11 +0100956 /* AES-128 */
957 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100958 "AES 128",
959 aes_128_key,
960 128,
961 (const unsigned char*)aes_128_subkeys,
962 MBEDTLS_CIPHER_AES_128_ECB,
963 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100964 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100965 {
966 return( ret );
967 }
968
Brian Murrayae1cb122016-05-23 15:01:59 -0700969 if( ( ret = cmac_test_wth_cipher( verbose,
970 "AES 128",
971 aes_128_key,
972 128,
973 test_message,
974 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100975 (const unsigned char*)aes_128_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100976 MBEDTLS_CIPHER_AES_128_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100977 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100978 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100979 {
980 return( ret );
981 }
982
983 /* AES-192 */
984 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100985 "AES 192",
986 aes_192_key,
987 192,
988 (const unsigned char*)aes_192_subkeys,
989 MBEDTLS_CIPHER_AES_192_ECB,
990 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100991 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -0700992 {
993 return( ret );
994 }
Brian Murray0f6af732016-05-19 15:59:23 -0700995
Brian Murrayae1cb122016-05-23 15:01:59 -0700996 if( ( ret = cmac_test_wth_cipher( verbose,
997 "AES 192",
998 aes_192_key,
999 192,
1000 test_message,
1001 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001002 (const unsigned char*)aes_192_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001003 MBEDTLS_CIPHER_AES_192_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001004 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001005 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001006 {
Simon Butcher327398a2016-10-05 14:09:11 +01001007 return( ret );
1008 }
1009
1010 /* AES-256 */
1011 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001012 "AES 256",
1013 aes_256_key,
1014 256,
1015 (const unsigned char*)aes_256_subkeys,
1016 MBEDTLS_CIPHER_AES_256_ECB,
1017 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001018 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001019 {
1020 return( ret );
1021 }
Brian Murray0f6af732016-05-19 15:59:23 -07001022
Simon Butcher69283e52016-10-06 12:49:58 +01001023 if( ( ret = cmac_test_wth_cipher ( verbose,
Brian Murrayae1cb122016-05-23 15:01:59 -07001024 "AES 256",
1025 aes_256_key,
1026 256,
1027 test_message,
1028 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001029 (const unsigned char*)aes_256_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001030 MBEDTLS_CIPHER_AES_256_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001031 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001032 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001033 {
1034 return( ret );
1035 }
Brian Murray0f6af732016-05-19 15:59:23 -07001036#endif /* MBEDTLS_AES_C */
1037
Simon Butcher69283e52016-10-06 12:49:58 +01001038#if defined(MBEDTLS_DES_C)
Simon Butcher327398a2016-10-05 14:09:11 +01001039 /* 3DES 2 key */
1040 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001041 "3DES 2 key",
1042 des3_2key_key,
1043 192,
1044 (const unsigned char*)des3_2key_subkeys,
1045 MBEDTLS_CIPHER_DES_EDE3_ECB,
1046 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001047 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001048 {
1049 return( ret );
1050 }
1051
Brian Murrayae1cb122016-05-23 15:01:59 -07001052 if( ( ret = cmac_test_wth_cipher( verbose,
1053 "3DES 2 key",
1054 des3_2key_key,
1055 192,
1056 test_message,
1057 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001058 (const unsigned char*)des3_2key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001059 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001060 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001061 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001062 {
1063 return( ret );
1064 }
Brian Murray0f6af732016-05-19 15:59:23 -07001065
Simon Butcher327398a2016-10-05 14:09:11 +01001066 /* 3DES 3 key */
1067 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001068 "3DES 3 key",
1069 des3_3key_key,
1070 192,
1071 (const unsigned char*)des3_3key_subkeys,
1072 MBEDTLS_CIPHER_DES_EDE3_ECB,
1073 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001074 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001075 {
1076 return( ret );
1077 }
1078
Brian Murrayae1cb122016-05-23 15:01:59 -07001079 if( ( ret = cmac_test_wth_cipher( verbose,
1080 "3DES 3 key",
1081 des3_3key_key,
1082 192,
1083 test_message,
1084 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001085 (const unsigned char*)des3_3key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001086 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001087 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001088 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001089 {
1090 return( ret );
1091 }
Brian Murray0f6af732016-05-19 15:59:23 -07001092#endif /* MBEDTLS_DES_C */
1093
Simon Butcher69283e52016-10-06 12:49:58 +01001094#if defined(MBEDTLS_AES_C)
Simon Butcher420be4e2016-10-07 12:55:43 +01001095 if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001096 return( ret );
Brian Murray0f6af732016-05-19 15:59:23 -07001097#endif /* MBEDTLS_AES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -07001098
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001099 if( verbose != 0 )
1100 mbedtls_printf( "\n" );
Brian Murray0f6af732016-05-19 15:59:23 -07001101
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001102 return( 0 );
1103}
1104
Brian Murray0f6af732016-05-19 15:59:23 -07001105#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001106
1107#endif /* MBEDTLS_CMAC_C */