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
21 extern "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  */
mbedtls_block_cipher_init(mbedtls_block_cipher_context_t * ctx)30 static 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  */
49 int 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  */
67 int 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  */
85 int 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  */
93 void 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