summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
Diffstat (limited to 'crypto')
-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)