+
+static int evp_default_property_is_enabled(OPENSSL_CTX *libctx,
+ const char *prop_name)
+{
+ OSSL_METHOD_STORE *store = get_evp_method_store(libctx);
+
+ return ossl_method_store_global_property_is_enabled(store, prop_name);
+}
+
+int EVP_default_properties_is_fips_enabled(OPENSSL_CTX *libctx)
+{
+ return evp_default_property_is_enabled(libctx, "fips");
+}
+
+int EVP_default_properties_enable_fips(OPENSSL_CTX *libctx, int enable)
+{
+ const char *query = (enable != 0) ? "fips=yes" : "-fips";
+
+ return evp_default_properties_merge(libctx, query);
+}
+
+
+struct do_all_data_st {
+ void (*user_fn)(void *method, void *arg);
+ void *user_arg;
+ void *(*new_method)(const int name_id, const OSSL_DISPATCH *fns,
+ OSSL_PROVIDER *prov);
+ void (*free_method)(void *);
+};
+
+static void do_one(OSSL_PROVIDER *provider, const OSSL_ALGORITHM *algo,
+ int no_store, void *vdata)
+{
+ struct do_all_data_st *data = vdata;
+ OPENSSL_CTX *libctx = ossl_provider_library_context(provider);
+ OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx);
+ int name_id = ossl_namemap_add_names(namemap, 0, algo->algorithm_names,
+ NAME_SEPARATOR);
+ void *method = NULL;
+
+ if (name_id != 0)
+ method = data->new_method(name_id, algo->implementation, provider);
+
+ if (method != NULL) {
+ data->user_fn(method, data->user_arg);
+ data->free_method(method);
+ }
+}
+
+void evp_generic_do_all(OPENSSL_CTX *libctx, int operation_id,
+ void (*user_fn)(void *method, void *arg),
+ void *user_arg,
+ void *(*new_method)(int name_id,
+ const OSSL_DISPATCH *fns,
+ OSSL_PROVIDER *prov),
+ void (*free_method)(void *))
+{
+ struct do_all_data_st data;
+
+ data.new_method = new_method;
+ data.free_method = free_method;
+ data.user_fn = user_fn;
+ data.user_arg = user_arg;
+
+ /*
+ * No pre- or post-condition for this call, as this only creates methods
+ * temporarly and then promptly destroys them.
+ */
+ ossl_algorithm_do_all(libctx, operation_id, NULL, NULL, do_one, NULL,
+ &data);
+}
+
+const char *evp_first_name(const OSSL_PROVIDER *prov, int name_id)
+{
+ OPENSSL_CTX *libctx = ossl_provider_library_context(prov);
+ OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx);
+
+ return ossl_namemap_num2name(namemap, name_id, 0);
+}
+
+int evp_is_a(OSSL_PROVIDER *prov, int number,
+ const char *legacy_name, const char *name)
+{
+ /*
+ * For a |prov| that is NULL, the library context will be NULL
+ */
+ OPENSSL_CTX *libctx = ossl_provider_library_context(prov);
+ OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx);
+
+ if (prov == NULL)
+ number = ossl_namemap_name2num(namemap, legacy_name);
+ return ossl_namemap_name2num(namemap, name) == number;
+}
+
+void evp_names_do_all(OSSL_PROVIDER *prov, int number,
+ void (*fn)(const char *name, void *data),
+ void *data)
+{
+ OPENSSL_CTX *libctx = ossl_provider_library_context(prov);
+ OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx);
+
+ ossl_namemap_doall_names(namemap, number, fn, data);
+}