OPTIGA Trust M  1.1.0
C++ library for Optiga Trust M Chip Security Controller
aes.c File Reference
#include "config.h"
#include <string.h>
#include "aes.h"
#include "platform.h"
#include "platform_util.h"
Include dependency graph for aes.c:

Macros

#define AES_VALIDATE_RET(cond)   MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )
 
#define AES_VALIDATE(cond)   MBEDTLS_INTERNAL_VALIDATE( cond )
 
#define GET_UINT32_LE(n, b, i)
 
#define PUT_UINT32_LE(n, b, i)
 
#define FT
 
#define V(a, b, c, d)   0x##a##b##c##d
 
#define V(a, b, c, d)   0x##b##c##d##a
 
#define V(a, b, c, d)   0x##c##d##a##b
 
#define V(a, b, c, d)   0x##d##a##b##c
 
#define RT
 
#define V(a, b, c, d)   0x##a##b##c##d
 
#define V(a, b, c, d)   0x##b##c##d##a
 
#define V(a, b, c, d)   0x##c##d##a##b
 
#define V(a, b, c, d)   0x##d##a##b##c
 
#define AES_RT0(idx)   RT0[idx]
 
#define AES_RT1(idx)   RT1[idx]
 
#define AES_RT2(idx)   RT2[idx]
 
#define AES_RT3(idx)   RT3[idx]
 
#define AES_FT0(idx)   FT0[idx]
 
#define AES_FT1(idx)   FT1[idx]
 
#define AES_FT2(idx)   FT2[idx]
 
#define AES_FT3(idx)   FT3[idx]
 
#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)
 
#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)
 

Functions

void mbedtls_aes_init (mbedtls_aes_context *ctx)
 This function initializes the specified AES context. More...
 
void mbedtls_aes_free (mbedtls_aes_context *ctx)
 This function releases and clears the specified AES context. More...
 
int mbedtls_aes_setkey_enc (mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits)
 This function sets the encryption key. More...
 
int mbedtls_aes_setkey_dec (mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits)
 This function sets the decryption key. More...
 
int mbedtls_internal_aes_encrypt (mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16])
 Internal AES block encryption function. This is only exposed to allow overriding it using MBEDTLS_AES_ENCRYPT_ALT. More...
 
void mbedtls_aes_encrypt (mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16])
 Deprecated internal AES block encryption function without return value. More...
 
int mbedtls_internal_aes_decrypt (mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16])
 Internal AES block decryption function. This is only exposed to allow overriding it using see MBEDTLS_AES_DECRYPT_ALT. More...
 
void mbedtls_aes_decrypt (mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16])
 Deprecated internal AES block decryption function without return value. More...
 
int mbedtls_aes_crypt_ecb (mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16])
 This function performs an AES single-block encryption or decryption operation. More...
 

Macro Definition Documentation

◆ AES_FROUND

#define AES_FROUND (   X0,
  X1,
  X2,
  X3,
  Y0,
  Y1,
  Y2,
  Y3 
)
Value:
{ \
X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \
AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \
AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \
AES_FT3( ( Y3 >> 24 ) & 0xFF ); \
\
X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \
AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \
AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \
AES_FT3( ( Y0 >> 24 ) & 0xFF ); \
\
X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \
AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \
AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \
AES_FT3( ( Y1 >> 24 ) & 0xFF ); \
\
X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \
AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \
AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \
AES_FT3( ( Y2 >> 24 ) & 0xFF ); \
}
#define AES_FT0(idx)
Definition: aes.c:511

◆ AES_FT0

#define AES_FT0 (   idx)    FT0[idx]

◆ AES_FT1

#define AES_FT1 (   idx)    FT1[idx]

◆ AES_FT2

#define AES_FT2 (   idx)    FT2[idx]

◆ AES_FT3

#define AES_FT3 (   idx)    FT3[idx]

◆ AES_RROUND

#define AES_RROUND (   X0,
  X1,
  X2,
  X3,
  Y0,
  Y1,
  Y2,
  Y3 
)
Value:
{ \
X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \
AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \
AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \
AES_RT3( ( Y1 >> 24 ) & 0xFF ); \
\
X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \
AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \
AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \
AES_RT3( ( Y2 >> 24 ) & 0xFF ); \
\
X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \
AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \
AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \
AES_RT3( ( Y3 >> 24 ) & 0xFF ); \
\
X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \
AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \
AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \
AES_RT3( ( Y0 >> 24 ) & 0xFF ); \
}
#define AES_RT0(idx)
Definition: aes.c:506

◆ AES_RT0

#define AES_RT0 (   idx)    RT0[idx]

◆ AES_RT1

#define AES_RT1 (   idx)    RT1[idx]

◆ AES_RT2

#define AES_RT2 (   idx)    RT2[idx]

◆ AES_RT3

#define AES_RT3 (   idx)    RT3[idx]

◆ AES_VALIDATE

#define AES_VALIDATE (   cond)    MBEDTLS_INTERNAL_VALIDATE( cond )

◆ AES_VALIDATE_RET

#define AES_VALIDATE_RET (   cond)    MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA )

◆ FT

#define FT

◆ GET_UINT32_LE

#define GET_UINT32_LE (   n,
  b,
 
)
Value:
{ \
(n) = ( (uint32_t) (b)[(i) ] ) \
| ( (uint32_t) (b)[(i) + 1] << 8 ) \
| ( (uint32_t) (b)[(i) + 2] << 16 ) \
| ( (uint32_t) (b)[(i) + 3] << 24 ); \
}

