Replace mbedtls_platform_enforce_volatile_reads

Replace function mbedtls_platform_enforce_volatile_reads() with
mbedtls_platform_random_delay().
This commit is contained in:
Arto Kinnunen 2019-12-30 17:32:58 +02:00
parent dbf2b43ceb
commit e91f0dc905
6 changed files with 12 additions and 28 deletions

View file

@ -259,16 +259,6 @@ uint32_t mbedtls_platform_random_in_range( size_t num );
*/ */
int mbedtls_platform_random_delay( size_t num ); int mbedtls_platform_random_delay( size_t num );
/**
* \brief This function can be inserted between successive reads to a
* volatile local variable to prevent compilers from optimizing
* them away. In addition, this function will spent a small random
* time in a busy loop as a counter-measure to fault injection
* attack.
*
*/
void mbedtls_platform_enforce_volatile_reads( void );
#if defined(MBEDTLS_HAVE_TIME_DATE) #if defined(MBEDTLS_HAVE_TIME_DATE)
/** /**
* \brief Platform-specific implementation of gmtime_r() * \brief Platform-specific implementation of gmtime_r()

View file

@ -597,7 +597,7 @@ static int uecc_eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
if( ret_fi == UECC_SUCCESS ) if( ret_fi == UECC_SUCCESS )
{ {
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if( ret_fi == UECC_SUCCESS ) if( ret_fi == UECC_SUCCESS )
return( 0 ); return( 0 );
else else

View file

@ -198,12 +198,6 @@ int mbedtls_platform_random_delay( size_t max_rand )
#endif /* !MBEDTLS_ENTROPY_HARDWARE_ALT */ #endif /* !MBEDTLS_ENTROPY_HARDWARE_ALT */
} }
void mbedtls_platform_enforce_volatile_reads( void )
{
// Add a small random delay as a counter-measure to fault injection attack.
mbedtls_platform_random_delay( 50 );
}
#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT)
#include <time.h> #include <time.h>
#if !defined(_WIN32) && (defined(unix) || \ #if !defined(_WIN32) && (defined(unix) || \

View file

@ -3043,7 +3043,7 @@ check_signature:
if( ret_fi == 0 ) if( ret_fi == 0 )
{ {
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if( ret_fi == 0 ) if( ret_fi == 0 )
signature_is_good = X509_SIGNATURE_IS_GOOD; signature_is_good = X509_SIGNATURE_IS_GOOD;
} }
@ -3549,7 +3549,7 @@ find_parent:
if( signature_is_good_fi != X509_SIGNATURE_IS_GOOD ) if( signature_is_good_fi != X509_SIGNATURE_IS_GOOD )
*flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED | X509_BADCERT_FI_EXTRA; *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED | X509_BADCERT_FI_EXTRA;
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if( signature_is_good_fi != X509_SIGNATURE_IS_GOOD ) if( signature_is_good_fi != X509_SIGNATURE_IS_GOOD )
*flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED | X509_BADCERT_FI_EXTRA; *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED | X509_BADCERT_FI_EXTRA;
@ -3861,7 +3861,7 @@ exit:
flags_fi = *flags; flags_fi = *flags;
if( flags_fi == 0 ) if( flags_fi == 0 )
{ {
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if( flags_fi == 0 ) if( flags_fi == 0 )
return( 0 ); return( 0 );
} }

View file

@ -168,7 +168,7 @@ static int uECC_check_curve_integrity(void)
} }
/* i should be 32 */ /* i should be 32 */
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 10 );
diff |= (unsigned char) i ^ 32; diff |= (unsigned char) i ^ 32;
return diff; return diff;
@ -296,7 +296,7 @@ uECC_word_t uECC_vli_equal(const uECC_word_t *left, const uECC_word_t *right)
} }
/* i should be -1 now */ /* i should be -1 now */
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 10 );
diff |= i ^ -1; diff |= i ^ -1;
return diff; return diff;
@ -1046,7 +1046,7 @@ int EccPoint_mult_safer(uECC_word_t * result, const uECC_word_t * point,
if (problem != 0) { if (problem != 0) {
return UECC_FAULT_DETECTED; return UECC_FAULT_DETECTED;
} }
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if (problem != 0) { if (problem != 0) {
return UECC_FAULT_DETECTED; return UECC_FAULT_DETECTED;
} }
@ -1058,7 +1058,7 @@ int EccPoint_mult_safer(uECC_word_t * result, const uECC_word_t * point,
/* invalid input, can happen without fault */ /* invalid input, can happen without fault */
return UECC_FAILURE; return UECC_FAILURE;
} }
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if (problem != 0) { if (problem != 0) {
/* failure on second check means fault, though */ /* failure on second check means fault, though */
return UECC_FAULT_DETECTED; return UECC_FAULT_DETECTED;
@ -1088,7 +1088,7 @@ int EccPoint_mult_safer(uECC_word_t * result, const uECC_word_t * point,
r = UECC_FAULT_DETECTED; r = UECC_FAULT_DETECTED;
goto clear_and_out; goto clear_and_out;
} }
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 10 );
if (problem != 0) { if (problem != 0) {
r = UECC_FAULT_DETECTED; r = UECC_FAULT_DETECTED;
goto clear_and_out; goto clear_and_out;
@ -1101,7 +1101,7 @@ int EccPoint_mult_safer(uECC_word_t * result, const uECC_word_t * point,
r = UECC_FAULT_DETECTED; r = UECC_FAULT_DETECTED;
goto clear_and_out; goto clear_and_out;
} }
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 10 );
if (problem != 0) { if (problem != 0) {
r = UECC_FAULT_DETECTED; r = UECC_FAULT_DETECTED;
goto clear_and_out; goto clear_and_out;
@ -1198,7 +1198,7 @@ int uECC_valid_point(const uECC_word_t *point)
/* Make sure that y^2 == x^3 + ax + b */ /* Make sure that y^2 == x^3 + ax + b */
diff = uECC_vli_equal(tmp1, tmp2); diff = uECC_vli_equal(tmp1, tmp2);
if (diff == 0) { if (diff == 0) {
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 10 );
if (diff == 0) { if (diff == 0) {
return 0; return 0;
} }

View file

@ -299,7 +299,7 @@ int uECC_verify(const uint8_t *public_key, const uint8_t *message_hash,
/* Accept only if v == r. */ /* Accept only if v == r. */
diff = uECC_vli_equal(rx, r); diff = uECC_vli_equal(rx, r);
if (diff == 0) { if (diff == 0) {
mbedtls_platform_enforce_volatile_reads(); mbedtls_platform_random_delay( 50 );
if (diff == 0) { if (diff == 0) {
return UECC_SUCCESS; return UECC_SUCCESS;
} }