Add per-function override for AES
This commit is contained in:
parent
70a5010783
commit
31993f271d
4 changed files with 159 additions and 86 deletions
|
@ -4,9 +4,9 @@ mbed TLS ChangeLog (Sorted per branch, date)
|
||||||
|
|
||||||
Features
|
Features
|
||||||
* Support for DTLS 1.0 and 1.2 (RFC 6347).
|
* Support for DTLS 1.0 and 1.2 (RFC 6347).
|
||||||
* Ability to override xxx_process() function from a md/sha module with
|
* Ability to override core functions from MDx, SHAx, AES and DES modules
|
||||||
custom implementation (eg hardware accelerated), complementing the ability
|
with custom implementation (eg hardware accelerated), complementing the
|
||||||
to override the whole module.
|
ability to override the whole module.
|
||||||
|
|
||||||
API Changes
|
API Changes
|
||||||
* All public identifiers moved to the mbedtls_* or MBEDTLS_* namespace.
|
* All public identifiers moved to the mbedtls_* or MBEDTLS_* namespace.
|
||||||
|
|
|
@ -246,6 +246,32 @@ int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
|
||||||
unsigned char *output );
|
unsigned char *output );
|
||||||
#endif /* MBEDTLS_CIPHER_MODE_CTR */
|
#endif /* MBEDTLS_CIPHER_MODE_CTR */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Internal AES block encryption function
|
||||||
|
* (Only exposed to allow overriding it,
|
||||||
|
* see MBEDTLS_AES_ENCRYPT_ALT)
|
||||||
|
*
|
||||||
|
* \param ctx AES context
|
||||||
|
* \param input Plaintext block
|
||||||
|
* \param output Output (ciphertext) block
|
||||||
|
*/
|
||||||
|
void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
|
||||||
|
const unsigned char input[16],
|
||||||
|
unsigned char output[16] );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Internal AES block decryption function
|
||||||
|
* (Only exposed to allow overriding it,
|
||||||
|
* see MBEDTLS_AES_DECRYPT_ALT)
|
||||||
|
*
|
||||||
|
* \param ctx AES context
|
||||||
|
* \param input Ciphertext block
|
||||||
|
* \param output Output (plaintext) block
|
||||||
|
*/
|
||||||
|
void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
|
||||||
|
const unsigned char input[16],
|
||||||
|
unsigned char output[16] );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -241,6 +241,10 @@
|
||||||
* of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible
|
* of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible
|
||||||
* with this definition.
|
* with this definition.
|
||||||
*
|
*
|
||||||
|
* Note: if you use the AES_xxx_ALT macros, then is is recommended to also set
|
||||||
|
* MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES
|
||||||
|
* tables.
|
||||||
|
*
|
||||||
* Uncomment a macro to enable alternate implementation of the corresponding
|
* Uncomment a macro to enable alternate implementation of the corresponding
|
||||||
* function.
|
* function.
|
||||||
*/
|
*/
|
||||||
|
@ -254,6 +258,10 @@
|
||||||
//#define MBEDTLS_DES_SETKEY_ALT
|
//#define MBEDTLS_DES_SETKEY_ALT
|
||||||
//#define MBEDTLS_DES_CRYPT_ECB_ALT
|
//#define MBEDTLS_DES_CRYPT_ECB_ALT
|
||||||
//#define MBEDTLS_DES3_CRYPT_ECB_ALT
|
//#define MBEDTLS_DES3_CRYPT_ECB_ALT
|
||||||
|
//#define MBEDTLS_AES_SETKEY_ENC_ALT
|
||||||
|
//#define MBEDTLS_AES_SETKEY_DEC_ALT
|
||||||
|
//#define MBEDTLS_AES_ENCRYPT_ALT
|
||||||
|
//#define MBEDTLS_AES_DECRYPT_ALT
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def MBEDTLS_AES_ROM_TABLES
|
* \def MBEDTLS_AES_ROM_TABLES
|
||||||
|
|
205
library/aes.c
205
library/aes.c
|
@ -481,6 +481,7 @@ void mbedtls_aes_free( mbedtls_aes_context *ctx )
|
||||||
/*
|
/*
|
||||||
* AES key schedule (encryption)
|
* AES key schedule (encryption)
|
||||||
*/
|
*/
|
||||||
|
#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
|
||||||
int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
|
int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
|
||||||
unsigned int keysize )
|
unsigned int keysize )
|
||||||
{
|
{
|
||||||
|
@ -589,10 +590,12 @@ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AES key schedule (decryption)
|
* AES key schedule (decryption)
|
||||||
*/
|
*/
|
||||||
|
#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
|
||||||
int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
|
int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
|
||||||
unsigned int keysize )
|
unsigned int keysize )
|
||||||
{
|
{
|
||||||
|
@ -656,6 +659,7 @@ exit:
|
||||||
|
|
||||||
return( ret );
|
return( ret );
|
||||||
}
|
}
|
||||||
|
#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
|
||||||
|
|
||||||
#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
|
#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -703,6 +707,120 @@ exit:
|
||||||
RT3[ ( Y0 >> 24 ) & 0xFF ]; \
|
RT3[ ( Y0 >> 24 ) & 0xFF ]; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AES-ECB block encryption
|
||||||
|
*/
|
||||||
|
#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
|
||||||
|
void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
|
||||||
|
const unsigned char input[16],
|
||||||
|
unsigned char output[16] )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
|
||||||
|
|
||||||
|
RK = ctx->rk;
|
||||||
|
|
||||||
|
GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
|
||||||
|
GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
|
||||||
|
GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
|
||||||
|
GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
|
||||||
|
|
||||||
|
for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
|
||||||
|
{
|
||||||
|
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
||||||
|
AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
||||||
|
|
||||||
|
X0 = *RK++ ^ \
|
||||||
|
( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
X1 = *RK++ ^ \
|
||||||
|
( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
X2 = *RK++ ^ \
|
||||||
|
( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
X3 = *RK++ ^ \
|
||||||
|
( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
PUT_UINT32_LE( X0, output, 0 );
|
||||||
|
PUT_UINT32_LE( X1, output, 4 );
|
||||||
|
PUT_UINT32_LE( X2, output, 8 );
|
||||||
|
PUT_UINT32_LE( X3, output, 12 );
|
||||||
|
}
|
||||||
|
#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AES-ECB block decryption
|
||||||
|
*/
|
||||||
|
#if !defined(MBEDTLS_AES_DECRYPT_ALT)
|
||||||
|
void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
|
||||||
|
const unsigned char input[16],
|
||||||
|
unsigned char output[16] )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
|
||||||
|
|
||||||
|
RK = ctx->rk;
|
||||||
|
|
||||||
|
GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
|
||||||
|
GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
|
||||||
|
GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
|
||||||
|
GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
|
||||||
|
|
||||||
|
for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
|
||||||
|
{
|
||||||
|
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
||||||
|
AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
||||||
|
|
||||||
|
X0 = *RK++ ^ \
|
||||||
|
( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
X1 = *RK++ ^ \
|
||||||
|
( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
X2 = *RK++ ^ \
|
||||||
|
( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
X3 = *RK++ ^ \
|
||||||
|
( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
|
||||||
|
( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
|
||||||
|
|
||||||
|
PUT_UINT32_LE( X0, output, 0 );
|
||||||
|
PUT_UINT32_LE( X1, output, 4 );
|
||||||
|
PUT_UINT32_LE( X2, output, 8 );
|
||||||
|
PUT_UINT32_LE( X3, output, 12 );
|
||||||
|
}
|
||||||
|
#endif /* !MBEDTLS_AES_DECRYPT_ALT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AES-ECB block encryption/decryption
|
* AES-ECB block encryption/decryption
|
||||||
*/
|
*/
|
||||||
|
@ -711,9 +829,6 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
|
||||||
const unsigned char input[16],
|
const unsigned char input[16],
|
||||||
unsigned char output[16] )
|
unsigned char output[16] )
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
|
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
|
||||||
if( mbedtls_aesni_supports( MBEDTLS_AESNI_AES ) )
|
if( mbedtls_aesni_supports( MBEDTLS_AESNI_AES ) )
|
||||||
return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
|
return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
|
||||||
|
@ -731,86 +846,10 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RK = ctx->rk;
|
if( mode == MBEDTLS_AES_ENCRYPT )
|
||||||
|
mbedtls_aes_encrypt( ctx, input, output );
|
||||||
GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
|
else
|
||||||
GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
|
mbedtls_aes_decrypt( ctx, input, output );
|
||||||
GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
|
|
||||||
GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
|
|
||||||
|
|
||||||
if( mode == MBEDTLS_AES_DECRYPT )
|
|
||||||
{
|
|
||||||
for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
|
|
||||||
{
|
|
||||||
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
|
||||||
AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
|
|
||||||
}
|
|
||||||
|
|
||||||
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
|
||||||
|
|
||||||
X0 = *RK++ ^ \
|
|
||||||
( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
|
|
||||||
X1 = *RK++ ^ \
|
|
||||||
( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
|
|
||||||
X2 = *RK++ ^ \
|
|
||||||
( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
|
|
||||||
X3 = *RK++ ^ \
|
|
||||||
( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
}
|
|
||||||
else /* MBEDTLS_AES_ENCRYPT */
|
|
||||||
{
|
|
||||||
for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
|
|
||||||
{
|
|
||||||
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
|
||||||
AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
|
|
||||||
}
|
|
||||||
|
|
||||||
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
|
|
||||||
|
|
||||||
X0 = *RK++ ^ \
|
|
||||||
( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
|
|
||||||
X1 = *RK++ ^ \
|
|
||||||
( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
|
|
||||||
X2 = *RK++ ^ \
|
|
||||||
( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
|
|
||||||
X3 = *RK++ ^ \
|
|
||||||
( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
|
|
||||||
( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
|
|
||||||
}
|
|
||||||
|
|
||||||
PUT_UINT32_LE( X0, output, 0 );
|
|
||||||
PUT_UINT32_LE( X1, output, 4 );
|
|
||||||
PUT_UINT32_LE( X2, output, 8 );
|
|
||||||
PUT_UINT32_LE( X3, output, 12 );
|
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue