aes 28.7 KB
Newer Older
ROOL's avatar
ROOL committed
1 2 3
/**
 * \file aes.h
 *
ROOL's avatar
ROOL committed
4 5 6
 * \brief   This file contains AES definitions and functions.
 *
 *          The Advanced Encryption Standard (AES) specifies a FIPS-approved
ROOL's avatar
ROOL committed
7 8 9 10 11 12 13 14 15
 *          cryptographic algorithm that can be used to protect electronic
 *          data.
 *
 *          The AES algorithm is a symmetric block cipher that can
 *          encrypt and decrypt information. For more information, see
 *          <em>FIPS Publication 197: Advanced Encryption Standard</em> and
 *          <em>ISO/IEC 18033-2:2006: Information technology -- Security
 *          techniques -- Encryption algorithms -- Part 2: Asymmetric
 *          ciphers</em>.
ROOL's avatar
ROOL committed
16 17 18 19 20
 *
 *          The AES-XTS block mode is standardized by NIST SP 800-38E
 *          <https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38e.pdf>
 *          and described in detail by IEEE P1619
 *          <https://ieeexplore.ieee.org/servlet/opac?punumber=4375278>.
ROOL's avatar
ROOL committed
21
 */
ROOL's avatar
ROOL committed
22

ROOL's avatar
ROOL committed
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
/*  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved.
 *  SPDX-License-Identifier: Apache-2.0
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 *  not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *  This file is part of Mbed TLS (https://tls.mbed.org)
 */

#ifndef MBEDTLS_AES_H
#define MBEDTLS_AES_H

#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif

#include <stddef.h>
#include <stdint.h>

/* padlock.c and aesni.c rely on these values! */
#define MBEDTLS_AES_ENCRYPT     1 /**< AES encryption. */
#define MBEDTLS_AES_DECRYPT     0 /**< AES decryption. */

/* Error codes in range 0x0020-0x0022 */
#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH                -0x0020  /**< Invalid key length. */
#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH              -0x0022  /**< Invalid data input length. */

ROOL's avatar
ROOL committed
61 62
/* Error codes in range 0x0021-0x0025 */
#define MBEDTLS_ERR_AES_BAD_INPUT_DATA                    -0x0021  /**< Invalid input data. */
ROOL's avatar
ROOL committed
63 64

/* MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE is deprecated and should not be used. */
ROOL's avatar
ROOL committed
65
#define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE               -0x0023  /**< Feature not available. For example, an unsupported AES key size. */
ROOL's avatar
ROOL committed
66 67

/* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */
ROOL's avatar
ROOL committed
68 69 70 71 72 73 74 75 76 77 78
#define MBEDTLS_ERR_AES_HW_ACCEL_FAILED                   -0x0025  /**< AES hardware accelerator failed. */

#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
    !defined(inline) && !defined(__cplusplus)
#define inline __inline
#endif

