Skip to content

Commit

Permalink
CORE: add a provider argument to ossl_method_construct()
Browse files Browse the repository at this point in the history
This makes it possible to limit the search of methods to that
particular provider.  This uses already available possibilities in
ossl_algorithm_do_all().

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from #16725)

(cherry picked from commit cfce50f)
  • Loading branch information
levitte committed Oct 27, 2021
1 parent c4105ed commit 203ef4d
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 16 deletions.
17 changes: 15 additions & 2 deletions crypto/core_algorithm.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,23 @@ void ossl_algorithm_do_all(OSSL_LIB_CTX *libctx, int operation_id,
cbdata.post = post;
cbdata.data = data;

if (provider == NULL)
if (provider == NULL) {
ossl_provider_doall_activated(libctx, algorithm_do_this, &cbdata);
else
} else {
OSSL_LIB_CTX *libctx2 = ossl_provider_libctx(provider);

/*
* If a provider is given, its library context MUST match the library
* context we're passed. If this turns out not to be true, there is
* a programming error in the functions up the call stack.
*/
if (!ossl_assert(ossl_lib_ctx_get_concrete(libctx)
== ossl_lib_ctx_get_concrete(libctx2)))
return;

cbdata.libctx = libctx2;
algorithm_do_this(provider, &cbdata);
}
}

char *ossl_algorithm_get1_first_name(const OSSL_ALGORITHM *algo)
Expand Down
4 changes: 2 additions & 2 deletions crypto/core_fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ static void ossl_method_construct_this(OSSL_PROVIDER *provider,
}

