summaryrefslogtreecommitdiffstats
path: root/crypto/property
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2021-06-03 09:09:19 +0200
committerRichard Levitte <levitte@openssl.org>2021-06-15 16:21:31 +0200
commitf0191d0b1373bb7b0c50a0103d63791f51ed3398 (patch)
tree6682eddfadfc09727b8dfba8feef9678cc13b241 /crypto/property
parent04fb4ec8facc5555e1e289029c289ebc4b487db8 (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)
Diffstat (limited to 'crypto/property')
-rw-r--r--crypto/property/property.c36
1 files changed, 36 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)