diff options
author | Matt Caswell <matt@openssl.org> | 2020-05-04 15:28:15 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2020-06-05 10:31:06 +0100 |
commit | 5f603a280ca71b7136861b9bc408f37fd1c4e0d7 (patch) | |
tree | 4c201e275d78aede7ba0a4d03425ab300fce665a | |
parent | 263ff2c9d4c88f19133d21d9956d71edd7401d54 (diff) | |
download | openssl-5f603a280ca71b7136861b9bc408f37fd1c4e0d7.zip openssl-5f603a280ca71b7136861b9bc408f37fd1c4e0d7.tar.gz openssl-5f603a280ca71b7136861b9bc408f37fd1c4e0d7.tar.bz2 |
Enable applications to directly call a provider's query operation
This is useful to get hold of the low-level dispatch tables. This could
be used to create a new provider based on an existing one.
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/11834)
-rw-r--r-- | crypto/provider.c | 9 | ||||
-rw-r--r-- | doc/man3/OSSL_PROVIDER.pod | 20 | ||||
-rw-r--r-- | include/openssl/provider.h | 4 | ||||
-rw-r--r-- | util/libcrypto.num | 1 |
4 files changed, 33 insertions, 1 deletions
diff --git a/crypto/provider.c b/crypto/provider.c index 13438ce..6b029ec 100644 --- a/crypto/provider.c +++ b/crypto/provider.c @@ -57,6 +57,15 @@ int OSSL_PROVIDER_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]) return ossl_provider_get_params(prov, params); } + +const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, + int operation_id, + int *no_cache) +{ + return ossl_provider_query_operation(prov, operation_id, no_cache); +} + + int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *libctx, const char *name, OSSL_provider_init_fn *init_fn) { diff --git a/doc/man3/OSSL_PROVIDER.pod b/doc/man3/OSSL_PROVIDER.pod index 93d6e14..177e2c2 100644 --- a/doc/man3/OSSL_PROVIDER.pod +++ b/doc/man3/OSSL_PROVIDER.pod @@ -6,7 +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_add_builtin, OSSL_PROVIDER_name - provider routines +OSSL_PROVIDER_query_operation, OSSL_PROVIDER_add_builtin, +OSSL_PROVIDER_name - provider routines =head1 SYNOPSIS @@ -27,6 +28,10 @@ OSSL_PROVIDER_add_builtin, OSSL_PROVIDER_name - provider routines const OSSL_PARAM *OSSL_PROVIDER_gettable_params(OSSL_PROVIDER *prov); int OSSL_PROVIDER_get_params(OSSL_PROVIDER *prov, OSSL_PARAM params[]); + const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, + int operation_id, + int *no_cache); + int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *libctx, const char *name, ossl_provider_init_fn *init_fn); @@ -82,6 +87,16 @@ The caller must prepare the B<OSSL_PARAM> array before calling this 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<query_operation> +function (see L<provider(7)>), if the provider has one. It should return an +array of I<OSSL_ALGORITHM> for the given I<operation_id> terminated by an all +NULL OSSL_ALGORITHM entry. This is considered a low-level function that most +applications should not need to call. + +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 +have a short lifetime. + OSSL_PROVIDER_name() returns the name of the given provider. =head1 RETURN VALUES @@ -101,6 +116,9 @@ of constant B<OSSL_PARAM>, or NULL if none is provided. OSSL_PROVIDER_get_params() returns 1 on success, or 0 on error. +OSSL_PROVIDER_query_operation() returns an array of OSSL_ALGORITHM or NULL on +error. + =head1 EXAMPLES This demonstrates how to load the provider module "foo" and ask for diff --git a/include/openssl/provider.h b/include/openssl/provider.h index 6ce68b1..91b864e 100644 --- a/include/openssl/provider.h +++ b/include/openssl/provider.h @@ -30,6 +30,10 @@ int OSSL_PROVIDER_do_all(OPENSSL_CTX *ctx, const OSSL_PARAM *OSSL_PROVIDER_gettable_params(const OSSL_PROVIDER *prov); 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); + /* Add a built in providers */ int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *, const char *name, OSSL_provider_init_fn *init_fn); diff --git a/util/libcrypto.num b/util/libcrypto.num index fd05091..3ac1c1c 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -5097,3 +5097,4 @@ EC_GROUP_get_field_type ? 3_0_0 EXIST::FUNCTION:EC 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: |