diff options
author | Pauli <ppzgs1@gmail.com> | 2021-02-27 11:55:59 +1000 |
---|---|---|
committer | Pauli <ppzgs1@gmail.com> | 2021-03-02 13:23:17 +1000 |
commit | 5a11de50a41054ed17d4280c39825a2bdaa96b96 (patch) | |
tree | b9d09e0ff74440b2d34cf5bad976b1fedf17fb39 | |
parent | 0647162f6af7c2e0edb4c770bf501ad7e0302970 (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)
-rw-r--r-- | test/testutil.h | 4 | ||||
-rw-r--r-- | test/testutil/fake_random.c | 50 |
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; } |