#ifdef __cplusplus
extern "C" {
#endif

ROOL's avatar
ROOL committed
79 80 81 82
#if !defined(MBEDTLS_AES_ALT)
// Regular implementation
//

ROOL's avatar
ROOL committed
83 84 85
/**
 * \brief The AES context-type definition.
 */
ROOL's avatar
ROOL committed
86
typedef struct mbedtls_aes_context
ROOL's avatar
ROOL committed
87 88 89 90 91 92 93 94 95 96 97 98 99 100
{
    int nr;                     /*!< The number of rounds. */
    uint32_t *rk;               /*!< AES round keys. */
    uint32_t buf[68];           /*!< Unaligned data buffer. This buffer can
                                     hold 32 extra Bytes, which can be used for
                                     one of the following purposes:
                                     <ul><li>Alignment if VIA padlock is
                                             used.</li>
                                     <li>Simplifying key expansion in the 256-bit
                                         case by generating an extra round key.
                                         </li></ul> */
}
mbedtls_aes_context;

ROOL's avatar
ROOL committed
101 102 103 104
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
 * \brief The AES XTS context-type definition.
 */
ROOL's avatar
ROOL committed
105
typedef struct mbedtls_aes_xts_context
ROOL's avatar
ROOL committed
106 107 108 109 110 111 112 113
{
    mbedtls_aes_context crypt; /*!< The AES context to use for AES block
                                        encryption or decryption. */
    mbedtls_aes_context tweak; /*!< The AES context used for tweak
                                        computation. */
} mbedtls_aes_xts_context;
#endif /* MBEDTLS_CIPHER_MODE_XTS */

ROOL's avatar
ROOL committed
114 115 116 117
#else  /* MBEDTLS_AES_ALT */
#include "aes_alt.h"
#endif /* MBEDTLS_AES_ALT */

ROOL's avatar
ROOL committed
118 119 120 121 122 123
/**
 * \brief          This function initializes the specified AES context.
 *
 *                 It must be the first API called before using
 *                 the context.
 *
ROOL's avatar
ROOL committed
124
 * \param ctx      The AES context to initialize. This must not be \c NULL.
ROOL's avatar
ROOL committed
125 126 127 128 129 130 131
 */
void mbedtls_aes_init( mbedtls_aes_context *ctx );

/**
 * \brief          This function releases and clears the specified AES context.
 *
 * \param ctx      The AES context to clear.
ROOL's avatar
ROOL committed
132 133
 *                 If this is \c NULL, this function does nothing.
 *                 Otherwise, the context must have been at least initialized.
ROOL's avatar
ROOL committed
134 135 136
 */
void mbedtls_aes_free( mbedtls_aes_context *ctx );

ROOL's avatar
ROOL committed
137 138 139 140 141 142 143
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
 * \brief          This function initializes the specified AES XTS context.
 *
 *                 It must be the first API called before using
 *                 the context.
 *
ROOL's avatar
ROOL committed
144
 * \param ctx      The AES XTS context to initialize. This must not be \c NULL.
ROOL's avatar
ROOL committed
145 146 147 148 149 150 151
 */
void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx );

/**
 * \brief          This function releases and clears the specified AES XTS context.
 *
 * \param ctx      The AES XTS context to clear.
ROOL's avatar
ROOL committed
152 153
 *                 If this is \c NULL, this function does nothing.
 *                 Otherwise, the context must have been at least initialized.
ROOL's avatar
ROOL committed
154 155 156 157
 */
void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx );
#endif /* MBEDTLS_CIPHER_MODE_XTS */

ROOL's avatar
ROOL committed
158 159 160 161
/**
 * \brief          This function sets the encryption key.
 *
 * \param ctx      The AES context to which the key should be bound.
ROOL's avatar
ROOL committed
162
 *                 It must be initialized.
ROOL's avatar
ROOL committed
163
 * \param key      The encryption key.
ROOL's avatar
ROOL committed
164
 *                 This must be a readable buffer of size \p keybits bits.
ROOL's avatar
ROOL committed
165 166 167 168 169
 * \param keybits  The size of data passed in bits. Valid options are:
 *                 <ul><li>128 bits</li>
 *                 <li>192 bits</li>
 *                 <li>256 bits</li></ul>
 *
ROOL's avatar
ROOL committed
170 171
 * \return         \c 0 on success.
 * \return         #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
ROOL's avatar
ROOL committed
172 173 174 175 176 177 178 179
 */
int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
                    unsigned int keybits );

/**
 * \brief          This function sets the decryption key.
 *
 * \param ctx      The AES context to which the key should be bound.
ROOL's avatar
ROOL committed
180
 *                 It must be initialized.
ROOL's avatar
ROOL committed
181
 * \param key      The decryption key.
ROOL's avatar
ROOL committed
182
 *                 This must be a readable buffer of size \p keybits bits.
ROOL's avatar
ROOL committed
183 184 185 186 187
 * \param keybits  The size of data passed. Valid options are:
 *                 <ul><li>128 bits</li>
 *                 <li>192 bits</li>
 *                 <li>256 bits</li></ul>
 *
ROOL's avatar
ROOL committed
188 189
 * \return         \c 0 on success.
 * \return         #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
ROOL's avatar
ROOL committed
190 191 192 193
 */
int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
                    unsigned int keybits );

ROOL's avatar
ROOL committed
194 195 196 197 198 199
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
 * \brief          This function prepares an XTS context for encryption and
 *                 sets the encryption key.
 *
 * \param ctx      The AES XTS context to which the key should be bound.
ROOL's avatar
ROOL committed
200
 *                 It must be initialized.
ROOL's avatar
ROOL committed
201 202
 * \param key      The encryption key. This is comprised of the XTS key1
 *                 concatenated with the XTS key2.
ROOL's avatar
ROOL committed
203
 *                 This must be a readable buffer of size \p keybits bits.
