From 2fd3392c8f4e2f3481fa4d7e6a683dc19c6c1cd2 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 30 Sep 2021 09:44:10 +0200 Subject: [PATCH] EVP: Add the internal function evp_generic_fetch_from_prov() This function leverages the generic possibility to fetch EVP methods from a specific provider. Reviewed-by: Tomas Mraz Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/16725) --- crypto/evp/evp_fetch.c | 28 ++++++++++++++++++++++++- crypto/evp/evp_local.h | 7 +++++++ doc/internal/man3/evp_generic_fetch.pod | 18 ++++++++++++++-- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/crypto/evp/evp_fetch.c b/crypto/evp/evp_fetch.c index a0fa6590ae..ef9e222411 100644 --- a/crypto/evp/evp_fetch.c +++ b/crypto/evp/evp_fetch.c @@ -379,7 +379,7 @@ void *evp_generic_fetch(OSSL_LIB_CTX *libctx, int operation_id, * already known names, i.e. it refuses to work if no name_id can be found * (it's considered an internal programming error). * This is meant to be used when one method needs to fetch an associated - * other method. + * method. */ void *evp_generic_fetch_by_number(OSSL_LIB_CTX *libctx, int operation_id, int name_id, const char *properties, @@ -401,6 +401,32 @@ void *evp_generic_fetch_by_number(OSSL_LIB_CTX *libctx, int operation_id, return method; } +/* + * evp_generic_fetch_from_prov() is special, and only returns methods from + * the given provider. + * This is meant to be used when one method needs to fetch an associated + * method. + */ +void *evp_generic_fetch_from_prov(OSSL_PROVIDER *prov, int operation_id, + const char *name, const char *properties, + void *(*new_method)(int name_id, + const OSSL_ALGORITHM *algodef, + OSSL_PROVIDER *prov), + int (*up_ref_method)(void *), + void (*free_method)(void *)) +{ + struct evp_method_data_st methdata; + void *method; + + methdata.libctx = ossl_provider_libctx(prov); + methdata.tmp_store = NULL; + method = inner_evp_generic_fetch(&methdata, prov, operation_id, + 0, name, properties, + new_method, up_ref_method, free_method); + dealloc_tmp_evp_method_store(methdata.tmp_store); + return method; +} + int evp_method_store_flush(OSSL_LIB_CTX *libctx) { OSSL_METHOD_STORE *store = get_evp_method_store(libctx); diff --git a/crypto/evp/evp_local.h b/crypto/evp/evp_local.h index f8fd3f05f5..58c5759120 100644 --- a/crypto/evp/evp_local.h +++ b/crypto/evp/evp_local.h @@ -276,6 +276,13 @@ void *evp_generic_fetch_by_number(OSSL_LIB_CTX *ctx, int operation_id, OSSL_PROVIDER *prov), int (*up_ref_method)(void *), void (*free_method)(void *)); +void *evp_generic_fetch_from_prov(OSSL_PROVIDER *prov, int operation_id, + const char *name, const char *properties, + void *(*new_method)(int name_id, + const OSSL_ALGORITHM *algodef, + OSSL_PROVIDER *prov), + int (*up_ref_method)(void *), + void (*free_method)(void *)); void evp_generic_do_all_prefetched(OSSL_LIB_CTX *libctx, int operation_id, void (*user_fn)(void *method, void *arg), void *user_arg); diff --git a/doc/internal/man3/evp_generic_fetch.pod b/doc/internal/man3/evp_generic_fetch.pod index bc9a3a0770..b23d2ec0ea 100644 --- a/doc/internal/man3/evp_generic_fetch.pod +++ b/doc/internal/man3/evp_generic_fetch.pod @@ -2,7 +2,7 @@ =head1 NAME -evp_generic_fetch, evp_generic_fetch_by_number +evp_generic_fetch, evp_generic_fetch_by_number, evp_generic_fetch_from_prov - generic algorithm fetchers and method creators for EVP =head1 SYNOPSIS @@ -29,6 +29,15 @@ evp_generic_fetch, evp_generic_fetch_by_number void *method_data, int (*up_ref_method)(void *), void (*free_method)(void *)); + void *evp_generic_fetch_from_prov(OSSL_PROVIDER *prov, int operation_id, + int name_id, const char *properties, + void *(*new_method)(int name_id, + const OSSL_DISPATCH *fns, + OSSL_PROVIDER *prov, + void *method_data), + void *method_data, + int (*up_ref_method)(void *), + void (*free_method)(void *)); =head1 DESCRIPTION @@ -42,9 +51,14 @@ but takes a numeric I instead of a name. I must always be nonzero; as a matter of fact, it being zero is considered a programming error. This is meant to be used when one method needs to fetch an associated -other method, and is typically called from inside the given function +method, and is typically called from inside the given function I. +evp_generic_fetch_from_prov() does the same thing as evp_generic_fetch(), +but limits the search of methods to the provider given with I. +This is meant to be used when one method needs to fetch an associated +method in the same provider. + The three functions I, I, and I are supposed to: -- 2.39.2