Latest update.
This commit is contained in:
+20
-21
@@ -54,6 +54,9 @@ struct ossl_provider_st {
|
||||
OSSL_provider_get_param_types_fn *get_param_types;
|
||||
OSSL_provider_get_params_fn *get_params;
|
||||
OSSL_provider_query_operation_fn *query_operation;
|
||||
|
||||
/* Provider side data */
|
||||
void *provctx;
|
||||
};
|
||||
DEFINE_STACK_OF(OSSL_PROVIDER)
|
||||
|
||||
@@ -76,7 +79,6 @@ struct provider_store_st {
|
||||
CRYPTO_RWLOCK *lock;
|
||||
unsigned int use_fallbacks:1;
|
||||
};
|
||||
static int provider_store_index = -1;
|
||||
|
||||
static void provider_store_free(void *vstore)
|
||||
{
|
||||
@@ -89,7 +91,7 @@ static void provider_store_free(void *vstore)
|
||||
OPENSSL_free(store);
|
||||
}
|
||||
|
||||
static void *provider_store_new(void)
|
||||
static void *provider_store_new(OPENSSL_CTX *ctx)
|
||||
{
|
||||
struct provider_store_st *store = OPENSSL_zalloc(sizeof(*store));
|
||||
const struct predefined_providers_st *p = NULL;
|
||||
@@ -131,23 +133,12 @@ static const OPENSSL_CTX_METHOD provider_store_method = {
|
||||
provider_store_free,
|
||||
};
|
||||
|
||||
static CRYPTO_ONCE provider_store_init_flag = CRYPTO_ONCE_STATIC_INIT;
|
||||
DEFINE_RUN_ONCE_STATIC(do_provider_store_init)
|
||||
{
|
||||
return OPENSSL_init_crypto(0, NULL)
|
||||
&& (provider_store_index =
|
||||
openssl_ctx_new_index(&provider_store_method)) != -1;
|
||||
}
|
||||
|
||||
|
||||
static struct provider_store_st *get_provider_store(OPENSSL_CTX *libctx)
|
||||
{
|
||||
struct provider_store_st *store = NULL;
|
||||
|
||||
if (!RUN_ONCE(&provider_store_init_flag, do_provider_store_init))
|
||||
return NULL;
|
||||
|
||||
store = openssl_ctx_get_data(libctx, provider_store_index);
|
||||
store = openssl_ctx_get_data(libctx, OPENSSL_CTX_PROVIDER_STORE_INDEX,
|
||||
&provider_store_method);
|
||||
if (store == NULL)
|
||||
CRYPTOerr(CRYPTO_F_GET_PROVIDER_STORE, ERR_R_INTERNAL_ERROR);
|
||||
return store;
|
||||
@@ -275,7 +266,7 @@ void ossl_provider_free(OSSL_PROVIDER *prov)
|
||||
*/
|
||||
if (ref < 2 && prov->flag_initialized) {
|
||||
if (prov->teardown != NULL)
|
||||
prov->teardown();
|
||||
prov->teardown(prov->provctx);
|
||||
prov->flag_initialized = 0;
|
||||
}
|
||||
|
||||
@@ -401,7 +392,8 @@ static int provider_activate(OSSL_PROVIDER *prov)
|
||||
}
|
||||
|
||||
if (prov->init_function == NULL
|
||||
|| !prov->init_function(prov, core_dispatch, &provider_dispatch)) {
|
||||
|| !prov->init_function(prov, core_dispatch, &provider_dispatch,
|
||||
&prov->provctx)) {
|
||||
CRYPTOerr(CRYPTO_F_PROVIDER_ACTIVATE, ERR_R_INIT_FAIL);
|
||||
ERR_add_error_data(2, "name=", prov->name);
|
||||
DSO_free(prov->module);
|
||||
@@ -448,6 +440,11 @@ int ossl_provider_activate(OSSL_PROVIDER *prov)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *ossl_provider_ctx(const OSSL_PROVIDER *prov)
|
||||
{
|
||||
return prov->provctx;
|
||||
}
|
||||
|
||||
|
||||
static int provider_forall_loaded(struct provider_store_st *store,
|
||||
int *found_activated,
|
||||
@@ -573,18 +570,20 @@ const char *ossl_provider_module_path(OSSL_PROVIDER *prov)
|
||||
void ossl_provider_teardown(const OSSL_PROVIDER *prov)
|
||||
{
|
||||
if (prov->teardown != NULL)
|
||||
prov->teardown();
|
||||
prov->teardown(prov->provctx);
|
||||
}
|
||||
|
||||
const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov)
|
||||
{
|
||||
return prov->get_param_types == NULL ? NULL : prov->get_param_types(prov);
|
||||
return prov->get_param_types == NULL
|
||||
? NULL : prov->get_param_types(prov->provctx);
|
||||
}
|
||||
|
||||
int ossl_provider_get_params(const OSSL_PROVIDER *prov,
|
||||
const OSSL_PARAM params[])
|
||||
{
|
||||
return prov->get_params == NULL ? 0 : prov->get_params(prov, params);
|
||||
return prov->get_params == NULL
|
||||
? 0 : prov->get_params(prov->provctx, params);
|
||||
}
|
||||
|
||||
|
||||
@@ -592,7 +591,7 @@ const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
|
||||
int operation_id,
|
||||
int *no_cache)
|
||||
{
|
||||
return prov->query_operation(prov, operation_id, no_cache);
|
||||
return prov->query_operation(prov->provctx, operation_id, no_cache);
|
||||
}
|
||||
|
||||
/*-
|
||||
|
||||
Reference in New Issue
Block a user