diff --git a/include/mbedtls/platform_util.h b/include/mbedtls/platform_util.h index e20f1c32e..d6ee886de 100644 --- a/include/mbedtls/platform_util.h +++ b/include/mbedtls/platform_util.h @@ -238,6 +238,21 @@ int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num ); */ uint32_t mbedtls_platform_random_in_range( size_t num ); +/** + * \brief Random delay function. + * + * Function implements random delay by incrementing local variable + * randomized number of times. + * + * \note Currently the function is dependent of hardware providing an + * rng with MBEDTLS_ENTROPY_HARDWARE_ALT. + * + * \param num Max-value for the local variable increments. + * + * \return In success number of increments, -1 in case of errors. + */ +int mbedtls_platform_random_delay( size_t num ); + /** * \brief This function does nothing, but can be inserted between * successive reads to a volatile local variable to prevent diff --git a/library/platform_util.c b/library/platform_util.c index 16867aad6..5a6fc206e 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -165,6 +165,29 @@ uint32_t mbedtls_platform_random_in_range( size_t num ) #endif } +int mbedtls_platform_random_delay( size_t max_rand ) +{ +#if !defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + (void) max_rand; + return -1; +#else + size_t random_number; + volatile size_t i = 0; + if( max_rand == 0 || max_rand > INT_MAX ) + { + return -1; + } + + random_number = mbedtls_platform_random_in_range( max_rand ); + + do { + i++; + } while ( i < random_number ); + + return (int) i; +#endif /* !MBEDTLS_ENTROPY_HARDWARE_ALT */ +} + /* Some compilers (armcc 5 for example) optimize away successive reads from a * volatile local variable (which we use as a counter-measure to fault * injection attacks), unless there is a call to an external function between