From d01d375264e73f49a416409e2f8febe88ad39c8a Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Fri, 8 May 2020 16:44:02 +0100 Subject: [PATCH] Implement OSSL_PROVIDER_get0_provider_ctx() Implement a function which enables us to get hold of the provider ctx for a loaded provider. Reviewed-by: Shane Lontis (Merged from https://github.com/openssl/openssl/pull/11834) --- crypto/provider.c | 4 ++++ crypto/provider_core.c | 8 ++++++++ doc/man3/OSSL_PROVIDER.pod | 13 +++++++++---- include/internal/provider.h | 1 + include/openssl/provider.h | 1 + util/libcrypto.num | 1 + 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/crypto/provider.c b/crypto/provider.c index 6b029ecced..02002a5f95 100644 --- a/crypto/provider.c +++ b/crypto/provider.c @@ -65,6 +65,10 @@ const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, return ossl_provider_query_operation(prov, operation_id, no_cache); } +void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov) +{ + return ossl_provider_prov_ctx(prov); +} int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *libctx, const char *name, OSSL_provider_init_fn *init_fn) diff --git a/crypto/provider_core.c b/crypto/provider_core.c index 8b868fdb6b..f7af51a297 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -787,6 +787,14 @@ const char *ossl_provider_module_path(const OSSL_PROVIDER *prov) #endif } +void *ossl_provider_prov_ctx(const OSSL_PROVIDER *prov) +{ + if (prov != NULL) + return prov->provctx; + + return NULL; +} + OPENSSL_CTX *ossl_provider_library_context(const OSSL_PROVIDER *prov) { /* TODO(3.0) just: return prov->libctx; */ diff --git a/doc/man3/OSSL_PROVIDER.pod b/doc/man3/OSSL_PROVIDER.pod index 177e2c2e83..d6f0af53c9 100644 --- a/doc/man3/OSSL_PROVIDER.pod +++ b/doc/man3/OSSL_PROVIDER.pod @@ -6,8 +6,8 @@ OSSL_PROVIDER_set_default_search_path, OSSL_PROVIDER, OSSL_PROVIDER_load, OSSL_PROVIDER_unload, OSSL_PROVIDER_available, OSSL_PROVIDER_do_all, OSSL_PROVIDER_gettable_params, OSSL_PROVIDER_get_params, -OSSL_PROVIDER_query_operation, OSSL_PROVIDER_add_builtin, -OSSL_PROVIDER_name - provider routines +OSSL_PROVIDER_query_operation, OSSL_PROVIDER_get0_provider_ctx, +OSSL_PROVIDER_add_builtin, OSSL_PROVIDER_name - provider routines =head1 SYNOPSIS @@ -31,6 +31,7 @@ OSSL_PROVIDER_name - provider routines const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, int operation_id, int *no_cache); + void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov); int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *libctx, const char *name, ossl_provider_init_fn *init_fn); @@ -88,13 +89,17 @@ function, and the variables acting as buffers for this parameter array should be filled with data when it returns successfully. OSSL_PROVIDER_query_operation() calls the provider's I -function (see L), if the provider has one. It should return an +function (see L), if the provider has one. It returns an array of I for the given I terminated by an all NULL OSSL_ALGORITHM entry. This is considered a low-level function that most applications should not need to call. +OSSL_PROVIDER_get0_provider_ctx() returns the provider context for the given +provider. The provider context is an opaque handle set by the provider itself +and is passed back to the provider by libcrypto in various function calls. + If it is permissible to cache references to this array then I<*no_store> is set -to 0 or 1 otherwise. If the array is not cacheable then it should be assumed to +to 0 or 1 otherwise. If the array is not cacheable then it is assumed to have a short lifetime. OSSL_PROVIDER_name() returns the name of the given provider. diff --git a/include/internal/provider.h b/include/internal/provider.h index 135b660f49..d7c0926a0b 100644 --- a/include/internal/provider.h +++ b/include/internal/provider.h @@ -64,6 +64,7 @@ const char *ossl_provider_name(const OSSL_PROVIDER *prov); const DSO *ossl_provider_dso(const OSSL_PROVIDER *prov); const char *ossl_provider_module_name(const OSSL_PROVIDER *prov); const char *ossl_provider_module_path(const OSSL_PROVIDER *prov); +void *ossl_provider_prov_ctx(const OSSL_PROVIDER *prov); OPENSSL_CTX *ossl_provider_library_context(const OSSL_PROVIDER *prov); /* Thin wrappers around calls to the provider */ diff --git a/include/openssl/provider.h b/include/openssl/provider.h index 91b864e423..e9a1408675 100644 --- a/include/openssl/provider.h +++ b/include/openssl/provider.h @@ -33,6 +33,7 @@ int OSSL_PROVIDER_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]); const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, int operation_id, int *no_cache); +void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov); /* Add a built in providers */ int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *, const char *name, diff --git a/util/libcrypto.num b/util/libcrypto.num index 3ac1c1ca49..a34d467099 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -5098,3 +5098,4 @@ X509_PUBKEY_eq ? 3_0_0 EXIST::FUNCTION: EVP_PKEY_eq ? 3_0_0 EXIST::FUNCTION: EVP_PKEY_parameters_eq ? 3_0_0 EXIST::FUNCTION: OSSL_PROVIDER_query_operation ? 3_0_0 EXIST::FUNCTION: +OSSL_PROVIDER_get0_provider_ctx ? 3_0_0 EXIST::FUNCTION: -- 2.34.1