mbedtls/tests/suites/test_suite_entropy.function

181 lines
4.6 KiB
Plaintext
Raw Normal View History

2014-05-30 10:38:18 +02:00
/* BEGIN_HEADER */
2015-03-09 18:05:11 +01:00
#include "mbedtls/entropy.h"
2014-05-30 11:42:01 +02:00
/*
* 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( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
2014-05-30 11:42:01 +02:00
else
*olen = *d;
}
memset( output, 0x2a, *olen );
return( 0 );
}
2014-05-30 10:38:18 +02:00
/* END_HEADER */
/* BEGIN_DEPENDENCIES
* depends_on:MBEDTLS_ENTROPY_C
2014-05-30 10:38:18 +02:00
* END_DEPENDENCIES
*/
/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:ENTROPY_HAVE_STRONG */
2014-05-30 10:38:18 +02:00
void entropy_seed_file( char *path, int ret )
{
mbedtls_entropy_context ctx;
2014-05-30 10:38:18 +02:00
mbedtls_entropy_init( &ctx );
2014-05-30 10:38:18 +02:00
TEST_ASSERT( mbedtls_entropy_write_seed_file( &ctx, path ) == ret );
TEST_ASSERT( mbedtls_entropy_update_seed_file( &ctx, path ) == ret );
2014-05-30 10:38:18 +02:00
exit:
mbedtls_entropy_free( &ctx );
2014-05-30 10:38:18 +02:00
}
/* END_CASE */
2014-05-30 11:42:01 +02:00
/* BEGIN_CASE */
void entropy_too_many_sources( )
{
mbedtls_entropy_context ctx;
2014-05-30 11:42:01 +02:00
size_t i;
mbedtls_entropy_init( &ctx );
2014-05-30 11:42:01 +02:00
/*
* 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 < MBEDTLS_ENTROPY_MAX_SOURCES; i++ )
(void) mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL,
16, MBEDTLS_ENTROPY_SOURCE_WEAK );
2014-05-30 11:42:01 +02:00
TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL,
16, MBEDTLS_ENTROPY_SOURCE_WEAK )
== MBEDTLS_ERR_ENTROPY_MAX_SOURCES );
2014-05-30 11:42:01 +02:00
exit:
mbedtls_entropy_free( &ctx );
2014-05-30 11:42:01 +02:00
}
/* END_CASE */
/* BEGIN_CASE depends_on:ENTROPY_HAVE_STRONG */
2014-05-30 11:42:01 +02:00
void entropy_func_len( int len, int ret )
{
mbedtls_entropy_context ctx;
unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE + 10] = { 0 };
unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE + 10] = { 0 };
2014-05-30 11:42:01 +02:00
size_t i, j;
mbedtls_entropy_init( &ctx );
2014-05-30 11:42:01 +02:00
/*
* See comments in mbedtls_entropy_self_test()
2014-05-30 11:42:01 +02:00
*/
for( i = 0; i < 8; i++ )
{
TEST_ASSERT( mbedtls_entropy_func( &ctx, buf, len ) == ret );
2014-05-30 11:42:01 +02:00
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 )
{
mbedtls_entropy_context ctx;
2014-05-30 11:42:01 +02:00
int fail = -1;
unsigned char buf[16];
mbedtls_entropy_init( &ctx );
2014-05-30 11:42:01 +02:00
TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source,
&fail, 16,
MBEDTLS_ENTROPY_SOURCE_WEAK )
2014-05-30 11:42:01 +02:00
== 0 );
TEST_ASSERT( mbedtls_entropy_func( &ctx, buf, sizeof( buf ) )
== MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
TEST_ASSERT( mbedtls_entropy_gather( &ctx )
== MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
#if defined(MBEDTLS_FS_IO)
TEST_ASSERT( mbedtls_entropy_write_seed_file( &ctx, path )
== MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
TEST_ASSERT( mbedtls_entropy_update_seed_file( &ctx, path )
== MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
2014-05-30 11:42:01 +02:00
#else
((void) path);
#endif
exit:
mbedtls_entropy_free( &ctx );
2014-05-30 11:42:01 +02:00
}
/* END_CASE */
/* BEGIN_CASE depends_on:ENTROPY_HAVE_STRONG */
2014-05-30 11:42:01 +02:00
void entropy_threshold( int threshold, int chunk_size, int result )
{
mbedtls_entropy_context ctx;
unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };
2014-05-30 11:42:01 +02:00
int ret;
mbedtls_entropy_init( &ctx );
2014-05-30 11:42:01 +02:00
TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source,
&chunk_size, threshold,
MBEDTLS_ENTROPY_SOURCE_WEAK ) == 0 );
2014-05-30 11:42:01 +02:00
entropy_dummy_calls = 0;
ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) );
2014-05-30 11:42:01 +02:00
if( result >= 0 )
{
TEST_ASSERT( ret == 0 );
TEST_ASSERT( entropy_dummy_calls == (size_t) result );
}
else
{
TEST_ASSERT( ret == result );
}
exit:
mbedtls_entropy_free( &ctx );
2014-05-30 11:42:01 +02:00
}
/* END_CASE */
/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:ENTROPY_HAVE_STRONG */
2014-05-30 10:38:18 +02:00
void entropy_selftest( )
{
TEST_ASSERT( mbedtls_entropy_self_test( 0 ) == 0 );
2014-05-30 10:38:18 +02:00
}
/* END_CASE */