void *ossl_method_construct(OSSL_LIB_CTX *libctx, int operation_id,
int force_store,
OSSL_PROVIDER *provider, int force_store,
OSSL_METHOD_CONSTRUCT_METHOD *mcm, void *mcm_data)
{
void *method = NULL;
Expand All @@ -117,7 +117,7 @@ void *ossl_method_construct(OSSL_LIB_CTX *libctx, int operation_id,
cbdata.force_store = force_store;
cbdata.mcm = mcm;
cbdata.mcm_data = mcm_data;
ossl_algorithm_do_all(libctx, operation_id, NULL,
ossl_algorithm_do_all(libctx, operation_id, provider,
ossl_method_construct_precondition,
ossl_method_construct_this,
ossl_method_construct_postcondition,
Expand Down
2 changes: 1 addition & 1 deletion crypto/encode_decode/decoder_meth.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ inner_ossl_decoder_fetch(struct decoder_data_st *methdata, int id,
methdata->propquery = properties;
methdata->flag_construct_error_occurred = 0;
if ((method = ossl_method_construct(methdata->libctx, OSSL_OP_DECODER,
0 /* !force_cache */,
NULL, 0 /* !force_cache */,
&mcm, methdata)) != NULL) {
/*
* If construction did create a method for us, we know that
Expand Down
2 changes: 1 addition & 1 deletion crypto/encode_decode/encoder_meth.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ inner_ossl_encoder_fetch(struct encoder_data_st *methdata, int id,
methdata->propquery = properties;
methdata->flag_construct_error_occurred = 0;
if ((method = ossl_method_construct(methdata->libctx, OSSL_OP_ENCODER,
0 /* !force_cache */,
NULL, 0 /* !force_cache */,
&mcm, methdata)) != NULL) {
/*
* If construction did create a method for us, we know that
Expand Down
15 changes: 8 additions & 7 deletions crypto/evp/evp_fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,8 @@ static void destruct_evp_method(void *method, void *data)
}

static void *
inner_evp_generic_fetch(struct evp_method_data_st *methdata, int operation_id,
inner_evp_generic_fetch(struct evp_method_data_st *methdata,
OSSL_PROVIDER *prov, int operation_id,
int name_id, const char *name,
const char *properties,
void *(*new_method)(int name_id,
Expand Down Expand Up @@ -315,7 +316,7 @@ inner_evp_generic_fetch(struct evp_method_data_st *methdata, int operation_id,
methdata->destruct_method = free_method;
methdata->flag_construct_error_occurred = 0;
if ((method = ossl_method_construct(methdata->libctx, operation_id,
0 /* !force_cache */,
prov, 0 /* !force_cache */,
&mcm, methdata)) != NULL) {
/*
* If construction did create a method for us, we know that
Expand Down Expand Up @@ -366,8 +367,8 @@ void *evp_generic_fetch(OSSL_LIB_CTX *libctx, int operation_id,

methdata.libctx = libctx;
methdata.tmp_store = NULL;
method = inner_evp_generic_fetch(&methdata,
operation_id, 0, name, properties,
method = inner_evp_generic_fetch(&methdata, NULL, operation_id,
0, name, properties,
new_method, up_ref_method, free_method);
dealloc_tmp_evp_method_store(methdata.tmp_store);
return method;
Expand All @@ -393,8 +394,8 @@ void *evp_generic_fetch_by_number(OSSL_LIB_CTX *libctx, int operation_id,

methdata.libctx = libctx;
methdata.tmp_store = NULL;
method = inner_evp_generic_fetch(&methdata,
operation_id, name_id, NULL, properties,
method = inner_evp_generic_fetch(&methdata, NULL, operation_id,
name_id, NULL, properties,
new_method, up_ref_method, free_method);
dealloc_tmp_evp_method_store(methdata.tmp_store);
return method;
Expand Down Expand Up @@ -588,7 +589,7 @@ void evp_generic_do_all(OSSL_LIB_CTX *libctx, int operation_id,

methdata.libctx = libctx;
methdata.tmp_store = NULL;
(void)inner_evp_generic_fetch(&methdata, operation_id, 0, NULL, NULL,
(void)inner_evp_generic_fetch(&methdata, NULL, operation_id, 0, NULL, NULL,
new_method, up_ref_method, free_method);

data.operation_id = operation_id;
Expand Down
2 changes: 1 addition & 1 deletion crypto/store/store_meth.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ inner_loader_fetch(struct loader_data_st *methdata, int id,
methdata->propquery = properties;
methdata->flag_construct_error_occurred = 0;
if ((method = ossl_method_construct(methdata->libctx, OSSL_OP_STORE,
0 /* !force_cache */,
NULL, 0 /* !force_cache */,
&mcm, methdata)) != NULL) {
/*
* If construction did create a method for us, we know that there
Expand Down
5 changes: 4 additions & 1 deletion doc/internal/man3/ossl_method_construct.pod
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ OSSL_METHOD_CONSTRUCT_METHOD, ossl_method_construct
typedef struct ossl_method_construct_method OSSL_METHOD_CONSTRUCT_METHOD;

void *ossl_method_construct(OSSL_LIB_CTX *ctx, int operation_id,
int force_cache,
OSSL_PROVIDER *prov, int force_cache,
OSSL_METHOD_CONSTRUCT_METHOD *mcm, void *mcm_data);


Expand Down Expand Up @@ -57,6 +57,9 @@ providers for a dispatch table given an I<operation_id>, and then
calling the appropriate functions given by the subsystem specific
method creator through I<mcm> and the data in I<mcm_data> (which is
passed by ossl_method_construct()).
If I<prov> is not NULL, only that provider is considered, which is
useful in the case a method must be found in that particular
provider.

This function assumes that the subsystem method creator implements
reference counting and acts accordingly (i.e. it will call the
Expand Down
2 changes: 1 addition & 1 deletion include/internal/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ typedef struct ossl_method_construct_method_st {
} OSSL_METHOD_CONSTRUCT_METHOD;

void *ossl_method_construct(OSSL_LIB_CTX *ctx, int operation_id,
int force_cache,
OSSL_PROVIDER *prov, int force_cache,
OSSL_METHOD_CONSTRUCT_METHOD *mcm, void *mcm_data);

void ossl_algorithm_do_all(OSSL_LIB_CTX *libctx, int operation_id,
Expand Down

0 comments on commit 203ef4d

Please sign in to comment.