ROOL's avatar
ROOL committed
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
 * \param keybits  The size of \p key passed in bits. Valid options are:
 *                 <ul><li>256 bits (each of key1 and key2 is a 128-bit key)</li>
 *                 <li>512 bits (each of key1 and key2 is a 256-bit key)</li></ul>
 *
 * \return         \c 0 on success.
 * \return         #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
 */
int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx,
                                const unsigned char *key,
                                unsigned int keybits );

/**
 * \brief          This function prepares an XTS context for decryption and
 *                 sets the decryption key.
 *
 * \param ctx      The AES XTS context to which the key should be bound.
ROOL's avatar
ROOL committed
220
 *                 It must be initialized.
ROOL's avatar
ROOL committed
221 222
 * \param key      The decryption key. This is comprised of the XTS key1
 *                 concatenated with the XTS key2.
ROOL's avatar
ROOL committed
223
 *                 This must be a readable buffer of size \p keybits bits.
ROOL's avatar
ROOL committed
224 225 226 227 228 229 230 231 232 233 234 235
 * \param keybits  The size of \p key passed in bits. Valid options are:
 *                 <ul><li>256 bits (each of key1 and key2 is a 128-bit key)</li>
 *                 <li>512 bits (each of key1 and key2 is a 256-bit key)</li></ul>
 *
 * \return         \c 0 on success.
 * \return         #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
 */
int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
                                const unsigned char *key,
                                unsigned int keybits );
#endif /* MBEDTLS_CIPHER_MODE_XTS */

ROOL's avatar
ROOL committed
236 237 238 239 240 241 242 243 244 245 246 247 248
/**
 * \brief          This function performs an AES single-block encryption or
 *                 decryption operation.
 *
 *                 It performs the operation defined in the \p mode parameter
 *                 (encrypt or decrypt), on the input data buffer defined in
 *                 the \p input parameter.
 *
 *                 mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or
 *                 mbedtls_aes_setkey_dec() must be called before the first
 *                 call to this API with the same context.
 *
 * \param ctx      The AES context to use for encryption or decryption.
ROOL's avatar
ROOL committed
249
 *                 It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
250 251
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 *                 #MBEDTLS_AES_DECRYPT.
ROOL's avatar
ROOL committed
252 253 254 255
 * \param input    The buffer holding the input data.
 *                 It must be readable and at least \c 16 Bytes long.
 * \param output   The buffer where the output data will be written.
 *                 It must be writeable and at least \c 16 Bytes long.
ROOL's avatar
ROOL committed
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277

 * \return         \c 0 on success.
 */
int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
                    int mode,
                    const unsigned char input[16],
                    unsigned char output[16] );

#if defined(MBEDTLS_CIPHER_MODE_CBC)
/**
 * \brief  This function performs an AES-CBC encryption or decryption operation
 *         on full blocks.
 *
 *         It performs the operation defined in the \p mode
 *         parameter (encrypt/decrypt), on the input data buffer defined in
 *         the \p input parameter.
 *
 *         It can be called as many times as needed, until all the input
 *         data is processed. mbedtls_aes_init(), and either
 *         mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called
 *         before the first call to this API with the same context.
 *
ROOL's avatar
ROOL committed
278 279
 * \note   This function operates on full blocks, that is, the input size
 *         must be a multiple of the AES block size of \c 16 Bytes.
ROOL's avatar
ROOL committed
280 281 282 283 284 285 286 287 288 289
 *
 * \note   Upon exit, the content of the IV is updated so that you can
 *         call the same function again on the next
 *         block(s) of data and get the same result as if it was
 *         encrypted in one call. This allows a "streaming" usage.
 *         If you need to retain the contents of the IV, you should
 *         either save it manually or use the cipher module instead.
 *
 *
 * \param ctx      The AES context to use for encryption or decryption.
ROOL's avatar
ROOL committed
290
 *                 It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
291 292 293
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 *                 #MBEDTLS_AES_DECRYPT.
 * \param length   The length of the input data in Bytes. This must be a
ROOL's avatar
ROOL committed
294
 *                 multiple of the block size (\c 16 Bytes).
ROOL's avatar
ROOL committed
295
 * \param iv       Initialization vector (updated after use).
ROOL's avatar
ROOL committed
296
 *                 It must be a readable and writeable buffer of \c 16 Bytes.
ROOL's avatar
ROOL committed
297
 * \param input    The buffer holding the input data.
ROOL's avatar
ROOL committed
298
 *                 It must be readable and of size \p length Bytes.
ROOL's avatar
ROOL committed
299
 * \param output   The buffer holding the output data.
ROOL's avatar
ROOL committed
300
 *                 It must be writeable and of size \p length Bytes.
ROOL's avatar
ROOL committed
301
 *
ROOL's avatar
ROOL committed
302 303
 * \return         \c 0 on success.
 * \return         #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
ROOL's avatar
ROOL committed
304 305 306 307 308 309 310 311 312 313
 *                 on failure.
 */
