blob: fed337d5c119da072a5de55a25b049e8ed8fc006 [file] [log] [blame]
Robert Cragie3d23b1d2015-12-15 07:38:11 +00001/**
2 * \file cmac.h
3 *
4 * \brief The CMAC Mode for Authentication
5 *
6 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
7 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 * This file is part of mbed TLS (https://tls.mbed.org)
22 */
23#ifndef MBEDTLS_CMAC_H
24#define MBEDTLS_CMAC_H
25
26#include "cipher.h"
27
28#define MBEDTLS_ERR_CMAC_BAD_INPUT -0x0011 /**< Bad input parameters to function. */
29#define MBEDTLS_ERR_CMAC_VERIFY_FAILED -0x0013 /**< Verification failed. */
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35/**
Brian Murrayb439d452016-05-19 16:02:42 -070036 * \brief CMAC context structure
Robert Cragie3d23b1d2015-12-15 07:38:11 +000037 */
38typedef struct {
39 mbedtls_cipher_context_t cipher_ctx; /*!< cipher context used */
Brian Murrayb439d452016-05-19 16:02:42 -070040 unsigned char* K1; /*!< CMAC Subkey 1 */
41 unsigned char* K2; /*!< CMAC Subkey 2 */
Robert Cragie3d23b1d2015-12-15 07:38:11 +000042}
43mbedtls_cmac_context;
44
45/**
46 * \brief Initialize CMAC context (just makes references valid)
47 * Makes the context ready for mbedtls_cmac_setkey() or
48 * mbedtls_cmac_free().
49 *
50 * \param ctx CMAC context to initialize
51 */
52void mbedtls_cmac_init( mbedtls_cmac_context *ctx );
53
54/**
Brian Murrayb439d452016-05-19 16:02:42 -070055 * \brief Initialize the CMAC context
Robert Cragie3d23b1d2015-12-15 07:38:11 +000056 *
57 * \param ctx CMAC context to be initialized
Brian Murrayb439d452016-05-19 16:02:42 -070058 * \param cipher cipher to use
Robert Cragie3d23b1d2015-12-15 07:38:11 +000059 * \param key encryption key
Brian Murrayb439d452016-05-19 16:02:42 -070060 * \param keybits encryption key size in bits (must be acceptable by the cipher)
Robert Cragie3d23b1d2015-12-15 07:38:11 +000061 *
62 * \return 0 if successful, or a cipher specific error code
63 */
64int mbedtls_cmac_setkey( mbedtls_cmac_context *ctx,
65 mbedtls_cipher_id_t cipher,
66 const unsigned char *key,
67 unsigned int keybits );
68
69/**
70 * \brief Free a CMAC context and underlying cipher sub-context
Brian Murrayb439d452016-05-19 16:02:42 -070071 * Securely wipes sub keys and other sensitive data.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000072 *
73 * \param ctx CMAC context to free
74 */
75void mbedtls_cmac_free( mbedtls_cmac_context *ctx );
76
77/**
Brian Murrayb439d452016-05-19 16:02:42 -070078 * \brief Generate a CMAC tag.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000079 *
80 * \param ctx CMAC context
Robert Cragie3d23b1d2015-12-15 07:38:11 +000081 * \param input buffer holding the input data
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +000082 * \param in_len length of the input data in bytes
Robert Cragie3d23b1d2015-12-15 07:38:11 +000083 * \param tag buffer for holding the generated tag
84 * \param tag_len length of the tag to generate in bytes
Brian Murrayb439d452016-05-19 16:02:42 -070085 * Must be 4, 6, 8 if cipher block size is 64
86 * Must be 4, 6, 8 0, 14 or 16 if cipher block size is 128
Robert Cragie3d23b1d2015-12-15 07:38:11 +000087 *
88 * \return 0 if successful
89 */
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +000090int mbedtls_cmac_generate( mbedtls_cmac_context *ctx,
91 const unsigned char *input, size_t in_len,
Robert Cragie3d23b1d2015-12-15 07:38:11 +000092 unsigned char *tag, size_t tag_len );
93
94/**
Brian Murrayb439d452016-05-19 16:02:42 -070095 * \brief Verify a CMAC tag.
Robert Cragie3d23b1d2015-12-15 07:38:11 +000096 *
97 * \param ctx CMAC context
Robert Cragie3d23b1d2015-12-15 07:38:11 +000098 * \param input buffer holding the input data
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +000099 * \param in_len length of the input data in bytes
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000100 * \param tag buffer holding the tag to verify
101 * \param tag_len length of the tag to verify in bytes
Brian Murrayb439d452016-05-19 16:02:42 -0700102 * Must be 4, 6, 8 if cipher block size is 64
103 * Must be 4, 6, 8 0, 14 or 16 if cipher block size is 128
104 * \return 0 if successful and authenticated
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000105 * MBEDTLS_ERR_CMAC_VERIFY_FAILED if tag does not match
106 */
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000107int mbedtls_cmac_verify( mbedtls_cmac_context *ctx,
108 const unsigned char *input, size_t in_len,
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000109 const unsigned char *tag, size_t tag_len );
110
Brian Murrayb439d452016-05-19 16:02:42 -0700111#ifdef MBEDTLS_AES_C
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000112/**
113 * \brief AES-CMAC-128-PRF
Brian Murrayb439d452016-05-19 16:02:42 -0700114 * See RFC 4615 for details
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000115 *
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000116 * \param key PRF key
117 * \param key_len PRF key length
118 * \param input buffer holding the input data
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000119 * \param in_len length of the input data in bytes
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000120 * \param tag buffer holding the tag to verify (16 bytes)
121 *
122 * \return 0 if successful
123 */
Brian Murrayb0c3c432016-05-18 14:29:51 -0700124int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_len,
Manuel Pégourié-Gonnard690083c2016-01-13 10:48:02 +0000125 const unsigned char *input, size_t in_len,
Brian Murrayb439d452016-05-19 16:02:42 -0700126 unsigned char tag[16] );
127#endif /* MBEDTLS_AES_C */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000128
Brian Murrayb439d452016-05-19 16:02:42 -0700129#if defined(MBEDTLS_SELF_TEST) && ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) )
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000130/**
131 * \brief Checkup routine
132 *
133 * \return 0 if successful, or 1 if the test failed
134 */
135int mbedtls_cmac_self_test( int verbose );
Brian Murrayb439d452016-05-19 16:02:42 -0700136#endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
Robert Cragie3d23b1d2015-12-15 07:38:11 +0000137
138#ifdef __cplusplus
139}
140#endif
141
142#endif /* MBEDTLS_CMAC_H */