diff options
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/property/property.c | 36 |
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) |