| 1 | /** | 
| 2 |  * \file cipher.h | 
| 3 |  * | 
| 4 |  * \brief This file contains an abstraction interface for use with the cipher | 
| 5 |  * primitives provided by the library. It provides a common interface to all of | 
| 6 |  * the available cipher operations. | 
| 7 |  * | 
| 8 |  * \author Adriaan de Jong <dejong@fox-it.com> | 
| 9 |  */ | 
| 10 | /* | 
| 11 |  *  Copyright The Mbed TLS Contributors | 
| 12 |  *  SPDX-License-Identifier: Apache-2.0 | 
| 13 |  * | 
| 14 |  *  Licensed under the Apache License, Version 2.0 (the "License"); you may | 
| 15 |  *  not use this file except in compliance with the License. | 
| 16 |  *  You may obtain a copy of the License at | 
| 17 |  * | 
| 18 |  *  http://www.apache.org/licenses/LICENSE-2.0 | 
| 19 |  * | 
| 20 |  *  Unless required by applicable law or agreed to in writing, software | 
| 21 |  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
| 22 |  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
| 23 |  *  See the License for the specific language governing permissions and | 
| 24 |  *  limitations under the License. | 
| 25 |  */ | 
| 26 |  | 
| 27 | #ifndef MBEDTLS_CIPHER_H | 
| 28 | #define MBEDTLS_CIPHER_H | 
| 29 |  | 
| 30 | #if !defined(MBEDTLS_CONFIG_FILE) | 
| 31 | #include "mbedtls/config.h" | 
| 32 | #else | 
| 33 | #include MBEDTLS_CONFIG_FILE | 
| 34 | #endif | 
| 35 |  | 
| 36 | #include <stddef.h> | 
| 37 | #include "mbedtls/platform_util.h" | 
| 38 |  | 
| 39 | #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) | 
| 40 | #define MBEDTLS_CIPHER_MODE_AEAD | 
| 41 | #endif | 
| 42 |  | 
| 43 | #if defined(MBEDTLS_CIPHER_MODE_CBC) | 
| 44 | #define MBEDTLS_CIPHER_MODE_WITH_PADDING | 
| 45 | #endif | 
| 46 |  | 
| 47 | #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ | 
| 48 |     defined(MBEDTLS_CHACHA20_C) | 
| 49 | #define MBEDTLS_CIPHER_MODE_STREAM | 
| 50 | #endif | 
| 51 |  | 
| 52 | #if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ | 
| 53 |     !defined(inline) && !defined(__cplusplus) | 
| 54 | #define inline __inline | 
| 55 | #endif | 
| 56 |  | 
| 57 | /** The selected feature is not available. */ | 
| 58 | #define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE  -0x6080 | 
| 59 | /** Bad input parameters. */ | 
| 60 | #define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA       -0x6100 | 
| 61 | /** Failed to allocate memory. */ | 
| 62 | #define MBEDTLS_ERR_CIPHER_ALLOC_FAILED         -0x6180 | 
| 63 | /** Input data contains invalid padding and is rejected. */ | 
| 64 | #define MBEDTLS_ERR_CIPHER_INVALID_PADDING      -0x6200 | 
| 65 | /** Decryption of block requires a full block. */ | 
| 66 | #define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED  -0x6280 | 
| 67 | /** Authentication failed (for AEAD modes). */ | 
| 68 | #define MBEDTLS_ERR_CIPHER_AUTH_FAILED          -0x6300 | 
| 69 | /** The context is invalid. For example, because it was freed. */ | 
| 70 | #define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT      -0x6380 | 
| 71 |  | 
| 72 | /* MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED is deprecated and should not be used. */ | 
| 73 | /** Cipher hardware accelerator failed. */ | 
| 74 | #define MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED      -0x6400 | 
| 75 |  | 
| 76 | #define MBEDTLS_CIPHER_VARIABLE_IV_LEN     0x01    /**< Cipher accepts IVs of variable length. */ | 
| 77 | #define MBEDTLS_CIPHER_VARIABLE_KEY_LEN    0x02    /**< Cipher accepts keys of variable length. */ | 
| 78 |  | 
| 79 | #ifdef __cplusplus | 
| 80 | extern "C"  { | 
| 81 | #endif | 
| 82 |  | 
| 83 | /** | 
| 84 |  * \brief     Supported cipher types. | 
| 85 |  * | 
| 86 |  * \warning   RC4 and DES/3DES are considered weak ciphers and their use | 
| 87 |  *            constitutes a security risk. We recommend considering stronger | 
| 88 |  *            ciphers instead. | 
| 89 |  */ | 
| 90 | typedef enum { | 
| 91 |     MBEDTLS_CIPHER_ID_NONE = 0,  /**< Placeholder to mark the end of cipher ID lists. */ | 
| 92 |     MBEDTLS_CIPHER_ID_NULL,      /**< The identity cipher, treated as a stream cipher. */ | 
| 93 |     MBEDTLS_CIPHER_ID_AES,       /**< The AES cipher. */ | 
| 94 |     MBEDTLS_CIPHER_ID_DES,       /**< The DES cipher. \warning DES is considered weak. */ | 
| 95 |     MBEDTLS_CIPHER_ID_3DES,      /**< The Triple DES cipher. \warning 3DES is considered weak. */ | 
| 96 |     MBEDTLS_CIPHER_ID_CAMELLIA,  /**< The Camellia cipher. */ | 
| 97 |     MBEDTLS_CIPHER_ID_BLOWFISH,  /**< The Blowfish cipher. */ | 
| 98 |     MBEDTLS_CIPHER_ID_ARC4,      /**< The RC4 cipher. */ | 
| 99 |     MBEDTLS_CIPHER_ID_ARIA,      /**< The Aria cipher. */ | 
| 100 |     MBEDTLS_CIPHER_ID_CHACHA20,  /**< The ChaCha20 cipher. */ | 
| 101 | } mbedtls_cipher_id_t; | 
| 102 |  | 
| 103 | /** | 
| 104 |  * \brief     Supported {cipher type, cipher mode} pairs. | 
| 105 |  * | 
| 106 |  * \warning   RC4 and DES/3DES are considered weak ciphers and their use | 
| 107 |  *            constitutes a security risk. We recommend considering stronger | 
| 108 |  *            ciphers instead. | 
| 109 |  */ | 
| 110 | typedef enum { | 
| 111 |     MBEDTLS_CIPHER_NONE = 0,             /**< Placeholder to mark the end of cipher-pair lists. */ | 
| 112 |     MBEDTLS_CIPHER_NULL,                 /**< The identity stream cipher. */ | 
| 113 |     MBEDTLS_CIPHER_AES_128_ECB,          /**< AES cipher with 128-bit ECB mode. */ | 
| 114 |     MBEDTLS_CIPHER_AES_192_ECB,          /**< AES cipher with 192-bit ECB mode. */ | 
| 115 |     MBEDTLS_CIPHER_AES_256_ECB,          /**< AES cipher with 256-bit ECB mode. */ | 
| 116 |     MBEDTLS_CIPHER_AES_128_CBC,          /**< AES cipher with 128-bit CBC mode. */ | 
| 117 |     MBEDTLS_CIPHER_AES_192_CBC,          /**< AES cipher with 192-bit CBC mode. */ | 
| 118 |     MBEDTLS_CIPHER_AES_256_CBC,          /**< AES cipher with 256-bit CBC mode. */ | 
| 119 |     MBEDTLS_CIPHER_AES_128_CFB128,       /**< AES cipher with 128-bit CFB128 mode. */ | 
| 120 |     MBEDTLS_CIPHER_AES_192_CFB128,       /**< AES cipher with 192-bit CFB128 mode. */ | 
| 121 |     MBEDTLS_CIPHER_AES_256_CFB128,       /**< AES cipher with 256-bit CFB128 mode. */ | 
| 122 |     MBEDTLS_CIPHER_AES_128_CTR,          /**< AES cipher with 128-bit CTR mode. */ | 
| 123 |     MBEDTLS_CIPHER_AES_192_CTR,          /**< AES cipher with 192-bit CTR mode. */ | 
| 124 |     MBEDTLS_CIPHER_AES_256_CTR,          /**< AES cipher with 256-bit CTR mode. */ | 
| 125 |     MBEDTLS_CIPHER_AES_128_GCM,          /**< AES cipher with 128-bit GCM mode. */ | 
| 126 |     MBEDTLS_CIPHER_AES_192_GCM,          /**< AES cipher with 192-bit GCM mode. */ | 
| 127 |     MBEDTLS_CIPHER_AES_256_GCM,          /**< AES cipher with 256-bit GCM mode. */ | 
| 128 |     MBEDTLS_CIPHER_CAMELLIA_128_ECB,     /**< Camellia cipher with 128-bit ECB mode. */ | 
| 129 |     MBEDTLS_CIPHER_CAMELLIA_192_ECB,     /**< Camellia cipher with 192-bit ECB mode. */ | 
| 130 |     MBEDTLS_CIPHER_CAMELLIA_256_ECB,     /**< Camellia cipher with 256-bit ECB mode. */ | 
| 131 |     MBEDTLS_CIPHER_CAMELLIA_128_CBC,     /**< Camellia cipher with 128-bit CBC mode. */ | 
| 132 |     MBEDTLS_CIPHER_CAMELLIA_192_CBC,     /**< Camellia cipher with 192-bit CBC mode. */ | 
| 133 |     MBEDTLS_CIPHER_CAMELLIA_256_CBC,     /**< Camellia cipher with 256-bit CBC mode. */ | 
| 134 |     MBEDTLS_CIPHER_CAMELLIA_128_CFB128,  /**< Camellia cipher with 128-bit CFB128 mode. */ | 
| 135 |     MBEDTLS_CIPHER_CAMELLIA_192_CFB128,  /**< Camellia cipher with 192-bit CFB128 mode. */ | 
| 136 |     MBEDTLS_CIPHER_CAMELLIA_256_CFB128,  /**< Camellia cipher with 256-bit CFB128 mode. */ | 
| 137 |     MBEDTLS_CIPHER_CAMELLIA_128_CTR,     /**< Camellia cipher with 128-bit CTR mode. */ | 
| 138 |     MBEDTLS_CIPHER_CAMELLIA_192_CTR,     /**< Camellia cipher with 192-bit CTR mode. */ | 
| 139 |     MBEDTLS_CIPHER_CAMELLIA_256_CTR,     /**< Camellia cipher with 256-bit CTR mode. */ | 
| 140 |     MBEDTLS_CIPHER_CAMELLIA_128_GCM,     /**< Camellia cipher with 128-bit GCM mode. */ | 
| 141 |     MBEDTLS_CIPHER_CAMELLIA_192_GCM,     /**< Camellia cipher with 192-bit GCM mode. */ | 
| 142 |     MBEDTLS_CIPHER_CAMELLIA_256_GCM,     /**< Camellia cipher with 256-bit GCM mode. */ | 
| 143 |     MBEDTLS_CIPHER_DES_ECB,              /**< DES cipher with ECB mode. \warning DES is considered weak. */ | 
| 144 |     MBEDTLS_CIPHER_DES_CBC,              /**< DES cipher with CBC mode. \warning DES is considered weak. */ | 
| 145 |     MBEDTLS_CIPHER_DES_EDE_ECB,          /**< DES cipher with EDE ECB mode. \warning 3DES is considered weak. */ | 
| 146 |     MBEDTLS_CIPHER_DES_EDE_CBC,          /**< DES cipher with EDE CBC mode. \warning 3DES is considered weak. */ | 
| 147 |     MBEDTLS_CIPHER_DES_EDE3_ECB,         /**< DES cipher with EDE3 ECB mode. \warning 3DES is considered weak. */ | 
| 148 |     MBEDTLS_CIPHER_DES_EDE3_CBC,         /**< DES cipher with EDE3 CBC mode. \warning 3DES is considered weak. */ | 
| 149 |     MBEDTLS_CIPHER_BLOWFISH_ECB,         /**< Blowfish cipher with ECB mode. */ | 
| 150 |     MBEDTLS_CIPHER_BLOWFISH_CBC,         /**< Blowfish cipher with CBC mode. */ | 
| 151 |     MBEDTLS_CIPHER_BLOWFISH_CFB64,       /**< Blowfish cipher with CFB64 mode. */ | 
| 152 |     MBEDTLS_CIPHER_BLOWFISH_CTR,         /**< Blowfish cipher with CTR mode. */ | 
| 153 |     MBEDTLS_CIPHER_ARC4_128,             /**< RC4 cipher with 128-bit mode. */ | 
| 154 |     MBEDTLS_CIPHER_AES_128_CCM,          /**< AES cipher with 128-bit CCM mode. */ | 
| 155 |     MBEDTLS_CIPHER_AES_192_CCM,          /**< AES cipher with 192-bit CCM mode. */ | 
| 156 |     MBEDTLS_CIPHER_AES_256_CCM,          /**< AES cipher with 256-bit CCM mode. */ | 
| 157 |     MBEDTLS_CIPHER_CAMELLIA_128_CCM,     /**< Camellia cipher with 128-bit CCM mode. */ | 
| 158 |     MBEDTLS_CIPHER_CAMELLIA_192_CCM,     /**< Camellia cipher with 192-bit CCM mode. */ | 
| 159 |     MBEDTLS_CIPHER_CAMELLIA_256_CCM,     /**< Camellia cipher with 256-bit CCM mode. */ | 
| 160 |     MBEDTLS_CIPHER_ARIA_128_ECB,         /**< Aria cipher with 128-bit key and ECB mode. */ | 
| 161 |     MBEDTLS_CIPHER_ARIA_192_ECB,         /**< Aria cipher with 192-bit key and ECB mode. */ | 
| 162 |     MBEDTLS_CIPHER_ARIA_256_ECB,         /**< Aria cipher with 256-bit key and ECB mode. */ | 
| 163 |     MBEDTLS_CIPHER_ARIA_128_CBC,         /**< Aria cipher with 128-bit key and CBC mode. */ | 
| 164 |     MBEDTLS_CIPHER_ARIA_192_CBC,         /**< Aria cipher with 192-bit key and CBC mode. */ | 
| 165 |     MBEDTLS_CIPHER_ARIA_256_CBC,         /**< Aria cipher with 256-bit key and CBC mode. */ | 
| 166 |     MBEDTLS_CIPHER_ARIA_128_CFB128,      /**< Aria cipher with 128-bit key and CFB-128 mode. */ | 
| 167 |     MBEDTLS_CIPHER_ARIA_192_CFB128,      /**< Aria cipher with 192-bit key and CFB-128 mode. */ | 
| 168 |     MBEDTLS_CIPHER_ARIA_256_CFB128,      /**< Aria cipher with 256-bit key and CFB-128 mode. */ | 
| 169 |     MBEDTLS_CIPHER_ARIA_128_CTR,         /**< Aria cipher with 128-bit key and CTR mode. */ | 
| 170 |     MBEDTLS_CIPHER_ARIA_192_CTR,         /**< Aria cipher with 192-bit key and CTR mode. */ | 
| 171 |     MBEDTLS_CIPHER_ARIA_256_CTR,         /**< Aria cipher with 256-bit key and CTR mode. */ | 
| 172 |     MBEDTLS_CIPHER_ARIA_128_GCM,         /**< Aria cipher with 128-bit key and GCM mode. */ | 
| 173 |     MBEDTLS_CIPHER_ARIA_192_GCM,         /**< Aria cipher with 192-bit key and GCM mode. */ | 
| 174 |     MBEDTLS_CIPHER_ARIA_256_GCM,         /**< Aria cipher with 256-bit key and GCM mode. */ | 
| 175 |     MBEDTLS_CIPHER_ARIA_128_CCM,         /**< Aria cipher with 128-bit key and CCM mode. */ | 
| 176 |     MBEDTLS_CIPHER_ARIA_192_CCM,         /**< Aria cipher with 192-bit key and CCM mode. */ | 
| 177 |     MBEDTLS_CIPHER_ARIA_256_CCM,         /**< Aria cipher with 256-bit key and CCM mode. */ | 
| 178 |     MBEDTLS_CIPHER_AES_128_OFB,          /**< AES 128-bit cipher in OFB mode. */ | 
| 179 |     MBEDTLS_CIPHER_AES_192_OFB,          /**< AES 192-bit cipher in OFB mode. */ | 
| 180 |     MBEDTLS_CIPHER_AES_256_OFB,          /**< AES 256-bit cipher in OFB mode. */ | 
| 181 |     MBEDTLS_CIPHER_AES_128_XTS,          /**< AES 128-bit cipher in XTS block mode. */ | 
| 182 |     MBEDTLS_CIPHER_AES_256_XTS,          /**< AES 256-bit cipher in XTS block mode. */ | 
| 183 |     MBEDTLS_CIPHER_CHACHA20,             /**< ChaCha20 stream cipher. */ | 
| 184 |     MBEDTLS_CIPHER_CHACHA20_POLY1305,    /**< ChaCha20-Poly1305 AEAD cipher. */ | 
| 185 |     MBEDTLS_CIPHER_AES_128_KW,           /**< AES cipher with 128-bit NIST KW mode. */ | 
| 186 |     MBEDTLS_CIPHER_AES_192_KW,           /**< AES cipher with 192-bit NIST KW mode. */ | 
| 187 |     MBEDTLS_CIPHER_AES_256_KW,           /**< AES cipher with 256-bit NIST KW mode. */ | 
| 188 |     MBEDTLS_CIPHER_AES_128_KWP,          /**< AES cipher with 128-bit NIST KWP mode. */ | 
| 189 |     MBEDTLS_CIPHER_AES_192_KWP,          /**< AES cipher with 192-bit NIST KWP mode. */ | 
| 190 |     MBEDTLS_CIPHER_AES_256_KWP,          /**< AES cipher with 256-bit NIST KWP mode. */ | 
| 191 | } mbedtls_cipher_type_t; | 
| 192 |  | 
| 193 | /** Supported cipher modes. */ | 
| 194 | typedef enum { | 
| 195 |     MBEDTLS_MODE_NONE = 0,               /**< None.                        */ | 
| 196 |     MBEDTLS_MODE_ECB,                    /**< The ECB cipher mode.         */ | 
| 197 |     MBEDTLS_MODE_CBC,                    /**< The CBC cipher mode.         */ | 
| 198 |     MBEDTLS_MODE_CFB,                    /**< The CFB cipher mode.         */ | 
| 199 |     MBEDTLS_MODE_OFB,                    /**< The OFB cipher mode.         */ | 
| 200 |     MBEDTLS_MODE_CTR,                    /**< The CTR cipher mode.         */ | 
| 201 |     MBEDTLS_MODE_GCM,                    /**< The GCM cipher mode.         */ | 
| 202 |     MBEDTLS_MODE_STREAM,                 /**< The stream cipher mode.      */ | 
| 203 |     MBEDTLS_MODE_CCM,                    /**< The CCM cipher mode.         */ | 
| 204 |     MBEDTLS_MODE_XTS,                    /**< The XTS cipher mode.         */ | 
| 205 |     MBEDTLS_MODE_CHACHAPOLY,             /**< The ChaCha-Poly cipher mode. */ | 
| 206 |     MBEDTLS_MODE_KW,                     /**< The SP800-38F KW mode */ | 
| 207 |     MBEDTLS_MODE_KWP,                    /**< The SP800-38F KWP mode */ | 
| 208 | } mbedtls_cipher_mode_t; | 
| 209 |  | 
| 210 | /** Supported cipher padding types. */ | 
| 211 | typedef enum { | 
| 212 |     MBEDTLS_PADDING_PKCS7 = 0,     /**< PKCS7 padding (default).        */ | 
| 213 |     MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding.         */ | 
| 214 |     MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding.             */ | 
| 215 |     MBEDTLS_PADDING_ZEROS,         /**< Zero padding (not reversible). */ | 
| 216 |     MBEDTLS_PADDING_NONE,          /**< Never pad (full blocks only).   */ | 
| 217 | } mbedtls_cipher_padding_t; | 
| 218 |  | 
| 219 | /** Type of operation. */ | 
| 220 | typedef enum { | 
| 221 |     MBEDTLS_OPERATION_NONE = -1, | 
| 222 |     MBEDTLS_DECRYPT = 0, | 
| 223 |     MBEDTLS_ENCRYPT, | 
| 224 | } mbedtls_operation_t; | 
| 225 |  | 
| 226 | enum { | 
| 227 |     /** Undefined key length. */ | 
| 228 |     MBEDTLS_KEY_LENGTH_NONE = 0, | 
| 229 |     /** Key length, in bits (including parity), for DES keys. \warning DES is considered weak. */ | 
| 230 |     MBEDTLS_KEY_LENGTH_DES  = 64, | 
| 231 |     /** Key length in bits, including parity, for DES in two-key EDE. \warning 3DES is considered weak. */ | 
| 232 |     MBEDTLS_KEY_LENGTH_DES_EDE = 128, | 
| 233 |     /** Key length in bits, including parity, for DES in three-key EDE. \warning 3DES is considered weak. */ | 
| 234 |     MBEDTLS_KEY_LENGTH_DES_EDE3 = 192, | 
| 235 | }; | 
| 236 |  | 
| 237 | /** Maximum length of any IV, in Bytes. */ | 
| 238 | /* This should ideally be derived automatically from list of ciphers. | 
| 239 |  * This should be kept in sync with MBEDTLS_SSL_MAX_IV_LENGTH defined | 
| 240 |  * in ssl_internal.h. */ | 
| 241 | #define MBEDTLS_MAX_IV_LENGTH      16 | 
| 242 |  | 
| 243 | /** Maximum block size of any cipher, in Bytes. */ | 
| 244 | /* This should ideally be derived automatically from list of ciphers. | 
| 245 |  * This should be kept in sync with MBEDTLS_SSL_MAX_BLOCK_LENGTH defined | 
| 246 |  * in ssl_internal.h. */ | 
| 247 | #define MBEDTLS_MAX_BLOCK_LENGTH   16 | 
| 248 |  | 
| 249 | /** Maximum key length, in Bytes. */ | 
| 250 | /* This should ideally be derived automatically from list of ciphers. | 
| 251 |  * For now, only check whether XTS is enabled which uses 64 Byte keys, | 
| 252 |  * and use 32 Bytes as an upper bound for the maximum key length otherwise. | 
| 253 |  * This should be kept in sync with MBEDTLS_SSL_MAX_BLOCK_LENGTH defined | 
| 254 |  * in ssl_internal.h, which however deliberately ignores the case of XTS | 
| 255 |  * since the latter isn't used in SSL/TLS. */ | 
| 256 | #if defined(MBEDTLS_CIPHER_MODE_XTS) | 
| 257 | #define MBEDTLS_MAX_KEY_LENGTH     64 | 
| 258 | #else | 
| 259 | #define MBEDTLS_MAX_KEY_LENGTH     32 | 
| 260 | #endif /* MBEDTLS_CIPHER_MODE_XTS */ | 
| 261 |  | 
| 262 | /** | 
| 263 |  * Base cipher information (opaque struct). | 
| 264 |  */ | 
| 265 | typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t; | 
| 266 |  | 
| 267 | /** | 
| 268 |  * CMAC context (opaque struct). | 
| 269 |  */ | 
| 270 | typedef struct mbedtls_cmac_context_t mbedtls_cmac_context_t; | 
| 271 |  | 
| 272 | /** | 
| 273 |  * Cipher information. Allows calling cipher functions | 
| 274 |  * in a generic way. | 
| 275 |  */ | 
| 276 | typedef struct mbedtls_cipher_info_t { | 
| 277 |     /** Full cipher identifier. For example, | 
| 278 |      * MBEDTLS_CIPHER_AES_256_CBC. | 
| 279 |      */ | 
| 280 |     mbedtls_cipher_type_t type; | 
| 281 |  | 
| 282 |     /** The cipher mode. For example, MBEDTLS_MODE_CBC. */ | 
| 283 |     mbedtls_cipher_mode_t mode; | 
| 284 |  | 
| 285 |     /** The cipher key length, in bits. This is the | 
| 286 |      * default length for variable sized ciphers. | 
| 287 |      * Includes parity bits for ciphers like DES. | 
| 288 |      */ | 
| 289 |     unsigned int key_bitlen; | 
| 290 |  | 
| 291 |     /** Name of the cipher. */ | 
| 292 |     const char *name; | 
| 293 |  | 
| 294 |     /** IV or nonce size, in Bytes. | 
| 295 |      * For ciphers that accept variable IV sizes, | 
| 296 |      * this is the recommended size. | 
| 297 |      */ | 
| 298 |     unsigned int iv_size; | 
| 299 |  | 
| 300 |     /** Bitflag comprised of MBEDTLS_CIPHER_VARIABLE_IV_LEN and | 
| 301 |      *  MBEDTLS_CIPHER_VARIABLE_KEY_LEN indicating whether the | 
| 302 |      *  cipher supports variable IV or variable key sizes, respectively. | 
| 303 |      */ | 
| 304 |     int flags; | 
| 305 |  | 
| 306 |     /** The block size, in Bytes. */ | 
| 307 |     unsigned int block_size; | 
| 308 |  | 
| 309 |     /** Struct for base cipher information and functions. */ | 
| 310 |     const mbedtls_cipher_base_t *base; | 
| 311 |  | 
| 312 | } mbedtls_cipher_info_t; | 
| 313 |  | 
| 314 | /** | 
| 315 |  * Generic cipher context. | 
| 316 |  */ | 
| 317 | typedef struct mbedtls_cipher_context_t { | 
| 318 |     /** Information about the associated cipher. */ | 
| 319 |     const mbedtls_cipher_info_t *cipher_info; | 
| 320 |  | 
| 321 |     /** Key length to use. */ | 
| 322 |     int key_bitlen; | 
| 323 |  | 
| 324 |     /** Operation that the key of the context has been | 
| 325 |      * initialized for. | 
| 326 |      */ | 
| 327 |     mbedtls_operation_t operation; | 
| 328 |  | 
| 329 | #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) | 
| 330 |     /** Padding functions to use, if relevant for | 
| 331 |      * the specific cipher mode. | 
| 332 |      */ | 
| 333 |     void (*add_padding)(unsigned char *output, size_t olen, size_t data_len); | 
| 334 |     int (*get_padding)(unsigned char *input, size_t ilen, size_t *data_len); | 
| 335 | #endif | 
| 336 |  | 
| 337 |     /** Buffer for input that has not been processed yet. */ | 
| 338 |     unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH]; | 
| 339 |  | 
| 340 |     /** Number of Bytes that have not been processed yet. */ | 
| 341 |     size_t unprocessed_len; | 
| 342 |  | 
| 343 |     /** Current IV or NONCE_COUNTER for CTR-mode, data unit (or sector) number | 
| 344 |      * for XTS-mode. */ | 
| 345 |     unsigned char iv[MBEDTLS_MAX_IV_LENGTH]; | 
| 346 |  | 
| 347 |     /** IV size in Bytes, for ciphers with variable-length IVs. */ | 
| 348 |     size_t iv_size; | 
| 349 |  | 
| 350 |     /** The cipher-specific context. */ | 
| 351 |     void *cipher_ctx; | 
| 352 |  | 
| 353 | #if defined(MBEDTLS_CMAC_C) | 
| 354 |     /** CMAC-specific context. */ | 
| 355 |     mbedtls_cmac_context_t *cmac_ctx; | 
| 356 | #endif | 
| 357 |  | 
| 358 | #if defined(MBEDTLS_USE_PSA_CRYPTO) | 
| 359 |     /** Indicates whether the cipher operations should be performed | 
| 360 |      *  by Mbed TLS' own crypto library or an external implementation | 
| 361 |      *  of the PSA Crypto API. | 
| 362 |      *  This is unset if the cipher context was established through | 
| 363 |      *  mbedtls_cipher_setup(), and set if it was established through | 
| 364 |      *  mbedtls_cipher_setup_psa(). | 
| 365 |      */ | 
| 366 |     unsigned char psa_enabled; | 
| 367 | #endif /* MBEDTLS_USE_PSA_CRYPTO */ | 
| 368 |  | 
| 369 | } mbedtls_cipher_context_t; | 
| 370 |  | 
| 371 | /** | 
| 372 |  * \brief This function retrieves the list of ciphers supported | 
| 373 |  *        by the generic cipher module. | 
| 374 |  * | 
| 375 |  *        For any cipher identifier in the returned list, you can | 
| 376 |  *        obtain the corresponding generic cipher information structure | 
| 377 |  *        via mbedtls_cipher_info_from_type(), which can then be used | 
| 378 |  *        to prepare a cipher context via mbedtls_cipher_setup(). | 
| 379 |  * | 
| 380 |  * | 
| 381 |  * \return      A statically-allocated array of cipher identifiers | 
| 382 |  *              of type cipher_type_t. The last entry is zero. | 
| 383 |  */ | 
| 384 | const int *mbedtls_cipher_list(void); | 
| 385 |  | 
| 386 | /** | 
| 387 |  * \brief               This function retrieves the cipher-information | 
| 388 |  *                      structure associated with the given cipher name. | 
| 389 |  * | 
| 390 |  * \param cipher_name   Name of the cipher to search for. This must not be | 
| 391 |  *                      \c NULL. | 
| 392 |  * | 
| 393 |  * \return              The cipher information structure associated with the | 
| 394 |  *                      given \p cipher_name. | 
| 395 |  * \return              \c NULL if the associated cipher information is not found. | 
| 396 |  */ | 
| 397 | const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string(const char *cipher_name); | 
| 398 |  | 
| 399 | /** | 
| 400 |  * \brief               This function retrieves the cipher-information | 
| 401 |  *                      structure associated with the given cipher type. | 
| 402 |  * | 
| 403 |  * \param cipher_type   Type of the cipher to search for. | 
| 404 |  * | 
| 405 |  * \return              The cipher information structure associated with the | 
| 406 |  *                      given \p cipher_type. | 
| 407 |  * \return              \c NULL if the associated cipher information is not found. | 
| 408 |  */ | 
| 409 | const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type(const mbedtls_cipher_type_t cipher_type); | 
| 410 |  | 
| 411 | /** | 
| 412 |  * \brief               This function retrieves the cipher-information | 
| 413 |  *                      structure associated with the given cipher ID, | 
| 414 |  *                      key size and mode. | 
| 415 |  * | 
| 416 |  * \param cipher_id     The ID of the cipher to search for. For example, | 
| 417 |  *                      #MBEDTLS_CIPHER_ID_AES. | 
| 418 |  * \param key_bitlen    The length of the key in bits. | 
| 419 |  * \param mode          The cipher mode. For example, #MBEDTLS_MODE_CBC. | 
| 420 |  * | 
| 421 |  * \return              The cipher information structure associated with the | 
| 422 |  *                      given \p cipher_id. | 
| 423 |  * \return              \c NULL if the associated cipher information is not found. | 
| 424 |  */ | 
| 425 | const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values(const mbedtls_cipher_id_t cipher_id, | 
| 426 |                                                              int key_bitlen, | 
| 427 |                                                              const mbedtls_cipher_mode_t mode); | 
| 428 |  | 
| 429 | /** | 
| 430 |  * \brief               This function initializes a \p ctx as NONE. | 
| 431 |  * | 
| 432 |  * \param ctx           The context to be initialized. This must not be \c NULL. | 
| 433 |  */ | 
| 434 | void mbedtls_cipher_init(mbedtls_cipher_context_t *ctx); | 
| 435 |  | 
| 436 | /** | 
| 437 |  * \brief               This function frees and clears the cipher-specific | 
| 438 |  *                      context of \p ctx. Freeing \p ctx itself remains the | 
| 439 |  *                      responsibility of the caller. | 
| 440 |  * | 
| 441 |  * \param ctx           The context to be freed. If this is \c NULL, the | 
| 442 |  *                      function has no effect, otherwise this must point to an | 
| 443 |  *                      initialized context. | 
| 444 |  */ | 
| 445 | void mbedtls_cipher_free(mbedtls_cipher_context_t *ctx); | 
| 446 |  | 
| 447 |  | 
| 448 | /** | 
| 449 |  * \brief               This function initializes a cipher context for | 
| 450 |  *                      use with the given cipher primitive. | 
| 451 |  * | 
| 452 |  * \param ctx           The context to initialize. This must be initialized. | 
| 453 |  * \param cipher_info   The cipher to use. | 
| 454 |  * | 
| 455 |  * \return              \c 0 on success. | 
| 456 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 457 |  *                      parameter-verification failure. | 
| 458 |  * \return              #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the | 
| 459 |  *                      cipher-specific context fails. | 
| 460 |  * | 
| 461 |  * \internal Currently, the function also clears the structure. | 
| 462 |  * In future versions, the caller will be required to call | 
| 463 |  * mbedtls_cipher_init() on the structure first. | 
| 464 |  */ | 
| 465 | int mbedtls_cipher_setup(mbedtls_cipher_context_t *ctx, | 
| 466 |                          const mbedtls_cipher_info_t *cipher_info); | 
| 467 |  | 
| 468 | #if defined(MBEDTLS_USE_PSA_CRYPTO) | 
| 469 | /** | 
| 470 |  * \brief               This function initializes a cipher context for | 
| 471 |  *                      PSA-based use with the given cipher primitive. | 
| 472 |  * | 
| 473 |  * \note                See #MBEDTLS_USE_PSA_CRYPTO for information on PSA. | 
| 474 |  * | 
| 475 |  * \param ctx           The context to initialize. May not be \c NULL. | 
| 476 |  * \param cipher_info   The cipher to use. | 
| 477 |  * \param taglen        For AEAD ciphers, the length in bytes of the | 
| 478 |  *                      authentication tag to use. Subsequent uses of | 
| 479 |  *                      mbedtls_cipher_auth_encrypt() or | 
| 480 |  *                      mbedtls_cipher_auth_decrypt() must provide | 
| 481 |  *                      the same tag length. | 
| 482 |  *                      For non-AEAD ciphers, the value must be \c 0. | 
| 483 |  * | 
| 484 |  * \return              \c 0 on success. | 
| 485 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 486 |  *                      parameter-verification failure. | 
| 487 |  * \return              #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the | 
| 488 |  *                      cipher-specific context fails. | 
| 489 |  */ | 
| 490 | int mbedtls_cipher_setup_psa(mbedtls_cipher_context_t *ctx, | 
| 491 |                              const mbedtls_cipher_info_t *cipher_info, | 
| 492 |                              size_t taglen); | 
| 493 | #endif /* MBEDTLS_USE_PSA_CRYPTO */ | 
| 494 |  | 
| 495 | /** | 
| 496 |  * \brief        This function returns the block size of the given cipher. | 
| 497 |  * | 
| 498 |  * \param ctx    The context of the cipher. This must be initialized. | 
| 499 |  * | 
| 500 |  * \return       The block size of the underlying cipher. | 
| 501 |  * \return       \c 0 if \p ctx has not been initialized. | 
| 502 |  */ | 
| 503 | static inline unsigned int mbedtls_cipher_get_block_size( | 
| 504 |     const mbedtls_cipher_context_t *ctx) | 
| 505 | { | 
| 506 |     MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, 0); | 
| 507 |     if (ctx->cipher_info == NULL) { | 
| 508 |         return 0; | 
| 509 |     } | 
| 510 |  | 
| 511 |     return ctx->cipher_info->block_size; | 
| 512 | } | 
| 513 |  | 
| 514 | /** | 
| 515 |  * \brief        This function returns the mode of operation for | 
| 516 |  *               the cipher. For example, MBEDTLS_MODE_CBC. | 
| 517 |  * | 
| 518 |  * \param ctx    The context of the cipher. This must be initialized. | 
| 519 |  * | 
| 520 |  * \return       The mode of operation. | 
| 521 |  * \return       #MBEDTLS_MODE_NONE if \p ctx has not been initialized. | 
| 522 |  */ | 
| 523 | static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( | 
| 524 |     const mbedtls_cipher_context_t *ctx) | 
| 525 | { | 
| 526 |     MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, MBEDTLS_MODE_NONE); | 
| 527 |     if (ctx->cipher_info == NULL) { | 
| 528 |         return MBEDTLS_MODE_NONE; | 
| 529 |     } | 
| 530 |  | 
| 531 |     return ctx->cipher_info->mode; | 
| 532 | } | 
| 533 |  | 
| 534 | /** | 
| 535 |  * \brief       This function returns the size of the IV or nonce | 
| 536 |  *              of the cipher, in Bytes. | 
| 537 |  * | 
| 538 |  * \param ctx   The context of the cipher. This must be initialized. | 
| 539 |  * | 
| 540 |  * \return      The recommended IV size if no IV has been set. | 
| 541 |  * \return      \c 0 for ciphers not using an IV or a nonce. | 
| 542 |  * \return      The actual size if an IV has been set. | 
| 543 |  */ | 
| 544 | static inline int mbedtls_cipher_get_iv_size( | 
| 545 |     const mbedtls_cipher_context_t *ctx) | 
| 546 | { | 
| 547 |     MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, 0); | 
| 548 |     if (ctx->cipher_info == NULL) { | 
| 549 |         return 0; | 
| 550 |     } | 
| 551 |  | 
| 552 |     if (ctx->iv_size != 0) { | 
| 553 |         return (int) ctx->iv_size; | 
| 554 |     } | 
| 555 |  | 
| 556 |     return (int) ctx->cipher_info->iv_size; | 
| 557 | } | 
| 558 |  | 
| 559 | /** | 
| 560 |  * \brief               This function returns the type of the given cipher. | 
| 561 |  * | 
| 562 |  * \param ctx           The context of the cipher. This must be initialized. | 
| 563 |  * | 
| 564 |  * \return              The type of the cipher. | 
| 565 |  * \return              #MBEDTLS_CIPHER_NONE if \p ctx has not been initialized. | 
| 566 |  */ | 
| 567 | static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( | 
| 568 |     const mbedtls_cipher_context_t *ctx) | 
| 569 | { | 
| 570 |     MBEDTLS_INTERNAL_VALIDATE_RET( | 
| 571 |         ctx != NULL, MBEDTLS_CIPHER_NONE); | 
| 572 |     if (ctx->cipher_info == NULL) { | 
| 573 |         return MBEDTLS_CIPHER_NONE; | 
| 574 |     } | 
| 575 |  | 
| 576 |     return ctx->cipher_info->type; | 
| 577 | } | 
| 578 |  | 
| 579 | /** | 
| 580 |  * \brief               This function returns the name of the given cipher | 
| 581 |  *                      as a string. | 
| 582 |  * | 
| 583 |  * \param ctx           The context of the cipher. This must be initialized. | 
| 584 |  * | 
| 585 |  * \return              The name of the cipher. | 
| 586 |  * \return              NULL if \p ctx has not been not initialized. | 
| 587 |  */ | 
| 588 | static inline const char *mbedtls_cipher_get_name( | 
| 589 |     const mbedtls_cipher_context_t *ctx) | 
| 590 | { | 
| 591 |     MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, 0); | 
| 592 |     if (ctx->cipher_info == NULL) { | 
| 593 |         return 0; | 
| 594 |     } | 
| 595 |  | 
| 596 |     return ctx->cipher_info->name; | 
| 597 | } | 
| 598 |  | 
| 599 | /** | 
| 600 |  * \brief               This function returns the key length of the cipher. | 
| 601 |  * | 
| 602 |  * \param ctx           The context of the cipher. This must be initialized. | 
| 603 |  * | 
| 604 |  * \return              The key length of the cipher in bits. | 
| 605 |  * \return              #MBEDTLS_KEY_LENGTH_NONE if \p ctx has not been | 
| 606 |  *                      initialized. | 
| 607 |  */ | 
| 608 | static inline int mbedtls_cipher_get_key_bitlen( | 
| 609 |     const mbedtls_cipher_context_t *ctx) | 
| 610 | { | 
| 611 |     MBEDTLS_INTERNAL_VALIDATE_RET( | 
| 612 |         ctx != NULL, MBEDTLS_KEY_LENGTH_NONE); | 
| 613 |     if (ctx->cipher_info == NULL) { | 
| 614 |         return MBEDTLS_KEY_LENGTH_NONE; | 
| 615 |     } | 
| 616 |  | 
| 617 |     return (int) ctx->cipher_info->key_bitlen; | 
| 618 | } | 
| 619 |  | 
| 620 | /** | 
| 621 |  * \brief          This function returns the operation of the given cipher. | 
| 622 |  * | 
| 623 |  * \param ctx      The context of the cipher. This must be initialized. | 
| 624 |  * | 
| 625 |  * \return         The type of operation: #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. | 
| 626 |  * \return         #MBEDTLS_OPERATION_NONE if \p ctx has not been initialized. | 
| 627 |  */ | 
| 628 | static inline mbedtls_operation_t mbedtls_cipher_get_operation( | 
| 629 |     const mbedtls_cipher_context_t *ctx) | 
| 630 | { | 
| 631 |     MBEDTLS_INTERNAL_VALIDATE_RET( | 
| 632 |         ctx != NULL, MBEDTLS_OPERATION_NONE); | 
| 633 |     if (ctx->cipher_info == NULL) { | 
| 634 |         return MBEDTLS_OPERATION_NONE; | 
| 635 |     } | 
| 636 |  | 
| 637 |     return ctx->operation; | 
| 638 | } | 
| 639 |  | 
| 640 | /** | 
| 641 |  * \brief               This function sets the key to use with the given context. | 
| 642 |  * | 
| 643 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 644 |  *                      bound to a cipher information structure. | 
| 645 |  * \param key           The key to use. This must be a readable buffer of at | 
| 646 |  *                      least \p key_bitlen Bits. | 
| 647 |  * \param key_bitlen    The key length to use, in Bits. | 
| 648 |  * \param operation     The operation that the key will be used for: | 
| 649 |  *                      #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. | 
| 650 |  * | 
| 651 |  * \return              \c 0 on success. | 
| 652 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 653 |  *                      parameter-verification failure. | 
| 654 |  * \return              A cipher-specific error code on failure. | 
| 655 |  */ | 
| 656 | int mbedtls_cipher_setkey(mbedtls_cipher_context_t *ctx, | 
| 657 |                           const unsigned char *key, | 
| 658 |                           int key_bitlen, | 
| 659 |                           const mbedtls_operation_t operation); | 
| 660 |  | 
| 661 | #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) | 
| 662 | /** | 
| 663 |  * \brief               This function sets the padding mode, for cipher modes | 
| 664 |  *                      that use padding. | 
| 665 |  * | 
| 666 |  *                      The default passing mode is PKCS7 padding. | 
| 667 |  * | 
| 668 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 669 |  *                      bound to a cipher information structure. | 
| 670 |  * \param mode          The padding mode. | 
| 671 |  * | 
| 672 |  * \return              \c 0 on success. | 
| 673 |  * \return              #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE | 
| 674 |  *                      if the selected padding mode is not supported. | 
| 675 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode | 
| 676 |  *                      does not support padding. | 
| 677 |  */ | 
| 678 | int mbedtls_cipher_set_padding_mode(mbedtls_cipher_context_t *ctx, | 
| 679 |                                     mbedtls_cipher_padding_t mode); | 
| 680 | #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ | 
| 681 |  | 
| 682 | /** | 
| 683 |  * \brief           This function sets the initialization vector (IV) | 
| 684 |  *                  or nonce. | 
| 685 |  * | 
| 686 |  * \note            Some ciphers do not use IVs nor nonce. For these | 
| 687 |  *                  ciphers, this function has no effect. | 
| 688 |  * | 
| 689 |  * \param ctx       The generic cipher context. This must be initialized and | 
| 690 |  *                  bound to a cipher information structure. | 
| 691 |  * \param iv        The IV to use, or NONCE_COUNTER for CTR-mode ciphers. This | 
| 692 |  *                  must be a readable buffer of at least \p iv_len Bytes. | 
| 693 |  * \param iv_len    The IV length for ciphers with variable-size IV. | 
| 694 |  *                  This parameter is discarded by ciphers with fixed-size IV. | 
| 695 |  * | 
| 696 |  * \return          \c 0 on success. | 
| 697 |  * \return          #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 698 |  *                  parameter-verification failure. | 
| 699 |  */ | 
| 700 | int mbedtls_cipher_set_iv(mbedtls_cipher_context_t *ctx, | 
| 701 |                           const unsigned char *iv, | 
| 702 |                           size_t iv_len); | 
| 703 |  | 
| 704 | /** | 
| 705 |  * \brief         This function resets the cipher state. | 
| 706 |  * | 
| 707 |  * \param ctx     The generic cipher context. This must be initialized. | 
| 708 |  * | 
| 709 |  * \return        \c 0 on success. | 
| 710 |  * \return        #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 711 |  *                parameter-verification failure. | 
| 712 |  */ | 
| 713 | int mbedtls_cipher_reset(mbedtls_cipher_context_t *ctx); | 
| 714 |  | 
| 715 | #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) | 
| 716 | /** | 
| 717 |  * \brief               This function adds additional data for AEAD ciphers. | 
| 718 |  *                      Currently supported with GCM and ChaCha20+Poly1305. | 
| 719 |  *                      This must be called exactly once, after | 
| 720 |  *                      mbedtls_cipher_reset(). | 
| 721 |  * | 
| 722 |  * \param ctx           The generic cipher context. This must be initialized. | 
| 723 |  * \param ad            The additional data to use. This must be a readable | 
| 724 |  *                      buffer of at least \p ad_len Bytes. | 
| 725 |  * \param ad_len        The length of \p ad in Bytes. | 
| 726 |  * | 
| 727 |  * \return              \c 0 on success. | 
| 728 |  * \return              A specific error code on failure. | 
| 729 |  */ | 
| 730 | int mbedtls_cipher_update_ad(mbedtls_cipher_context_t *ctx, | 
| 731 |                              const unsigned char *ad, size_t ad_len); | 
| 732 | #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ | 
| 733 |  | 
| 734 | /** | 
| 735 |  * \brief               The generic cipher update function. It encrypts or | 
| 736 |  *                      decrypts using the given cipher context. Writes as | 
| 737 |  *                      many block-sized blocks of data as possible to output. | 
| 738 |  *                      Any data that cannot be written immediately is either | 
| 739 |  *                      added to the next block, or flushed when | 
| 740 |  *                      mbedtls_cipher_finish() is called. | 
| 741 |  *                      Exception: For MBEDTLS_MODE_ECB, expects a single block | 
| 742 |  *                      in size. For example, 16 Bytes for AES. | 
| 743 |  * | 
| 744 |  * \note                If the underlying cipher is used in GCM mode, all calls | 
| 745 |  *                      to this function, except for the last one before | 
| 746 |  *                      mbedtls_cipher_finish(), must have \p ilen as a | 
| 747 |  *                      multiple of the block size of the cipher. | 
| 748 |  * | 
| 749 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 750 |  *                      bound to a key. | 
| 751 |  * \param input         The buffer holding the input data. This must be a | 
| 752 |  *                      readable buffer of at least \p ilen Bytes. | 
| 753 |  * \param ilen          The length of the input data. | 
| 754 |  * \param output        The buffer for the output data. This must be able to | 
| 755 |  *                      hold at least `ilen + block_size`. This must not be the | 
| 756 |  *                      same buffer as \p input. | 
| 757 |  * \param olen          The length of the output data, to be updated with the | 
| 758 |  *                      actual number of Bytes written. This must not be | 
| 759 |  *                      \c NULL. | 
| 760 |  * | 
| 761 |  * \return              \c 0 on success. | 
| 762 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 763 |  *                      parameter-verification failure. | 
| 764 |  * \return              #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an | 
| 765 |  *                      unsupported mode for a cipher. | 
| 766 |  * \return              A cipher-specific error code on failure. | 
| 767 |  */ | 
| 768 | int mbedtls_cipher_update(mbedtls_cipher_context_t *ctx, | 
| 769 |                           const unsigned char *input, | 
| 770 |                           size_t ilen, unsigned char *output, | 
| 771 |                           size_t *olen); | 
| 772 |  | 
| 773 | /** | 
| 774 |  * \brief               The generic cipher finalization function. If data still | 
| 775 |  *                      needs to be flushed from an incomplete block, the data | 
| 776 |  *                      contained in it is padded to the size of | 
| 777 |  *                      the last block, and written to the \p output buffer. | 
| 778 |  * | 
| 779 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 780 |  *                      bound to a key. | 
| 781 |  * \param output        The buffer to write data to. This needs to be a writable | 
| 782 |  *                      buffer of at least block_size Bytes. | 
| 783 |  * \param olen          The length of the data written to the \p output buffer. | 
| 784 |  *                      This may not be \c NULL. | 
| 785 |  * | 
| 786 |  * \return              \c 0 on success. | 
| 787 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 788 |  *                      parameter-verification failure. | 
| 789 |  * \return              #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption | 
| 790 |  *                      expecting a full block but not receiving one. | 
| 791 |  * \return              #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding | 
| 792 |  *                      while decrypting. | 
| 793 |  * \return              A cipher-specific error code on failure. | 
| 794 |  */ | 
| 795 | int mbedtls_cipher_finish(mbedtls_cipher_context_t *ctx, | 
| 796 |                           unsigned char *output, size_t *olen); | 
| 797 |  | 
| 798 | #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) | 
| 799 | /** | 
| 800 |  * \brief               This function writes a tag for AEAD ciphers. | 
| 801 |  *                      Currently supported with GCM and ChaCha20+Poly1305. | 
| 802 |  *                      This must be called after mbedtls_cipher_finish(). | 
| 803 |  * | 
| 804 |  * \param ctx           The generic cipher context. This must be initialized, | 
| 805 |  *                      bound to a key, and have just completed a cipher | 
| 806 |  *                      operation through mbedtls_cipher_finish() the tag for | 
| 807 |  *                      which should be written. | 
| 808 |  * \param tag           The buffer to write the tag to. This must be a writable | 
| 809 |  *                      buffer of at least \p tag_len Bytes. | 
| 810 |  * \param tag_len       The length of the tag to write. | 
| 811 |  * | 
| 812 |  * \return              \c 0 on success. | 
| 813 |  * \return              A specific error code on failure. | 
| 814 |  */ | 
| 815 | int mbedtls_cipher_write_tag(mbedtls_cipher_context_t *ctx, | 
| 816 |                              unsigned char *tag, size_t tag_len); | 
| 817 |  | 
| 818 | /** | 
| 819 |  * \brief               This function checks the tag for AEAD ciphers. | 
| 820 |  *                      Currently supported with GCM and ChaCha20+Poly1305. | 
| 821 |  *                      This must be called after mbedtls_cipher_finish(). | 
| 822 |  * | 
| 823 |  * \param ctx           The generic cipher context. This must be initialized. | 
| 824 |  * \param tag           The buffer holding the tag. This must be a readable | 
| 825 |  *                      buffer of at least \p tag_len Bytes. | 
| 826 |  * \param tag_len       The length of the tag to check. | 
| 827 |  * | 
| 828 |  * \return              \c 0 on success. | 
| 829 |  * \return              A specific error code on failure. | 
| 830 |  */ | 
| 831 | int mbedtls_cipher_check_tag(mbedtls_cipher_context_t *ctx, | 
| 832 |                              const unsigned char *tag, size_t tag_len); | 
| 833 | #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ | 
| 834 |  | 
| 835 | /** | 
| 836 |  * \brief               The generic all-in-one encryption/decryption function, | 
| 837 |  *                      for all ciphers except AEAD constructs. | 
| 838 |  * | 
| 839 |  * \param ctx           The generic cipher context. This must be initialized. | 
| 840 |  * \param iv            The IV to use, or NONCE_COUNTER for CTR-mode ciphers. | 
| 841 |  *                      This must be a readable buffer of at least \p iv_len | 
| 842 |  *                      Bytes. | 
| 843 |  * \param iv_len        The IV length for ciphers with variable-size IV. | 
| 844 |  *                      This parameter is discarded by ciphers with fixed-size | 
| 845 |  *                      IV. | 
| 846 |  * \param input         The buffer holding the input data. This must be a | 
| 847 |  *                      readable buffer of at least \p ilen Bytes. | 
| 848 |  * \param ilen          The length of the input data in Bytes. | 
| 849 |  * \param output        The buffer for the output data. This must be able to | 
| 850 |  *                      hold at least `ilen + block_size`. This must not be the | 
| 851 |  *                      same buffer as \p input. | 
| 852 |  * \param olen          The length of the output data, to be updated with the | 
| 853 |  *                      actual number of Bytes written. This must not be | 
| 854 |  *                      \c NULL. | 
| 855 |  * | 
| 856 |  * \note                Some ciphers do not use IVs nor nonce. For these | 
| 857 |  *                      ciphers, use \p iv = NULL and \p iv_len = 0. | 
| 858 |  * | 
| 859 |  * \return              \c 0 on success. | 
| 860 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 861 |  *                      parameter-verification failure. | 
| 862 |  * \return              #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption | 
| 863 |  *                      expecting a full block but not receiving one. | 
| 864 |  * \return              #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding | 
| 865 |  *                      while decrypting. | 
| 866 |  * \return              A cipher-specific error code on failure. | 
| 867 |  */ | 
| 868 | int mbedtls_cipher_crypt(mbedtls_cipher_context_t *ctx, | 
| 869 |                          const unsigned char *iv, size_t iv_len, | 
| 870 |                          const unsigned char *input, size_t ilen, | 
| 871 |                          unsigned char *output, size_t *olen); | 
| 872 |  | 
| 873 | #if defined(MBEDTLS_CIPHER_MODE_AEAD) | 
| 874 | #if !defined(MBEDTLS_DEPRECATED_REMOVED) | 
| 875 | #if defined(MBEDTLS_DEPRECATED_WARNING) | 
| 876 | #define MBEDTLS_DEPRECATED    __attribute__((deprecated)) | 
| 877 | #else | 
| 878 | #define MBEDTLS_DEPRECATED | 
| 879 | #endif /* MBEDTLS_DEPRECATED_WARNING */ | 
| 880 | /** | 
| 881 |  * \brief               The generic authenticated encryption (AEAD) function. | 
| 882 |  * | 
| 883 |  * \deprecated          Superseded by mbedtls_cipher_auth_encrypt_ext(). | 
| 884 |  * | 
| 885 |  * \note                This function only supports AEAD algorithms, not key | 
| 886 |  *                      wrapping algorithms such as NIST_KW; for this, see | 
| 887 |  *                      mbedtls_cipher_auth_encrypt_ext(). | 
| 888 |  * | 
| 889 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 890 |  *                      bound to a key associated with an AEAD algorithm. | 
| 891 |  * \param iv            The nonce to use. This must be a readable buffer of | 
| 892 |  *                      at least \p iv_len Bytes and must not be \c NULL. | 
| 893 |  * \param iv_len        The length of the nonce. This must satisfy the | 
| 894 |  *                      constraints imposed by the AEAD cipher used. | 
| 895 |  * \param ad            The additional data to authenticate. This must be a | 
| 896 |  *                      readable buffer of at least \p ad_len Bytes, and may | 
| 897 |  *                      be \c NULL is \p ad_len is \c 0. | 
| 898 |  * \param ad_len        The length of \p ad. | 
| 899 |  * \param input         The buffer holding the input data. This must be a | 
| 900 |  *                      readable buffer of at least \p ilen Bytes, and may be | 
| 901 |  *                      \c NULL if \p ilen is \c 0. | 
| 902 |  * \param ilen          The length of the input data. | 
| 903 |  * \param output        The buffer for the output data. This must be a | 
| 904 |  *                      writable buffer of at least \p ilen Bytes, and must | 
| 905 |  *                      not be \c NULL. | 
| 906 |  * \param olen          This will be filled with the actual number of Bytes | 
| 907 |  *                      written to the \p output buffer. This must point to a | 
| 908 |  *                      writable object of type \c size_t. | 
| 909 |  * \param tag           The buffer for the authentication tag. This must be a | 
| 910 |  *                      writable buffer of at least \p tag_len Bytes. See note | 
| 911 |  *                      below regarding restrictions with PSA-based contexts. | 
| 912 |  * \param tag_len       The desired length of the authentication tag. This | 
| 913 |  *                      must match the constraints imposed by the AEAD cipher | 
| 914 |  *                      used, and in particular must not be \c 0. | 
| 915 |  * | 
| 916 |  * \note                If the context is based on PSA (that is, it was set up | 
| 917 |  *                      with mbedtls_cipher_setup_psa()), then it is required | 
| 918 |  *                      that \c tag == output + ilen. That is, the tag must be | 
| 919 |  *                      appended to the ciphertext as recommended by RFC 5116. | 
| 920 |  * | 
| 921 |  * \return              \c 0 on success. | 
| 922 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 923 |  *                      parameter-verification failure. | 
| 924 |  * \return              A cipher-specific error code on failure. | 
| 925 |  */ | 
| 926 | int MBEDTLS_DEPRECATED mbedtls_cipher_auth_encrypt( | 
| 927 |     mbedtls_cipher_context_t *ctx, | 
| 928 |     const unsigned char *iv, size_t iv_len, | 
| 929 |     const unsigned char *ad, size_t ad_len, | 
| 930 |     const unsigned char *input, size_t ilen, | 
| 931 |     unsigned char *output, size_t *olen, | 
| 932 |     unsigned char *tag, size_t tag_len); | 
| 933 |  | 
| 934 | /** | 
| 935 |  * \brief               The generic authenticated decryption (AEAD) function. | 
| 936 |  * | 
| 937 |  * \deprecated          Superseded by mbedtls_cipher_auth_decrypt_ext(). | 
| 938 |  * | 
| 939 |  * \note                This function only supports AEAD algorithms, not key | 
| 940 |  *                      wrapping algorithms such as NIST_KW; for this, see | 
| 941 |  *                      mbedtls_cipher_auth_decrypt_ext(). | 
| 942 |  * | 
| 943 |  * \note                If the data is not authentic, then the output buffer | 
| 944 |  *                      is zeroed out to prevent the unauthentic plaintext being | 
| 945 |  *                      used, making this interface safer. | 
| 946 |  * | 
| 947 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 948 |  *                      bound to a key associated with an AEAD algorithm. | 
| 949 |  * \param iv            The nonce to use. This must be a readable buffer of | 
| 950 |  *                      at least \p iv_len Bytes and must not be \c NULL. | 
| 951 |  * \param iv_len        The length of the nonce. This must satisfy the | 
| 952 |  *                      constraints imposed by the AEAD cipher used. | 
| 953 |  * \param ad            The additional data to authenticate. This must be a | 
| 954 |  *                      readable buffer of at least \p ad_len Bytes, and may | 
| 955 |  *                      be \c NULL is \p ad_len is \c 0. | 
| 956 |  * \param ad_len        The length of \p ad. | 
| 957 |  * \param input         The buffer holding the input data. This must be a | 
| 958 |  *                      readable buffer of at least \p ilen Bytes, and may be | 
| 959 |  *                      \c NULL if \p ilen is \c 0. | 
| 960 |  * \param ilen          The length of the input data. | 
| 961 |  * \param output        The buffer for the output data. This must be a | 
| 962 |  *                      writable buffer of at least \p ilen Bytes, and must | 
| 963 |  *                      not be \c NULL. | 
| 964 |  * \param olen          This will be filled with the actual number of Bytes | 
| 965 |  *                      written to the \p output buffer. This must point to a | 
| 966 |  *                      writable object of type \c size_t. | 
| 967 |  * \param tag           The buffer for the authentication tag. This must be a | 
| 968 |  *                      readable buffer of at least \p tag_len Bytes. See note | 
| 969 |  *                      below regarding restrictions with PSA-based contexts. | 
| 970 |  * \param tag_len       The length of the authentication tag. This must match | 
| 971 |  *                      the constraints imposed by the AEAD cipher used, and in | 
| 972 |  *                      particular must not be \c 0. | 
| 973 |  * | 
| 974 |  * \note                If the context is based on PSA (that is, it was set up | 
| 975 |  *                      with mbedtls_cipher_setup_psa()), then it is required | 
| 976 |  *                      that \c tag == input + len. That is, the tag must be | 
| 977 |  *                      appended to the ciphertext as recommended by RFC 5116. | 
| 978 |  * | 
| 979 |  * \return              \c 0 on success. | 
| 980 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 981 |  *                      parameter-verification failure. | 
| 982 |  * \return              #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic. | 
| 983 |  * \return              A cipher-specific error code on failure. | 
| 984 |  */ | 
| 985 | int MBEDTLS_DEPRECATED mbedtls_cipher_auth_decrypt( | 
| 986 |     mbedtls_cipher_context_t *ctx, | 
| 987 |     const unsigned char *iv, size_t iv_len, | 
| 988 |     const unsigned char *ad, size_t ad_len, | 
| 989 |     const unsigned char *input, size_t ilen, | 
| 990 |     unsigned char *output, size_t *olen, | 
| 991 |     const unsigned char *tag, size_t tag_len); | 
| 992 | #undef MBEDTLS_DEPRECATED | 
| 993 | #endif /* MBEDTLS_DEPRECATED_REMOVED */ | 
| 994 | #endif /* MBEDTLS_CIPHER_MODE_AEAD */ | 
| 995 |  | 
| 996 | #if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C) | 
| 997 | /** | 
| 998 |  * \brief               The authenticated encryption (AEAD/NIST_KW) function. | 
| 999 |  * | 
| 1000 |  * \note                For AEAD modes, the tag will be appended to the | 
| 1001 |  *                      ciphertext, as recommended by RFC 5116. | 
| 1002 |  *                      (NIST_KW doesn't have a separate tag.) | 
| 1003 |  * | 
| 1004 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 1005 |  *                      bound to a key, with an AEAD algorithm or NIST_KW. | 
| 1006 |  * \param iv            The nonce to use. This must be a readable buffer of | 
| 1007 |  *                      at least \p iv_len Bytes and may be \c NULL if \p | 
| 1008 |  *                      iv_len is \c 0. | 
| 1009 |  * \param iv_len        The length of the nonce. For AEAD ciphers, this must | 
| 1010 |  *                      satisfy the constraints imposed by the cipher used. | 
| 1011 |  *                      For NIST_KW, this must be \c 0. | 
| 1012 |  * \param ad            The additional data to authenticate. This must be a | 
| 1013 |  *                      readable buffer of at least \p ad_len Bytes, and may | 
| 1014 |  *                      be \c NULL is \p ad_len is \c 0. | 
| 1015 |  * \param ad_len        The length of \p ad. For NIST_KW, this must be \c 0. | 
| 1016 |  * \param input         The buffer holding the input data. This must be a | 
| 1017 |  *                      readable buffer of at least \p ilen Bytes, and may be | 
| 1018 |  *                      \c NULL if \p ilen is \c 0. | 
| 1019 |  * \param ilen          The length of the input data. | 
| 1020 |  * \param output        The buffer for the output data. This must be a | 
| 1021 |  *                      writable buffer of at least \p output_len Bytes, and | 
| 1022 |  *                      must not be \c NULL. | 
| 1023 |  * \param output_len    The length of the \p output buffer in Bytes. For AEAD | 
| 1024 |  *                      ciphers, this must be at least \p ilen + \p tag_len. | 
| 1025 |  *                      For NIST_KW, this must be at least \p ilen + 8 | 
| 1026 |  *                      (rounded up to a multiple of 8 if KWP is used); | 
| 1027 |  *                      \p ilen + 15 is always a safe value. | 
| 1028 |  * \param olen          This will be filled with the actual number of Bytes | 
| 1029 |  *                      written to the \p output buffer. This must point to a | 
| 1030 |  *                      writable object of type \c size_t. | 
| 1031 |  * \param tag_len       The desired length of the authentication tag. For AEAD | 
| 1032 |  *                      ciphers, this must match the constraints imposed by | 
| 1033 |  *                      the cipher used, and in particular must not be \c 0. | 
| 1034 |  *                      For NIST_KW, this must be \c 0. | 
| 1035 |  * | 
| 1036 |  * \return              \c 0 on success. | 
| 1037 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 1038 |  *                      parameter-verification failure. | 
| 1039 |  * \return              A cipher-specific error code on failure. | 
| 1040 |  */ | 
| 1041 | int mbedtls_cipher_auth_encrypt_ext(mbedtls_cipher_context_t *ctx, | 
| 1042 |                                     const unsigned char *iv, size_t iv_len, | 
| 1043 |                                     const unsigned char *ad, size_t ad_len, | 
| 1044 |                                     const unsigned char *input, size_t ilen, | 
| 1045 |                                     unsigned char *output, size_t output_len, | 
| 1046 |                                     size_t *olen, size_t tag_len); | 
| 1047 |  | 
| 1048 | /** | 
| 1049 |  * \brief               The authenticated encryption (AEAD/NIST_KW) function. | 
| 1050 |  * | 
| 1051 |  * \note                If the data is not authentic, then the output buffer | 
| 1052 |  *                      is zeroed out to prevent the unauthentic plaintext being | 
| 1053 |  *                      used, making this interface safer. | 
| 1054 |  * | 
| 1055 |  * \note                For AEAD modes, the tag must be appended to the | 
| 1056 |  *                      ciphertext, as recommended by RFC 5116. | 
| 1057 |  *                      (NIST_KW doesn't have a separate tag.) | 
| 1058 |  * | 
| 1059 |  * \param ctx           The generic cipher context. This must be initialized and | 
| 1060 |  *                      bound to a key, with an AEAD algorithm or NIST_KW. | 
| 1061 |  * \param iv            The nonce to use. This must be a readable buffer of | 
| 1062 |  *                      at least \p iv_len Bytes and may be \c NULL if \p | 
| 1063 |  *                      iv_len is \c 0. | 
| 1064 |  * \param iv_len        The length of the nonce. For AEAD ciphers, this must | 
| 1065 |  *                      satisfy the constraints imposed by the cipher used. | 
| 1066 |  *                      For NIST_KW, this must be \c 0. | 
| 1067 |  * \param ad            The additional data to authenticate. This must be a | 
| 1068 |  *                      readable buffer of at least \p ad_len Bytes, and may | 
| 1069 |  *                      be \c NULL is \p ad_len is \c 0. | 
| 1070 |  * \param ad_len        The length of \p ad. For NIST_KW, this must be \c 0. | 
| 1071 |  * \param input         The buffer holding the input data. This must be a | 
| 1072 |  *                      readable buffer of at least \p ilen Bytes, and may be | 
| 1073 |  *                      \c NULL if \p ilen is \c 0. | 
| 1074 |  * \param ilen          The length of the input data. For AEAD ciphers this | 
| 1075 |  *                      must be at least \p tag_len. For NIST_KW this must be | 
| 1076 |  *                      at least \c 8. | 
| 1077 |  * \param output        The buffer for the output data. This must be a | 
| 1078 |  *                      writable buffer of at least \p output_len Bytes, and | 
| 1079 |  *                      may be \c NULL if \p output_len is \c 0. | 
| 1080 |  * \param output_len    The length of the \p output buffer in Bytes. For AEAD | 
| 1081 |  *                      ciphers, this must be at least \p ilen - \p tag_len. | 
| 1082 |  *                      For NIST_KW, this must be at least \p ilen - 8. | 
| 1083 |  * \param olen          This will be filled with the actual number of Bytes | 
| 1084 |  *                      written to the \p output buffer. This must point to a | 
| 1085 |  *                      writable object of type \c size_t. | 
| 1086 |  * \param tag_len       The actual length of the authentication tag. For AEAD | 
| 1087 |  *                      ciphers, this must match the constraints imposed by | 
| 1088 |  *                      the cipher used, and in particular must not be \c 0. | 
| 1089 |  *                      For NIST_KW, this must be \c 0. | 
| 1090 |  * | 
| 1091 |  * \return              \c 0 on success. | 
| 1092 |  * \return              #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on | 
| 1093 |  *                      parameter-verification failure. | 
| 1094 |  * \return              #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic. | 
| 1095 |  * \return              A cipher-specific error code on failure. | 
| 1096 |  */ | 
| 1097 | int mbedtls_cipher_auth_decrypt_ext(mbedtls_cipher_context_t *ctx, | 
| 1098 |                                     const unsigned char *iv, size_t iv_len, | 
| 1099 |                                     const unsigned char *ad, size_t ad_len, | 
| 1100 |                                     const unsigned char *input, size_t ilen, | 
| 1101 |                                     unsigned char *output, size_t output_len, | 
| 1102 |                                     size_t *olen, size_t tag_len); | 
| 1103 | #endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */ | 
| 1104 | #ifdef __cplusplus | 
| 1105 | } | 
| 1106 | #endif | 
| 1107 |  | 
| 1108 | #endif /* MBEDTLS_CIPHER_H */ | 
| 1109 |  |