blob: 3b739cce9e87ba985e45340e1b202e0371fa794f [file] [log] [blame]
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/entropy.h"
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +02003
4/*
5 * Number of calls made to entropy_dummy_source()
6 */
7static size_t entropy_dummy_calls;
8
9/*
10 * Dummy entropy source
11 *
12 * If data is NULL, write exactly the requested length.
13 * Otherwise, write the length indicated by data or error if negative
14 */
15static int entropy_dummy_source( void *data, unsigned char *output,
16 size_t len, size_t *olen )
17{
18 entropy_dummy_calls++;
19
20 if( data == NULL )
21 *olen = len;
22 else
23 {
24 int *d = (int *) data;
25
26 if( *d < 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020028 else
29 *olen = *d;
30 }
31
32 memset( output, 0x2a, *olen );
33
34 return( 0 );
35}
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020036/* END_HEADER */
37
38/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039 * depends_on:MBEDTLS_ENTROPY_C
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020040 * END_DEPENDENCIES
41 */
42
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020044void entropy_seed_file( char *path, int ret )
45{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046 mbedtls_entropy_context ctx;
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048 mbedtls_entropy_init( &ctx );
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050 TEST_ASSERT( mbedtls_entropy_write_seed_file( &ctx, path ) == ret );
51 TEST_ASSERT( mbedtls_entropy_update_seed_file( &ctx, path ) == ret );
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020052
Paul Bakkerbd51b262014-07-10 15:26:12 +020053exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054 mbedtls_entropy_free( &ctx );
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +020055}
56/* END_CASE */
57
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020058/* BEGIN_CASE */
59void entropy_too_many_sources( )
60{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061 mbedtls_entropy_context ctx;
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020062 size_t i;
63
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064 mbedtls_entropy_init( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020065
66 /*
67 * It's hard to tell precisely when the error will occur,
68 * since we don't know how many sources were automatically added.
69 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070 for( i = 0; i < MBEDTLS_ENTROPY_MAX_SOURCES; i++ )
Manuel Pégourié-Gonnard7580ba42015-06-19 10:26:32 +020071 (void) mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL,
72 16, MBEDTLS_ENTROPY_SOURCE_WEAK );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020073
Manuel Pégourié-Gonnard7580ba42015-06-19 10:26:32 +020074 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL,
75 16, MBEDTLS_ENTROPY_SOURCE_WEAK )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076 == MBEDTLS_ERR_ENTROPY_MAX_SOURCES );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020077
Paul Bakkerbd51b262014-07-10 15:26:12 +020078exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079 mbedtls_entropy_free( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020080}
81/* END_CASE */
82
83/* BEGIN_CASE */
84void entropy_func_len( int len, int ret )
85{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020086 mbedtls_entropy_context ctx;
87 unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE + 10] = { 0 };
88 unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE + 10] = { 0 };
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020089 size_t i, j;
90
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091 mbedtls_entropy_init( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020092
93 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094 * See comments in mbedtls_entropy_self_test()
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020095 */
96 for( i = 0; i < 8; i++ )
97 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020098 TEST_ASSERT( mbedtls_entropy_func( &ctx, buf, len ) == ret );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +020099 for( j = 0; j < sizeof( buf ); j++ )
100 acc[j] |= buf[j];
101 }
102
103 if( ret == 0 )
104 for( j = 0; j < (size_t) len; j++ )
105 TEST_ASSERT( acc[j] != 0 );
106
107 for( j = len; j < sizeof( buf ); j++ )
108 TEST_ASSERT( acc[j] == 0 );
109}
110/* END_CASE */
111
112/* BEGIN_CASE */
113void entropy_source_fail( char *path )
114{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115 mbedtls_entropy_context ctx;
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200116 int fail = -1;
117 unsigned char buf[16];
118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119 mbedtls_entropy_init( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200120
Manuel Pégourié-Gonnard7580ba42015-06-19 10:26:32 +0200121 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source,
122 &fail, 16,
123 MBEDTLS_ENTROPY_SOURCE_WEAK )
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200124 == 0 );
125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126 TEST_ASSERT( mbedtls_entropy_func( &ctx, buf, sizeof( buf ) )
127 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
128 TEST_ASSERT( mbedtls_entropy_gather( &ctx )
129 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
130#if defined(MBEDTLS_FS_IO)
131 TEST_ASSERT( mbedtls_entropy_write_seed_file( &ctx, path )
132 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
133 TEST_ASSERT( mbedtls_entropy_update_seed_file( &ctx, path )
134 == MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200135#else
136 ((void) path);
137#endif
138
Paul Bakkerbd51b262014-07-10 15:26:12 +0200139exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200140 mbedtls_entropy_free( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200141}
142/* END_CASE */
143
144/* BEGIN_CASE */
145void entropy_threshold( int threshold, int chunk_size, int result )
146{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147 mbedtls_entropy_context ctx;
148 unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200149 int ret;
150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151 mbedtls_entropy_init( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153 TEST_ASSERT( mbedtls_entropy_add_source( &ctx, entropy_dummy_source,
Manuel Pégourié-Gonnard7580ba42015-06-19 10:26:32 +0200154 &chunk_size, threshold,
155 MBEDTLS_ENTROPY_SOURCE_WEAK ) == 0 );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200156
157 entropy_dummy_calls = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200158 ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200159
160 if( result >= 0 )
161 {
162 TEST_ASSERT( ret == 0 );
163 TEST_ASSERT( entropy_dummy_calls == (size_t) result );
164 }
165 else
166 {
167 TEST_ASSERT( ret == result );
168 }
169
Paul Bakkerbd51b262014-07-10 15:26:12 +0200170exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171 mbedtls_entropy_free( &ctx );
Manuel Pégourié-Gonnardc7c56b22014-05-30 11:42:01 +0200172}
173/* END_CASE */
174
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200175/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +0200176void entropy_selftest( )
177{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 TEST_ASSERT( mbedtls_entropy_self_test( 0 ) == 0 );
Manuel Pégourié-Gonnard2c25eb02014-05-30 10:38:18 +0200179}
180/* END_CASE */