test: update test_random to create real contexts instead of sharing one
authorPauli <ppzgs1@gmail.com>
Sat, 27 Feb 2021 01:55:59 +0000 (11:55 +1000)
committerPauli <ppzgs1@gmail.com>
Tue, 2 Mar 2021 03:23:17 +0000 (13:23 +1000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/14341)

test/testutil.h
test/testutil/fake_random.c

index 93c91a4a41aea24ee635c79bfc9711e1a4d9e16c..8989b1f73566cec2c87e91ee3baf7239fceb3f16 100644 (file)
@@ -569,7 +569,9 @@ void test_random_seed(uint32_t sd);
 /* Fake non-secure random number generator */
 OSSL_PROVIDER *fake_rand_start(OSSL_LIB_CTX *libctx);
 void fake_rand_finish(OSSL_PROVIDER *p);
-void fake_rand_set_callback(int (*cb)(unsigned char *out, size_t outlen));
+void fake_rand_set_callback(EVP_RAND_CTX *ctx,
+                            int (*cb)(unsigned char *out, size_t outlen,
+                                      const char *name, EVP_RAND_CTX *ctx));
 
 /* Create a file path from a directory and a filename */
 char *test_mk_file_path(const char *dir, const char *file);
index f8b97d2287e7ef665c6447b35d0deeea9c0ab41f..537755cde722be0899e53d680792ebfb63a87d56 100644 (file)
 #include <openssl/core_names.h>
 #include <openssl/rand.h>
 #include <openssl/provider.h>
+#include "../include/crypto/evp.h"
+#include "../../crypto/evp/evp_local.h"
 #include "../testutil.h"
 
 typedef struct {
-    int (*cb)(unsigned char *out, size_t outlen);
+    int (*cb)(unsigned char *out, size_t outlen,
+              const char *name, EVP_RAND_CTX *ctx);
     int state;
+    const char *name;
+    EVP_RAND_CTX *ctx;
 } FAKE_RAND;
 
-static FAKE_RAND fake_rand;
-
 static OSSL_FUNC_rand_newctx_fn fake_rand_newctx;
 static OSSL_FUNC_rand_freectx_fn fake_rand_freectx;
 static OSSL_FUNC_rand_instantiate_fn fake_rand_instantiate;
@@ -33,16 +36,16 @@ static OSSL_FUNC_rand_enable_locking_fn fake_rand_enable_locking;
 static void *fake_rand_newctx(void *provctx, void *parent,
                               const OSSL_DISPATCH *parent_dispatch)
 {
-    fake_rand.state = EVP_RAND_STATE_UNINITIALISED;
-    return &fake_rand;
+    FAKE_RAND *r = OPENSSL_zalloc(sizeof(*r));
+
+    if (r != NULL)
+        r->state = EVP_RAND_STATE_UNINITIALISED;
+    return r;
 }
 
 static void fake_rand_freectx(void *vrng)
 {
-    FAKE_RAND *frng = (FAKE_RAND *)vrng;
-
-    frng->cb = NULL;
-    frng->state = EVP_RAND_STATE_UNINITIALISED;
+    OPENSSL_free(vrng);
 }
 
 static int fake_rand_instantiate(void *vrng, ossl_unused unsigned int strength,
@@ -74,7 +77,7 @@ static int fake_rand_generate(void *vrng, unsigned char *out, size_t outlen,
     uint32_t r;
 
     if (frng->cb != NULL)
-        return (*frng->cb)(out, outlen);
+        return (*frng->cb)(out, outlen, frng->name, frng->ctx);
     while (outlen > 0) {
         r = test_random();
         l = outlen < sizeof(r) ? outlen : sizeof(r);
@@ -169,6 +172,20 @@ static int fake_rand_provider_init(const OSSL_CORE_HANDLE *handle,
     return 1;
 }
 
+static int check_rng(EVP_RAND_CTX *rng, const char *name)
+{
+    FAKE_RAND *f;
+
+    if (!TEST_ptr(rng)) {
+        TEST_info("random: %s", name);
+        return 0;
+    }
+    f = rng->data;
+    f->name = name;
+    f->ctx = rng;
+    return 1;
+}
+
 OSSL_PROVIDER *fake_rand_start(OSSL_LIB_CTX *libctx)
 {
     OSSL_PROVIDER *p;
@@ -180,8 +197,9 @@ OSSL_PROVIDER *fake_rand_start(OSSL_LIB_CTX *libctx)
         return NULL;
 
     /* Ensure that the fake rand is initialized. */
-    if (!TEST_ptr(RAND_get0_private(libctx))
-            || !TEST_ptr(RAND_get0_public(libctx))) {
+    if (!TEST_true(check_rng(RAND_get0_primary(libctx), "primary"))
+            || !TEST_true(check_rng(RAND_get0_private(libctx), "private"))
+            || !TEST_true(check_rng(RAND_get0_public(libctx), "public"))) {
         OSSL_PROVIDER_unload(p);
         return NULL;
     }
@@ -194,8 +212,12 @@ void fake_rand_finish(OSSL_PROVIDER *p)
     OSSL_PROVIDER_unload(p);
 }
 
-void fake_rand_set_callback(int (*cb)(unsigned char *out, size_t outlen))
+void fake_rand_set_callback(EVP_RAND_CTX *rng,
+                            int (*cb)(unsigned char *out, size_t outlen,
+                                      const char *name, EVP_RAND_CTX *ctx))
 {
-    fake_rand.cb = cb;
+    FAKE_RAND *f = rng->data;
+
+    f->cb = cb;
 }