From 18d32911c0a14c9458c32f2cf97eb3ce6ca50126 Mon Sep 17 00:00:00 2001
From: Paul Bakker
Date: Sat, 10 Dec 2011 21:42:49 +0000
Subject: [PATCH] - Added internal ctr_drbg_init_entropy_len() to allow NIST
determined entropy tests to work
---
library/ctr_drbg.c | 22 +++++++++++++++++++---
tests/suites/test_suite_ctr_drbg.function | 12 ++++++++++--
2 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/library/ctr_drbg.c b/library/ctr_drbg.c
index 6611c3d7b..478304e56 100644
--- a/library/ctr_drbg.c
+++ b/library/ctr_drbg.c
@@ -38,11 +38,17 @@
#include
#endif
-int ctr_drbg_init( ctr_drbg_context *ctx,
+/*
+ * Non-public function wrapped by ctr_crbg_init(). Necessary to allow NIST
+ * tests to succeed (which require known length fixed entropy)
+ */
+int ctr_drbg_init_entropy_len(
+ ctr_drbg_context *ctx,
int (*f_entropy)(void *, unsigned char *, size_t),
void *p_entropy,
const unsigned char *custom,
- size_t len )
+ size_t len,
+ size_t entropy_len )
{
int ret;
unsigned char key[CTR_DRBG_KEYSIZE];
@@ -53,7 +59,7 @@ int ctr_drbg_init( ctr_drbg_context *ctx,
ctx->f_entropy = f_entropy;
ctx->p_entropy = p_entropy;
- ctx->entropy_len = CTR_DRBG_ENTROPY_LEN;
+ ctx->entropy_len = entropy_len;
ctx->reseed_interval = CTR_DRBG_RESEED_INTERVAL;
/*
@@ -67,6 +73,16 @@ int ctr_drbg_init( ctr_drbg_context *ctx,
return( 0 );
}
+int ctr_drbg_init( ctr_drbg_context *ctx,
+ int (*f_entropy)(void *, unsigned char *, size_t),
+ void *p_entropy,
+ const unsigned char *custom,
+ size_t len )
+{
+ return( ctr_drbg_init_entropy_len( ctx, f_entropy, p_entropy, custom, len,
+ CTR_DRBG_ENTROPY_LEN ) );
+}
+
void ctr_drbg_set_prediction_resistance( ctr_drbg_context *ctx, int resistance )
{
ctx->prediction_resistance = resistance;
diff --git a/tests/suites/test_suite_ctr_drbg.function b/tests/suites/test_suite_ctr_drbg.function
index e817658b4..7349517a4 100644
--- a/tests/suites/test_suite_ctr_drbg.function
+++ b/tests/suites/test_suite_ctr_drbg.function
@@ -8,6 +8,14 @@ int entropy_func( void *p, unsigned char *buf, size_t len )
test_offset += 32;
return( 0 );
}
+
+int ctr_drbg_init_entropy_len(
+ ctr_drbg_context *ctx,
+ int (*f_entropy)(void *, unsigned char *, size_t),
+ void *p_entropy,
+ const unsigned char *custom,
+ size_t len,
+ size_t entropy_len );
END_HEADER
BEGIN_DEPENDENCIES
@@ -34,7 +42,7 @@ ctr_drbg_validate_pr:add_init_string:entropy_string:add1_string:add2_string:resu
add2_len = unhexify( add2, {add2_string} );
test_offset = 0;
- TEST_ASSERT( ctr_drbg_init( &ctx, entropy_func, entropy, add_init, add_init_len ) == 0 );
+ TEST_ASSERT( ctr_drbg_init_entropy_len( &ctx, entropy_func, entropy, add_init, add_init_len, 32 ) == 0 );
ctr_drbg_set_prediction_resistance( &ctx, CTR_DRBG_PR_ON );
TEST_ASSERT( ctr_drbg_random_with_add( &ctx, buf, 16, add1, add1_len ) == 0 );
@@ -66,7 +74,7 @@ ctr_drbg_validate_nopr:add_init_string:entropy_string:add1_string:add_reseed_str
add2_len = unhexify( add2, {add2_string} );
test_offset = 0;
- TEST_ASSERT( ctr_drbg_init( &ctx, entropy_func, entropy, add_init, add_init_len ) == 0 );
+ TEST_ASSERT( ctr_drbg_init_entropy_len( &ctx, entropy_func, entropy, add_init, add_init_len, 32 ) == 0 );
TEST_ASSERT( ctr_drbg_random_with_add( &ctx, buf, 16, add1, add1_len ) == 0 );
TEST_ASSERT( ctr_drbg_reseed( &ctx, add_reseed, add_reseed_len ) == 0 );