1/** 2 * \file block_cipher_internal.h 3 * 4 * \brief Lightweight abstraction layer for block ciphers with 128 bit blocks, 5 * for use by the GCM and CCM modules. 6 */ 7/* 8 * Copyright The Mbed TLS Contributors 9 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 10 */ 11#ifndef MBEDTLS_BLOCK_CIPHER_INTERNAL_H 12#define MBEDTLS_BLOCK_CIPHER_INTERNAL_H 13 14#include "mbedtls/build_info.h" 15 16#include "mbedtls/cipher.h" 17 18#include "mbedtls/block_cipher.h" 19 20#ifdef __cplusplus 21extern "C" { 22#endif 23 24/** 25 * \brief Initialize the context. 26 * This must be the first API call before using the context. 27 * 28 * \param ctx The context to initialize. 29 */ 30static inline void mbedtls_block_cipher_init(mbedtls_block_cipher_context_t *ctx) 31{ 32 memset(ctx, 0, sizeof(*ctx)); 33} 34 35/** 36 * \brief Set the block cipher to use with this context. 37 * This must be called after mbedtls_block_cipher_init(). 38 * 39 * \param ctx The context to set up. 40 * \param cipher_id The identifier of the cipher to use. 41 * This must be either AES, ARIA or Camellia. 42 * Warning: this is a ::mbedtls_cipher_id_t, 43 * not a ::mbedtls_block_cipher_id_t! 44 * 45 * \retval \c 0 on success. 46 * \retval #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if \p cipher_id was 47 * invalid. 48 */ 49int mbedtls_block_cipher_setup(mbedtls_block_cipher_context_t *ctx, 50 mbedtls_cipher_id_t cipher_id); 51 52/** 53 * \brief Set the key into the context. 54 * 55 * \param ctx The context to configure. 56 * \param key The buffer holding the key material. 57 * \param key_bitlen The size of the key in bits. 58 * 59 * \retval \c 0 on success. 60 * \retval #MBEDTLS_ERR_CIPHER_INVALID_CONTEXT if the context was not 61 * properly set up before calling this function. 62 * \retval One of #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH, 63 * #MBEDTLS_ERR_ARIA_BAD_INPUT_DATA, 64 * #MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA if \p key_bitlen is 65 * invalid. 66 */ 67int mbedtls_block_cipher_setkey(mbedtls_block_cipher_context_t *ctx, 68 const unsigned char *key, 69 unsigned key_bitlen); 70 71/** 72 * \brief Encrypt one block (16 bytes) with the configured key. 73 * 74 * \param ctx The context holding the key. 75 * \param input The buffer holding the input block. Must be 16 bytes. 76 * \param output The buffer to which the output block will be written. 77 * Must be writable and 16 bytes long. 78 * This must either not overlap with \p input, or be equal. 79 * 80 * \retval \c 0 on success. 81 * \retval #MBEDTLS_ERR_CIPHER_INVALID_CONTEXT if the context was not 82 * properly set up before calling this function. 83 * \retval Another negative value if encryption failed. 84 */ 85int mbedtls_block_cipher_encrypt(mbedtls_block_cipher_context_t *ctx, 86 const unsigned char input[16], 87 unsigned char output[16]); 88/** 89 * \brief Clear the context. 90 * 91 * \param ctx The context to clear. 92 */ 93void mbedtls_block_cipher_free(mbedtls_block_cipher_context_t *ctx); 94 95#ifdef __cplusplus 96} 97#endif 98 99#endif /* MBEDTLS_BLOCK_CIPHER_INTERNAL_H */ 100