| /* BEGIN_HEADER */ |
| #include "mbedtls/entropy.h" |
| |
| /* |
| * Number of calls made to entropy_dummy_source() |
| */ |
| static size_t entropy_dummy_calls; |
| |
| /* |
| * Dummy entropy source |
| * |
| * If data is NULL, write exactly the requested length. |
| * Otherwise, write the length indicated by data or error if negative |
| */ |
| static int entropy_dummy_source( void *data, unsigned char *output, |
| size_t len, size_t *olen ) |
| { |
| entropy_dummy_calls++; |
| |
| if( data == NULL ) |
| *olen = len; |
| else |
| { |
| int *d = (int *) data; |
| |
| if( *d < 0 ) |
| return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); |
| else |
| *olen = *d; |
| } |
| |
| memset( output, 0x2a, *olen ); |
| |
| return( 0 ); |
| } |
| /* END_HEADER */ |
| |
| /* BEGIN_DEPENDENCIES |
| * depends_on:POLARSSL_ENTROPY_C |
| * END_DEPENDENCIES |
| */ |
| |
| /* BEGIN_CASE depends_on:POLARSSL_FS_IO */ |
| void entropy_seed_file( char *path, int ret ) |
| { |
| entropy_context ctx; |
| |
| entropy_init( &ctx ); |
| |
| TEST_ASSERT( entropy_write_seed_file( &ctx, path ) == ret ); |
| TEST_ASSERT( entropy_update_seed_file( &ctx, path ) == ret ); |
| |
| exit: |
| entropy_free( &ctx ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE */ |
| void entropy_too_many_sources( ) |
| { |
| entropy_context ctx; |
| size_t i; |
| |
| entropy_init( &ctx ); |
| |
| /* |
| * It's hard to tell precisely when the error will occur, |
| * since we don't know how many sources were automatically added. |
| */ |
| for( i = 0; i < ENTROPY_MAX_SOURCES; i++ ) |
| (void) entropy_add_source( &ctx, entropy_dummy_source, NULL, 16 ); |
| |
| TEST_ASSERT( entropy_add_source( &ctx, entropy_dummy_source, NULL, 16 ) |
| == POLARSSL_ERR_ENTROPY_MAX_SOURCES ); |
| |
| exit: |
| entropy_free( &ctx ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE */ |
| void entropy_func_len( int len, int ret ) |
| { |
| entropy_context ctx; |
| unsigned char buf[ENTROPY_BLOCK_SIZE + 10] = { 0 }; |
| unsigned char acc[ENTROPY_BLOCK_SIZE + 10] = { 0 }; |
| size_t i, j; |
| |
| entropy_init( &ctx ); |
| |
| /* |
| * See comments in entropy_self_test() |
| */ |
| for( i = 0; i < 8; i++ ) |
| { |
| TEST_ASSERT( entropy_func( &ctx, buf, len ) == ret ); |
| for( j = 0; j < sizeof( buf ); j++ ) |
| acc[j] |= buf[j]; |
| } |
| |
| if( ret == 0 ) |
| for( j = 0; j < (size_t) len; j++ ) |
| TEST_ASSERT( acc[j] != 0 ); |
| |
| for( j = len; j < sizeof( buf ); j++ ) |
| TEST_ASSERT( acc[j] == 0 ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE */ |
| void entropy_source_fail( char *path ) |
| { |
| entropy_context ctx; |
| int fail = -1; |
| unsigned char buf[16]; |
| |
| entropy_init( &ctx ); |
| |
| TEST_ASSERT( entropy_add_source( &ctx, entropy_dummy_source, &fail, 16 ) |
| == 0 ); |
| |
| TEST_ASSERT( entropy_func( &ctx, buf, sizeof( buf ) ) |
| == POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); |
| TEST_ASSERT( entropy_gather( &ctx ) |
| == POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); |
| #if defined(POLARSSL_FS_IO) |
| TEST_ASSERT( entropy_write_seed_file( &ctx, path ) |
| == POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); |
| TEST_ASSERT( entropy_update_seed_file( &ctx, path ) |
| == POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); |
| #else |
| ((void) path); |
| #endif |
| |
| exit: |
| entropy_free( &ctx ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE */ |
| void entropy_threshold( int threshold, int chunk_size, int result ) |
| { |
| entropy_context ctx; |
| unsigned char buf[ENTROPY_BLOCK_SIZE] = { 0 }; |
| int ret; |
| |
| entropy_init( &ctx ); |
| |
| TEST_ASSERT( entropy_add_source( &ctx, entropy_dummy_source, |
| &chunk_size, threshold ) == 0 ); |
| |
| entropy_dummy_calls = 0; |
| ret = entropy_func( &ctx, buf, sizeof( buf ) ); |
| |
| if( result >= 0 ) |
| { |
| TEST_ASSERT( ret == 0 ); |
| TEST_ASSERT( entropy_dummy_calls == (size_t) result ); |
| } |
| else |
| { |
| TEST_ASSERT( ret == result ); |
| } |
| |
| exit: |
| entropy_free( &ctx ); |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */ |
| void entropy_selftest( ) |
| { |
| TEST_ASSERT( entropy_self_test( 0 ) == 0 ); |
| } |
| /* END_CASE */ |