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