Add hmac_drbg_set_prediction_resistance()
diff --git a/library/hmac_drbg.c b/library/hmac_drbg.c
index 8a4f3f0..808be61 100644
--- a/library/hmac_drbg.c
+++ b/library/hmac_drbg.c
@@ -171,6 +171,15 @@
}
/*
+ * Set prediction resistance
+ */
+void hmac_drbg_set_prediction_resistance( hmac_drbg_context *ctx,
+ int resistance )
+{
+ ctx->prediction_resistance = resistance;
+}
+
+/*
* Set entropy length grabbed for reseeds
*/
void hmac_drbg_set_entropy_len( hmac_drbg_context *ctx, size_t len )
@@ -185,12 +194,19 @@
unsigned char *output, size_t out_len,
const unsigned char *additional, size_t add_len )
{
+ int ret;
hmac_drbg_context *ctx = (hmac_drbg_context *) p_rng;
size_t md_len = md_get_size( ctx->md_ctx.md_info );
size_t left = out_len;
unsigned char *out = output;
- /* 1. Check reseed counter (TODO) */
+ /* 1. Check reseed counter (TODO) and PR */
+ if( ctx->f_entropy != NULL &&
+ ctx->prediction_resistance == HMAC_DRBG_PR_ON )
+ {
+ if( ( ret = hmac_drbg_reseed( ctx, additional, add_len ) ) != 0 )
+ return( ret );
+ }
/* 2. Use additional data if any */
if( additional != NULL && add_len != 0 )