Introduce generic validation macros

Avoid duplicating source code for each module.
This commit is contained in:
Manuel Pégourié-Gonnard 2018-12-10 16:37:51 +01:00
parent a967626753
commit 0e9cddbf1a
3 changed files with 38 additions and 21 deletions

View file

@ -67,22 +67,6 @@
/* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */ /* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */
#define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025 /**< AES hardware accelerator failed. */ #define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025 /**< AES hardware accelerator failed. */
#if defined( MBEDTLS_CHECK_PARAMS )
#define MBEDTLS_AES_VALIDATE_RET( cond ) do{ if( !(cond) ) { \
MBEDTLS_PARAM_FAILED( #cond ); \
return MBEDTLS_ERR_AES_BAD_INPUT_DATA;} \
} while(0);
#define MBEDTLS_AES_VALIDATE( cond ) do{ if( !(cond) ) { \
MBEDTLS_PARAM_FAILED( #cond ); \
return; } \
} while(0);
#else
/* No validation of parameters will be performed */
#define MBEDTLS_AES_VALIDATE_RET( cond )
#define MBEDTLS_AES_VALIDATE( cond)
#endif
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
!defined(inline) && !defined(__cplusplus) !defined(inline) && !defined(__cplusplus)
#define inline __inline #define inline __inline

View file

@ -81,6 +81,33 @@ void mbedtls_param_failed( const char *failure_condition,
const char *file, const char *file,
int line ); int line );
#endif /* MBEDTLS_PARAM_FAILED */ #endif /* MBEDTLS_PARAM_FAILED */
/* Internal macro meant to be called only from within the library. */
#define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) \
do { \
if( !(cond) ) \
{ \
MBEDTLS_PARAM_FAILED( #cond ); \
return( ret ); \
} \
} while( 0 )
/* Internal macro meant to be called only from within the library. */
#define MBEDTLS_INTERNAL_VALIDATE( cond ) \
do { \
if( !(cond) ) \
{ \
MBEDTLS_PARAM_FAILED( #cond ); \
return; \
} \
} while( 0 )
#else /* MBEDTLS_CHECK_PARAMS */
/* Internal macros meant to be called only from within the library. */
#define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) do { } while( 0 )
#define MBEDTLS_INTERNAL_VALIDATE( cond ) do { } while( 0 )
#endif /* MBEDTLS_CHECK_PARAMS */ #endif /* MBEDTLS_CHECK_PARAMS */
/** /**

View file

@ -56,6 +56,12 @@
#if !defined(MBEDTLS_AES_ALT) #if !defined(MBEDTLS_AES_ALT)
/* Parameter validation macros based on platform_util.h */
#define AES_VALIDATE_RET( cond ) \
MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA)
#define AES_VALIDATE( cond ) \
MBEDTLS_INTERNAL_VALIDATE( cond )
/* /*
* 32-bit integer manipulation macros (little endian) * 32-bit integer manipulation macros (little endian)
*/ */
@ -511,7 +517,7 @@ static void aes_gen_tables( void )
void mbedtls_aes_init( mbedtls_aes_context *ctx ) void mbedtls_aes_init( mbedtls_aes_context *ctx )
{ {
MBEDTLS_AES_VALIDATE( ctx != NULL ); AES_VALIDATE( ctx != NULL );
memset( ctx, 0, sizeof( mbedtls_aes_context ) ); memset( ctx, 0, sizeof( mbedtls_aes_context ) );
} }
@ -527,7 +533,7 @@ void mbedtls_aes_free( mbedtls_aes_context *ctx )
#if defined(MBEDTLS_CIPHER_MODE_XTS) #if defined(MBEDTLS_CIPHER_MODE_XTS)
void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx ) void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
{ {
MBEDTLS_AES_VALIDATE( ctx != NULL ); AES_VALIDATE( ctx != NULL );
mbedtls_aes_init( &ctx->crypt ); mbedtls_aes_init( &ctx->crypt );
mbedtls_aes_init( &ctx->tweak ); mbedtls_aes_init( &ctx->tweak );
@ -535,7 +541,7 @@ void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx )
void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx ) void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx )
{ {
MBEDTLS_AES_VALIDATE( ctx != NULL ); AES_VALIDATE( ctx != NULL );
mbedtls_aes_free( &ctx->crypt ); mbedtls_aes_free( &ctx->crypt );
mbedtls_aes_free( &ctx->tweak ); mbedtls_aes_free( &ctx->tweak );
@ -552,7 +558,7 @@ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
unsigned int i; unsigned int i;
uint32_t *RK; uint32_t *RK;
MBEDTLS_AES_VALIDATE_RET( ctx != NULL && key != NULL ); AES_VALIDATE_RET( ctx != NULL && key != NULL );
switch( keybits ) switch( keybits )
{ {
@ -670,7 +676,7 @@ int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
uint32_t *RK; uint32_t *RK;
uint32_t *SK; uint32_t *SK;
MBEDTLS_AES_VALIDATE_RET( ctx != NULL && key != NULL ); AES_VALIDATE_RET( ctx != NULL && key != NULL );
mbedtls_aes_init( &cty ); mbedtls_aes_init( &cty );