int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
                    int mode,
                    size_t length,
                    unsigned char iv[16],
                    const unsigned char *input,
                    unsigned char *output );
#endif /* MBEDTLS_CIPHER_MODE_CBC */

ROOL's avatar
ROOL committed
314 315 316 317 318 319 320 321 322 323 324 325 326 327
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
 * \brief      This function performs an AES-XTS encryption or decryption
 *             operation for an entire XTS data unit.
 *
 *             AES-XTS encrypts or decrypts blocks based on their location as
 *             defined by a data unit number. The data unit number must be
 *             provided by \p data_unit.
 *
 *             NIST SP 800-38E limits the maximum size of a data unit to 2^20
 *             AES blocks. If the data unit is larger than this, this function
 *             returns #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH.
 *
 * \param ctx          The AES XTS context to use for AES XTS operations.
ROOL's avatar
ROOL committed
328
 *                     It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
329 330
 * \param mode         The AES operation: #MBEDTLS_AES_ENCRYPT or
 *                     #MBEDTLS_AES_DECRYPT.
ROOL's avatar
ROOL committed
331
 * \param length       The length of a data unit in Bytes. This can be any
ROOL's avatar
ROOL committed
332 333 334 335 336 337 338
 *                     length between 16 bytes and 2^24 bytes inclusive
 *                     (between 1 and 2^20 block cipher blocks).
 * \param data_unit    The address of the data unit encoded as an array of 16
 *                     bytes in little-endian format. For disk encryption, this
 *                     is typically the index of the block device sector that
 *                     contains the data.
 * \param input        The buffer holding the input data (which is an entire
ROOL's avatar
ROOL committed
339
 *                     data unit). This function reads \p length Bytes from \p
ROOL's avatar
ROOL committed
340 341
 *                     input.
 * \param output       The buffer holding the output data (which is an entire
ROOL's avatar
ROOL committed
342
 *                     data unit). This function writes \p length Bytes to \p
ROOL's avatar
ROOL committed
343 344 345 346
 *                     output.
 *
 * \return             \c 0 on success.
 * \return             #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH if \p length is
ROOL's avatar
ROOL committed
347
 *                     smaller than an AES block in size (16 Bytes) or if \p
ROOL's avatar
ROOL committed
348 349 350 351 352 353 354 355 356 357
 *                     length is larger than 2^20 blocks (16 MiB).
 */
int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx,
                           int mode,
                           size_t length,
                           const unsigned char data_unit[16],
                           const unsigned char *input,
                           unsigned char *output );
#endif /* MBEDTLS_CIPHER_MODE_XTS */

ROOL's avatar
ROOL committed
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
#if defined(MBEDTLS_CIPHER_MODE_CFB)
/**
 * \brief This function performs an AES-CFB128 encryption or decryption
 *        operation.
 *
 *        It performs the operation defined in the \p mode
 *        parameter (encrypt or decrypt), on the input data buffer
 *        defined in the \p input parameter.
 *
 *        For CFB, you must set up the context with mbedtls_aes_setkey_enc(),
 *        regardless of whether you are performing an encryption or decryption
 *        operation, that is, regardless of the \p mode parameter. This is
 *        because CFB mode uses the same key schedule for encryption and
 *        decryption.
 *
 * \note  Upon exit, the content of the IV is updated so that you can
 *        call the same function again on the next
 *        block(s) of data and get the same result as if it was
 *        encrypted in one call. This allows a "streaming" usage.
 *        If you need to retain the contents of the
 *        IV, you must either save it manually or use the cipher
 *        module instead.
 *
 *
 * \param ctx      The AES context to use for encryption or decryption.
ROOL's avatar
ROOL committed
383
 *                 It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
384 385
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 *                 #MBEDTLS_AES_DECRYPT.
ROOL's avatar
ROOL committed
386
 * \param length   The length of the input data in Bytes.
ROOL's avatar
ROOL committed
387
 * \param iv_off   The offset in IV (updated after use).
ROOL's avatar
ROOL committed
388
 *                 It must point to a valid \c size_t.
ROOL's avatar
ROOL committed
389
 * \param iv       The initialization vector (updated after use).
ROOL's avatar
ROOL committed
390
 *                 It must be a readable and writeable buffer of \c 16 Bytes.
ROOL's avatar
ROOL committed
391
 * \param input    The buffer holding the input data.
ROOL's avatar
ROOL committed
392
 *                 It must be readable and of size \p length Bytes.
ROOL's avatar
ROOL committed
393
 * \param output   The buffer holding the output data.
ROOL's avatar
ROOL committed
394
 *                 It must be writeable and of size \p length Bytes.
ROOL's avatar
ROOL committed
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
 *
 * \return         \c 0 on success.
 */
