summaryrefslogtreecommitdiff
path: root/crypto
diff options
context:
space:
mode:
Diffstat (limited to 'crypto')
-rw-r--r--crypto/bio/bss_core.c14
-rw-r--r--crypto/context.c440
-rw-r--r--crypto/core_namemap.c14
-rw-r--r--crypto/encode_decode/decoder_meth.c23
-rw-r--r--crypto/encode_decode/encoder_meth.c23
-rw-r--r--crypto/evp/evp_fetch.c21
-rw-r--r--crypto/initthread.c17
-rw-r--r--crypto/property/defn_cache.c17
-rw-r--r--crypto/property/property.c20
-rw-r--r--crypto/property/property_string.c19
-rw-r--r--crypto/provider_child.c32
-rw-r--r--crypto/provider_conf.c15
-rw-r--r--crypto/provider_core.c17
-rw-r--r--crypto/rand/rand_lib.c14
-rw-r--r--crypto/self_test_core.c14
-rw-r--r--crypto/store/store_meth.c23
16 files changed, 371 insertions, 352 deletions
diff --git a/crypto/bio/bss_core.c b/crypto/bio/bss_core.c
index b78b1bedaa..66b56647f6 100644
--- a/crypto/bio/bss_core.c
+++ b/crypto/bio/bss_core.c
@@ -10,6 +10,7 @@
#include <openssl/core_dispatch.h>
#include "bio_local.h"
#include "internal/cryptlib.h"
+#include "crypto/context.h"
typedef struct {
OSSL_FUNC_BIO_read_ex_fn *c_bio_read_ex;
@@ -21,26 +22,19 @@ typedef struct {
OSSL_FUNC_BIO_free_fn *c_bio_free;
} BIO_CORE_GLOBALS;
-static void bio_core_globals_free(void *vbcg)
+void ossl_bio_core_globals_free(void *vbcg)
{
OPENSSL_free(vbcg);
}
-static void *bio_core_globals_new(OSSL_LIB_CTX *ctx)
+void *ossl_bio_core_globals_new(OSSL_LIB_CTX *ctx)
{
return OPENSSL_zalloc(sizeof(BIO_CORE_GLOBALS));
}
-static const OSSL_LIB_CTX_METHOD bio_core_globals_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- bio_core_globals_new,
- bio_core_globals_free,
-};
-
static ossl_inline BIO_CORE_GLOBALS *get_globals(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_BIO_CORE_INDEX,
- &bio_core_globals_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_BIO_CORE_INDEX);
}
static int bio_core_read_ex(BIO *bio, char *data, size_t data_len,
diff --git a/crypto/context.c b/crypto/context.c
index e84eeea596..4a79e2eec6 100644
--- a/crypto/context.c
+++ b/crypto/context.c
@@ -14,6 +14,7 @@
#include "internal/core.h"
#include "internal/bio.h"
#include "internal/provider.h"
+#include "crypto/context.h"
struct ossl_lib_ctx_onfree_list_st {
ossl_lib_ctx_onfree_fn *fn;
@@ -21,20 +22,31 @@ struct ossl_lib_ctx_onfree_list_st {
};
struct ossl_lib_ctx_st {
- CRYPTO_RWLOCK *lock;
- CRYPTO_EX_DATA data;
-
- /*
- * For most data in the OSSL_LIB_CTX we just use ex_data to store it. But
- * that doesn't work for ex_data itself - so we store that directly.
- */
+ CRYPTO_RWLOCK *lock, *rand_crngt_lock;
OSSL_EX_DATA_GLOBAL global;
- /* Map internal static indexes to dynamically created indexes */
- int dyn_indexes[OSSL_LIB_CTX_MAX_INDEXES];
-
- /* Keep a separate lock for each index */
- CRYPTO_RWLOCK *index_locks[OSSL_LIB_CTX_MAX_INDEXES];
+ void *property_string_data;
+ void *evp_method_store;
+ void *provider_store;
+ void *namemap;
+ void *property_defns;
+ void *global_properties;
+ void *drbg;
+ void *drbg_nonce;
+#ifndef FIPS_MODULE
+ void *provider_conf;
+ void *bio_core;
+ void *child_provider;
+ OSSL_METHOD_STORE *decoder_store;
+ OSSL_METHOD_STORE *encoder_store;
+ OSSL_METHOD_STORE *store_loader_store;
+ void *self_test_cb;
+#endif
+ void *rand_crngt;
+#ifdef FIPS_MODULE
+ void *thread_event_handler;
+ void *fips_prov;
+#endif
CRYPTO_RWLOCK *oncelock;
int run_once_done[OSSL_LIB_CTX_MAX_RUN_ONCE];
@@ -67,9 +79,10 @@ int ossl_lib_ctx_is_child(OSSL_LIB_CTX *ctx)
return ctx->ischild;
}
+static void context_deinit_objs(OSSL_LIB_CTX *ctx);
+
static int context_init(OSSL_LIB_CTX *ctx)
{
- size_t i;
int exdata_done = 0;
ctx->lock = CRYPTO_THREAD_lock_new();
@@ -80,48 +93,246 @@ static int context_init(OSSL_LIB_CTX *ctx)
if (ctx->oncelock == NULL)
goto err;
- for (i = 0; i < OSSL_LIB_CTX_MAX_INDEXES; i++) {
- ctx->index_locks[i] = CRYPTO_THREAD_lock_new();
- ctx->dyn_indexes[i] = -1;
- if (ctx->index_locks[i] == NULL)
- goto err;
- }
+ ctx->rand_crngt_lock = CRYPTO_THREAD_lock_new();
+ if (ctx->rand_crngt_lock == NULL)
+ goto err;
- /* OSSL_LIB_CTX is built on top of ex_data so we initialise that directly */
+ /* Initialize ex_data. */
if (!ossl_do_ex_data_init(ctx))
goto err;
exdata_done = 1;
- if (!ossl_crypto_new_ex_data_ex(ctx, CRYPTO_EX_INDEX_OSSL_LIB_CTX, NULL,
- &ctx->data))
+ /* P2. We want evp_method_store to be cleaned up before the provider store */
+ ctx->evp_method_store = ossl_method_store_new(ctx);
+ if (ctx->evp_method_store == NULL)
+ goto err;
+
+#ifndef FIPS_MODULE
+ /* P2. Must be freed before the provider store is freed */
+ ctx->provider_conf = ossl_prov_conf_ctx_new(ctx);
+ if (ctx->provider_conf == NULL)
+ goto err;
+#endif
+
+ /* P2. */
+ ctx->drbg = ossl_rand_ctx_new(ctx);
+ if (ctx->drbg == NULL)
+ goto err;
+
+#ifndef FIPS_MODULE
+ /* P2. We want decoder_store to be cleaned up before the provider store */
+ ctx->decoder_store = ossl_method_store_new(ctx);
+ if (ctx->decoder_store == NULL)
+ goto err;
+
+ /* P2. We want encoder_store to be cleaned up before the provider store */
+ ctx->encoder_store = ossl_method_store_new(ctx);
+ if (ctx->encoder_store == NULL)
+ goto err;
+
+ /* P2. We want loader_store to be cleaned up before the provider store */
+ ctx->store_loader_store = ossl_method_store_new(ctx);
+ if (ctx->store_loader_store == NULL)
+ goto err;
+#endif
+
+ /* P1. Needs to be freed before the child provider data is freed */
+ ctx->provider_store = ossl_provider_store_new(ctx);
+ if (ctx->provider_store == NULL)
+ goto err;
+
+ /* Default priority. */
+ ctx->property_string_data = ossl_property_string_data_new(ctx);
+ if (ctx->property_string_data == NULL)
goto err;
+ ctx->namemap = ossl_stored_namemap_new(ctx);
+ if (ctx->namemap == NULL)
+ goto err;
+
+ ctx->property_defns = ossl_property_defns_new(ctx);
+ if (ctx->property_defns == NULL)
+ goto err;
+
+ ctx->global_properties = ossl_ctx_global_properties_new(ctx);
+ if (ctx->global_properties == NULL)
+ goto err;
+
+#ifndef FIPS_MODULE
+ ctx->bio_core = ossl_bio_core_globals_new(ctx);
+ if (ctx->bio_core == NULL)
+ goto err;
+#endif
+
+ ctx->drbg_nonce = ossl_prov_drbg_nonce_ctx_new(ctx);
+ if (ctx->drbg_nonce == NULL)
+ goto err;
+
+#ifndef FIPS_MODULE
+ ctx->self_test_cb = ossl_self_test_set_callback_new(ctx);
+ if (ctx->self_test_cb == NULL)
+ goto err;
+#endif
+
+#ifdef FIPS_MODULE
+ ctx->thread_event_handler = ossl_thread_event_ctx_new(ctx);
+ if (ctx->thread_event_handler == NULL)
+ goto err;
+
+ ctx->fips_prov = ossl_fips_prov_ossl_ctx_new(ctx);
+ if (ctx->fips_prov == NULL)
+ goto err;
+#endif
+
+ /* Low priority. */
+#ifndef FIPS_MODULE
+ ctx->child_provider = ossl_child_prov_ctx_new(ctx);
+ if (ctx->child_provider == NULL)
+ goto err;
+#endif
+
/* Everything depends on properties, so we also pre-initialise that */
if (!ossl_property_parse_init(ctx))
goto err;
return 1;
+
err:
+ context_deinit_objs(ctx);
+
if (exdata_done)
ossl_crypto_cleanup_all_ex_data_int(ctx);
- for (i = 0; i < OSSL_LIB_CTX_MAX_INDEXES; i++)
- CRYPTO_THREAD_lock_free(ctx->index_locks[i]);
+
+ CRYPTO_THREAD_lock_free(ctx->rand_crngt_lock);
CRYPTO_THREAD_lock_free(ctx->oncelock);
CRYPTO_THREAD_lock_free(ctx->lock);
memset(ctx, '\0', sizeof(*ctx));
return 0;
}
+static void context_deinit_objs(OSSL_LIB_CTX *ctx)
+{
+ /* P2. We want evp_method_store to be cleaned up before the provider store */
+ if (ctx->evp_method_store != NULL) {
+ ossl_method_store_free(ctx->evp_method_store);
+ ctx->evp_method_store = NULL;
+ }
+
+ /* P2. */
+ if (ctx->drbg != NULL) {
+ ossl_rand_ctx_free(ctx->drbg);
+ ctx->drbg = NULL;
+ }
+
+#ifndef FIPS_MODULE
+ /* P2. */
+ if (ctx->provider_conf != NULL) {
+ ossl_prov_conf_ctx_free(ctx->provider_conf);
+ ctx->provider_conf = NULL;
+ }
+
+ /* P2. We want decoder_store to be cleaned up before the provider store */
+ if (ctx->decoder_store != NULL) {
+ ossl_method_store_free(ctx->decoder_store);
+ ctx->decoder_store = NULL;
+ }
+
+ /* P2. We want encoder_store to be cleaned up before the provider store */
+ if (ctx->encoder_store != NULL) {
+ ossl_method_store_free(ctx->encoder_store);
+ ctx->encoder_store = NULL;
+ }
+
+ /* P2. We want loader_store to be cleaned up before the provider store */
+ if (ctx->store_loader_store != NULL) {
+ ossl_method_store_free(ctx->store_loader_store);
+ ctx->store_loader_store = NULL;
+ }
+#endif
+
+ /* P1. Needs to be freed before the child provider data is freed */
+ if (ctx->provider_store != NULL) {
+ ossl_provider_store_free(ctx->provider_store);
+ ctx->provider_store = NULL;
+ }
+
+ /* Default priority. */
+ if (ctx->property_string_data != NULL) {
+ ossl_property_string_data_free(ctx->property_string_data);
+ ctx->property_string_data = NULL;
+ }
+
+ if (ctx->namemap != NULL) {
+ ossl_stored_namemap_free(ctx->namemap);
+ ctx->namemap = NULL;
+ }
+
+ if (ctx->property_defns != NULL) {
+ ossl_property_defns_free(ctx->property_defns);
+ ctx->property_defns = NULL;
+ }
+
+ if (ctx->global_properties != NULL) {
+ ossl_ctx_global_properties_free(ctx->global_properties);
+ ctx->global_properties = NULL;
+ }
+
+#ifndef FIPS_MODULE
+ if (ctx->bio_core != NULL) {
+ ossl_bio_core_globals_free(ctx->bio_core);
+ ctx->bio_core = NULL;
+ }
+#endif
+
+ if (ctx->drbg_nonce != NULL) {
+ ossl_prov_drbg_nonce_ctx_free(ctx->drbg_nonce);
+ ctx->drbg_nonce = NULL;
+ }
+
+#ifndef FIPS_MODULE
+ if (ctx->self_test_cb != NULL) {
+ ossl_self_test_set_callback_free(ctx->self_test_cb);
+ ctx->self_test_cb = NULL;
+ }
+#endif
+
+ if (ctx->rand_crngt != NULL) {
+ ossl_rand_crng_ctx_free(ctx->rand_crngt);
+ ctx->rand_crngt = NULL;
+ }
+
+#ifdef FIPS_MODULE
+ if (ctx->thread_event_handler != NULL) {
+ ossl_thread_event_ctx_free(ctx->thread_event_handler);
+ ctx->thread_event_handler = NULL;
+ }
+
+ if (ctx->fips_prov != NULL) {
+ ossl_fips_prov_ossl_ctx_free(ctx->fips_prov);
+ ctx->fips_prov = NULL;
+ }
+#endif
+
+ /* Low priority. */
+#ifndef FIPS_MODULE
+ if (ctx->child_provider != NULL) {
+ ossl_child_prov_ctx_free(ctx->child_provider);
+ ctx->child_provider = NULL;
+ }
+#endif
+}
+
static int context_deinit(OSSL_LIB_CTX *ctx)
{
struct ossl_lib_ctx_onfree_list_st *tmp, *onfree;
- int i;
if (ctx == NULL)
return 1;
ossl_ctx_thread_stop(ctx);
+ context_deinit_objs(ctx);
+
onfree = ctx->onfreelist;
while (onfree != NULL) {
onfree->fn(ctx);
@@ -129,13 +340,14 @@ static int context_deinit(OSSL_LIB_CTX *ctx)
onfree = onfree->next;
OPENSSL_free(tmp);
}
- CRYPTO_free_ex_data(CRYPTO_EX_INDEX_OSSL_LIB_CTX, NULL, &ctx->data);
+
ossl_crypto_cleanup_all_ex_data_int(ctx);
- for (i = 0; i < OSSL_LIB_CTX_MAX_INDEXES; i++)
- CRYPTO_THREAD_lock_free(ctx->index_locks[i]);
+ CRYPTO_THREAD_lock_free(ctx->rand_crngt_lock);
CRYPTO_THREAD_lock_free(ctx->oncelock);
CRYPTO_THREAD_lock_free(ctx->lock);
+ ctx->rand_crngt_lock = NULL;
+ ctx->oncelock = NULL;
ctx->lock = NULL;
return 1;
}
@@ -299,127 +511,89 @@ int ossl_lib_ctx_is_global_default(OSSL_LIB_CTX *ctx)
return 0;
}
-static void ossl_lib_ctx_generic_new(void *parent_ign, void *ptr_ign,
- CRYPTO_EX_DATA *ad, int index,
- long argl_ign, void *argp)
+void *ossl_lib_ctx_get_data(OSSL_LIB_CTX *ctx, int index)
{
- const OSSL_LIB_CTX_METHOD *meth = argp;
- OSSL_LIB_CTX *ctx = ossl_crypto_ex_data_get_ossl_lib_ctx(ad);
- void *ptr = meth->new_func(ctx);
-
- if (ptr != NULL) {
- if (!CRYPTO_THREAD_write_lock(ctx->lock))
- /*
- * Can't return something, so best to hope that something will
- * fail later. :(
- */
- return;
- CRYPTO_set_ex_data(ad, index, ptr);
- CRYPTO_THREAD_unlock(ctx->lock);
- }
-}
-static void ossl_lib_ctx_generic_free(void *parent_ign, void *ptr,
- CRYPTO_EX_DATA *ad, int index,
- long argl_ign, void *argp)
-{
- const OSSL_LIB_CTX_METHOD *meth = argp;
-
- meth->free_func(ptr);
-}
-
-static int ossl_lib_ctx_init_index(OSSL_LIB_CTX *ctx, int static_index,
- const OSSL_LIB_CTX_METHOD *meth)
-{
- int idx;
+ void *p;
ctx = ossl_lib_ctx_get_concrete(ctx);
if (ctx == NULL)
- return 0;
+ return NULL;
- idx = ossl_crypto_get_ex_new_index_ex(ctx, CRYPTO_EX_INDEX_OSSL_LIB_CTX, 0,
- (void *)meth,
- ossl_lib_ctx_generic_new,
- NULL, ossl_lib_ctx_generic_free,
- meth->priority);
- if (idx < 0)
- return 0;
+ switch (index) {
+ case OSSL_LIB_CTX_PROPERTY_STRING_INDEX:
+ return ctx->property_string_data;
+ case OSSL_LIB_CTX_EVP_METHOD_STORE_INDEX:
+ return ctx->evp_method_store;
+ case OSSL_LIB_CTX_PROVIDER_STORE_INDEX:
+ return ctx->provider_store;
+ case OSSL_LIB_CTX_NAMEMAP_INDEX:
+ return ctx->namemap;
+ case OSSL_LIB_CTX_PROPERTY_DEFN_INDEX:
+ return ctx->property_defns;
+ case OSSL_LIB_CTX_GLOBAL_PROPERTIES:
+ return ctx->global_properties;
+ case OSSL_LIB_CTX_DRBG_INDEX:
+ return ctx->drbg;
+ case OSSL_LIB_CTX_DRBG_NONCE_INDEX:
+ return ctx->drbg_nonce;
+#ifndef FIPS_MODULE
+ case OSSL_LIB_CTX_PROVIDER_CONF_INDEX:
+ return ctx->provider_conf;
+ case OSSL_LIB_CTX_BIO_CORE_INDEX:
+ return ctx->bio_core;
+ case OSSL_LIB_CTX_CHILD_PROVIDER_INDEX:
+ return ctx->child_provider;
+ case OSSL_LIB_CTX_DECODER_STORE_INDEX:
+ return ctx->decoder_store;
+ case OSSL_LIB_CTX_ENCODER_STORE_INDEX:
+ return ctx->encoder_store;
+ case OSSL_LIB_CTX_STORE_LOADER_STORE_INDEX:
+ return ctx->store_loader_store;
+ case OSSL_LIB_CTX_SELF_TEST_CB_INDEX:
+ return ctx->self_test_cb;
+#endif
- ctx->dyn_indexes[static_index] = idx;
- return 1;
-}
+ case OSSL_LIB_CTX_RAND_CRNGT_INDEX: {
+
+ /*
+ * rand_crngt must be lazily initialized because it calls into
+ * libctx, so must not be called from context_init, else a deadlock
+ * will occur.
+ *
+ * We use a separate lock because code called by the instantiation
+ * of rand_crngt is liable to try and take the libctx lock.
+ */
+ if (CRYPTO_THREAD_read_lock(ctx->rand_crngt_lock) != 1)
+ return NULL;
-void *ossl_lib_ctx_get_data(OSSL_LIB_CTX *ctx, int index,
- const OSSL_LIB_CTX_METHOD *meth)
-{
- void *data = NULL;
- int dynidx;
+ if (ctx->rand_crngt == NULL) {
+ CRYPTO_THREAD_unlock(ctx->rand_crngt_lock);
- ctx = ossl_lib_ctx_get_concrete(ctx);
- if (ctx == NULL)
- return NULL;
-
- if (!CRYPTO_THREAD_read_lock(ctx->lock))
- return NULL;
- dynidx = ctx->dyn_indexes[index];
- CRYPTO_THREAD_unlock(ctx->lock);
+ if (CRYPTO_THREAD_write_lock(ctx->rand_crngt_lock) != 1)
+ return NULL;
- if (dynidx != -1) {
- if (!CRYPTO_THREAD_read_lock(ctx->index_locks[index]))
- return NULL;
- if (!CRYPTO_THREAD_read_lock(ctx->lock)) {
- CRYPTO_THREAD_unlock(ctx->index_locks[index]);
- return NULL;
+ if (ctx->rand_crngt == NULL)
+ ctx->rand_crngt = ossl_rand_crng_ctx_new(ctx);
}
- data = CRYPTO_get_ex_data(&ctx->data, dynidx);
- CRYPTO_THREAD_unlock(ctx->lock);
- CRYPTO_THREAD_unlock(ctx->index_locks[index]);
- return data;
- }
- if (!CRYPTO_THREAD_write_lock(ctx->index_locks[index]))
- return NULL;
- if (!CRYPTO_THREAD_write_lock(ctx->lock)) {
- CRYPTO_THREAD_unlock(ctx->index_locks[index]);
- return NULL;
- }
+ p = ctx->rand_crngt;
- dynidx = ctx->dyn_indexes[index];
- if (dynidx != -1) {
- data = CRYPTO_get_ex_data(&ctx->data, dynidx);
- CRYPTO_THREAD_unlock(ctx->lock);
- CRYPTO_THREAD_unlock(ctx->index_locks[index]);
- return data;
- }
+ CRYPTO_THREAD_unlock(ctx->rand_crngt_lock);
- if (!ossl_lib_ctx_init_index(ctx, index, meth)) {
- CRYPTO_THREAD_unlock(ctx->lock);
- CRYPTO_THREAD_unlock(ctx->index_locks[index]);
- return NULL;
+ return p;
}
- CRYPTO_THREAD_unlock(ctx->lock);
-
- /*
- * The alloc call ensures there's a value there. We release the ctx->lock
- * for this, because the allocation itself may recursively call
- * ossl_lib_ctx_get_data for other indexes (never this one). The allocation
- * will itself acquire the ctx->lock when it actually comes to store the
- * allocated data (see ossl_lib_ctx_generic_new() above). We call
- * ossl_crypto_alloc_ex_data_intern() here instead of CRYPTO_alloc_ex_data().
- * They do the same thing except that the latter calls CRYPTO_get_ex_data()
- * as well - which we must not do without holding the ctx->lock.
- */
- if (ossl_crypto_alloc_ex_data_intern(CRYPTO_EX_INDEX_OSSL_LIB_CTX, NULL,
- &ctx->data, ctx->dyn_indexes[index])) {
- if (!CRYPTO_THREAD_read_lock(ctx->lock))
- goto end;
- data = CRYPTO_get_ex_data(&ctx->data, ctx->dyn_indexes[index]);
- CRYPTO_THREAD_unlock(ctx->lock);
- }
+#ifdef FIPS_MODULE
+ case OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX:
+ return ctx->thread_event_handler;
-end:
- CRYPTO_THREAD_unlock(ctx->index_locks[index]);
- return data;
+ case OSSL_LIB_CTX_FIPS_PROV_INDEX:
+ return ctx->fips_prov;
+#endif
+
+ default:
+ return NULL;
+ }
}
OSSL_EX_DATA_GLOBAL *ossl_lib_ctx_get_ex_data_global(OSSL_LIB_CTX *ctx)
diff --git a/crypto/core_namemap.c b/crypto/core_namemap.c
index f058e629f3..d8de0af3ff 100644
--- a/crypto/core_namemap.c
+++ b/crypto/core_namemap.c
@@ -13,6 +13,7 @@
#include "crypto/lhash.h" /* ossl_lh_strcasehash */
#include "internal/tsan_assist.h"
#include "internal/sizes.h"
+#include "crypto/context.h"
/*-
* The namenum entry
@@ -61,7 +62,7 @@ static void namenum_free(NAMENUM_ENTRY *n)
/* OSSL_LIB_CTX_METHOD functions for a namemap stored in a library context */
-static void *stored_namemap_new(OSSL_LIB_CTX *libctx)
+void *ossl_stored_namemap_new(OSSL_LIB_CTX *libctx)
{
OSSL_NAMEMAP *namemap = ossl_namemap_new();
@@ -71,7 +72,7 @@ static void *stored_namemap_new(OSSL_LIB_CTX *libctx)
return namemap;
}
-static void stored_namemap_free(void *vnamemap)
+void ossl_stored_namemap_free(void *vnamemap)
{
OSSL_NAMEMAP *namemap = vnamemap;
@@ -82,12 +83,6 @@ static void stored_namemap_free(void *vnamemap)
}
}
-static const OSSL_LIB_CTX_METHOD stored_namemap_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- stored_namemap_new,
- stored_namemap_free,
-};
-
/*-
* API functions
* =============
@@ -469,8 +464,7 @@ OSSL_NAMEMAP *ossl_namemap_stored(OSSL_LIB_CTX *libctx)
int nms;
#endif
OSSL_NAMEMAP *namemap =
- ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_NAMEMAP_INDEX,
- &stored_namemap_method);
+ ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_NAMEMAP_INDEX);
if (namemap == NULL)
return NULL;
diff --git a/crypto/encode_decode/decoder_meth.c b/crypto/encode_decode/decoder_meth.c
index c469f84558..2a8b044f78 100644
--- a/crypto/encode_decode/decoder_meth.c
+++ b/crypto/encode_decode/decoder_meth.c
@@ -17,6 +17,7 @@
#include "internal/provider.h"
#include "crypto/decoder.h"
#include "encoder_local.h"
+#include "crypto/context.h"
/*
* Decoder can have multiple names, separated with colons in a name string
@@ -65,25 +66,6 @@ void OSSL_DECODER_free(OSSL_DECODER *decoder)
OPENSSL_free(decoder);
}
-/* Permanent decoder method store, constructor and destructor */
-static void decoder_store_free(void *vstore)
-{
- ossl_method_store_free(vstore);
-}
-
-static void *decoder_store_new(OSSL_LIB_CTX *ctx)
-{
- return ossl_method_store_new(ctx);
-}
-
-
-static const OSSL_LIB_CTX_METHOD decoder_store_method = {
- /* We want decoder_store to be cleaned up before the provider store */
- OSSL_LIB_CTX_METHOD_PRIORITY_2,
- decoder_store_new,
- decoder_store_free,
-};
-
/* Data to be passed through ossl_method_construct() */
struct decoder_data_st {
OSSL_LIB_CTX *libctx;
@@ -120,8 +102,7 @@ static void dealloc_tmp_decoder_store(void *store)
/* Get the permanent decoder store */
static OSSL_METHOD_STORE *get_decoder_store(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_DECODER_STORE_INDEX,
- &decoder_store_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_DECODER_STORE_INDEX);
}
/* Get decoder methods from a store, or put one in */
diff --git a/crypto/encode_decode/encoder_meth.c b/crypto/encode_decode/encoder_meth.c
index 57b2f998e2..67bfcc23fe 100644
--- a/crypto/encode_decode/encoder_meth.c
+++ b/crypto/encode_decode/encoder_meth.c
@@ -17,6 +17,7 @@
#include "internal/provider.h"
#include "crypto/encoder.h"
#include "encoder_local.h"
+#include "crypto/context.h"
/*
* Encoder can have multiple names, separated with colons in a name string
@@ -65,25 +66,6 @@ void OSSL_ENCODER_free(OSSL_ENCODER *encoder)
OPENSSL_free(encoder);
}
-/* Permanent encoder method store, constructor and destructor */
-static void encoder_store_free(void *vstore)
-{
- ossl_method_store_free(vstore);
-}
-
-static void *encoder_store_new(OSSL_LIB_CTX *ctx)
-{
- return ossl_method_store_new(ctx);
-}
-
-
-static const OSSL_LIB_CTX_METHOD encoder_store_method = {
- /* We want encoder_store to be cleaned up before the provider store */
- OSSL_LIB_CTX_METHOD_PRIORITY_2,
- encoder_store_new,
- encoder_store_free,
-};
-
/* Data to be passed through ossl_method_construct() */
struct encoder_data_st {
OSSL_LIB_CTX *libctx;
@@ -120,8 +102,7 @@ static void dealloc_tmp_encoder_store(void *store)
/* Get the permanent encoder store */
static OSSL_METHOD_STORE *get_encoder_store(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_ENCODER_STORE_INDEX,
- &encoder_store_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_ENCODER_STORE_INDEX);
}
/* Get encoder methods from a store, or put one in */
diff --git a/crypto/evp/evp_fetch.c b/crypto/evp/evp_fetch.c
index 3066e0b0d4..06839777f0 100644
--- a/crypto/evp/evp_fetch.c
+++ b/crypto/evp/evp_fetch.c
@@ -23,24 +23,6 @@
#define NAME_SEPARATOR ':'
-static void evp_method_store_free(void *vstore)
-{
- ossl_method_store_free(vstore);
-}
-
-static void *evp_method_store_new(OSSL_LIB_CTX *ctx)
-{
- return ossl_method_store_new(ctx);
-}
-
-
-static const OSSL_LIB_CTX_METHOD evp_method_store_method = {
- /* We want evp_method_store to be cleaned up before the provider store */
- OSSL_LIB_CTX_METHOD_PRIORITY_2,
- evp_method_store_new,
- evp_method_store_free,
-};
-
/* Data to be passed through ossl_method_construct() */
struct evp_method_data_st {
OSSL_LIB_CTX *libctx;
@@ -79,8 +61,7 @@ static void *get_tmp_evp_method_store(void *data)
static OSSL_METHOD_STORE *get_evp_method_store(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_EVP_METHOD_STORE_INDEX,
- &evp_method_store_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_EVP_METHOD_STORE_INDEX);
}
/*
diff --git a/crypto/initthread.c b/crypto/initthread.c
index 1bdaeda9fc..ee57d14466 100644
--- a/crypto/initthread.c
+++ b/crypto/initthread.c
@@ -12,6 +12,7 @@
#include "crypto/cryptlib.h"
#include "prov/providercommon.h"
#include "internal/thread_once.h"
+#include "crypto/context.h"
#ifdef FIPS_MODULE
#include "prov/provider_ctx.h"
@@ -248,7 +249,7 @@ void ossl_ctx_thread_stop(OSSL_LIB_CTX *ctx)
#else
-static void *thread_event_ossl_ctx_new(OSSL_LIB_CTX *libctx)
+void *ossl_thread_event_ctx_new(OSSL_LIB_CTX *libctx)
{
THREAD_EVENT_HANDLER **hands = NULL;
CRYPTO_THREAD_LOCAL *tlocal = OPENSSL_zalloc(sizeof(*tlocal));
@@ -274,17 +275,11 @@ static void *thread_event_ossl_ctx_new(OSSL_LIB_CTX *libctx)
return NULL;
}
-static void thread_event_ossl_ctx_free(void *tlocal)
+void ossl_thread_event_ctx_free(void *tlocal)
{
OPENSSL_free(tlocal);
}
-static const OSSL_LIB_CTX_METHOD thread_event_ossl_ctx_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- thread_event_ossl_ctx_new,
- thread_event_ossl_ctx_free,
-};
-
static void ossl_arg_thread_stop(void *arg)
{
ossl_ctx_thread_stop((OSSL_LIB_CTX *)arg);
@@ -294,8 +289,7 @@ void ossl_ctx_thread_stop(OSSL_LIB_CTX *ctx)
{
THREAD_EVENT_HANDLER **hands;
CRYPTO_THREAD_LOCAL *local
- = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX,
- &thread_event_ossl_ctx_method);
+ = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX);
if (local == NULL)
return;
@@ -363,8 +357,7 @@ int ossl_init_thread_start(const void *index, void *arg,
* OSSL_LIB_CTX gets informed about thread stop events individually.
*/
CRYPTO_THREAD_LOCAL *local
- = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX,
- &thread_event_ossl_ctx_method);
+ = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX);
#else
/*
* Outside of FIPS mode the list of THREAD_EVENT_HANDLERs is unique per
diff --git a/crypto/property/defn_cache.c b/crypto/property/defn_cache.c
index 8007599526..ed2a675455 100644
--- a/crypto/property/defn_cache.c
+++ b/crypto/property/defn_cache.c
@@ -15,6 +15,7 @@
#include "internal/property.h"
#include "internal/core.h"
#include "property_local.h"
+#include "crypto/context.h"
/*
* Implement a property definition cache.
@@ -47,7 +48,7 @@ static void property_defn_free(PROPERTY_DEFN_ELEM *elem)
OPENSSL_free(elem);
}
-static void property_defns_free(void *vproperty_defns)
+void ossl_property_defns_free(void *vproperty_defns)
{
LHASH_OF(PROPERTY_DEFN_ELEM) *property_defns = vproperty_defns;
@@ -58,24 +59,17 @@ static void property_defns_free(void *vproperty_defns)
}
}
-static void *property_defns_new(OSSL_LIB_CTX *ctx) {
+void *ossl_property_defns_new(OSSL_LIB_CTX *ctx) {
return lh_PROPERTY_DEFN_ELEM_new(&property_defn_hash, &property_defn_cmp);
}
-static const OSSL_LIB_CTX_METHOD property_defns_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- property_defns_new,
- property_defns_free,
-};
-
OSSL_PROPERTY_LIST *ossl_prop_defn_get(OSSL_LIB_CTX *ctx, const char *prop)
{
PROPERTY_DEFN_ELEM elem, *r;
LHASH_OF(PROPERTY_DEFN_ELEM) *property_defns;
property_defns = ossl_lib_ctx_get_data(ctx,
- OSSL_LIB_CTX_PROPERTY_DEFN_INDEX,
- &property_defns_method);
+ OSSL_LIB_CTX_PROPERTY_DEFN_INDEX);
if (property_defns == NULL || !ossl_lib_ctx_read_lock(ctx))
return NULL;
@@ -94,8 +88,7 @@ int ossl_prop_defn_set(OSSL_LIB_CTX *ctx, const char *prop,
int res = 1;
property_defns = ossl_lib_ctx_get_data(ctx,
- OSSL_LIB_CTX_PROPERTY_DEFN_INDEX,
- &property_defns_method);
+ OSSL_LIB_CTX_PROPERTY_DEFN_INDEX);
if (property_defns == NULL)
return 0;
diff --git a/crypto/property/property.c b/crypto/property/property.c
index 2967b80a09..728b78be50 100644
--- a/crypto/property/property.c
+++ b/crypto/property/property.c
@@ -22,6 +22,7 @@
#include "crypto/lhash.h"
#include "crypto/sparse_array.h"
#include "property_local.h"
+#include "crypto/context.h"
/*
* The number of elements in the query cache before we initiate a flush.
@@ -85,7 +86,7 @@ typedef struct ossl_global_properties_st {
static void ossl_method_cache_flush(OSSL_METHOD_STORE *store, int nid);
/* Global properties are stored per library context */
-static void ossl_ctx_global_properties_free(void *vglobp)
+void ossl_ctx_global_properties_free(void *vglobp)
{
OSSL_GLOBAL_PROPERTIES *globp = vglobp;
@@ -95,17 +96,11 @@ static void ossl_ctx_global_properties_free(void *vglobp)
}
}
-static void *ossl_ctx_global_properties_new(OSSL_LIB_CTX *ctx)
+void *ossl_ctx_global_properties_new(OSSL_LIB_CTX *ctx)
{
return OPENSSL_zalloc(sizeof(OSSL_GLOBAL_PROPERTIES));
}
-static const OSSL_LIB_CTX_METHOD ossl_ctx_global_properties_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- ossl_ctx_global_properties_new,
- ossl_ctx_global_properties_free,
-};
-
OSSL_PROPERTY_LIST **ossl_ctx_global_properties(OSSL_LIB_CTX *libctx,
int loadconfig)
{
@@ -115,8 +110,7 @@ OSSL_PROPERTY_LIST **ossl_ctx_global_properties(OSSL_LIB_CTX *libctx,
if (loadconfig && !OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL))
return NULL;
#endif
- globp = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_GLOBAL_PROPERTIES,
- &ossl_ctx_global_properties_method);
+ globp = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_GLOBAL_PROPERTIES);
return globp != NULL ? &globp->list : NULL;
}
@@ -125,8 +119,7 @@ OSSL_PROPERTY_LIST **ossl_ctx_global_properties(OSSL_LIB_CTX *libctx,
int ossl_global_properties_no_mirrored(OSSL_LIB_CTX *libctx)
{
OSSL_GLOBAL_PROPERTIES *globp
- = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_GLOBAL_PROPERTIES,
- &ossl_ctx_global_properties_method);
+ = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_GLOBAL_PROPERTIES);
return globp != NULL && globp->no_mirrored ? 1 : 0;
}
@@ -134,8 +127,7 @@ int ossl_global_properties_no_mirrored(OSSL_LIB_CTX *libctx)
void ossl_global_properties_stop_mirroring(OSSL_LIB_CTX *libctx)
{
OSSL_GLOBAL_PROPERTIES *globp
- = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_GLOBAL_PROPERTIES,
- &ossl_ctx_global_properties_method);
+ = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_GLOBAL_PROPERTIES);
if (globp != NULL)
globp->no_mirrored = 1;
diff --git a/crypto/property/property_string.c b/crypto/property/property_string.c
index 9191453d5a..eb48052508 100644
--- a/crypto/property/property_string.c
+++ b/crypto/property/property_string.c
@@ -13,6 +13,7 @@
#include <openssl/lhash.h>
#include "crypto/lhash.h"
#include "property_local.h"
+#include "crypto/context.h"
/*
* Property strings are a consolidation of all strings seen by the property
@@ -72,7 +73,7 @@ static void property_table_free(PROP_TABLE **pt)
}
}
-static void property_string_data_free(void *vpropdata)
+void ossl_property_string_data_free(void *vpropdata)
{
PROPERTY_STRING_DATA *propdata = vpropdata;
@@ -92,7 +93,7 @@ static void property_string_data_free(void *vpropdata)
OPENSSL_free(propdata);
}
-static void *property_string_data_new(OSSL_LIB_CTX *ctx) {
+void *ossl_property_string_data_new(OSSL_LIB_CTX *ctx) {
PROPERTY_STRING_DATA *propdata = OPENSSL_zalloc(sizeof(*propdata));
if (propdata == NULL)
@@ -114,18 +115,12 @@ static void *property_string_data_new(OSSL_LIB_CTX *ctx) {
#endif
|| propdata->prop_names == NULL
|| propdata->prop_values == NULL) {
- property_string_data_free(propdata);
+ ossl_property_string_data_free(propdata);
return NULL;
}
return propdata;
}
-static const OSSL_LIB_CTX_METHOD property_string_data_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- property_string_data_new,
- property_string_data_free,
-};
-
static PROPERTY_STRING *new_property_string(const char *s,
OSSL_PROPERTY_IDX *pidx)
{
@@ -151,8 +146,7 @@ static OSSL_PROPERTY_IDX ossl_property_string(OSSL_LIB_CTX *ctx, int name,
PROP_TABLE *t;
OSSL_PROPERTY_IDX *pidx;
PROPERTY_STRING_DATA *propdata
- = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_PROPERTY_STRING_INDEX,
- &property_string_data_method);
+ = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_PROPERTY_STRING_INDEX);
if (propdata == NULL)
return 0;
@@ -224,8 +218,7 @@ static const char *ossl_property_str(int name, OSSL_LIB_CTX *ctx,
{
const char *r;
PROPERTY_STRING_DATA *propdata
- = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_PROPERTY_STRING_INDEX,
- &property_string_data_method);
+ = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_PROPERTY_STRING_INDEX);
if (propdata == NULL)
return NULL;
diff --git a/crypto/provider_child.c b/crypto/provider_child.c
index 977ea4db3b..5bf3ad3a3d 100644
--- a/crypto/provider_child.c
+++ b/crypto/provider_child.c
@@ -16,6 +16,7 @@
#include "internal/provider.h"
#include "internal/cryptlib.h"
#include "crypto/evp.h"
+#include "crypto/context.h"
DEFINE_STACK_OF(OSSL_PROVIDER)
@@ -33,12 +34,12 @@ struct child_prov_globals {
OSSL_FUNC_provider_free_fn *c_prov_free;
};
-static void *child_prov_ossl_ctx_new(OSSL_LIB_CTX *libctx)
+void *ossl_child_prov_ctx_new(OSSL_LIB_CTX *libctx)
{
return OPENSSL_zalloc(sizeof(struct child_prov_globals));
}
-static void child_prov_ossl_ctx_free(void *vgbl)
+void ossl_child_prov_ctx_free(void *vgbl)
{
struct child_prov_globals *gbl = vgbl;
@@ -46,12 +47,6 @@ static void child_prov_ossl_ctx_free(void *vgbl)
OPENSSL_free(gbl);
}
-static const OSSL_LIB_CTX_METHOD child_prov_ossl_ctx_method = {
- OSSL_LIB_CTX_METHOD_LOW_PRIORITY,
- child_prov_ossl_ctx_new,
- child_prov_ossl_ctx_free,
-};
-
static OSSL_provider_init_fn ossl_child_provider_init;
static int ossl_child_provider_init(const OSSL_CORE_HANDLE *handle,
@@ -84,8 +79,7 @@ static int ossl_child_provider_init(const OSSL_CORE_HANDLE *handle,
*/
ctx = (OSSL_LIB_CTX *)c_get_libctx(handle);
- gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return 0;
@@ -103,8 +97,7 @@ static int provider_create_child_cb(const OSSL_CORE_HANDLE *prov, void *cbdata)
OSSL_PROVIDER *cprov;
int ret = 0;
- gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return 0;
@@ -166,8 +159,7 @@ static int provider_remove_child_cb(const OSSL_CORE_HANDLE *prov, void *cbdata)
const char *provname;
OSSL_PROVIDER *cprov;
- gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return 0;
@@ -203,8 +195,7 @@ int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx,
if (ctx == NULL)
return 0;
- gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return 0;
@@ -271,8 +262,7 @@ int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx,
void ossl_provider_deinit_child(OSSL_LIB_CTX *ctx)
{
struct child_prov_globals *gbl
- = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return;
@@ -284,8 +274,7 @@ int ossl_provider_up_ref_parent(OSSL_PROVIDER *prov, int activate)
struct child_prov_globals *gbl;
gbl = ossl_lib_ctx_get_data(ossl_provider_libctx(prov),
- OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return 0;
@@ -297,8 +286,7 @@ int ossl_provider_free_parent(OSSL_PROVIDER *prov, int deactivate)
struct child_prov_globals *gbl;
gbl = ossl_lib_ctx_get_data(ossl_provider_libctx(prov),
- OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
+ OSSL_LIB_CTX_CHILD_PROVIDER_INDEX);
if (gbl == NULL)
return 0;
diff --git a/crypto/provider_conf.c b/crypto/provider_conf.c
index 6a62f0df60..e3b576d6c2 100644
--- a/crypto/provider_conf.c
+++ b/crypto/provider_conf.c
@@ -16,6 +16,7 @@
#include "internal/provider.h"
#include "internal/cryptlib.h"
#include "provider_local.h"
+#include "crypto/context.h"
DEFINE_STACK_OF(OSSL_PROVIDER)
@@ -26,7 +27,7 @@ typedef struct {
STACK_OF(OSSL_PROVIDER) *activated_providers;
} PROVIDER_CONF_GLOBAL;
-static void *prov_conf_ossl_ctx_new(OSSL_LIB_CTX *libctx)
+void *ossl_prov_conf_ctx_new(OSSL_LIB_CTX *libctx)
{
PROVIDER_CONF_GLOBAL *pcgbl = OPENSSL_zalloc(sizeof(*pcgbl));
@@ -42,7 +43,7 @@ static void *prov_conf_ossl_ctx_new(OSSL_LIB_CTX *libctx)
return pcgbl;
}
-static void prov_conf_ossl_ctx_free(void *vpcgbl)
+void ossl_prov_conf_ctx_free(void *vpcgbl)
{
PROVIDER_CONF_GLOBAL *pcgbl = vpcgbl;
@@ -54,13 +55,6 @@ static void prov_conf_ossl_ctx_free(void *vpcgbl)
OPENSSL_free(pcgbl);
}
-static const OSSL_LIB_CTX_METHOD provider_conf_ossl_ctx_method = {
- /* Must be freed before the provider store is freed */
- OSSL_LIB_CTX_METHOD_PRIORITY_2,
- prov_conf_ossl_ctx_new,
- prov_conf_ossl_ctx_free,
-};
-
static const char *skip_dot(const char *name)
{
const char *p = strchr(name, '.');
@@ -141,8 +135,7 @@ static int provider_conf_activate(OSSL_LIB_CTX *libctx, const char *name,
int soft, const CONF *cnf)
{
PROVIDER_CONF_GLOBAL *pcgbl
- = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_CONF_INDEX,
- &provider_conf_ossl_ctx_method);
+ = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_CONF_INDEX);
OSSL_PROVIDER *prov = NULL, *actual = NULL;
int ok = 0;
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index e04734c12e..48fad8242f 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -24,6 +24,7 @@
#include "internal/bio.h"
#include "internal/core.h"
#include "provider_local.h"
+#include "crypto/context.h"
#ifndef FIPS_MODULE
# include <openssl/self_test.h>
#endif
@@ -277,7 +278,7 @@ void ossl_provider_info_clear(OSSL_PROVIDER_INFO *info)
sk_INFOPAIR_pop_free(info->parameters, infopair_free);
}
-static void provider_store_free(void *vstore)
+void ossl_provider_store_free(void *vstore)
{
struct provider_store_st *store = vstore;
size_t i;
@@ -299,7 +300,7 @@ static void provider_store_free(void *vstore)
OPENSSL_free(store);
}
-static void *provider_store_new(OSSL_LIB_CTX *ctx)
+void *ossl_provider_store_new(OSSL_LIB_CTX *ctx)
{
struct provider_store_st *store = OPENSSL_zalloc(sizeof(*store));
@@ -310,7 +311,7 @@ static void *provider_store_new(OSSL_LIB_CTX *ctx)
|| (store->child_cbs = sk_OSSL_PROVIDER_CHILD_CB_new_null()) == NULL
#endif
|| (store->lock = CRYPTO_THREAD_lock_new()) == NULL) {
- provider_store_free(store);
+ ossl_provider_store_free(store);
return NULL;
}
store->libctx = ctx;
@@ -319,19 +320,11 @@ static void *provider_store_new(OSSL_LIB_CTX *ctx)
return store;
}
-static const OSSL_LIB_CTX_METHOD provider_store_method = {
- /* Needs to be freed before the child provider data is freed */
- OSSL_LIB_CTX_METHOD_PRIORITY_1,
- provider_store_new,
- provider_store_free,
-};
-
static struct provider_store_st *get_provider_store(OSSL_LIB_CTX *libctx)
{
struct provider_store_st *store = NULL;
- store = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_STORE_INDEX,
- &provider_store_method);
+ store = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_STORE_INDEX);
if (store == NULL)
ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
return store;
diff --git a/crypto/rand/rand_lib.c b/crypto/rand/rand_lib.c
index c772bcc79c..79f5ce322b 100644
--- a/crypto/rand/rand_lib.c
+++ b/crypto/rand/rand_lib.c
@@ -18,6 +18,7 @@
#include "crypto/rand.h"
#include "crypto/cryptlib.h"
#include "rand_local.h"
+#include "crypto/context.h"
#ifndef FIPS_MODULE
# include <stdio.h>
@@ -434,7 +435,7 @@ typedef struct rand_global_st {
* Initialize the OSSL_LIB_CTX global DRBGs on first use.
* Returns the allocated global data on success or NULL on failure.
*/
-static void *rand_ossl_ctx_new(OSSL_LIB_CTX *libctx)
+void *ossl_rand_ctx_new(OSSL_LIB_CTX *libctx)
{
RAND_GLOBAL *dgbl = OPENSSL_zalloc(sizeof(*dgbl));
@@ -469,7 +470,7 @@ static void *rand_ossl_ctx_new(OSSL_LIB_CTX *libctx)
return NULL;
}
-static void rand_ossl_ctx_free(void *vdgbl)
+void ossl_rand_ctx_free(void *vdgbl)
{
RAND_GLOBAL *dgbl = vdgbl;
@@ -491,16 +492,9 @@ static void rand_ossl_ctx_free(void *vdgbl)
OPENSSL_free(dgbl);
}
-static const OSSL_LIB_CTX_METHOD rand_drbg_ossl_ctx_method = {
- OSSL_LIB_CTX_METHOD_PRIORITY_2,
- rand_ossl_ctx_new,
- rand_ossl_ctx_free,
-};
-
static RAND_GLOBAL *rand_get_global(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_DRBG_INDEX,
- &rand_drbg_ossl_ctx_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_DRBG_INDEX);
}
static void rand_delete_thread_state(void *arg)
diff --git a/crypto/self_test_core.c b/crypto/self_test_core.c
index dad4be208a..e0999fb05f 100644
--- a/crypto/self_test_core.c
+++ b/crypto/self_test_core.c
@@ -11,6 +11,7 @@
#include <openssl/core_names.h>
#include <openssl/params.h>
#include "internal/cryptlib.h"
+#include "crypto/context.h"
typedef struct self_test_cb_st
{
@@ -32,7 +33,7 @@ struct ossl_self_test_st
};
#ifndef FIPS_MODULE
-static void *self_test_set_callback_new(OSSL_LIB_CTX *ctx)
+void *ossl_self_test_set_callback_new(OSSL_LIB_CTX *ctx)
{
SELF_TEST_CB *stcb;
@@ -40,21 +41,14 @@ static void *self_test_set_callback_new(OSSL_LIB_CTX *ctx)
return stcb;
}
-static void self_test_set_callback_free(void *stcb)
+void ossl_self_test_set_callback_free(void *stcb)
{
OPENSSL_free(stcb);
}
-static const OSSL_LIB_CTX_METHOD self_test_set_callback_method = {
- OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY,
- self_test_set_callback_new,
- self_test_set_callback_free,
-};
-
static SELF_TEST_CB *get_self_test_callback(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_SELF_TEST_CB_INDEX,
- &self_test_set_callback_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_SELF_TEST_CB_INDEX);
}
void OSSL_SELF_TEST_set_callback(OSSL_LIB_CTX *libctx, OSSL_CALLBACK *cb,
diff --git a/crypto/store/store_meth.c b/crypto/store/store_meth.c
index 4d18645b21..8256970d30 100644
--- a/crypto/store/store_meth.c
+++ b/crypto/store/store_meth.c
@@ -14,6 +14,7 @@
#include "internal/property.h"
#include "internal/provider.h"
#include "store_local.h"
+#include "crypto/context.h"
int OSSL_STORE_LOADER_up_ref(OSSL_STORE_LOADER *loader)
{
@@ -68,25 +69,6 @@ static void free_loader(void *method)
OSSL_STORE_LOADER_free(method);
}
-/* Permanent loader method store, constructor and destructor */
-static void loader_store_free(void *vstore)
-{
- ossl_method_store_free(vstore);
-}
-
-static void *loader_store_new(OSSL_LIB_CTX *ctx)
-{
- return ossl_method_store_new(ctx);
-}
-
-
-static const OSSL_LIB_CTX_METHOD loader_store_method = {
- /* We want loader_store to be cleaned up before the provider store */
- OSSL_LIB_CTX_METHOD_PRIORITY_2,
- loader_store_new,
- loader_store_free,
-};
-
/* Data to be passed through ossl_method_construct() */
struct loader_data_st {
OSSL_LIB_CTX *libctx;
@@ -123,8 +105,7 @@ static void *get_tmp_loader_store(void *data)
/* Get the permanent loader store */
static OSSL_METHOD_STORE *get_loader_store(OSSL_LIB_CTX *libctx)
{
- return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_STORE_LOADER_STORE_INDEX,
- &loader_store_method);
+ return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_STORE_LOADER_STORE_INDEX);
}
/* Get loader methods from a store, or put one in */