Add range-checking to RAND_DRBG_set_reseed_interval
authorRich Salz <rsalz@openssl.org>
Wed, 19 Jul 2017 21:41:26 +0000 (17:41 -0400)
committerRich Salz <rsalz@openssl.org>
Thu, 20 Jul 2017 09:49:09 +0000 (05:49 -0400)
As suggested by Kurt.

Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
(Merged from https://github.com/openssl/openssl/pull/3970)

crypto/rand/drbg_lib.c
crypto/rand/drbg_rand.c
crypto/rand/rand_lcl.h
include/internal/rand.h

index b9161ab..1588515 100644 (file)
@@ -328,11 +328,14 @@ int RAND_DRBG_set_callbacks(DRBG_CTX *dctx,
 }
 
 /*
- * Set the reseed internal. Used mainly for the KATs.
+ * Set the reseed interval. Used mainly for the KATs.
  */
-void RAND_DRBG_set_reseed_interval(DRBG_CTX *dctx, int interval)
+int RAND_DRBG_set_reseed_interval(DRBG_CTX *dctx, int interval)
 {
+    if (interval < 0 || interval > MAX_RESEED)
+        return 0;
     dctx->reseed_interval = interval;
+    return 1;
 }
 
 /*
index 858f74a..4ff347c 100644 (file)
@@ -372,7 +372,7 @@ int ctr_init(DRBG_CTX *dctx)
     }
 
     dctx->max_request = 1 << 16;
-    dctx->reseed_interval = 1 << 24;
+    dctx->reseed_interval = MAX_RESEED;
     return 1;
 }
 
index d65d49f..689e3a3 100644 (file)
@@ -20,6 +20,9 @@
 /* we require 256 bits of randomness */
 # define RANDOMNESS_NEEDED (256 / 8)
 
+/* Maximum count allowed in reseeding */
+#define MAX_RESEED (1 << 24)
+
 /* DRBG status values */
 #define DRBG_STATUS_UNINITIALISED      0
 #define DRBG_STATUS_READY              1
index 95ad712..0d386f6 100644 (file)
@@ -35,7 +35,7 @@ int RAND_DRBG_set_callbacks(DRBG_CTX *dctx,
     void (*cleanup_nonce)(DRBG_CTX *ctx, unsigned char *out, size_t olen)
     );
 
-void RAND_DRBG_set_reseed_interval(DRBG_CTX *dctx, int interval);
+int RAND_DRBG_set_reseed_interval(DRBG_CTX *dctx, int interval);
 
 #define RAND_DRBG_get_ex_new_index(l, p, newf, dupf, freef) \
     CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DRBG, l, p, newf, dupf, freef)