int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
                       int mode,
                       size_t length,
                       size_t *iv_off,
                       unsigned char iv[16],
                       const unsigned char *input,
                       unsigned char *output );

/**
 * \brief This function performs an AES-CFB8 encryption or decryption
 *        operation.
 *
 *        It performs the operation defined in the \p mode
 *        parameter (encrypt/decrypt), on the input data buffer defined
 *        in the \p input parameter.
 *
 *        Due to the nature of CFB, you must use the same key schedule for
 *        both encryption and decryption operations. Therefore, you must
 *        use the context initialized with mbedtls_aes_setkey_enc() for
 *        both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT.
 *
 * \note  Upon exit, the content of the IV is updated so that you can
 *        call the same function again on the next
 *        block(s) of data and get the same result as if it was
 *        encrypted in one call. This allows a "streaming" usage.
 *        If you need to retain the contents of the
 *        IV, you should either save it manually or use the cipher
 *        module instead.
 *
 *
 * \param ctx      The AES context to use for encryption or decryption.
ROOL's avatar
ROOL committed
429
 *                 It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
430 431 432 433
 * \param mode     The AES operation: #MBEDTLS_AES_ENCRYPT or
 *                 #MBEDTLS_AES_DECRYPT
 * \param length   The length of the input data.
 * \param iv       The initialization vector (updated after use).
ROOL's avatar
ROOL committed
434
 *                 It must be a readable and writeable buffer of \c 16 Bytes.
ROOL's avatar
ROOL committed
435
 * \param input    The buffer holding the input data.
ROOL's avatar
ROOL committed
436
 *                 It must be readable and of size \p length Bytes.
ROOL's avatar
ROOL committed
437
 * \param output   The buffer holding the output data.
ROOL's avatar
ROOL committed
438
 *                 It must be writeable and of size \p length Bytes.
ROOL's avatar
ROOL committed
439 440 441 442 443 444 445 446 447 448 449
 *
 * \return         \c 0 on success.
 */
int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
                    int mode,
                    size_t length,
                    unsigned char iv[16],
                    const unsigned char *input,
                    unsigned char *output );
#endif /*MBEDTLS_CIPHER_MODE_CFB */

