X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=crypto%2Fprovider_core.c;h=f1b3925faac6ab2fa5d7070af4cee7821ee6b789;hb=671aaecd365644d6981c9542d48a1c32666da18d;hp=36692b6ce41f34aa4c4d483bbb04cc01cd480385;hpb=3593266d1c924ea595a1074e78381890f964392c;p=openssl.git diff --git a/crypto/provider_core.c b/crypto/provider_core.c index 36692b6ce4..f1b3925faa 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -11,7 +11,7 @@ #include #include #include -#include "internal/cryptlib.h" +#include "internal/cryptlib_int.h" #include "internal/nelem.h" #include "internal/thread_once.h" #include "internal/provider.h" @@ -47,6 +47,7 @@ struct ossl_provider_st { DSO *module; OSSL_provider_init_fn *init_function; STACK_OF(INFOPAIR) *parameters; + OPENSSL_CTX *libctx; /* The library context this instance is in */ struct provider_store_st *store; /* The store this instance belongs to */ /* Provider side functions */ @@ -120,6 +121,7 @@ static void *provider_store_new(OPENSSL_CTX *ctx) CRYPTOerr(CRYPTO_F_PROVIDER_STORE_NEW, ERR_R_INTERNAL_ERROR); return NULL; } + prov->libctx = ctx; prov->store = store; if(p->is_fallback) ossl_provider_set_fallback(prov); @@ -194,7 +196,8 @@ int ossl_provider_upref(OSSL_PROVIDER *prov) { int ref = 0; - CRYPTO_UP_REF(&prov->refcnt, &ref, prov->refcnt_lock); + if (CRYPTO_UP_REF(&prov->refcnt, &ref, prov->refcnt_lock) <= 0) + return 0; return ref; } @@ -228,6 +231,7 @@ OSSL_PROVIDER *ossl_provider_new(OPENSSL_CTX *libctx, const char *name, ossl_provider_free(prov); /* -1 Reference that was to be returned */ prov = NULL; } else { + prov->libctx = libctx; prov->store = store; } CRYPTO_THREAD_unlock(store->lock); @@ -265,6 +269,9 @@ void ossl_provider_free(OSSL_PROVIDER *prov) * When that happens, the provider is inactivated. */ if (ref < 2 && prov->flag_initialized) { +#ifndef FIPS_MODE + ossl_init_thread_deregister(prov); +#endif if (prov->teardown != NULL) prov->teardown(prov->provctx); prov->flag_initialized = 0; @@ -340,7 +347,7 @@ static const OSSL_DISPATCH *core_dispatch; /* Define further down */ /* * Internal version that doesn't affect the store flags, and thereby avoid * locking. Direct callers must remember to set the store flags when - * appropriate + * appropriate. */ static int provider_activate(OSSL_PROVIDER *prov) { @@ -397,6 +404,7 @@ static int provider_activate(OSSL_PROVIDER *prov) #endif } + /* Call the initialise function for the provider. */ if (prov->init_function == NULL || !prov->init_function(prov, core_dispatch, &provider_dispatch, &prov->provctx)) { @@ -553,17 +561,17 @@ int ossl_provider_set_fallback(OSSL_PROVIDER *prov) } /* Getters of Provider Object data */ -const char *ossl_provider_name(OSSL_PROVIDER *prov) +const char *ossl_provider_name(const OSSL_PROVIDER *prov) { return prov->name; } -const DSO *ossl_provider_dso(OSSL_PROVIDER *prov) +const DSO *ossl_provider_dso(const OSSL_PROVIDER *prov) { return prov->module; } -const char *ossl_provider_module_name(OSSL_PROVIDER *prov) +const char *ossl_provider_module_name(const OSSL_PROVIDER *prov) { #ifdef FIPS_MODE return NULL; @@ -572,7 +580,7 @@ const char *ossl_provider_module_name(OSSL_PROVIDER *prov) #endif } -const char *ossl_provider_module_path(OSSL_PROVIDER *prov) +const char *ossl_provider_module_path(const OSSL_PROVIDER *prov) { #ifdef FIPS_MODE return NULL; @@ -595,8 +603,7 @@ const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov) ? NULL : prov->get_param_types(prov->provctx); } -int ossl_provider_get_params(const OSSL_PROVIDER *prov, - const OSSL_PARAM params[]) +int ossl_provider_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]) { return prov->get_params == NULL ? 0 : prov->get_params(prov->provctx, params); @@ -633,10 +640,10 @@ static const OSSL_ITEM *core_get_param_types(const OSSL_PROVIDER *prov) return param_types; } -static int core_get_params(const OSSL_PROVIDER *prov, const OSSL_PARAM params[]) +static int core_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]) { int i; - const OSSL_PARAM *p; + OSSL_PARAM *p; if ((p = OSSL_PARAM_locate(params, "openssl-version")) != NULL) OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR); @@ -656,9 +663,23 @@ static int core_get_params(const OSSL_PROVIDER *prov, const OSSL_PARAM params[]) return 1; } +static OSSL_core_get_library_context_fn core_get_libctx; /* Check */ +static OPENSSL_CTX *core_get_libctx(const OSSL_PROVIDER *prov) +{ + return prov->libctx; +} + +static int core_thread_start(const OSSL_PROVIDER *prov, + OSSL_thread_stop_handler_fn handfn) +{ + return ossl_init_thread_start(prov, prov->provctx, handfn); +} + static const OSSL_DISPATCH core_dispatch_[] = { { OSSL_FUNC_CORE_GET_PARAM_TYPES, (void (*)(void))core_get_param_types }, { OSSL_FUNC_CORE_GET_PARAMS, (void (*)(void))core_get_params }, + { OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT, (void (*)(void))core_get_libctx }, + { OSSL_FUNC_CORE_THREAD_START, (void (*)(void))core_thread_start }, { OSSL_FUNC_CORE_PUT_ERROR, (void (*)(void))ERR_put_error }, { OSSL_FUNC_CORE_ADD_ERROR_VDATA, (void (*)(void))ERR_add_error_vdata }, { 0, NULL }