diff --git a/ChangeLog b/ChangeLog index 0e876f0a0..c0afc058b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,6 +18,7 @@ API Changes mbedtls_ccm_init() -> mbedtls_ccm_setkey() mbedtls_gcm_init() -> mbedtls_gcm_setkey() mbedtls_hmac_drbg_init() -> mbedtls_hmac_drbg_init(_buf)() + mbedtls_ctr_drbg_init() -> mbedtls_ctr_drbg_init(_buf)() * In the threading layer, mbedtls_mutex_init() and mbedtls_mutex_free() now return void. * ecdsa_write_signature() gained an addtional md_alg argument and diff --git a/include/mbedtls/ctr_drbg.h b/include/mbedtls/ctr_drbg.h index f32ae8089..3ea4af2ec 100644 --- a/include/mbedtls/ctr_drbg.h +++ b/include/mbedtls/ctr_drbg.h @@ -103,12 +103,22 @@ typedef struct mbedtls_ctr_drbg_context; /** - * \brief CTR_DRBG initialization + * \brief CTR_DRBG context initialization + * Makes the context ready for mbetls_ctr_drbg_seed() or + * mbedtls_ctr_drbg_free(). + * + * \param ctx CTR_DRBG context to be initialized + */ +void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); + +/** + * \brief CTR_DRBG initial seeding + * Seed and setup entropy source for future reseeds. * * Note: Personalization data can be provided in addition to the more generic * entropy source to make this instantiation as unique as possible. * - * \param ctx CTR_DRBG context to be initialized + * \param ctx CTR_DRBG context to be seeded * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer * length) * \param p_entropy Entropy context @@ -119,7 +129,7 @@ mbedtls_ctr_drbg_context; * \return 0 if successful, or * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED */ -int mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx, +int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, @@ -262,7 +272,7 @@ int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char int mbedtls_ctr_drbg_self_test( int verbose ); /* Internal functions (do not call directly) */ -int mbedtls_ctr_drbg_init_entropy_len( mbedtls_ctr_drbg_context *, +int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *, int (*)(void *, unsigned char *, size_t), void *, const unsigned char *, size_t, size_t ); diff --git a/include/mbedtls/hmac_drbg.h b/include/mbedtls/hmac_drbg.h index ed85dfec0..fb2ee0eb1 100644 --- a/include/mbedtls/hmac_drbg.h +++ b/include/mbedtls/hmac_drbg.h @@ -90,7 +90,7 @@ typedef struct } mbedtls_hmac_drbg_context; /** - * \brief HMAC_DRBG initialization (just make references valid) + * \brief HMAC_DRBG context initialization * Makes the context ready for mbetls_hmac_drbg_seed(), * mbedtls_hmac_drbg_seed_buf() or * mbedtls_hmac_drbg_free(). @@ -101,7 +101,7 @@ void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ); /** * \brief HMAC_DRBG initial seeding - * Seed and setup entropy pool for later re-seeding. + * Seed and setup entropy source for future reseeds. * * \param ctx HMAC_DRBG context to be seeded * \param md_info MD algorithm to use for HMAC_DRBG diff --git a/library/ctr_drbg.c b/library/ctr_drbg.c index 355d0f4f4..ec7d9a773 100644 --- a/library/ctr_drbg.c +++ b/library/ctr_drbg.c @@ -55,11 +55,19 @@ static void mbedtls_zeroize( void *v, size_t n ) { volatile unsigned char *p = v; while( n-- ) *p++ = 0; } +/* + * CTR_DRBG context initialization + */ +void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ) +{ + memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) ); +} + /* * Non-public function wrapped by ctr_crbg_init(). Necessary to allow NIST * tests to succeed (which require known length fixed entropy) */ -int mbedtls_ctr_drbg_init_entropy_len( +int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, @@ -92,13 +100,13 @@ int mbedtls_ctr_drbg_init_entropy_len( return( 0 ); } -int mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx, +int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ) { - return( mbedtls_ctr_drbg_init_entropy_len( ctx, f_entropy, p_entropy, custom, len, + return( mbedtls_ctr_drbg_seed_entropy_len( ctx, f_entropy, p_entropy, custom, len, MBEDTLS_CTR_DRBG_ENTROPY_LEN ) ); } @@ -513,6 +521,8 @@ int mbedtls_ctr_drbg_self_test( int verbose ) mbedtls_ctr_drbg_context ctx; unsigned char buf[16]; + mbedtls_ctr_drbg_init( &ctx ); + /* * Based on a NIST CTR_DRBG test vector (PR = True) */ @@ -520,7 +530,7 @@ int mbedtls_ctr_drbg_self_test( int verbose ) mbedtls_printf( " CTR_DRBG (PR = TRUE) : " ); test_offset = 0; - CHK( mbedtls_ctr_drbg_init_entropy_len( &ctx, ctr_drbg_self_test_entropy, + CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy, (void *) entropy_source_pr, nonce_pers_pr, 16, 32 ) ); mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); @@ -537,7 +547,7 @@ int mbedtls_ctr_drbg_self_test( int verbose ) mbedtls_printf( " CTR_DRBG (PR = FALSE): " ); test_offset = 0; - CHK( mbedtls_ctr_drbg_init_entropy_len( &ctx, ctr_drbg_self_test_entropy, + CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy, (void *) entropy_source_nopr, nonce_pers_nopr, 16, 32 ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) ); CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) ); diff --git a/programs/test/benchmark.c b/programs/test/benchmark.c index c752ba6a4..9f8990ffe 100644 --- a/programs/test/benchmark.c +++ b/programs/test/benchmark.c @@ -516,13 +516,15 @@ int main( int argc, char *argv[] ) { mbedtls_ctr_drbg_context ctr_drbg; - if( mbedtls_ctr_drbg_init( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 ) + mbedtls_ctr_drbg_init( &ctr_drbg ); + + if( mbedtls_ctr_drbg_seed( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 ) mbedtls_exit(1); TIME_AND_TSC( "CTR_DRBG (NOPR)", if( mbedtls_ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 ) mbedtls_exit(1) ); - if( mbedtls_ctr_drbg_init( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 ) + if( mbedtls_ctr_drbg_seed( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 ) mbedtls_exit(1); mbedtls_ctr_drbg_set_prediction_resistance( &ctr_drbg, MBEDTLS_CTR_DRBG_PR_ON ); TIME_AND_TSC( "CTR_DRBG (PR)", diff --git a/tests/suites/test_suite_ctr_drbg.function b/tests/suites/test_suite_ctr_drbg.function index 8e53efb63..b7d2bece9 100644 --- a/tests/suites/test_suite_ctr_drbg.function +++ b/tests/suites/test_suite_ctr_drbg.function @@ -30,6 +30,7 @@ void ctr_drbg_validate_pr( char *add_init_string, char *entropy_string, unsigned char output_str[512]; int add_init_len, add1_len, add2_len; + mbedtls_ctr_drbg_init( &ctx ); memset( output_str, 0, 512 ); unhexify( entropy, entropy_string ); @@ -38,7 +39,7 @@ void ctr_drbg_validate_pr( char *add_init_string, char *entropy_string, add2_len = unhexify( add2, add2_string ); test_offset_idx = 0; - TEST_ASSERT( mbedtls_ctr_drbg_init_entropy_len( &ctx, mbedtls_entropy_func, entropy, add_init, add_init_len, 32 ) == 0 ); + TEST_ASSERT( mbedtls_ctr_drbg_seed_entropy_len( &ctx, mbedtls_entropy_func, entropy, add_init, add_init_len, 32 ) == 0 ); mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON ); TEST_ASSERT( mbedtls_ctr_drbg_random_with_add( &ctx, buf, 16, add1, add1_len ) == 0 ); @@ -66,6 +67,7 @@ void ctr_drbg_validate_nopr( char *add_init_string, char *entropy_string, unsigned char output_str[512]; int add_init_len, add1_len, add_reseed_len, add2_len; + mbedtls_ctr_drbg_init( &ctx ); memset( output_str, 0, 512 ); unhexify( entropy, entropy_string ); @@ -75,7 +77,7 @@ void ctr_drbg_validate_nopr( char *add_init_string, char *entropy_string, add2_len = unhexify( add2, add2_string ); test_offset_idx = 0; - TEST_ASSERT( mbedtls_ctr_drbg_init_entropy_len( &ctx, mbedtls_entropy_func, entropy, add_init, add_init_len, 32 ) == 0 ); + TEST_ASSERT( mbedtls_ctr_drbg_seed_entropy_len( &ctx, mbedtls_entropy_func, entropy, add_init, add_init_len, 32 ) == 0 ); TEST_ASSERT( mbedtls_ctr_drbg_random_with_add( &ctx, buf, 16, add1, add1_len ) == 0 ); TEST_ASSERT( mbedtls_ctr_drbg_reseed( &ctx, add_reseed, add_reseed_len ) == 0 ); @@ -98,6 +100,7 @@ void ctr_drbg_entropy_usage( ) size_t i, reps = 10; int last_idx; + mbedtls_ctr_drbg_init( &ctx ); test_offset_idx = 0; memset( entropy, 0, sizeof( entropy ) ); memset( out, 0, sizeof( out ) ); @@ -105,7 +108,7 @@ void ctr_drbg_entropy_usage( ) /* Init must use entropy */ last_idx = test_offset_idx; - TEST_ASSERT( mbedtls_ctr_drbg_init( &ctx, mbedtls_entropy_func, entropy, NULL, 0 ) == 0 ); + TEST_ASSERT( mbedtls_ctr_drbg_seed( &ctx, mbedtls_entropy_func, entropy, NULL, 0 ) == 0 ); TEST_ASSERT( last_idx < test_offset_idx ); /* By default, PR is off and reseed_interval is large, @@ -171,7 +174,9 @@ void ctr_drbg_seed_file( char *path, int ret ) { mbedtls_ctr_drbg_context ctx; - TEST_ASSERT( mbedtls_ctr_drbg_init( &ctx, rnd_std_rand, NULL, NULL, 0 ) == 0 ); + mbedtls_ctr_drbg_init( &ctx ); + + TEST_ASSERT( mbedtls_ctr_drbg_seed( &ctx, rnd_std_rand, NULL, NULL, 0 ) == 0 ); TEST_ASSERT( mbedtls_ctr_drbg_write_seed_file( &ctx, path ) == ret ); TEST_ASSERT( mbedtls_ctr_drbg_update_seed_file( &ctx, path ) == ret ); diff --git a/tests/suites/test_suite_rsa.function b/tests/suites/test_suite_rsa.function index 0075f61d4..59cbb5c97 100644 --- a/tests/suites/test_suite_rsa.function +++ b/tests/suites/test_suite_rsa.function @@ -666,8 +666,10 @@ void mbedtls_rsa_gen_key( int nrbits, int exponent, int result) mbedtls_ctr_drbg_context ctr_drbg; const char *pers = "test_suite_rsa"; + mbedtls_ctr_drbg_init( &ctr_drbg ); + mbedtls_entropy_init( &entropy ); - TEST_ASSERT( mbedtls_ctr_drbg_init( &ctr_drbg, mbedtls_entropy_func, &entropy, + TEST_ASSERT( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen( pers ) ) == 0 ); mbedtls_rsa_init( &ctx, 0, 0 );