ROOL's avatar
ROOL committed
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
#if defined(MBEDTLS_CIPHER_MODE_OFB)
/**
 * \brief       This function performs an AES-OFB (Output Feedback Mode)
 *              encryption or decryption operation.
 *
 *              For OFB, you must set up the context with
 *              mbedtls_aes_setkey_enc(), regardless of whether you are
 *              performing an encryption or decryption operation. This is
 *              because OFB mode uses the same key schedule for encryption and
 *              decryption.
 *
 *              The OFB operation is identical for encryption or decryption,
 *              therefore no operation mode needs to be specified.
 *
 * \note        Upon exit, the content of iv, the Initialisation Vector, is
 *              updated so that you can call the same function again on the next
 *              block(s) of data and get the same result as if it was encrypted
 *              in one call. This allows a "streaming" usage, by initialising
 *              iv_off to 0 before the first call, and preserving its value
 *              between calls.
 *
 *              For non-streaming use, the iv should be initialised on each call
 *              to a unique value, and iv_off set to 0 on each call.
 *
 *              If you need to retain the contents of the initialisation vector,
 *              you must either save it manually or use the cipher module
 *              instead.
 *
 * \warning     For the OFB mode, the initialisation vector must be unique
 *              every encryption operation. Reuse of an initialisation vector
 *              will compromise security.
 *
 * \param ctx      The AES context to use for encryption or decryption.
ROOL's avatar
ROOL committed
483
 *                 It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
484 485
 * \param length   The length of the input data.
 * \param iv_off   The offset in IV (updated after use).
ROOL's avatar
ROOL committed
486
 *                 It must point to a valid \c size_t.
ROOL's avatar
ROOL committed
487
 * \param iv       The initialization vector (updated after use).
ROOL's avatar
ROOL committed
488
 *                 It must be a readable and writeable buffer of \c 16 Bytes.
ROOL's avatar
ROOL committed
489
 * \param input    The buffer holding the input data.
ROOL's avatar
ROOL committed
490
 *                 It must be readable and of size \p length Bytes.
ROOL's avatar
ROOL committed
491
 * \param output   The buffer holding the output data.
ROOL's avatar
ROOL committed
492
 *                 It must be writeable and of size \p length Bytes.
ROOL's avatar
ROOL committed
493 494 495 496 497 498 499 500 501 502 503 504
 *
 * \return         \c 0 on success.
 */
int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx,
                       size_t length,
                       size_t *iv_off,
                       unsigned char iv[16],
                       const unsigned char *input,
                       unsigned char *output );

#endif /* MBEDTLS_CIPHER_MODE_OFB */

ROOL's avatar
ROOL committed
505 506 507 508 509 510 511 512 513 514 515 516 517 518
#if defined(MBEDTLS_CIPHER_MODE_CTR)
/**
 * \brief      This function performs an AES-CTR encryption or decryption
 *             operation.
 *
 *             This function performs the operation defined in the \p mode
 *             parameter (encrypt/decrypt), on the input data buffer
 *             defined in the \p input parameter.
 *
 *             Due to the nature of CTR, you must use the same key schedule
 *             for both encryption and decryption operations. Therefore, you
 *             must use the context initialized with mbedtls_aes_setkey_enc()
 *             for both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT.
 *
ROOL's avatar
ROOL committed
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
 * \warning    You must never reuse a nonce value with the same key. Doing so
 *             would void the encryption for the two messages encrypted with
 *             the same nonce and key.
 *
 *             There are two common strategies for managing nonces with CTR:
 *
 *             1. You can handle everything as a single message processed over
 *             successive calls to this function. In that case, you want to
 *             set \p nonce_counter and \p nc_off to 0 for the first call, and
 *             then preserve the values of \p nonce_counter, \p nc_off and \p
 *             stream_block across calls to this function as they will be
 *             updated by this function.
 *
 *             With this strategy, you must not encrypt more than 2**128
 *             blocks of data with the same key.
 *
 *             2. You can encrypt separate messages by dividing the \p
 *             nonce_counter buffer in two areas: the first one used for a
 *             per-message nonce, handled by yourself, and the second one
 *             updated by this function internally.
 *
 *             For example, you might reserve the first 12 bytes for the
 *             per-message nonce, and the last 4 bytes for internal use. In that
 *             case, before calling this function on a new message you need to
 *             set the first 12 bytes of \p nonce_counter to your chosen nonce
 *             value, the last 4 to 0, and \p nc_off to 0 (which will cause \p
 *             stream_block to be ignored). That way, you can encrypt at most
 *             2**96 messages of up to 2**32 blocks each with the same key.
 *
 *             The per-message nonce (or information sufficient to reconstruct
 *             it) needs to be communicated with the ciphertext and must be unique.
 *             The recommended way to ensure uniqueness is to use a message
 *             counter. An alternative is to generate random nonces, but this
 *             limits the number of messages that can be securely encrypted:
 *             for example, with 96-bit random nonces, you should not encrypt
 *             more than 2**32 messages with the same key.
 *
 *             Note that for both stategies, sizes are measured in blocks and
 *             that an AES block is 16 bytes.
 *
 * \warning    Upon return, \p stream_block contains sensitive data. Its
 *             content must not be written to insecure storage and should be
 *             securely discarded as soon as it's no longer needed.
ROOL's avatar
ROOL committed
562 563
 *
 * \param ctx              The AES context to use for encryption or decryption.
ROOL's avatar
ROOL committed
564
 *                         It must be initialized and bound to a key.
ROOL's avatar
ROOL committed
565 566 567 568
 * \param length           The length of the input data.
 * \param nc_off           The offset in the current \p stream_block, for
 *                         resuming within the current cipher stream. The
 *                         offset pointer should be 0 at the start of a stream.
ROOL's avatar
ROOL committed
569
 *                         It must point to a valid \c size_t.
ROOL's avatar
ROOL committed
570
 * \param nonce_counter    The 128-bit nonce and counter.
ROOL's avatar
ROOL committed
571
 *                         It must be a readable-writeable buffer of \c 16 Bytes.
ROOL's avatar
ROOL committed
572 573
 * \param stream_block     The saved stream block for resuming. This is
 *                         overwritten by the function.
ROOL's avatar
ROOL committed
574
 *                         It must be a readable-writeable buffer of \c 16 Bytes.
ROOL's avatar
ROOL committed
575
 * \param input            The buffer holding the input data.
ROOL's avatar
ROOL committed
576
 *                         It must be readable and of size \p length Bytes.
ROOL's avatar
ROOL committed
577
 * \param output           The buffer holding the output data.
ROOL's avatar
ROOL committed
578
 *                         It must be writeable and of size \p length Bytes.
ROOL's avatar
ROOL committed
579
 *
ROOL's avatar
ROOL committed
580
 * \return                 \c 0 on success.
ROOL's avatar
ROOL committed
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
 */
