blob: 41a115cc6b740e5d4e38ee2049368538880942b7 [file] [log] [blame]
/* 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 */