From: Richard Levitte Date: Tue, 19 Nov 2019 08:55:56 +0000 (+0100) Subject: CORE: pass the full algorithm definition to the method constructor X-Git-Tag: openssl-3.0.0-alpha1~886 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=36fa4d8a0df9dc168047fadd0365966c7116b31d;p=oweals%2Fopenssl.git CORE: pass the full algorithm definition to the method constructor So far, the API level method constructors that are called by ossl_method_construct_this() were passed the algorithm name string and the dispatch table and had no access to anything else. This change gives them access to the full OSSL_ALGORITHM item, thereby giving them access to the property definition. Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/10394) --- diff --git a/crypto/core_fetch.c b/crypto/core_fetch.c index ed50bb87d5..7f815a50ac 100644 --- a/crypto/core_fetch.c +++ b/crypto/core_fetch.c @@ -31,9 +31,8 @@ static void ossl_method_construct_this(OSSL_PROVIDER *provider, struct construct_data_st *data = cbdata; void *method = NULL; - if ((method = data->mcm->construct(algo->algorithm_names, - algo->implementation, provider, - data->mcm_data)) == NULL) + if ((method = data->mcm->construct(algo, provider, data->mcm_data)) + == NULL) return; /* diff --git a/crypto/evp/evp_fetch.c b/crypto/evp/evp_fetch.c index ff4e96a823..b2040e06f4 100644 --- a/crypto/evp/evp_fetch.c +++ b/crypto/evp/evp_fetch.c @@ -233,7 +233,7 @@ static int put_evp_method_in_store(OPENSSL_CTX *libctx, void *store, * The core fetching functionality passes the name of the implementation. * This function is responsible to getting an identity number for it. */ -static void *construct_evp_method(const char *names, const OSSL_DISPATCH *fns, +static void *construct_evp_method(const OSSL_ALGORITHM *algodef, OSSL_PROVIDER *prov, void *data) { /* @@ -246,11 +246,13 @@ static void *construct_evp_method(const char *names, const OSSL_DISPATCH *fns, struct evp_method_data_st *methdata = data; OPENSSL_CTX *libctx = ossl_provider_library_context(prov); OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx); + const char *names = algodef->algorithm_names; int name_id = ossl_namemap_add_names(namemap, 0, names, NAME_SEPARATOR); if (name_id == 0) return NULL; - return methdata->method_from_dispatch(name_id, fns, prov); + return methdata->method_from_dispatch(name_id, algodef->implementation, + prov); } static void destruct_evp_method(void *method, void *data) diff --git a/include/internal/core.h b/include/internal/core.h index d2229e173b..ca04333486 100644 --- a/include/internal/core.h +++ b/include/internal/core.h @@ -38,8 +38,8 @@ typedef struct ossl_method_construct_method_st { const OSSL_PROVIDER *prov, int operation_id, const char *name, const char *propdef, void *data); /* Construct a new method */ - void *(*construct)(const char *name, const OSSL_DISPATCH *fns, - OSSL_PROVIDER *prov, void *data); + void *(*construct)(const OSSL_ALGORITHM *algodef, OSSL_PROVIDER *prov, + void *data); /* Destruct a method */ void (*destruct)(void *method, void *data); } OSSL_METHOD_CONSTRUCT_METHOD;