int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
                       size_t length,
                       size_t *nc_off,
                       unsigned char nonce_counter[16],
                       unsigned char stream_block[16],
                       const unsigned char *input,
                       unsigned char *output );
#endif /* MBEDTLS_CIPHER_MODE_CTR */

/**
 * \brief           Internal AES block encryption function. This is only
 *                  exposed to allow overriding it using
 *                  \c MBEDTLS_AES_ENCRYPT_ALT.
 *
 * \param ctx       The AES context to use for encryption.
 * \param input     The plaintext block.
 * \param output    The output (ciphertext) block.
 *
 * \return          \c 0 on success.
 */
int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
                                  const unsigned char input[16],
                                  unsigned char output[16] );

/**
 * \brief           Internal AES block decryption function. This is only
 *                  exposed to allow overriding it using see
 *                  \c MBEDTLS_AES_DECRYPT_ALT.
 *
 * \param ctx       The AES context to use for decryption.
 * \param input     The ciphertext block.
 * \param output    The output (plaintext) block.
 *
 * \return          \c 0 on success.
 */
int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
                                  const unsigned char input[16],
                                  unsigned char output[16] );

#if !defined(MBEDTLS_DEPRECATED_REMOVED)
#if defined(MBEDTLS_DEPRECATED_WARNING)
#define MBEDTLS_DEPRECATED      __attribute__((deprecated))
#else
#define MBEDTLS_DEPRECATED
#endif
/**
 * \brief           Deprecated internal AES block encryption function
 *                  without return value.
 *
ROOL's avatar
ROOL committed
631
 * \deprecated      Superseded by mbedtls_internal_aes_encrypt()
ROOL's avatar
ROOL committed
632 633 634 635 636 637 638 639 640 641 642 643 644
 *
 * \param ctx       The AES context to use for encryption.
 * \param input     Plaintext block.
 * \param output    Output (ciphertext) block.
 */
MBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
                                             const unsigned char input[16],
                                             unsigned char output[16] );

/**
 * \brief           Deprecated internal AES block decryption function
 *                  without return value.
 *
ROOL's avatar
ROOL committed
645
 * \deprecated      Superseded by mbedtls_internal_aes_decrypt()
ROOL's avatar
ROOL committed
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
 *
 * \param ctx       The AES context to use for decryption.
 * \param input     Ciphertext block.
 * \param output    Output (plaintext) block.
 */
MBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
                                             const unsigned char input[16],
                                             unsigned char output[16] );

#undef MBEDTLS_DEPRECATED
#endif /* !MBEDTLS_DEPRECATED_REMOVED */

/**
 * \brief          Checkup routine.
 *
ROOL's avatar
ROOL committed
661 662
 * \return         \c 0 on success.
 * \return         \c 1 on failure.
ROOL's avatar
ROOL committed
663 664 665 666 667 668 669 670
 */
int mbedtls_aes_self_test( int verbose );

#ifdef __cplusplus
}
#endif

#endif /* aes.h */