| /* |
| * Copyright (c) 2019, The OpenThread Authors. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. Neither the name of the copyright holder nor the |
| * names of its contributors may be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef MBEDTLS_AES_ALT_H |
| #define MBEDTLS_AES_ALT_H |
| |
| #if !defined(MBEDTLS_CONFIG_FILE) |
| #include "samr21-mbedtls-config.h" |
| #else |
| #include MBEDTLS_CONFIG_FILE |
| #endif |
| |
| #ifdef MBEDTLS_AES_ALT |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| typedef struct |
| { |
| uint8_t hwKeyLen; |
| unsigned char aes_enc_key[32]; /* Encryption key */ |
| unsigned char aes_dec_key[32]; /* Decryption key */ |
| } mbedtls_aes_context; |
| |
| /** |
| * @brief Initialize AES context |
| * |
| * @param [in,out] ctx AES context to be initialized |
| */ |
| void mbedtls_aes_init(mbedtls_aes_context *ctx); |
| |
| /** |
| * @brief Clear AES context |
| * |
| * \param ctx AES context to be cleared |
| */ |
| void mbedtls_aes_free(mbedtls_aes_context *ctx); |
| |
| /** |
| * \brief AES key schedule (encryption) |
| * |
| * \param ctx AES context to be initialized |
| * \param key encryption key |
| * \param keybits must be 128, 192 or 256 |
| * |
| * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH |
| */ |
| int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key, |
| unsigned int keybits); |
| |
| /** |
| * \brief AES key schedule (decryption) |
| * |
| * \param ctx AES context to be initialized |
| * \param key decryption key |
| * \param keybits must be 128, 192 or 256 |
| * |
| * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH |
| */ |
| int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key, |
| unsigned int keybits); |
| |
| /** |
| * \brief AES-ECB block encryption/decryption |
| * |
| * \param ctx AES context |
| * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT |
| * \param input 16-byte input block |
| * \param output 16-byte output block |
| * |
| * \return 0 if successful |
| */ |
| int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx, int mode, const unsigned char input[16], |
| unsigned char output[16]); |
| |
| /** |
| * \brief AES-CBC buffer encryption/decryption |
| * Length should be a multiple of the block |
| * size (16 bytes) |
| * |
| * \note Upon exit, the content of the IV is updated so that you can |
| * call the function same function again on the following |
| * block(s) of data and get the same result as if it was |
| * encrypted in one call. This allows a "streaming" usage. |
| * If on the other hand you need to retain the contents of the |
| * IV, you should either save it manually or use the cipher |
| * module instead. |
| * |
| * \param ctx AES context |
| * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT |
| * \param length length of the input data |
| * \param iv initialization vector (updated after use) |
| * \param input buffer holding the input data |
| * \param output buffer holding the output data |
| * |
| * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH |
| */ |
| 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 ); |
| |
| /** |
| * \brief AES-CTR buffer encryption/decryption |
| * |
| * Warning: You have to keep the maximum use of your counter in mind! |
| * |
| * Note: Due to the nature of CTR you should use the same key schedule for |
| * both encryption and decryption. So a context initialized with |
| * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. |
| * |
| * \param ctx AES context |
| * \param length The length of the data |
| * \param nc_off The offset in the current stream_block (for resuming |
| * within current cipher stream). The offset pointer to |
| * should be 0 at the start of a stream. |
| * \param nonce_counter The 128-bit nonce and counter. |
| * \param stream_block The saved stream-block for resuming. Is overwritten |
| * by the function. |
| * \param input The input data stream |
| * \param output The output data stream |
| * |
| * \return 0 if successful |
| */ |
| 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 ); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* MBEDTLS_AES_ALT */ |
| |
| #endif /* MBEDTLS_AES_ALT_H */ |