◆ PUT_UINT32_LE

#define PUT_UINT32_LE (   n,
  b,
 
)
Value:
{ \
(b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
(b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
(b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
(b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
}

◆ RT

#define RT

◆ V [1/8]

#define V (   a,
  b,
  c,
 
)    0x##a##b##c##d

◆ V [2/8]

#define V (   a,
  b,
  c,
 
)    0x##b##c##d##a

◆ V [3/8]

#define V (   a,
  b,
  c,
 
)    0x##c##d##a##b

◆ V [4/8]

#define V (   a,
  b,
  c,
 
)    0x##d##a##b##c

◆ V [5/8]

#define V (   a,
  b,
  c,
 
)    0x##a##b##c##d

◆ V [6/8]

#define V (   a,
  b,
  c,
 
)    0x##b##c##d##a

◆ V [7/8]

#define V (   a,
  b,
  c,
 
)    0x##c##d##a##b

◆ V [8/8]

#define V (   a,
  b,
  c,
 
)    0x##d##a##b##c

Function Documentation

◆ mbedtls_aes_crypt_ecb()

int mbedtls_aes_crypt_ecb ( mbedtls_aes_context ctx,
int  mode,
const unsigned char  input[16],
unsigned char  output[16] 
)

This function performs an AES single-block encryption or decryption operation.

It performs the operation defined in the mode parameter (encrypt or decrypt), on the input data buffer defined in the 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.

Parameters
ctxThe AES context to use for encryption or decryption. It must be initialized and bound to a key.
modeThe AES operation: MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT.
inputThe buffer holding the input data. It must be readable and at least 16 Bytes long.
outputThe buffer where the output data will be written. It must be writeable and at least 16 Bytes long.
Returns
0 on success.
Here is the call graph for this function:

◆ mbedtls_aes_decrypt()

void mbedtls_aes_decrypt ( mbedtls_aes_context ctx,
const unsigned char  input[16],
unsigned char  output[16] 
)

Deprecated internal AES block decryption function without return value.

Deprecated:
Superseded by mbedtls_internal_aes_decrypt()
Parameters
ctxThe AES context to use for decryption.
inputCiphertext block.
outputOutput (plaintext) block.
Here is the call graph for this function:

◆ mbedtls_aes_encrypt()

void mbedtls_aes_encrypt ( mbedtls_aes_context ctx,
const unsigned char  input[16],
unsigned char  output[16] 
)

Deprecated internal AES block encryption function without return value.

Deprecated:
Superseded by mbedtls_internal_aes_encrypt()
Parameters
ctxThe AES context to use for encryption.
inputPlaintext block.
outputOutput (ciphertext) block.
Here is the call graph for this function:

◆ mbedtls_aes_free()

void mbedtls_aes_free ( mbedtls_aes_context ctx)

This function releases and clears the specified AES context.

Parameters
ctxThe AES context to clear. If this is NULL, this function does nothing. Otherwise, the context must have been at least initialized.
Here is the call graph for this function:

◆ mbedtls_aes_init()

void mbedtls_aes_init ( mbedtls_aes_context ctx)

This function initializes the specified AES context.

            It must be the first API called before using
            the context.
Parameters
ctxThe AES context to initialize. This must not be NULL.

◆ mbedtls_aes_setkey_dec()

int mbedtls_aes_setkey_dec ( mbedtls_aes_context ctx,
const unsigned char *  key,
unsigned int  keybits 
)

This function sets the decryption key.

Parameters
ctxThe AES context to which the key should be bound. It must be initialized.
keyThe decryption key. This must be a readable buffer of size keybits bits.
keybitsThe size of data passed. Valid options are:
  • 128 bits
  • 192 bits
  • 256 bits
Returns
0 on success.
MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.

◆ mbedtls_aes_setkey_enc()

int mbedtls_aes_setkey_enc ( mbedtls_aes_context ctx,
const unsigned char *  key,
unsigned int  keybits 
)

This function sets the encryption key.

Parameters
ctxThe AES context to which the key should be bound. It must be initialized.
keyThe encryption key. This must be a readable buffer of size keybits bits.
keybitsThe size of data passed in bits. Valid options are:
  • 128 bits
  • 192 bits
  • 256 bits
Returns
0 on success.
MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.

◆ mbedtls_internal_aes_decrypt()

int mbedtls_internal_aes_decrypt ( mbedtls_aes_context ctx,
const unsigned char  input[16],
unsigned char  output[16] 
)

Internal AES block decryption function. This is only exposed to allow overriding it using see MBEDTLS_AES_DECRYPT_ALT.

Parameters
ctxThe AES context to use for decryption.
inputThe ciphertext block.
outputThe output (plaintext) block.
Returns
0 on success.

◆ mbedtls_internal_aes_encrypt()

int mbedtls_internal_aes_encrypt ( mbedtls_aes_context ctx,
const unsigned char  input[16],
unsigned char  output[16] 
)

Internal AES block encryption function. This is only exposed to allow overriding it using MBEDTLS_AES_ENCRYPT_ALT.

Parameters
ctxThe AES context to use for encryption.
inputThe plaintext block.
outputThe output (ciphertext) block.
Returns
0 on success.