diff --git a/include/mbedtls/platform_util.h b/include/mbedtls/platform_util.h index 4e0f9897a..7d16074e2 100644 --- a/include/mbedtls/platform_util.h +++ b/include/mbedtls/platform_util.h @@ -231,6 +231,18 @@ int mbedtls_platform_memmove( void *dst, const void *src, size_t num ); */ int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num ); +/** + * \brief RNG-function for getting a random 32-bit integer. + * + * + * \note Currently the function is dependent of hardware providing an + * rng with MBEDTLS_ENTROPY_HARDWARE_ALT. By default, 0 is + * returned. + * + * \return The generated random number. + */ +uint32_t mbedtls_platform_random_uint32( void ); + /** * \brief RNG-function for getting a random in given range. * diff --git a/library/aes.c b/library/aes.c index f6c4fc33e..e9e754449 100644 --- a/library/aes.c +++ b/library/aes.c @@ -552,7 +552,7 @@ static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len ) int i = 0, j, is_even_pos, dummy_rounds, num; mbedtls_platform_memset( tbl, 0, tbl_len ); - // get random from 0x0fff (each f will be used separately) + // get random from 0x0fff num = mbedtls_platform_random_in_range( 0x1000 ); // Randomize execution order of initial round key addition @@ -570,7 +570,7 @@ static int aes_sca_cm_data_randomize( uint8_t *tbl, uint8_t tbl_len ) tbl_len = tbl_len - (AES_SCA_CM_ROUNDS - dummy_rounds); // randomize positions for the dummy rounds - num = ( num & 0x000f ) % ( dummy_rounds + 1 ); + num = ( num & 0x0fff ) % ( dummy_rounds + 1 ); // add dummy rounds after initial round key addition (if needed) for ( ; i < num + 2; i++ ) @@ -725,7 +725,9 @@ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) ); #endif - mbedtls_platform_memset( RK, 0, ( keybits >> 5 ) * 4 ); + /* Three least significant bits are truncated from keybits, which is + * expected to be a multiple of 8. */ + mbedtls_platform_memset( RK, 0, keybits >> 3 ); offset = mbedtls_platform_random_in_range( keybits >> 5 ); for( j = offset; j < ( keybits >> 5 ); j++ ) @@ -1089,7 +1091,7 @@ int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx, do { GET_UINT32_LE( aes_data_real.xy_values[i], input, ( i * 4 ) ); - aes_data_fake.xy_values[i] = mbedtls_platform_random_in_range( 0xffffffff ); + aes_data_fake.xy_values[i] = mbedtls_platform_random_uint32(); flow_control++; } while( ( i = ( i + 1 ) % 4 ) != offset ); diff --git a/library/platform_util.c b/library/platform_util.c index de2fa2bd0..fc6eb5abb 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -172,6 +172,20 @@ int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num ) return( (int) diff | (int) ( flow_counter ^ num ) ); } +uint32_t mbedtls_platform_random_uint32( ) +{ +#if !defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + return 0; +#else + uint32_t result = 0; + size_t olen = 0; + + mbedtls_hardware_poll( NULL, (unsigned char *) &result, sizeof( result ), + &olen ); + return( result ); +#endif +} + uint32_t mbedtls_platform_random_in_range( size_t num ) { #if !defined(MBEDTLS_ENTROPY_HARDWARE_ALT)