summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorPauli <ppzgs1@gmail.com>2021-02-27 11:55:59 +1000
committerPauli <ppzgs1@gmail.com>2021-03-02 13:23:17 +1000
commit5a11de50a41054ed17d4280c39825a2bdaa96b96 (patch)
treeb9d09e0ff74440b2d34cf5bad976b1fedf17fb39 /test
parent0647162f6af7c2e0edb4c770bf501ad7e0302970 (diff)
test: update test_random to create real contexts instead of sharing one
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/14341)
Diffstat (limited to 'test')
-rw-r--r--test/testutil.h4
-rw-r--r--test/testutil/fake_random.c50
2 files changed, 39 insertions, 15 deletions
diff --git a/test/testutil.h b/test/testutil.h
index 93c91a4a41..8989b1f735 100644
--- a/test/testutil.h
+++ b/test/testutil.h
@@ -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);
diff --git a/test/testutil/fake_random.c b/test/testutil/fake_random.c
index f8b97d2287..537755cde7 100644
--- a/test/testutil/fake_random.c
+++ b/test/testutil/fake_random.c
@@ -12,15 +12,18 @@
#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;
}