From 0736325d80954911fe7dac3224468bc87d40803a Mon Sep 17 00:00:00 2001 From: Jarno Lamsa Date: Fri, 27 Sep 2019 16:20:11 +0300 Subject: [PATCH] Add FI/SCA compliant versions of mem-functions Add FI/SCA compliant memset, memcmp and memcpy-functions to platform_util. Also add a stub implementation of a global RNG-function. --- include/mbedtls/platform_util.h | 8 ++++ library/platform_util.c | 65 +++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/include/mbedtls/platform_util.h b/include/mbedtls/platform_util.h index 7033af837..b3d0c915d 100644 --- a/include/mbedtls/platform_util.h +++ b/include/mbedtls/platform_util.h @@ -164,6 +164,14 @@ MBEDTLS_DEPRECATED typedef int mbedtls_deprecated_numeric_constant_t; */ void mbedtls_platform_zeroize( void *buf, size_t len ); +void mbedtls_platform_memset( void *ptr, int value, size_t num ); + +void mbedtls_platform_memcpy( void *dst, const void *src, size_t num ); + +int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num ); + +size_t mbedtls_random_in_range( size_t num ); + #if defined(MBEDTLS_HAVE_TIME_DATE) /** * \brief Platform-specific implementation of gmtime_r() diff --git a/library/platform_util.c b/library/platform_util.c index 6f6d8b67e..73759cdb1 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -79,6 +79,71 @@ void mbedtls_platform_zeroize( void *buf, size_t len ) } #endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */ +void mbedtls_platform_memset( void *ptr, int value, size_t num ) +{ + /* Randomize start offset. */ + size_t startOffset = mbedtls_random_in_range( num ); + /* Randomize data */ + size_t data = mbedtls_random_in_range( 0xff ); + + /* Perform a pair of memset operations from random locations with + * random data */ + memset( ( void * ) ( ptr + startOffset ), value, ( num - startOffset ) ); + memset( ( void * ) ptr, data, startOffset ); + + /* Perform the original memset */ + memset( ptr, value, num ); +} + +void mbedtls_platform_memcpy( void *dst, const void *src, size_t num ) +{ + /* Randomize start offset. */ + size_t startOffset = mbedtls_random_in_range( num ); + /* Randomize initial data to prevent leakage while copying */ + size_t data = mbedtls_random_in_range( 0xff ); + + memset( ( void * ) dst, data, num ); + memcpy( ( void * ) ( ( unsigned char * ) dst + startOffset ), + ( void * ) ( ( unsigned char * ) src + startOffset ), + ( num - startOffset ) ); + memcpy( ( void * ) dst, ( void * ) src, startOffset ); +} + +int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num ) +{ + volatile unsigned int equal = 0; + + size_t i = num; + + size_t startOffset = mbedtls_random_in_range( num ); + + for( i = startOffset; i < num; i++ ) + { + equal += ( ( ( unsigned char * ) buf1 )[i] == + ( ( unsigned char * ) buf2 )[i] ); + } + + for( i = 0; i < startOffset; i++ ) + { + equal += ( ( ( unsigned char * ) buf1 )[i] == + ( ( unsigned char * ) buf2 )[i] ); + } + + if ( equal == num ) + { + return 0; + } + + return 1; +} + +//TODO: This is a stub implementation of the global RNG function. +size_t mbedtls_random_in_range( size_t num ) +{ + (void) num; + return 0; +} + #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) #include #if !defined(_WIN32) && (defined(unix) || \