blob: a7f7f45e9cd7c56ab4d75e6c788964cbefb93b6f [file] [log] [blame]
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001/**
2 * \file cmac.h
3 *
Simon Butcher327398a2016-10-05 14:09:11 +01004 * \brief Cipher-based Message Authentication Code (CMAC) Mode for
5 * Authentication
Darryl Greena40a1012018-01-05 15:33:17 +00006 */
7/*
Simon Butcher327398a2016-10-05 14:09:11 +01008 * Copyright (C) 2015-2016, ARM Limited, All Rights Reserved
Robert Cragie3d23b1d2015-12-15 07:38:11 +00009 * SPDX-License-Identifier: Apache-2.0
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License"); you may
12 * not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 *
23 * This file is part of mbed TLS (https://tls.mbed.org)
24 */
25#ifndef MBEDTLS_CMAC_H
26#define MBEDTLS_CMAC_H
27
Simon Butcher327398a2016-10-05 14:09:11 +010028#include "mbedtls/cipher.h"
Robert Cragie3d23b1d2015-12-15 07:38:11 +000029
30#ifdef __cplusplus
31extern "C" {
32#endif
33
Simon Butcher69283e52016-10-06 12:49:58 +010034#define MBEDTLS_AES_BLOCK_SIZE 16
35#define MBEDTLS_DES3_BLOCK_SIZE 8
36
Simon Butcher327398a2016-10-05 14:09:11 +010037#if defined(MBEDTLS_AES_C)
Simon Butcher69283e52016-10-06 12:49:58 +010038#define MBEDTLS_CIPHER_BLKSIZE_MAX 16 /* longest used by CMAC is AES */
Simon Butcher327398a2016-10-05 14:09:11 +010039#else
Simon Butcher69283e52016-10-06 12:49:58 +010040#define MBEDTLS_CIPHER_BLKSIZE_MAX 8 /* longest used by CMAC is 3DES */
Simon Butcher327398a2016-10-05 14:09:11 +010041#endif
42
Steven Cooreman63342772017-04-04 11:47:16 +020043#if !defined(MBEDTLS_CMAC_ALT)
44
Robert Cragie3d23b1d2015-12-15 07:38:11 +000045/**
Simon Butcher8308a442016-10-05 15:12:59 +010046 * CMAC context structure - Contains internal state information only
Robert Cragie3d23b1d2015-12-15 07:38:11 +000047 */
Simon Butcher8308a442016-10-05 15:12:59 +010048struct mbedtls_cmac_context_t
49{
Simon Butcher327398a2016-10-05 14:09:11 +010050 /** Internal state of the CMAC algorithm */
Simon Butcher69283e52016-10-06 12:49:58 +010051 unsigned char state[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +010052
Andres AGa592dcc2016-10-06 15:23:39 +010053 /** Unprocessed data - either data that was not block aligned and is still
Simon Butcher327398a2016-10-05 14:09:11 +010054 * pending to be processed, or the final block */
Simon Butcher69283e52016-10-06 12:49:58 +010055 unsigned char unprocessed_block[MBEDTLS_CIPHER_BLKSIZE_MAX];
Simon Butcher327398a2016-10-05 14:09:11 +010056
57 /** Length of data pending to be processed */
58 size_t unprocessed_len;
Simon Butcher8308a442016-10-05 15:12:59 +010059};
Robert Cragie3d23b1d2015-12-15 07:38:11 +000060
61/**
Simon Butcher327398a2016-10-05 14:09:11 +010062 * \brief Set the CMAC key and prepare to authenticate the input
63 * data.
Simon Butcherf4957a82016-12-14 15:27:22 +000064 * Should be called with an initialized cipher context.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000065 *
Simon Butcherf4957a82016-12-14 15:27:22 +000066 * \param ctx Cipher context. This should be a cipher context,
67 * initialized to be one of the following types:
68 * MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_CIPHER_AES_192_ECB,
69 * MBEDTLS_CIPHER_AES_256_ECB or
70 * MBEDTLS_CIPHER_DES_EDE3_ECB.
Simon Butcher327398a2016-10-05 14:09:11 +010071 * \param key CMAC key
72 * \param keybits length of the CMAC key in bits
73 * (must be acceptable by the cipher)
74 *
75 * \return 0 if successful, or a cipher specific error code
Robert Cragie3d23b1d2015-12-15 07:38:11 +000076 */
Simon Butcher327398a2016-10-05 14:09:11 +010077int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,
Simon Butcher94ffde72016-10-05 15:33:53 +010078 const unsigned char *key, size_t keybits );
Robert Cragie3d23b1d2015-12-15 07:38:11 +000079
80/**
Simon Butcher327398a2016-10-05 14:09:11 +010081 * \brief Generic CMAC process buffer.
82 * Called between mbedtls_cipher_cmac_starts() or
83 * mbedtls_cipher_cmac_reset() and
84 * mbedtls_cipher_cmac_finish().
85 * May be called repeatedly.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000086 *
Simon Butcher327398a2016-10-05 14:09:11 +010087 * \param ctx CMAC context
88 * \param input buffer holding the data
89 * \param ilen length of the input data
Robert Cragie3d23b1d2015-12-15 07:38:11 +000090 *
Simon Butcher327398a2016-10-05 14:09:11 +010091 * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
92 * verification fails.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000093 */
Simon Butcher327398a2016-10-05 14:09:11 +010094int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,
95 const unsigned char *input, size_t ilen );
Robert Cragie3d23b1d2015-12-15 07:38:11 +000096
97/**
Simon Butcher327398a2016-10-05 14:09:11 +010098 * \brief Output CMAC.
99 * Called after mbedtls_cipher_cmac_update().
100 * Usually followed by mbedtls_cipher_cmac_reset(), then
101 * mbedtls_cipher_cmac_starts(), or mbedtls_cipher_free().
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000102 *
Simon Butcher327398a2016-10-05 14:09:11 +0100103 * \param ctx CMAC context
104 * \param output Generic CMAC checksum result
105 *
106 * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
107 * verification fails.
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000108 */
Simon Butcher327398a2016-10-05 14:09:11 +0100109int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,
110 unsigned char *output );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000111
112/**
Simon Butcher327398a2016-10-05 14:09:11 +0100113 * \brief Prepare to authenticate a new message with the same key.
114 * Called after mbedtls_cipher_cmac_finish() and before
115 * mbedtls_cipher_cmac_update().
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000116 *
Simon Butcher327398a2016-10-05 14:09:11 +0100117 * \param ctx CMAC context to be reset
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000118 *
Simon Butcher327398a2016-10-05 14:09:11 +0100119 * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
120 * verification fails.
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000121 */
Simon Butcher327398a2016-10-05 14:09:11 +0100122int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000123
124/**
Simon Butcherf4957a82016-12-14 15:27:22 +0000125 * \brief Output = Generic_CMAC( cmac key, input buffer )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000126 *
Simon Butcher327398a2016-10-05 14:09:11 +0100127 * \param cipher_info message digest info
128 * \param key CMAC key
129 * \param keylen length of the CMAC key in bits
130 * \param input buffer holding the data
131 * \param ilen length of the input data
132 * \param output Generic CMAC-result
133 *
134 * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter
135 * verification fails.
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000136 */
Simon Butcher327398a2016-10-05 14:09:11 +0100137int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,
138 const unsigned char *key, size_t keylen,
139 const unsigned char *input, size_t ilen,
140 unsigned char *output );
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000141
Simon Butcher69283e52016-10-06 12:49:58 +0100142#if defined(MBEDTLS_AES_C)
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000143/**
144 * \brief AES-CMAC-128-PRF
Simon Butcher327398a2016-10-05 14:09:11 +0100145 * Implementation of (AES-CMAC-PRF-128), as defined in RFC 4615
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000146 *
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000147 * \param key PRF key
Simon Butcher327398a2016-10-05 14:09:11 +0100148 * \param key_len PRF key length in bytes
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000149 * \param input buffer holding the input data
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000150 * \param in_len length of the input data in bytes
Simon Butcher327398a2016-10-05 14:09:11 +0100151 * \param output buffer holding the generated pseudorandom output (16 bytes)
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000152 *
153 * \return 0 if successful
154 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700155int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_len,
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000156 const unsigned char *input, size_t in_len,
Simon Butcher327398a2016-10-05 14:09:11 +0100157 unsigned char output[16] );
Brian Murrayb439d452016-05-19 16:02:42 -0700158#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000159
Steven Cooreman63342772017-04-04 11:47:16 +0200160#ifdef __cplusplus
161}
162#endif
163
164#else /* !MBEDTLS_CMAC_ALT */
165#include "cmac_alt.h"
166#endif /* !MBEDTLS_CMAC_ALT */
167
168#ifdef __cplusplus
169extern "C" {
170#endif
171
Brian Murrayb439d452016-05-19 16:02:42 -0700172#if defined(MBEDTLS_SELF_TEST) && ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000173/**
174 * \brief Checkup routine
175 *
176 * \return 0 if successful, or 1 if the test failed
177 */
178int mbedtls_cmac_self_test( int verbose );
Brian Murrayb439d452016-05-19 16:02:42 -0700179#endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000180
181#ifdef __cplusplus
182}
183#endif
184
185#endif /* MBEDTLS_CMAC_H */