blob: 409f67958e9e34cea2098ba0f009f6fb9e25881a [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útia2947ac2020-08-19 16:37:36 +02006 * Copyright The Mbed TLS Contributors
Bence Szépkútif744bd72020-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útif744bd72020-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"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050077#include "mbedtls/platform_util.h"
Robert Cragie3d23b1d2015-12-15 07:38:11 +000078
79#include <string.h>
80
Brian Murray8b4111c2016-09-13 15:58:46 -070081
Robert Cragie3d23b1d2015-12-15 07:38:11 +000082#if defined(MBEDTLS_PLATFORM_C)
83#include "mbedtls/platform.h"
84#else
Brian Murray8b4111c2016-09-13 15:58:46 -070085#include <stdlib.h>
86#define mbedtls_calloc calloc
87#define mbedtls_free free
Simon Butcherd241f1c2016-10-06 10:39:49 +010088#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +000089#include <stdio.h>
Brian Murray8b4111c2016-09-13 15:58:46 -070090#define mbedtls_printf printf
Brian J Murray2adecba2016-11-06 04:45:15 -080091#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +000092#endif /* MBEDTLS_PLATFORM_C */
Brian Murray8b4111c2016-09-13 15:58:46 -070093
Ron Eldor621080d2017-12-21 10:57:43 +020094#if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST)
Steven Cooreman63342772017-04-04 11:47:16 +020095
Robert Cragie3d23b1d2015-12-15 07:38:11 +000096/*
Brian Murrayb0c3c432016-05-18 14:29:51 -070097 * Multiplication by u in the Galois field of GF(2^n)
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +000098 *
Brian Murray72b69e32016-09-13 14:21:01 -070099 * As explained in NIST SP 800-38B, this can be computed:
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000100 *
Simon Butcher327398a2016-10-05 14:09:11 +0100101 * If MSB(p) = 0, then p = (p << 1)
102 * If MSB(p) = 1, then p = (p << 1) ^ R_n
103 * with R_64 = 0x1B and R_128 = 0x87
104 *
105 * Input and output MUST NOT point to the same buffer
Brian J Murray2adecba2016-11-06 04:45:15 -0800106 * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES.
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000107 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700108static int cmac_multiply_by_u( unsigned char *output,
109 const unsigned char *input,
Brian Murray53e23b62016-09-13 14:00:15 -0700110 size_t blocksize )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000111{
Brian Murrayb0c3c432016-05-18 14:29:51 -0700112 const unsigned char R_128 = 0x87;
113 const unsigned char R_64 = 0x1B;
114 unsigned char R_n, mask;
115 unsigned char overflow = 0x00;
Simon Butcher327398a2016-10-05 14:09:11 +0100116 int i;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700117
Simon Butcher69283e52016-10-06 12:49:58 +0100118 if( blocksize == MBEDTLS_AES_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700119 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700120 R_n = R_128;
Simon Butcher327398a2016-10-05 14:09:11 +0100121 }
Simon Butcher69283e52016-10-06 12:49:58 +0100122 else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700123 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700124 R_n = R_64;
Simon Butcher327398a2016-10-05 14:09:11 +0100125 }
126 else
Brian Murray6a3c0d22016-05-20 18:25:43 -0700127 {
Simon Butcher327398a2016-10-05 14:09:11 +0100128 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700129 }
130
Simon B3249cb72016-11-03 01:11:37 +0000131 for( i = (int)blocksize - 1; i >= 0; i-- )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000132 {
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000133 output[i] = input[i] << 1 | overflow;
134 overflow = input[i] >> 7;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000135 }
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000136
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000137 /* mask = ( input[0] >> 7 ) ? 0xff : 0x00
138 * using bit operations to avoid branches */
Simon Butcher327398a2016-10-05 14:09:11 +0100139
Manuel Pégourié-Gonnard475f06f2016-01-13 13:05:03 +0000140 /* MSVC has a warning about unary minus on unsigned, but this is
141 * well-defined and precisely what we want to do here */
142#if defined(_MSC_VER)
143#pragma warning( push )
144#pragma warning( disable : 4146 )
145#endif
146 mask = - ( input[0] >> 7 );
147#if defined(_MSC_VER)
148#pragma warning( pop )
149#endif
150
Simon Butcher327398a2016-10-05 14:09:11 +0100151 output[ blocksize - 1 ] ^= R_n & mask;
152
Brian Murrayb439d452016-05-19 16:02:42 -0700153 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000154}
155
156/*
157 * Generate subkeys
Simon Butcher327398a2016-10-05 14:09:11 +0100158 *
159 * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000160 */
Simon Butcher327398a2016-10-05 14:09:11 +0100161static int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx,
162 unsigned char* K1, unsigned char* K2 )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000163{
Brian Murray57863ad2016-05-19 16:38:36 -0700164 int ret;
Simon Butcher69283e52016-10-06 12:49:58 +0100165 unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700166 size_t olen, block_size;
167
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500168 mbedtls_platform_zeroize( L, sizeof( L ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700169
Simon Butcher327398a2016-10-05 14:09:11 +0100170 block_size = ctx->cipher_info->block_size;
171
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000172 /* Calculate Ek(0) */
Simon Butcher327398a2016-10-05 14:09:11 +0100173 if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700174 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000175
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000176 /*
Manuel Pégourié-Gonnarda610b4c2016-01-13 11:28:16 +0000177 * Generate K1 and K2
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000178 */
Simon Butcher327398a2016-10-05 14:09:11 +0100179 if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700180 goto exit;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000181
Simon Butcher327398a2016-10-05 14:09:11 +0100182 if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 )
183 goto exit;
184
185exit:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500186 mbedtls_platform_zeroize( L, sizeof( L ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100187
188 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000189}
Ron Eldor621080d2017-12-21 10:57:43 +0200190#endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000191
Ron Eldor621080d2017-12-21 10:57:43 +0200192#if !defined(MBEDTLS_CMAC_ALT)
Simon Butcher69283e52016-10-06 12:49:58 +0100193static void cmac_xor_block( unsigned char *output, const unsigned char *input1,
194 const unsigned char *input2,
195 const size_t block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000196{
Hanno Becker61937d42017-04-26 15:01:23 +0100197 size_t idx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000198
Hanno Becker61937d42017-04-26 15:01:23 +0100199 for( idx = 0; idx < block_size; idx++ )
200 output[ idx ] = input1[ idx ] ^ input2[ idx ];
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000201}
202
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000203/*
204 * Create padded last block from (partial) last block.
205 *
206 * We can't use the padding option from the cipher layer, as it only works for
207 * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition.
208 */
Simon Butcher69283e52016-10-06 12:49:58 +0100209static void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX],
Brian Murray53e23b62016-09-13 14:00:15 -0700210 size_t padded_block_len,
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000211 const unsigned char *last_block,
Brian Murrayb0c3c432016-05-18 14:29:51 -0700212 size_t last_block_len )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000213{
214 size_t j;
215
Brian Murrayb0c3c432016-05-18 14:29:51 -0700216 for( j = 0; j < padded_block_len; j++ )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000217 {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700218 if( j < last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000219 padded_block[j] = last_block[j];
Brian Murrayb0c3c432016-05-18 14:29:51 -0700220 else if( j == last_block_len )
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000221 padded_block[j] = 0x80;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000222 else
Manuel Pégourié-Gonnardd2c3d3e2016-01-13 13:14:04 +0000223 padded_block[j] = 0x00;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000224 }
225}
226
Simon Butcher327398a2016-10-05 14:09:11 +0100227int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,
Simon Butcher94ffde72016-10-05 15:33:53 +0100228 const unsigned char *key, size_t keybits )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000229{
Simon Butcher327398a2016-10-05 14:09:11 +0100230 mbedtls_cipher_type_t type;
231 mbedtls_cmac_context_t *cmac_ctx;
Simon Butcher327398a2016-10-05 14:09:11 +0100232 int retval;
233
234 if( ctx == NULL || ctx->cipher_info == NULL || key == NULL )
235 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
236
Simon B3249cb72016-11-03 01:11:37 +0000237 if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits,
Simon Butcher327398a2016-10-05 14:09:11 +0100238 MBEDTLS_ENCRYPT ) ) != 0 )
239 return( retval );
240
Simon Butcher327398a2016-10-05 14:09:11 +0100241 type = ctx->cipher_info->type;
242
243 switch( type )
244 {
245 case MBEDTLS_CIPHER_AES_128_ECB:
246 case MBEDTLS_CIPHER_AES_192_ECB:
247 case MBEDTLS_CIPHER_AES_256_ECB:
248 case MBEDTLS_CIPHER_DES_EDE3_ECB:
249 break;
250 default:
251 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
252 }
253
254 /* Allocated and initialise in the cipher context memory for the CMAC
255 * context */
256 cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) );
257 if( cmac_ctx == NULL )
258 return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );
259
260 ctx->cmac_ctx = cmac_ctx;
261
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500262 mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100263
264 return 0;
265}
266
267int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,
268 const unsigned char *input, size_t ilen )
269{
270 mbedtls_cmac_context_t* cmac_ctx;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700271 unsigned char *state;
Simon B3249cb72016-11-03 01:11:37 +0000272 int ret = 0;
273 size_t n, j, olen, block_size;
Brian Murrayb0c3c432016-05-18 14:29:51 -0700274
Simon Butcher327398a2016-10-05 14:09:11 +0100275 if( ctx == NULL || ctx->cipher_info == NULL || input == NULL ||
276 ctx->cmac_ctx == NULL )
277 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700278
Simon Butcher327398a2016-10-05 14:09:11 +0100279 cmac_ctx = ctx->cmac_ctx;
280 block_size = ctx->cipher_info->block_size;
281 state = ctx->cmac_ctx->state;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000282
Simon Butcher6b0774a2016-10-10 21:37:42 +0100283 /* Is there data still to process from the last call, that's greater in
284 * size than a block? */
Simon Butcher327398a2016-10-05 14:09:11 +0100285 if( cmac_ctx->unprocessed_len > 0 &&
Andres AGa592dcc2016-10-06 15:23:39 +0100286 ilen > block_size - cmac_ctx->unprocessed_len )
Brian Murray57863ad2016-05-19 16:38:36 -0700287 {
Simon Butcher327398a2016-10-05 14:09:11 +0100288 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
289 input,
290 block_size - cmac_ctx->unprocessed_len );
291
292 cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size );
293
294 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
295 &olen ) ) != 0 )
296 {
297 goto exit;
298 }
299
Simon Butcher6b0774a2016-10-10 21:37:42 +0100300 input += block_size - cmac_ctx->unprocessed_len;
301 ilen -= block_size - cmac_ctx->unprocessed_len;
Simon Butcher327398a2016-10-05 14:09:11 +0100302 cmac_ctx->unprocessed_len = 0;
Brian Murray57863ad2016-05-19 16:38:36 -0700303 }
304
Simon Butcher327398a2016-10-05 14:09:11 +0100305 /* n is the number of blocks including any final partial block */
306 n = ( ilen + block_size - 1 ) / block_size;
307
Simon B3249cb72016-11-03 01:11:37 +0000308 /* Iterate across the input data in block sized chunks, excluding any
309 * final partial or complete block */
310 for( j = 1; j < n; j++ )
Brian Murray57863ad2016-05-19 16:38:36 -0700311 {
Simon Butcher327398a2016-10-05 14:09:11 +0100312 cmac_xor_block( state, input, state, block_size );
313
314 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
315 &olen ) ) != 0 )
316 goto exit;
317
318 ilen -= block_size;
319 input += block_size;
Brian Murray57863ad2016-05-19 16:38:36 -0700320 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000321
Simon Butcher327398a2016-10-05 14:09:11 +0100322 /* If there is data left over that wasn't aligned to a block */
323 if( ilen > 0 )
324 {
Simon Butcher6b0774a2016-10-10 21:37:42 +0100325 memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],
326 input,
327 ilen );
328 cmac_ctx->unprocessed_len += ilen;
Simon Butcher327398a2016-10-05 14:09:11 +0100329 }
330
331exit:
332 return( ret );
333}
334
335int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,
336 unsigned char *output )
337{
338 mbedtls_cmac_context_t* cmac_ctx;
Simon Butcher69283e52016-10-06 12:49:58 +0100339 unsigned char *state, *last_block;
340 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
341 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
342 unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100343 int ret;
344 size_t olen, block_size;
345
346 if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ||
347 output == NULL )
348 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
349
350 cmac_ctx = ctx->cmac_ctx;
351 block_size = ctx->cipher_info->block_size;
352 state = cmac_ctx->state;
353
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500354 mbedtls_platform_zeroize( K1, sizeof( K1 ) );
355 mbedtls_platform_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100356 cmac_generate_subkeys( ctx, K1, K2 );
357
Simon Butcher69283e52016-10-06 12:49:58 +0100358 last_block = cmac_ctx->unprocessed_block;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000359
360 /* Calculate last block */
Janos Follathe3d882a2016-10-11 10:49:26 +0100361 if( cmac_ctx->unprocessed_len < block_size )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000362 {
Simon Butcher327398a2016-10-05 14:09:11 +0100363 cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len );
364 cmac_xor_block( M_last, M_last, K2, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000365 }
366 else
367 {
Manuel Pégourié-Gonnard2c063062016-01-13 14:27:55 +0000368 /* Last block is complete block */
Simon Butcher327398a2016-10-05 14:09:11 +0100369 cmac_xor_block( M_last, last_block, K1, block_size );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000370 }
371
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000372
Simon Butcher327398a2016-10-05 14:09:11 +0100373 cmac_xor_block( state, M_last, state, block_size );
374 if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,
375 &olen ) ) != 0 )
376 {
377 goto exit;
378 }
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000379
Simon Butcher327398a2016-10-05 14:09:11 +0100380 memcpy( output, state, block_size );
381
382exit:
383 /* Wipe the generated keys on the stack, and any other transients to avoid
384 * side channel leakage */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500385 mbedtls_platform_zeroize( K1, sizeof( K1 ) );
386 mbedtls_platform_zeroize( K2, sizeof( K2 ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100387
388 cmac_ctx->unprocessed_len = 0;
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500389 mbedtls_platform_zeroize( cmac_ctx->unprocessed_block,
390 sizeof( cmac_ctx->unprocessed_block ) );
Simon Butcher327398a2016-10-05 14:09:11 +0100391
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500392 mbedtls_platform_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX );
Simon Butcher327398a2016-10-05 14:09:11 +0100393 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000394}
395
Simon Butcher327398a2016-10-05 14:09:11 +0100396int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000397{
Simon Butcher327398a2016-10-05 14:09:11 +0100398 mbedtls_cmac_context_t* cmac_ctx;
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000399
Simon Butcher327398a2016-10-05 14:09:11 +0100400 if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL )
401 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700402
Simon Butcher327398a2016-10-05 14:09:11 +0100403 cmac_ctx = ctx->cmac_ctx;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000404
Simon Butcher327398a2016-10-05 14:09:11 +0100405 /* Reset the internal state */
406 cmac_ctx->unprocessed_len = 0;
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500407 mbedtls_platform_zeroize( cmac_ctx->unprocessed_block,
408 sizeof( cmac_ctx->unprocessed_block ) );
409 mbedtls_platform_zeroize( cmac_ctx->state,
410 sizeof( cmac_ctx->state ) );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000411
Simon Butcher327398a2016-10-05 14:09:11 +0100412 return( 0 );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000413}
414
Simon Butcher327398a2016-10-05 14:09:11 +0100415int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
416 const unsigned char *key, size_t keylen,
417 const unsigned char *input, size_t ilen,
418 unsigned char *output )
419{
420 mbedtls_cipher_context_t ctx;
421 int ret;
422
423 if( cipher_info == NULL || key == NULL || input == NULL || output == NULL )
424 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
425
426 mbedtls_cipher_init( &ctx );
427
428 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
429 goto exit;
430
431 ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen );
Simon Butcher327398a2016-10-05 14:09:11 +0100432 if( ret != 0 )
433 goto exit;
Simon Butcher327398a2016-10-05 14:09:11 +0100434
435 ret = mbedtls_cipher_cmac_update( &ctx, input, ilen );
436 if( ret != 0 )
437 goto exit;
438
Simon Butcher69283e52016-10-06 12:49:58 +0100439 ret = mbedtls_cipher_cmac_finish( &ctx, output );
Simon Butcher327398a2016-10-05 14:09:11 +0100440
441exit:
Simon Butcher69283e52016-10-06 12:49:58 +0100442 mbedtls_cipher_free( &ctx );
443
Simon Butcher327398a2016-10-05 14:09:11 +0100444 return( ret );
445}
Simon Butcher327398a2016-10-05 14:09:11 +0100446
Simon Butcher69283e52016-10-06 12:49:58 +0100447#if defined(MBEDTLS_AES_C)
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000448/*
Simon Butcher69283e52016-10-06 12:49:58 +0100449 * Implementation of AES-CMAC-PRF-128 defined in RFC 4615
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000450 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700451int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length,
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000452 const unsigned char *input, size_t in_len,
Rodrigo Dias Correa1a0c7fb2020-11-10 01:38:00 -0300453 unsigned char output[16] )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000454{
455 int ret;
Simon Butcher327398a2016-10-05 14:09:11 +0100456 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100457 unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE];
458 unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE];
459
460 if( key == NULL || input == NULL || output == NULL )
461 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000462
Simon Butcher327398a2016-10-05 14:09:11 +0100463 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
464 if( cipher_info == NULL )
465 {
466 /* Failing at this point must be due to a build issue */
467 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
468 goto exit;
469 }
Brian Murrayb0c3c432016-05-18 14:29:51 -0700470
Simon Butcher69283e52016-10-06 12:49:58 +0100471 if( key_length == MBEDTLS_AES_BLOCK_SIZE )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000472 {
473 /* Use key as is */
Simon Butcher69283e52016-10-06 12:49:58 +0100474 memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000475 }
476 else
477 {
Simon Butcher69283e52016-10-06 12:49:58 +0100478 memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE );
Manuel Pégourié-Gonnard7b555f22016-01-13 15:09:09 +0000479
Simon Butcher327398a2016-10-05 14:09:11 +0100480 ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key,
481 key_length, int_key );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000482 if( ret != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700483 goto exit;
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000484 }
485
Simon Butcher327398a2016-10-05 14:09:11 +0100486 ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len,
487 output );
Manuel Pégourié-Gonnardd6cf7542016-01-13 11:30:00 +0000488
Simon Butcher327398a2016-10-05 14:09:11 +0100489exit:
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500490 mbedtls_platform_zeroize( int_key, sizeof( int_key ) );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700491
Simon Butcher327398a2016-10-05 14:09:11 +0100492 return( ret );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000493}
Brian Murrayb439d452016-05-19 16:02:42 -0700494#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000495
Steven Cooreman63342772017-04-04 11:47:16 +0200496#endif /* !MBEDTLS_CMAC_ALT */
497
Simon Butcher69283e52016-10-06 12:49:58 +0100498#if defined(MBEDTLS_SELF_TEST)
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000499/*
Janos Follathcd13bd22016-12-13 11:51:04 +0000500 * CMAC test data for SP800-38B
501 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf
502 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf
Brian Murray0f6af732016-05-19 15:59:23 -0700503 *
504 * AES-CMAC-PRF-128 test data from RFC 4615
505 * https://tools.ietf.org/html/rfc4615#page-4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000506 */
507
Brian Murray0f6af732016-05-19 15:59:23 -0700508#define NB_CMAC_TESTS_PER_KEY 4
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000509#define NB_PRF_TESTS 3
Simon Butcher327398a2016-10-05 14:09:11 +0100510
Brian Murray0f6af732016-05-19 15:59:23 -0700511#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)
512/* All CMAC test inputs are truncated from the same 64 byte buffer. */
513static const unsigned char test_message[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000514 /* PT */
515 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
516 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
517 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
518 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
519 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
520 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
521 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
522 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000523};
Simon Butcher69283e52016-10-06 12:49:58 +0100524#endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */
Brian Murray0cf14c12016-05-23 12:49:50 -0700525
Simon Butcher69283e52016-10-06 12:49:58 +0100526#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700527/* Truncation point of message for AES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700528static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000529 /* Mlen */
Brian Murray0f6af732016-05-19 15:59:23 -0700530 0,
531 16,
Janos Follathcd13bd22016-12-13 11:51:04 +0000532 20,
Brian Murray0f6af732016-05-19 15:59:23 -0700533 64
534};
535
Janos Follathcd13bd22016-12-13 11:51:04 +0000536/* CMAC-AES128 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700537static const unsigned char aes_128_key[16] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000538 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
539 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
Brian Murray0f6af732016-05-19 15:59:23 -0700540};
Simon Butcher69283e52016-10-06 12:49:58 +0100541static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700542 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000543 /* K1 */
544 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66,
545 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde
Brian Murray0f6af732016-05-19 15:59:23 -0700546 },
547 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000548 /* K2 */
549 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc,
550 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b
Brian Murray0f6af732016-05-19 15:59:23 -0700551 }
552};
Simon Butcher69283e52016-10-06 12:49:58 +0100553static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000554 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000555 /* Example #1 */
556 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
557 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000558 },
559 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000560 /* Example #2 */
561 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
562 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000563 },
564 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000565 /* Example #3 */
566 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8,
567 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000568 },
569 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000570 /* Example #4 */
571 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
572 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000573 }
574};
575
Janos Follathcd13bd22016-12-13 11:51:04 +0000576/* CMAC-AES192 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700577static const unsigned char aes_192_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000578 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
579 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
580 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000581};
Simon Butcher69283e52016-10-06 12:49:58 +0100582static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700583 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000584 /* K1 */
585 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27,
586 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96
Brian Murrayb0c3c432016-05-18 14:29:51 -0700587 },
588 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000589 /* K2 */
590 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e,
591 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c
Brian Murrayb0c3c432016-05-18 14:29:51 -0700592 }
593};
Simon Butcher69283e52016-10-06 12:49:58 +0100594static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700595 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000596 /* Example #1 */
597 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5,
598 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67
Brian Murrayb0c3c432016-05-18 14:29:51 -0700599 },
600 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000601 /* Example #2 */
602 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90,
603 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84
Brian Murrayb0c3c432016-05-18 14:29:51 -0700604 },
605 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000606 /* Example #3 */
607 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04,
608 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8
Brian Murrayb0c3c432016-05-18 14:29:51 -0700609 },
610 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000611 /* Example #4 */
612 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79,
613 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11
Brian Murrayb0c3c432016-05-18 14:29:51 -0700614 }
615};
616
Janos Follathcd13bd22016-12-13 11:51:04 +0000617/* CMAC-AES256 Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700618static const unsigned char aes_256_key[32] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000619 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
620 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
621 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
622 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
Brian Murray0f6af732016-05-19 15:59:23 -0700623};
Simon Butcher69283e52016-10-06 12:49:58 +0100624static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700625 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000626 /* K1 */
627 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac,
628 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f
Brian Murray0f6af732016-05-19 15:59:23 -0700629 },
630 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000631 /* K2 */
632 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58,
633 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700634 }
635};
Simon Butcher69283e52016-10-06 12:49:58 +0100636static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700637 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000638 /* Example #1 */
639 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e,
640 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83
Brian Murray0f6af732016-05-19 15:59:23 -0700641 },
642 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000643 /* Example #2 */
644 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82,
645 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c
Brian Murray0f6af732016-05-19 15:59:23 -0700646 },
647 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000648 /* Example #3 */
649 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a,
650 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93
Brian Murray0f6af732016-05-19 15:59:23 -0700651 },
652 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000653 /* Example #4 */
654 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5,
655 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10
Brian Murray0f6af732016-05-19 15:59:23 -0700656 }
657};
658#endif /* MBEDTLS_AES_C */
659
Simon Butcher69283e52016-10-06 12:49:58 +0100660#if defined(MBEDTLS_DES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700661/* Truncation point of message for 3DES CMAC tests */
Brian Murray57863ad2016-05-19 16:38:36 -0700662static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = {
Brian Murray0f6af732016-05-19 15:59:23 -0700663 0,
Janos Follathcd13bd22016-12-13 11:51:04 +0000664 16,
Brian Murray0f6af732016-05-19 15:59:23 -0700665 20,
666 32
667};
668
Janos Follathcd13bd22016-12-13 11:51:04 +0000669/* CMAC-TDES (Generation) - 2 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700670static const unsigned char des3_2key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000671 /* Key1 */
672 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
673 /* Key2 */
674 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01,
675 /* Key3 */
676 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
Brian Murray0f6af732016-05-19 15:59:23 -0700677};
678static const unsigned char des3_2key_subkeys[2][8] = {
679 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000680 /* K1 */
681 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9
Brian Murray0f6af732016-05-19 15:59:23 -0700682 },
683 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000684 /* K2 */
685 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2
Brian Murray0f6af732016-05-19 15:59:23 -0700686 }
687};
Simon Butcher69283e52016-10-06 12:49:58 +0100688static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700689 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000690 /* Sample #1 */
691 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60
Brian Murrayb0c3c432016-05-18 14:29:51 -0700692 },
693 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000694 /* Sample #2 */
695 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b
Brian Murrayb0c3c432016-05-18 14:29:51 -0700696 },
697 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000698 /* Sample #3 */
699 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69
Brian Murrayb0c3c432016-05-18 14:29:51 -0700700 },
701 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000702 /* Sample #4 */
703 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb
Brian Murrayb0c3c432016-05-18 14:29:51 -0700704 }
705};
706
Janos Follathcd13bd22016-12-13 11:51:04 +0000707/* CMAC-TDES (Generation) - 3 Key Test Data */
Brian Murray57863ad2016-05-19 16:38:36 -0700708static const unsigned char des3_3key_key[24] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000709 /* Key1 */
710 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef,
711 /* Key2 */
712 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,
713 /* Key3 */
714 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23
Brian Murray0f6af732016-05-19 15:59:23 -0700715};
716static const unsigned char des3_3key_subkeys[2][8] = {
717 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000718 /* K1 */
719 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0
Brian Murray0f6af732016-05-19 15:59:23 -0700720 },
721 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000722 /* K2 */
723 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b
Brian Murray0f6af732016-05-19 15:59:23 -0700724 }
725};
Simon Butcher69283e52016-10-06 12:49:58 +0100726static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {
Brian Murrayb0c3c432016-05-18 14:29:51 -0700727 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000728 /* Sample #1 */
729 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50
Brian Murrayb0c3c432016-05-18 14:29:51 -0700730 },
731 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000732 /* Sample #2 */
733 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09
Brian Murrayb0c3c432016-05-18 14:29:51 -0700734 },
735 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000736 /* Sample #3 */
737 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2
Brian Murrayb0c3c432016-05-18 14:29:51 -0700738 },
739 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000740 /* Sample #4 */
741 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5
Brian Murrayb0c3c432016-05-18 14:29:51 -0700742 }
743};
744
Brian Murray0f6af732016-05-19 15:59:23 -0700745#endif /* MBEDTLS_DES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700746
Simon Butcher69283e52016-10-06 12:49:58 +0100747#if defined(MBEDTLS_AES_C)
Brian Murray0f6af732016-05-19 15:59:23 -0700748/* AES AES-CMAC-PRF-128 Test Data */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000749static const unsigned char PRFK[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000750 /* Key */
751 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
752 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000753 0xed, 0xcb
754};
755
756/* Sizes in bytes */
757static const size_t PRFKlen[NB_PRF_TESTS] = {
758 18,
759 16,
760 10
761};
762
Janos Follathcd13bd22016-12-13 11:51:04 +0000763/* Message */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000764static const unsigned char PRFM[] = {
Janos Follathcd13bd22016-12-13 11:51:04 +0000765 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
766 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
Manuel Pégourié-Gonnard3da54022016-01-13 11:00:47 +0000767 0x10, 0x11, 0x12, 0x13
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000768};
769
770static const unsigned char PRFT[NB_PRF_TESTS][16] = {
771 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000772 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b,
773 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000774 },
775 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000776 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52,
777 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000778 },
779 {
Janos Follathcd13bd22016-12-13 11:51:04 +0000780 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee,
781 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000782 }
783};
Brian Murray0f6af732016-05-19 15:59:23 -0700784#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000785
Simon Butcher327398a2016-10-05 14:09:11 +0100786static int cmac_test_subkeys( int verbose,
787 const char* testname,
788 const unsigned char* key,
789 int keybits,
790 const unsigned char* subkeys,
791 mbedtls_cipher_type_t cipher_type,
792 int block_size,
793 int num_tests )
794{
Brian Murray2fab5c92016-12-15 18:51:13 -0800795 int i, ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100796 mbedtls_cipher_context_t ctx;
797 const mbedtls_cipher_info_t *cipher_info;
Simon Butcher69283e52016-10-06 12:49:58 +0100798 unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];
799 unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +0100800
801 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
802 if( cipher_info == NULL )
803 {
804 /* Failing at this point must be due to a build issue */
Simon Butcher69283e52016-10-06 12:49:58 +0100805 return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
Simon Butcher327398a2016-10-05 14:09:11 +0100806 }
807
808 for( i = 0; i < num_tests; i++ )
809 {
810 if( verbose != 0 )
Simon Butcher69283e52016-10-06 12:49:58 +0100811 mbedtls_printf( " %s CMAC subkey #%u: ", testname, i + 1 );
Simon Butcher327398a2016-10-05 14:09:11 +0100812
Janos Follathd4443582016-10-12 10:00:42 +0100813 mbedtls_cipher_init( &ctx );
814
Simon Butcher327398a2016-10-05 14:09:11 +0100815 if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )
816 {
817 if( verbose != 0 )
818 mbedtls_printf( "test execution failed\n" );
819
Janos Follathd4443582016-10-12 10:00:42 +0100820 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100821 }
822
823 if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits,
824 MBEDTLS_ENCRYPT ) ) != 0 )
825 {
826 if( verbose != 0 )
827 mbedtls_printf( "test execution failed\n" );
828
Janos Follathd4443582016-10-12 10:00:42 +0100829 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100830 }
831
832 ret = cmac_generate_subkeys( &ctx, K1, K2 );
833 if( ret != 0 )
834 {
835 if( verbose != 0 )
836 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100837
838 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100839 }
840
Simon Butcher420be4e2016-10-07 12:55:43 +0100841 if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0 ||
842 ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100843 {
844 if( verbose != 0 )
845 mbedtls_printf( "failed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100846
847 goto cleanup;
Simon Butcher327398a2016-10-05 14:09:11 +0100848 }
849
850 if( verbose != 0 )
851 mbedtls_printf( "passed\n" );
Janos Follathd4443582016-10-12 10:00:42 +0100852
853 mbedtls_cipher_free( &ctx );
Simon Butcher327398a2016-10-05 14:09:11 +0100854 }
855
Gilles Peskinedf761d52018-03-01 22:18:14 +0100856 ret = 0;
Janos Follathd4443582016-10-12 10:00:42 +0100857 goto exit;
858
859cleanup:
Simon Butcher69283e52016-10-06 12:49:58 +0100860 mbedtls_cipher_free( &ctx );
861
Janos Follathd4443582016-10-12 10:00:42 +0100862exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100863 return( ret );
864}
865
Simon Butcher69283e52016-10-06 12:49:58 +0100866static int cmac_test_wth_cipher( int verbose,
867 const char* testname,
868 const unsigned char* key,
869 int keybits,
870 const unsigned char* messages,
871 const unsigned int message_lengths[4],
872 const unsigned char* expected_result,
873 mbedtls_cipher_type_t cipher_type,
874 int block_size,
875 int num_tests )
Brian Murray00dc5f02016-05-19 14:23:50 -0700876{
Simon Butcher327398a2016-10-05 14:09:11 +0100877 const mbedtls_cipher_info_t *cipher_info;
Brian Murray2fab5c92016-12-15 18:51:13 -0800878 int i, ret = 0;
Simon Butcher69283e52016-10-06 12:49:58 +0100879 unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];
Brian Murray57863ad2016-05-19 16:38:36 -0700880
Simon Butcher327398a2016-10-05 14:09:11 +0100881 cipher_info = mbedtls_cipher_info_from_type( cipher_type );
882 if( cipher_info == NULL )
Brian Murray00dc5f02016-05-19 14:23:50 -0700883 {
Simon Butcher327398a2016-10-05 14:09:11 +0100884 /* Failing at this point must be due to a build issue */
885 ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
Brian Murray00dc5f02016-05-19 14:23:50 -0700886 goto exit;
887 }
888
889 for( i = 0; i < num_tests; i++ )
890 {
891 if( verbose != 0 )
Andres AGa592dcc2016-10-06 15:23:39 +0100892 mbedtls_printf( " %s CMAC #%u: ", testname, i + 1 );
Brian Murray00dc5f02016-05-19 14:23:50 -0700893
Simon Butcher327398a2016-10-05 14:09:11 +0100894 if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages,
895 message_lengths[i], output ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700896 {
897 if( verbose != 0 )
898 mbedtls_printf( "failed\n" );
899 goto exit;
900 }
Brian Murray9ce2e092016-05-24 22:46:43 -0700901
Simon Butcher327398a2016-10-05 14:09:11 +0100902 if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 )
Brian Murray00dc5f02016-05-19 14:23:50 -0700903 {
904 if( verbose != 0 )
905 mbedtls_printf( "failed\n" );
906 goto exit;
907 }
908
Brian Murray9ce2e092016-05-24 22:46:43 -0700909 if( verbose != 0 )
910 mbedtls_printf( "passed\n" );
Brian Murray00dc5f02016-05-19 14:23:50 -0700911 }
Gilles Peskinedf761d52018-03-01 22:18:14 +0100912 ret = 0;
Simon Butcher327398a2016-10-05 14:09:11 +0100913
Simon Butcher69283e52016-10-06 12:49:58 +0100914exit:
Simon Butcher327398a2016-10-05 14:09:11 +0100915 return( ret );
Brian Murray00dc5f02016-05-19 14:23:50 -0700916}
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000917
Simon Butcher69283e52016-10-06 12:49:58 +0100918#if defined(MBEDTLS_AES_C)
919static int test_aes128_cmac_prf( int verbose )
Brian Murray6a3c0d22016-05-20 18:25:43 -0700920{
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000921 int i;
922 int ret;
Simon Butcher69283e52016-10-06 12:49:58 +0100923 unsigned char output[MBEDTLS_AES_BLOCK_SIZE];
Simon Butcher327398a2016-10-05 14:09:11 +0100924
Brian Murrayb0c3c432016-05-18 14:29:51 -0700925 for( i = 0; i < NB_PRF_TESTS; i++ )
926 {
Brian Murray0f6af732016-05-19 15:59:23 -0700927 mbedtls_printf( " AES CMAC 128 PRF #%u: ", i );
Simon Butcher327398a2016-10-05 14:09:11 +0100928 ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output );
Brian Murrayb0c3c432016-05-18 14:29:51 -0700929 if( ret != 0 ||
Simon Butcher69283e52016-10-06 12:49:58 +0100930 memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700931 {
Simon Butcher327398a2016-10-05 14:09:11 +0100932
Brian Murrayb0c3c432016-05-18 14:29:51 -0700933 if( verbose != 0 )
934 mbedtls_printf( "failed\n" );
935
Brian Murray0f6af732016-05-19 15:59:23 -0700936 return( ret );
Simon Butcher69283e52016-10-06 12:49:58 +0100937 }
938 else if( verbose != 0 )
Brian Murrayb0c3c432016-05-18 14:29:51 -0700939 {
940 mbedtls_printf( "passed\n" );
941 }
942 }
Brian Murray0f6af732016-05-19 15:59:23 -0700943 return( ret );
944}
945#endif /* MBEDTLS_AES_C */
946
947int mbedtls_cmac_self_test( int verbose )
948{
949 int ret;
Simon Butcher327398a2016-10-05 14:09:11 +0100950
Simon Butcher69283e52016-10-06 12:49:58 +0100951#if defined(MBEDTLS_AES_C)
Simon Butcher327398a2016-10-05 14:09:11 +0100952 /* AES-128 */
953 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100954 "AES 128",
955 aes_128_key,
956 128,
957 (const unsigned char*)aes_128_subkeys,
958 MBEDTLS_CIPHER_AES_128_ECB,
959 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100960 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100961 {
962 return( ret );
963 }
964
Brian Murrayae1cb122016-05-23 15:01:59 -0700965 if( ( ret = cmac_test_wth_cipher( verbose,
966 "AES 128",
967 aes_128_key,
968 128,
969 test_message,
970 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100971 (const unsigned char*)aes_128_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100972 MBEDTLS_CIPHER_AES_128_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +0100973 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100974 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +0100975 {
976 return( ret );
977 }
978
979 /* AES-192 */
980 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +0100981 "AES 192",
982 aes_192_key,
983 192,
984 (const unsigned char*)aes_192_subkeys,
985 MBEDTLS_CIPHER_AES_192_ECB,
986 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +0100987 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -0700988 {
989 return( ret );
990 }
Brian Murray0f6af732016-05-19 15:59:23 -0700991
Brian Murrayae1cb122016-05-23 15:01:59 -0700992 if( ( ret = cmac_test_wth_cipher( verbose,
993 "AES 192",
994 aes_192_key,
995 192,
996 test_message,
997 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +0100998 (const unsigned char*)aes_192_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +0100999 MBEDTLS_CIPHER_AES_192_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001000 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001001 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001002 {
Simon Butcher327398a2016-10-05 14:09:11 +01001003 return( ret );
1004 }
1005
1006 /* AES-256 */
1007 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001008 "AES 256",
1009 aes_256_key,
1010 256,
1011 (const unsigned char*)aes_256_subkeys,
1012 MBEDTLS_CIPHER_AES_256_ECB,
1013 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001014 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001015 {
1016 return( ret );
1017 }
Brian Murray0f6af732016-05-19 15:59:23 -07001018
Simon Butcher69283e52016-10-06 12:49:58 +01001019 if( ( ret = cmac_test_wth_cipher ( verbose,
Brian Murrayae1cb122016-05-23 15:01:59 -07001020 "AES 256",
1021 aes_256_key,
1022 256,
1023 test_message,
1024 aes_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001025 (const unsigned char*)aes_256_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001026 MBEDTLS_CIPHER_AES_256_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001027 MBEDTLS_AES_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001028 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001029 {
1030 return( ret );
1031 }
Brian Murray0f6af732016-05-19 15:59:23 -07001032#endif /* MBEDTLS_AES_C */
1033
Simon Butcher69283e52016-10-06 12:49:58 +01001034#if defined(MBEDTLS_DES_C)
Simon Butcher327398a2016-10-05 14:09:11 +01001035 /* 3DES 2 key */
1036 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001037 "3DES 2 key",
1038 des3_2key_key,
1039 192,
1040 (const unsigned char*)des3_2key_subkeys,
1041 MBEDTLS_CIPHER_DES_EDE3_ECB,
1042 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001043 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001044 {
1045 return( ret );
1046 }
1047
Brian Murrayae1cb122016-05-23 15:01:59 -07001048 if( ( ret = cmac_test_wth_cipher( verbose,
1049 "3DES 2 key",
1050 des3_2key_key,
1051 192,
1052 test_message,
1053 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001054 (const unsigned char*)des3_2key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001055 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001056 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001057 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001058 {
1059 return( ret );
1060 }
Brian Murray0f6af732016-05-19 15:59:23 -07001061
Simon Butcher327398a2016-10-05 14:09:11 +01001062 /* 3DES 3 key */
1063 if( ( ret = cmac_test_subkeys( verbose,
Simon Butcher69283e52016-10-06 12:49:58 +01001064 "3DES 3 key",
1065 des3_3key_key,
1066 192,
1067 (const unsigned char*)des3_3key_subkeys,
1068 MBEDTLS_CIPHER_DES_EDE3_ECB,
1069 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001070 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Simon Butcher327398a2016-10-05 14:09:11 +01001071 {
1072 return( ret );
1073 }
1074
Brian Murrayae1cb122016-05-23 15:01:59 -07001075 if( ( ret = cmac_test_wth_cipher( verbose,
1076 "3DES 3 key",
1077 des3_3key_key,
1078 192,
1079 test_message,
1080 des3_message_lengths,
Simon Butcher69283e52016-10-06 12:49:58 +01001081 (const unsigned char*)des3_3key_expected_result,
Simon Butcher327398a2016-10-05 14:09:11 +01001082 MBEDTLS_CIPHER_DES_EDE3_ECB,
Simon Butcher69283e52016-10-06 12:49:58 +01001083 MBEDTLS_DES3_BLOCK_SIZE,
Simon Butcher420be4e2016-10-07 12:55:43 +01001084 NB_CMAC_TESTS_PER_KEY ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001085 {
1086 return( ret );
1087 }
Brian Murray0f6af732016-05-19 15:59:23 -07001088#endif /* MBEDTLS_DES_C */
1089
Simon Butcher69283e52016-10-06 12:49:58 +01001090#if defined(MBEDTLS_AES_C)
Simon Butcher420be4e2016-10-07 12:55:43 +01001091 if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 )
Brian Murray9044b022016-05-19 16:36:56 -07001092 return( ret );
Brian Murray0f6af732016-05-19 15:59:23 -07001093#endif /* MBEDTLS_AES_C */
Brian Murrayb0c3c432016-05-18 14:29:51 -07001094
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001095 if( verbose != 0 )
1096 mbedtls_printf( "\n" );
Brian Murray0f6af732016-05-19 15:59:23 -07001097
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001098 return( 0 );
1099}
1100
Brian Murray0f6af732016-05-19 15:59:23 -07001101#endif /* MBEDTLS_SELF_TEST */
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001102
1103#endif /* MBEDTLS_CMAC_C */