mbed TLS Build

Dependents:   Slave-prot-prod

Committer:
williequesada
Date:
Tue Jun 04 16:03:38 2019 +0000
Revision:
1:1a219dea6cb5
Parent:
0:cdf462088d13
compartir a Pablo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 0:cdf462088d13 1 /* BEGIN_HEADER */
markrad 0:cdf462088d13 2 #include "mbedtls/entropy.h"
markrad 0:cdf462088d13 3 #include "mbedtls/entropy_poll.h"
markrad 0:cdf462088d13 4
markrad 0:cdf462088d13 5 /*
markrad 0:cdf462088d13 6 * Number of calls made to entropy_dummy_source()
markrad 0:cdf462088d13 7 */
markrad 0:cdf462088d13 8 static size_t entropy_dummy_calls;
markrad 0:cdf462088d13 9
markrad 0:cdf462088d13 10 /*
markrad 0:cdf462088d13 11 * Dummy entropy source
markrad 0:cdf462088d13 12 *
markrad 0:cdf462088d13 13 * If data is NULL, write exactly the requested length.
markrad 0:cdf462088d13 14 * Otherwise, write the length indicated by data or error if negative
markrad 0:cdf462088d13 15 */
markrad 0:cdf462088d13 16 static int entropy_dummy_source( void *data, unsigned char *output,
markrad 0:cdf462088d13 17 size_t len, size_t *olen )
markrad 0:cdf462088d13 18 {
markrad 0:cdf462088d13 19 entropy_dummy_calls++;
markrad 0:cdf462088d13 20
markrad 0:cdf462088d13 21 if( data == NULL )
markrad 0:cdf462088d13 22 *olen = len;
markrad 0:cdf462088d13 23 else
markrad 0:cdf462088d13 24 {
markrad 0:cdf462088d13 25 int *d = (int *) data;
markrad 0:cdf462088d13 26
markrad 0:cdf462088d13 27 if( *d < 0 )
markrad 0:cdf462088d13 28 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
markrad 0:cdf462088d13 29 else
markrad 0:cdf462088d13 30 *olen = *d;
markrad 0:cdf462088d13 31 }
markrad 0:cdf462088d13 32
markrad 0:cdf462088d13 33 memset( output, 0x2a, *olen );
markrad 0:cdf462088d13 34
markrad 0:cdf462088d13 35 return( 0 );
markrad 0:cdf462088d13 36 }
markrad 0:cdf462088d13 37
markrad 0:cdf462088d13 38 #if defined(MBEDTLS_ENTROPY_NV_SEED)
markrad 0:cdf462088d13 39 /*
markrad 0:cdf462088d13 40 * Ability to clear entropy sources to allow testing with just predefined
markrad 0:cdf462088d13 41 * entropy sources. This function or tests depending on it might break if there
markrad 0:cdf462088d13 42 * are internal changes to how entropy sources are registered.
markrad 0:cdf462088d13 43 *
markrad 0:cdf462088d13 44 * To be called immediately after mbedtls_entropy_init().
markrad 0:cdf462088d13 45 *
markrad 0:cdf462088d13 46 * Just resetting the counter. New sources will overwrite existing ones.
markrad 0:cdf462088d13 47 * This might break memory checks in the future if sources need 'free-ing' then
markrad 0:cdf462088d13 48 * as well.
markrad 0:cdf462088d13 49 */
markrad 0:cdf462088d13 50 static void entropy_clear_sources( mbedtls_entropy_context *ctx )
markrad 0:cdf462088d13 51 {
markrad 0:cdf462088d13 52 ctx->source_count = 0;
markrad 0:cdf462088d13 53 }
markrad 0:cdf462088d13 54
markrad 0:cdf462088d13 55 /*
markrad 0:cdf462088d13 56 * NV seed read/write functions that use a buffer instead of a file
markrad 0:cdf462088d13 57 */
markrad 0:cdf462088d13 58 static unsigned char buffer_seed[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 59
markrad 0:cdf462088d13 60 static int buffer_nv_seed_read( unsigned char *buf, size_t buf_len )
markrad 0:cdf462088d13 61 {
markrad 0:cdf462088d13 62 if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
markrad 0:cdf462088d13 63 return( -1 );
markrad 0:cdf462088d13 64
markrad 0:cdf462088d13 65 memcpy( buf, buffer_seed, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 66 return( 0 );
markrad 0:cdf462088d13 67 }
markrad 0:cdf462088d13 68
markrad 0:cdf462088d13 69 static int buffer_nv_seed_write( unsigned char *buf, size_t buf_len )
markrad 0:cdf462088d13 70 {
markrad 0:cdf462088d13 71 if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
markrad 0:cdf462088d13 72 return( -1 );
markrad 0:cdf462088d13 73
markrad 0:cdf462088d13 74 memcpy( buffer_seed, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 75 return( 0 );
markrad 0:cdf462088d13 76 }
markrad 0:cdf462088d13 77
markrad 0:cdf462088d13 78 /*
markrad 0:cdf462088d13 79 * NV seed read/write helpers that fill the base seedfile
markrad 0:cdf462088d13 80 */
markrad 0:cdf462088d13 81 static int write_nv_seed( unsigned char *buf, size_t buf_len )
markrad 0:cdf462088d13 82 {
markrad 0:cdf462088d13 83 FILE *f;
markrad 0:cdf462088d13 84
markrad 0:cdf462088d13 85 if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
markrad 0:cdf462088d13 86 return( -1 );
markrad 0:cdf462088d13 87
markrad 0:cdf462088d13 88 if( ( f = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w" ) ) == NULL )
markrad 0:cdf462088d13 89 return( -1 );
markrad 0:cdf462088d13 90
markrad 0:cdf462088d13 91 if( fwrite( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) !=
markrad 0:cdf462088d13 92 MBEDTLS_ENTROPY_BLOCK_SIZE )
markrad 0:cdf462088d13 93 return( -1 );
markrad 0:cdf462088d13 94
markrad 0:cdf462088d13 95 fclose( f );
markrad 0:cdf462088d13 96
markrad 0:cdf462088d13 97 return( 0 );
markrad 0:cdf462088d13 98 }
markrad 0:cdf462088d13 99
markrad 0:cdf462088d13 100 static int read_nv_seed( unsigned char *buf, size_t buf_len )
markrad 0:cdf462088d13 101 {
markrad 0:cdf462088d13 102 FILE *f;
markrad 0:cdf462088d13 103
markrad 0:cdf462088d13 104 if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
markrad 0:cdf462088d13 105 return( -1 );
markrad 0:cdf462088d13 106
markrad 0:cdf462088d13 107 if( ( f = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb" ) ) == NULL )
markrad 0:cdf462088d13 108 return( -1 );
markrad 0:cdf462088d13 109
markrad 0:cdf462088d13 110 if( fread( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) !=
markrad 0:cdf462088d13 111 MBEDTLS_ENTROPY_BLOCK_SIZE )
markrad 0:cdf462088d13 112 return( -1 );
markrad 0:cdf462088d13 113
markrad 0:cdf462088d13 114 fclose( f );
markrad 0:cdf462088d13 115
markrad 0:cdf462088d13 116 return( 0 );
markrad 0:cdf462088d13 117 }
markrad 0:cdf462088d13 118 #endif /* MBEDTLS_ENTROPY_NV_SEED */
markrad 0:cdf462088d13 119 /* END_HEADER */
markrad 0:cdf462088d13 120
markrad 0:cdf462088d13 121 /* BEGIN_DEPENDENCIES
markrad 0:cdf462088d13 122 * depends_on:MBEDTLS_ENTROPY_C
markrad 0:cdf462088d13 123 * END_DEPENDENCIES
markrad 0:cdf462088d13 124 */
markrad 0:cdf462088d13 125
markrad 0:cdf462088d13 126 /* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */
markrad 0:cdf462088d13 127 void entropy_seed_file( char *path, int ret )
markrad 0:cdf462088d13 128 {
markrad 0:cdf462088d13 129 mbedtls_entropy_context ctx;
markrad 0:cdf462088d13 130
markrad 0:cdf462088d13 131 mbedtls_entropy_init( &ctx );
markrad 0:cdf462088d13 132
markrad 0:cdf462088d13 133 TEST_ASSERT( mbedtls_entropy_write_seed_file( &ctx, path ) == ret );
markrad 0:cdf462088d13 134 TEST_ASSERT( mbedtls_entropy_update_seed_file( &ctx, path ) == ret );
markrad 0:cdf462088d13 135
markrad 0:cdf462088d13 136 exit:
markrad 0:cdf462088d13 137 mbedtls_entropy_free( &ctx );
markrad 0:cdf462088d13 138 }
markrad 0:cdf462088d13 139 /* END_CASE */
markrad 0:cdf462088d13 140
markrad 0:cdf462088d13 141 /* BEGIN_CASE */
markrad 0:cdf462088d13 142 void entropy_too_many_sources( )
markrad 0:cdf462088d13 143 {
markrad 0:cdf462088d13 144 mbedtls_entropy_context ctx;
markrad 0:cdf462088d13 145 size_t i;
markrad 0:cdf462088d13 146
markrad 0:cdf462088d13 147 mbedtls_entropy_init( &ctx );
markrad 0:cdf462088d13 148
markrad 0:cdf462088d13 149 /*
markrad 0:cdf462088d13 150 * It's hard to tell precisely when the error will occur,
markrad 0:cdf462088d13 151 * since we don't know how many sources were automatically added.
markrad 0:cdf462088d13 152 */
markrad 0:cdf462088d13 153 for( i = 0; i < MBEDTLS_ENTROPY_MAX_SOURCES; i++ )
markrad 0:cdf462088d13 154 (void) mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL,
markrad 0:cdf462088d13 155 16, MBEDTLS_ENTROPY_SOURCE_WEAK );
markrad 0:cdf462088d13 156
markrad 0:cdf462088d13 157 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL,
markrad 0:cdf462088d13 158 16, MBEDTLS_ENTROPY_SOURCE_WEAK )
markrad 0:cdf462088d13 159 == MBEDTLS_ERR_ENTROPY_MAX_SOURCES );
markrad 0:cdf462088d13 160
markrad 0:cdf462088d13 161 exit:
markrad 0:cdf462088d13 162 mbedtls_entropy_free( &ctx );
markrad 0:cdf462088d13 163 }
markrad 0:cdf462088d13 164 /* END_CASE */
markrad 0:cdf462088d13 165
markrad 0:cdf462088d13 166 /* BEGIN_CASE */
markrad 0:cdf462088d13 167 void entropy_func_len( int len, int ret )
markrad 0:cdf462088d13 168 {
markrad 0:cdf462088d13 169 mbedtls_entropy_context ctx;
markrad 0:cdf462088d13 170 unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE + 10] = { 0 };
markrad 0:cdf462088d13 171 unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE + 10] = { 0 };
markrad 0:cdf462088d13 172 size_t i, j;
markrad 0:cdf462088d13 173
markrad 0:cdf462088d13 174 mbedtls_entropy_init( &ctx );
markrad 0:cdf462088d13 175
markrad 0:cdf462088d13 176 /*
markrad 0:cdf462088d13 177 * See comments in mbedtls_entropy_self_test()
markrad 0:cdf462088d13 178 */
markrad 0:cdf462088d13 179 for( i = 0; i < 8; i++ )
markrad 0:cdf462088d13 180 {
markrad 0:cdf462088d13 181 TEST_ASSERT( mbedtls_entropy_func( &ctx, buf, len ) == ret );
markrad 0:cdf462088d13 182 for( j = 0; j < sizeof( buf ); j++ )
markrad 0:cdf462088d13 183 acc[j] |= buf[j];
markrad 0:cdf462088d13 184 }
markrad 0:cdf462088d13 185
markrad 0:cdf462088d13 186 if( ret == 0 )
markrad 0:cdf462088d13 187 for( j = 0; j < (size_t) len; j++ )
markrad 0:cdf462088d13 188 TEST_ASSERT( acc[j] != 0 );
markrad 0:cdf462088d13 189
markrad 0:cdf462088d13 190 for( j = len; j < sizeof( buf ); j++ )
markrad 0:cdf462088d13 191 TEST_ASSERT( acc[j] == 0 );
markrad 0:cdf462088d13 192 }
markrad 0:cdf462088d13 193 /* END_CASE */
markrad 0:cdf462088d13 194
markrad 0:cdf462088d13 195 /* BEGIN_CASE */
markrad 0:cdf462088d13 196 void entropy_source_fail( char *path )
markrad 0:cdf462088d13 197 {
markrad 0:cdf462088d13 198 mbedtls_entropy_context ctx;
markrad 0:cdf462088d13 199 int fail = -1;
markrad 0:cdf462088d13 200 unsigned char buf[16];
markrad 0:cdf462088d13 201
markrad 0:cdf462088d13 202 mbedtls_entropy_init( &ctx );
markrad 0:cdf462088d13 203
markrad 0:cdf462088d13 204 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source,
markrad 0:cdf462088d13 205 &fail, 16,
markrad 0:cdf462088d13 206 MBEDTLS_ENTROPY_SOURCE_WEAK )
markrad 0:cdf462088d13 207 == 0 );
markrad 0:cdf462088d13 208
markrad 0:cdf462088d13 209 TEST_ASSERT( mbedtls_entropy_func( &ctx, buf, sizeof( buf ) )
markrad 0:cdf462088d13 210 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
markrad 0:cdf462088d13 211 TEST_ASSERT( mbedtls_entropy_gather( &ctx )
markrad 0:cdf462088d13 212 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
markrad 0:cdf462088d13 213 #if defined(MBEDTLS_FS_IO) && defined(MBEDTLS_ENTROPY_NV_SEED)
markrad 0:cdf462088d13 214 TEST_ASSERT( mbedtls_entropy_write_seed_file( &ctx, path )
markrad 0:cdf462088d13 215 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
markrad 0:cdf462088d13 216 TEST_ASSERT( mbedtls_entropy_update_seed_file( &ctx, path )
markrad 0:cdf462088d13 217 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
markrad 0:cdf462088d13 218 #else
markrad 0:cdf462088d13 219 ((void) path);
markrad 0:cdf462088d13 220 #endif
markrad 0:cdf462088d13 221
markrad 0:cdf462088d13 222 exit:
markrad 0:cdf462088d13 223 mbedtls_entropy_free( &ctx );
markrad 0:cdf462088d13 224 }
markrad 0:cdf462088d13 225 /* END_CASE */
markrad 0:cdf462088d13 226
markrad 0:cdf462088d13 227 /* BEGIN_CASE */
markrad 0:cdf462088d13 228 void entropy_threshold( int threshold, int chunk_size, int result )
markrad 0:cdf462088d13 229 {
markrad 0:cdf462088d13 230 mbedtls_entropy_context ctx;
markrad 0:cdf462088d13 231 unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };
markrad 0:cdf462088d13 232 int ret;
markrad 0:cdf462088d13 233
markrad 0:cdf462088d13 234 mbedtls_entropy_init( &ctx );
markrad 0:cdf462088d13 235
markrad 0:cdf462088d13 236 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source,
markrad 0:cdf462088d13 237 &chunk_size, threshold,
markrad 0:cdf462088d13 238 MBEDTLS_ENTROPY_SOURCE_WEAK ) == 0 );
markrad 0:cdf462088d13 239
markrad 0:cdf462088d13 240 entropy_dummy_calls = 0;
markrad 0:cdf462088d13 241 ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) );
markrad 0:cdf462088d13 242
markrad 0:cdf462088d13 243 if( result >= 0 )
markrad 0:cdf462088d13 244 {
markrad 0:cdf462088d13 245 TEST_ASSERT( ret == 0 );
markrad 0:cdf462088d13 246 #if defined(MBEDTLS_ENTROPY_NV_SEED)
markrad 0:cdf462088d13 247 // Two times as much calls due to the NV seed update
markrad 0:cdf462088d13 248 result *= 2;
markrad 0:cdf462088d13 249 #endif
markrad 0:cdf462088d13 250 TEST_ASSERT( entropy_dummy_calls == (size_t) result );
markrad 0:cdf462088d13 251 }
markrad 0:cdf462088d13 252 else
markrad 0:cdf462088d13 253 {
markrad 0:cdf462088d13 254 TEST_ASSERT( ret == result );
markrad 0:cdf462088d13 255 }
markrad 0:cdf462088d13 256
markrad 0:cdf462088d13 257 exit:
markrad 0:cdf462088d13 258 mbedtls_entropy_free( &ctx );
markrad 0:cdf462088d13 259 }
markrad 0:cdf462088d13 260 /* END_CASE */
markrad 0:cdf462088d13 261
markrad 0:cdf462088d13 262 /* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO */
markrad 0:cdf462088d13 263 void nv_seed_file_create()
markrad 0:cdf462088d13 264 {
markrad 0:cdf462088d13 265 unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 266
markrad 0:cdf462088d13 267 memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 268
markrad 0:cdf462088d13 269 TEST_ASSERT( write_nv_seed( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 270 }
markrad 0:cdf462088d13 271 /* END_CASE */
markrad 0:cdf462088d13 272
markrad 0:cdf462088d13 273 /* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_FS_IO:MBEDTLS_PLATFORM_NV_SEED_ALT */
markrad 0:cdf462088d13 274 void entropy_nv_seed_std_io()
markrad 0:cdf462088d13 275 {
markrad 0:cdf462088d13 276 unsigned char io_seed[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 277 unsigned char check_seed[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 278
markrad 0:cdf462088d13 279 memset( io_seed, 1, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 280 memset( check_seed, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 281
markrad 0:cdf462088d13 282 mbedtls_platform_set_nv_seed( mbedtls_platform_std_nv_seed_read,
markrad 0:cdf462088d13 283 mbedtls_platform_std_nv_seed_write );
markrad 0:cdf462088d13 284
markrad 0:cdf462088d13 285 /* Check if platform NV read and write manipulate the same data */
markrad 0:cdf462088d13 286 TEST_ASSERT( write_nv_seed( io_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 287 TEST_ASSERT( mbedtls_nv_seed_read( check_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) ==
markrad 0:cdf462088d13 288 MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 289
markrad 0:cdf462088d13 290 TEST_ASSERT( memcmp( io_seed, check_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 291
markrad 0:cdf462088d13 292 memset( check_seed, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 293
markrad 0:cdf462088d13 294 /* Check if platform NV write and raw read manipulate the same data */
markrad 0:cdf462088d13 295 TEST_ASSERT( mbedtls_nv_seed_write( io_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) ==
markrad 0:cdf462088d13 296 MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 297 TEST_ASSERT( read_nv_seed( check_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 298
markrad 0:cdf462088d13 299 TEST_ASSERT( memcmp( io_seed, check_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 300 }
markrad 0:cdf462088d13 301 /* END_CASE */
markrad 0:cdf462088d13 302
markrad 0:cdf462088d13 303 /* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_NV_SEED:MBEDTLS_PLATFORM_NV_SEED_ALT:MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */
markrad 0:cdf462088d13 304 void entropy_nv_seed( char *read_seed_str )
markrad 0:cdf462088d13 305 {
markrad 0:cdf462088d13 306 mbedtls_sha512_context accumulator;
markrad 0:cdf462088d13 307 mbedtls_entropy_context ctx;
markrad 0:cdf462088d13 308
markrad 0:cdf462088d13 309 unsigned char header[2];
markrad 0:cdf462088d13 310 unsigned char entropy[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 311 unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 312 unsigned char empty[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 313 unsigned char read_seed[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 314 unsigned char check_seed[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 315 unsigned char check_entropy[MBEDTLS_ENTROPY_BLOCK_SIZE];
markrad 0:cdf462088d13 316
markrad 0:cdf462088d13 317 memset( entropy, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 318 memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 319 memset( buffer_seed, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 320 memset( empty, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 321 memset( check_seed, 2, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 322 memset( check_entropy, 3, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 323
markrad 0:cdf462088d13 324 // Set the initial NV seed to read
markrad 0:cdf462088d13 325 unhexify( read_seed, read_seed_str );
markrad 0:cdf462088d13 326 memcpy( buffer_seed, read_seed, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 327
markrad 0:cdf462088d13 328 // Make sure we read/write NV seed from our buffers
markrad 0:cdf462088d13 329 mbedtls_platform_set_nv_seed( buffer_nv_seed_read, buffer_nv_seed_write );
markrad 0:cdf462088d13 330
markrad 0:cdf462088d13 331 mbedtls_entropy_init( &ctx );
markrad 0:cdf462088d13 332 entropy_clear_sources( &ctx );
markrad 0:cdf462088d13 333
markrad 0:cdf462088d13 334 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, mbedtls_nv_seed_poll, NULL,
markrad 0:cdf462088d13 335 MBEDTLS_ENTROPY_BLOCK_SIZE,
markrad 0:cdf462088d13 336 MBEDTLS_ENTROPY_SOURCE_STRONG ) == 0 );
markrad 0:cdf462088d13 337
markrad 0:cdf462088d13 338 // Do an entropy run
markrad 0:cdf462088d13 339 TEST_ASSERT( mbedtls_entropy_func( &ctx, entropy, sizeof( entropy ) ) == 0 );
markrad 0:cdf462088d13 340
markrad 0:cdf462088d13 341 // Determine what should have happened with manual entropy internal logic
markrad 0:cdf462088d13 342 // Only use the SHA-512 version to check
markrad 0:cdf462088d13 343
markrad 0:cdf462088d13 344 // Init accumulator
markrad 0:cdf462088d13 345 header[1] = MBEDTLS_ENTROPY_BLOCK_SIZE;
markrad 0:cdf462088d13 346 mbedtls_sha512_starts( &accumulator, 0 );
markrad 0:cdf462088d13 347
markrad 0:cdf462088d13 348 // First run for updating write_seed
markrad 0:cdf462088d13 349 header[0] = 0;
markrad 0:cdf462088d13 350 mbedtls_sha512_update( &accumulator, header, 2 );
markrad 0:cdf462088d13 351 mbedtls_sha512_update( &accumulator, read_seed, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 352 mbedtls_sha512_finish( &accumulator, buf );
markrad 0:cdf462088d13 353
markrad 0:cdf462088d13 354 memset( &accumulator, 0, sizeof( mbedtls_sha512_context ) );
markrad 0:cdf462088d13 355 mbedtls_sha512_starts( &accumulator, 0 );
markrad 0:cdf462088d13 356 mbedtls_sha512_update( &accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 357
markrad 0:cdf462088d13 358 mbedtls_sha512( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, check_seed, 0 );
markrad 0:cdf462088d13 359
markrad 0:cdf462088d13 360 // Second run for actual entropy (triggers mbedtls_entropy_update_nv_seed)
markrad 0:cdf462088d13 361 header[0] = MBEDTLS_ENTROPY_SOURCE_MANUAL;
markrad 0:cdf462088d13 362 mbedtls_sha512_update( &accumulator, header, 2 );
markrad 0:cdf462088d13 363 mbedtls_sha512_update( &accumulator, empty, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 364
markrad 0:cdf462088d13 365 header[0] = 0;
markrad 0:cdf462088d13 366 mbedtls_sha512_update( &accumulator, header, 2 );
markrad 0:cdf462088d13 367 mbedtls_sha512_update( &accumulator, check_seed, MBEDTLS_ENTROPY_BLOCK_SIZE );
markrad 0:cdf462088d13 368 mbedtls_sha512_finish( &accumulator, buf );
markrad 0:cdf462088d13 369
markrad 0:cdf462088d13 370 mbedtls_sha512( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, check_entropy, 0 );
markrad 0:cdf462088d13 371
markrad 0:cdf462088d13 372 // Check result of both NV file and entropy received with the manual calculations
markrad 0:cdf462088d13 373 TEST_ASSERT( memcmp( check_seed, buffer_seed, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 374 TEST_ASSERT( memcmp( check_entropy, entropy, MBEDTLS_ENTROPY_BLOCK_SIZE ) == 0 );
markrad 0:cdf462088d13 375
markrad 0:cdf462088d13 376 mbedtls_entropy_free( &ctx );
markrad 0:cdf462088d13 377 }
markrad 0:cdf462088d13 378 /* END_CASE */
markrad 0:cdf462088d13 379
markrad 0:cdf462088d13 380 /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
markrad 0:cdf462088d13 381 void entropy_selftest( int result )
markrad 0:cdf462088d13 382 {
markrad 0:cdf462088d13 383 TEST_ASSERT( mbedtls_entropy_self_test( 1 ) == result );
markrad 0:cdf462088d13 384 }
markrad 0:cdf462088d13 385 /* END_CASE */