return 1;
}
-int ossl_provider_init_child_providers(OSSL_LIB_CTX *ctx)
-{
- struct child_prov_globals *gbl;
-
- /* Should never happen */
- if (ctx == NULL)
- return 0;
-
- gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX,
- &child_prov_ossl_ctx_method);
- if (gbl == NULL)
- return 0;
-
- if (!CRYPTO_THREAD_read_lock(gbl->lock))
- return 0;
- if (gbl->isinited) {
- CRYPTO_THREAD_unlock(gbl->lock);
- return 1;
- }
- CRYPTO_THREAD_unlock(gbl->lock);
-
- if (!CRYPTO_THREAD_write_lock(gbl->lock))
- return 0;
- if (!gbl->isinited) {
- if (!gbl->c_provider_register_child_cb(gbl->handle,
- provider_create_child_cb,
- provider_remove_child_cb,
- ctx)) {
- CRYPTO_THREAD_unlock(gbl->lock);
- return 0;
- }
- gbl->isinited = 1;
- }
- CRYPTO_THREAD_unlock(gbl->lock);
-
- return 1;
-}
-
int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx,
const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in)
if (gbl->lock == NULL)
return 0;
+ if (!gbl->c_provider_register_child_cb(gbl->handle,
+ provider_create_child_cb,
+ provider_remove_child_cb,
+ ctx))
+ return 0;
+
+ gbl->isinited = 1;
+
return 1;
}
if (!noconfig) {
if (ossl_lib_ctx_is_default(libctx))
OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
- if (ossl_lib_ctx_is_child(libctx)
- && !ossl_provider_init_child_providers(libctx))
- return NULL;
}
#endif
*/
if (ossl_lib_ctx_is_default(ctx))
OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
- if (ossl_lib_ctx_is_child(ctx)
- && !ossl_provider_init_child_providers(ctx))
- return 0;
#endif
if (store == NULL)
ossl_provider_set_fallback, ossl_provider_set_module_path,
ossl_provider_add_parameter, ossl_provider_set_child, ossl_provider_get_parent,
ossl_provider_up_ref_parent, ossl_provider_free_parent,
-ossl_provider_get0_dispatch, ossl_provider_init_child_providers,
+ossl_provider_get0_dispatch,
ossl_provider_init_as_child,
ossl_provider_activate, ossl_provider_deactivate, ossl_provider_available,
ossl_provider_ctx,
int *result);
int ossl_provider_clear_all_operation_bits(OSSL_LIB_CTX *libctx);
- int ossl_provider_init_child_providers(OSSL_LIB_CTX *ctx);
int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx,
const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in);
ossl_provider_clear_all_operation_bits() clears all of the operation bits
to (0) for all providers in the library context I<libctx>.
-ossl_provider_init_child_providers() registers the callbacks required to
-receive notifications about loading and unloading of providers in the parent
-library context.
-
ossl_provider_init_as_child() stores in the library context I<ctx> references to
the necessary upcalls for managing child providers. The I<handle> and I<in>
parameters are the B<OSSL_CORE_HANDLE> and B<OSSL_DISPATCH> pointers that were
void ossl_provider_add_conf_module(void);
/* Child providers */
-int ossl_provider_init_child_providers(OSSL_LIB_CTX *ctx);
int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx,
const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in);