Move size checks outside of mbedtls_platform_random_in_range
Update the documentation to mention that calling it with zero
as an argument will result in an undefined behavior.
Signed-off-by: Andrzej Kurek <andrzej.kurek@arm.com>
diff --git a/library/platform_util.c b/library/platform_util.c
index 15309aa..19ba7b9 100644
--- a/library/platform_util.c
+++ b/library/platform_util.c
@@ -119,43 +119,45 @@
void *mbedtls_platform_memset( void *ptr, int value, size_t num )
{
- size_t i, start_offset;
+ size_t i, start_offset = 0;
volatile size_t flow_counter = 0;
volatile char *b = ptr;
char rnd_data;
-
- start_offset = (size_t) mbedtls_platform_random_in_range( (uint32_t) num );
- rnd_data = (char) mbedtls_platform_random_in_range( 256 );
-
- /* Perform a memset operations with random data and start from a random
- * location */
- for( i = start_offset; i < num; ++i )
+ if( num > 0 )
{
- b[i] = rnd_data;
- flow_counter++;
- }
+ start_offset = (size_t) mbedtls_platform_random_in_range( (uint32_t) num );
- /* Start from a random location with target data */
- for( i = start_offset; i < num; ++i )
- {
- b[i] = value;
- flow_counter++;
- }
+ rnd_data = (char) mbedtls_platform_random_in_range( 256 );
- /* Second memset operation with random data */
- for( i = 0; i < start_offset; ++i )
- {
- b[i] = rnd_data;
- flow_counter++;
- }
+ /* Perform a memset operations with random data and start from a random
+ * location */
+ for( i = start_offset; i < num; ++i )
+ {
+ b[i] = rnd_data;
+ flow_counter++;
+ }
- /* Finish memset operation with correct data */
- for( i = 0; i < start_offset; ++i )
- {
- b[i] = value;
- flow_counter++;
- }
+ /* Start from a random location with target data */
+ for( i = start_offset; i < num; ++i )
+ {
+ b[i] = value;
+ flow_counter++;
+ }
+ /* Second memset operation with random data */
+ for( i = 0; i < start_offset; ++i )
+ {
+ b[i] = rnd_data;
+ flow_counter++;
+ }
+
+ /* Finish memset operation with correct data */
+ for( i = 0; i < start_offset; ++i )
+ {
+ b[i] = value;
+ flow_counter++;
+ }
+ }
/* check the correct number of iterations */
if( flow_counter == 2 * num )
{
@@ -165,6 +167,7 @@
return ptr;
}
}
+
return NULL;
}
@@ -245,22 +248,25 @@
/* Start from a random location and check the correct number of iterations */
size_t i, flow_counter = 0;
- size_t start_offset = (size_t) mbedtls_platform_random_in_range( (uint32_t) num );
-
- for( i = start_offset; i < num; i++ )
+ size_t start_offset = 0;
+ if( num > 0 )
{
- unsigned char x = A[i], y = B[i];
- flow_counter++;
- diff |= x ^ y;
- }
+ start_offset = (size_t) mbedtls_platform_random_in_range( (uint32_t) num );
- for( i = 0; i < start_offset; i++ )
- {
- unsigned char x = A[i], y = B[i];
- flow_counter++;
- diff |= x ^ y;
- }
+ for( i = start_offset; i < num; i++ )
+ {
+ unsigned char x = A[i], y = B[i];
+ flow_counter++;
+ diff |= x ^ y;
+ }
+ for( i = 0; i < start_offset; i++ )
+ {
+ unsigned char x = A[i], y = B[i];
+ flow_counter++;
+ diff |= x ^ y;
+ }
+ }
/* Return 0 only when diff is 0 and flow_counter is equal to num */
return( (int) diff | (int) ( flow_counter ^ num ) );
}
@@ -340,18 +346,7 @@
uint32_t mbedtls_platform_random_in_range( uint32_t num )
{
- uint32_t result;
-
- if( num <= 1 )
- {
- result = 0;
- }
- else
- {
- result = mbedtls_platform_random_uint32() % num;
- }
-
- return( result );
+ return mbedtls_platform_random_uint32() % num;
}
void mbedtls_platform_random_delay( void )