diff options
author | Richard Levitte <levitte@openssl.org> | 2021-06-03 09:09:19 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2021-06-15 16:21:31 +0200 |
commit | f0191d0b1373bb7b0c50a0103d63791f51ed3398 (patch) | |
tree | 6682eddfadfc09727b8dfba8feef9678cc13b241 | |
parent | 04fb4ec8facc5555e1e289029c289ebc4b487db8 (diff) |
Add the internal function ossl_method_store_do_all()
It will simply call the given callback for every method found in the
given store.
Fixes #15538
Fixes #14837
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15604)
-rw-r--r-- | crypto/property/property.c | 36 | ||||
-rw-r--r-- | include/internal/property.h | 3 |
2 files changed, 39 insertions, 0 deletions
diff --git a/crypto/property/property.c b/crypto/property/property.c index a769a7307e..535120b581 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -362,6 +362,42 @@ int ossl_method_store_remove(OSSL_METHOD_STORE *store, int nid, return 0; } +static void alg_do_one(ALGORITHM *alg, IMPLEMENTATION *impl, + void (*fn)(int id, void *method, void *fnarg), + void *fnarg) +{ + fn(alg->nid, impl->method.method, fnarg); +} + +struct alg_do_each_data_st { + void (*fn)(int id, void *method, void *fnarg); + void *fnarg; +}; + +static void alg_do_each(ossl_uintmax_t idx, ALGORITHM *alg, void *arg) +{ + struct alg_do_each_data_st *data = arg; + int i, end = sk_IMPLEMENTATION_num(alg->impls); + + for (i = 0; i < end; i++) { + IMPLEMENTATION *impl = sk_IMPLEMENTATION_value(alg->impls, i); + + alg_do_one(alg, impl, data->fn, data->fnarg); + } +} + +void ossl_method_store_do_all(OSSL_METHOD_STORE *store, + void (*fn)(int id, void *method, void *fnarg), + void *fnarg) +{ + struct alg_do_each_data_st data; + + data.fn = fn; + data.fnarg = fnarg; + if (store != NULL) + ossl_sa_ALGORITHM_doall_arg(store->algs, alg_do_each, &data); +} + int ossl_method_store_fetch(OSSL_METHOD_STORE *store, int nid, const char *prop_query, void **method) diff --git a/include/internal/property.h b/include/internal/property.h index bcea21d80c..dd9a2dc2d8 100644 --- a/include/internal/property.h +++ b/include/internal/property.h @@ -58,6 +58,9 @@ int ossl_method_store_add(OSSL_METHOD_STORE *store, const OSSL_PROVIDER *prov, void (*method_destruct)(void *)); int ossl_method_store_remove(OSSL_METHOD_STORE *store, int nid, const void *method); +void ossl_method_store_do_all(OSSL_METHOD_STORE *store, + void (*fn)(int id, void *method, void *fnarg), + void *fnarg); int ossl_method_store_fetch(OSSL_METHOD_STORE *store, int nid, const char *prop_query, void **method); |