const char *names; /* For get_evp_method_from_store() */
const char *propquery; /* For get_evp_method_from_store() */
void *(*method_from_dispatch)(int name_id, const OSSL_DISPATCH *,
- OSSL_PROVIDER *, void *);
- void *method_data;
+ OSSL_PROVIDER *);
int (*refcnt_up_method)(void *method);
void (*destruct_method)(void *method);
};
-static int add_names_to_namemap(OSSL_NAMEMAP *namemap,
- const char *names)
-{
- const char *p, *q;
- size_t l;
- int id = 0;
-
- /* Check that we have a namemap and that there is at least one name */
- if (namemap == NULL) {
- ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
-
- /*
- * Check that no name is an empty string, and that all names have at
- * most one numeric identity together.
- */
- for (p = names; *p != '\0'; p = (q == NULL ? p + l : q + 1)) {
- int this_id;
-
- if ((q = strchr(p, NAME_SEPARATOR)) == NULL)
- l = strlen(p); /* offset to \0 */
- else
- l = q - p; /* offset to the next separator */
-
- this_id = ossl_namemap_name2num_n(namemap, p, l);
-
- if (*p == '\0' || *p == NAME_SEPARATOR) {
- ERR_raise(ERR_LIB_EVP, EVP_R_BAD_ALGORITHM_NAME);
- return 0;
- }
- if (id == 0)
- id = this_id;
- else if (this_id != 0 && this_id != id) {
- ERR_raise_data(ERR_LIB_EVP, EVP_R_CONFLICTING_ALGORITHM_NAME,
- "\"%.*s\" has an existing different identity %d (from \"%s\")",
- l, p, this_id, names);
- return 0;
- }
- }
-
- /* Now that we have checked, register all names */
- for (p = names; *p != '\0'; p = (q == NULL ? p + l : q + 1)) {
- int this_id;
-
- if ((q = strchr(p, NAME_SEPARATOR)) == NULL)
- l = strlen(p); /* offset to \0 */
- else
- l = q - p; /* offset to the next separator */
-
- this_id = ossl_namemap_add_n(namemap, id, p, l);
- if (id == 0)
- id = this_id;
- else if (this_id != id) {
- ERR_raise_data(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR,
- "Got id %d when expecting %d", this_id, id);
- return 0;
- }
- }
-
- return id;
-}
-
/*
* Generic routines to fetch / create EVP methods with ossl_method_construct()
*/
&& (store = get_evp_method_store(libctx)) == NULL)
return NULL;
- (void)ossl_method_store_fetch(store, meth_id, methdata->propquery,
- &method);
-
- if (method != NULL
- && !methdata->refcnt_up_method(method)) {
- method = NULL;
- }
+ if (!ossl_method_store_fetch(store, meth_id, methdata->propquery,
+ &method))
+ return NULL;
return method;
}
* The core fetching functionality passes the name of the implementation.
* This function is responsible to getting an identity number for it.
*/
-static void *construct_evp_method(const char *names, const OSSL_DISPATCH *fns,
+static void *construct_evp_method(const OSSL_ALGORITHM *algodef,
OSSL_PROVIDER *prov, void *data)
{
/*
* This function is only called if get_evp_method_from_store() returned
* NULL, so it's safe to say that of all the spots to create a new
* namemap entry, this is it. Should the name already exist there, we
- * know that ossl_namemap_add() will return its corresponding number.
+ * know that ossl_namemap_add_name() will return its corresponding
+ * number.
*/
struct evp_method_data_st *methdata = data;
OPENSSL_CTX *libctx = ossl_provider_library_context(prov);
OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx);
- int name_id = add_names_to_namemap(namemap, names);
+ const char *names = algodef->algorithm_names;
+ int name_id = ossl_namemap_add_names(namemap, 0, names, NAME_SEPARATOR);
if (name_id == 0)
return NULL;
- return methdata->method_from_dispatch(name_id, fns, prov,
- methdata->method_data);
+ return methdata->method_from_dispatch(name_id, algodef->implementation,
+ prov);
}
static void destruct_evp_method(void *method, void *data)
const char *properties,
void *(*new_method)(int name_id,
const OSSL_DISPATCH *fns,
- OSSL_PROVIDER *prov,
- void *method_data),
- void *method_data,
+ OSSL_PROVIDER *prov),
int (*up_ref_method)(void *),
void (*free_method)(void *))
{
mcmdata.names = name;
mcmdata.propquery = properties;
mcmdata.method_from_dispatch = new_method;
- mcmdata.destruct_method = free_method;
mcmdata.refcnt_up_method = up_ref_method;
mcmdata.destruct_method = free_method;
- mcmdata.method_data = method_data;
if ((method = ossl_method_construct(libctx, operation_id,
0 /* !force_cache */,
&mcm, &mcmdata)) != NULL) {
if (name_id == 0)
name_id = ossl_namemap_name2num(namemap, name);
meth_id = evp_method_id(operation_id, name_id);
- ossl_method_store_cache_set(store, meth_id, properties, method);
+ ossl_method_store_cache_set(store, meth_id, properties, method,
+ up_ref_method, free_method);
}
- } else {
- up_ref_method(method);
}
return method;
const char *name, const char *properties,
void *(*new_method)(int name_id,
const OSSL_DISPATCH *fns,
- OSSL_PROVIDER *prov,
- void *method_data),
- void *method_data,
+ OSSL_PROVIDER *prov),
int (*up_ref_method)(void *),
void (*free_method)(void *))
{
return inner_evp_generic_fetch(libctx,
operation_id, 0, name, properties,
- new_method, method_data,
- up_ref_method, free_method);
+ new_method, up_ref_method, free_method);
}
/*
int name_id, const char *properties,
void *(*new_method)(int name_id,
const OSSL_DISPATCH *fns,
- OSSL_PROVIDER *prov,
- void *method_data),
- void *method_data,
+ OSSL_PROVIDER *prov),
int (*up_ref_method)(void *),
void (*free_method)(void *))
{
return inner_evp_generic_fetch(libctx,
operation_id, name_id, NULL, properties,
- new_method, method_data,
- up_ref_method, free_method);
+ new_method, up_ref_method, free_method);
}
int EVP_set_default_properties(OPENSSL_CTX *libctx, const char *propq)
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 *method_data);
- void *method_data;
+ OSSL_PROVIDER *prov);
void (*free_method)(void *);
};
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 = add_names_to_namemap(namemap, algo->algorithm_names);
+ 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,
- data->method_data);
+ method = data->new_method(name_id, algo->implementation, provider);
if (method != NULL) {
data->user_fn(method, data->user_arg);
void *user_arg,
void *(*new_method)(int name_id,
const OSSL_DISPATCH *fns,
- OSSL_PROVIDER *prov,
- void *method_data),
- void *method_data,
+ OSSL_PROVIDER *prov),
void (*free_method)(void *))
{
struct do_all_data_st data;
data.new_method = new_method;
- data.method_data = method_data;
data.free_method = free_method;
data.user_fn = user_fn;
data.user_arg = user_arg;
return ossl_namemap_num2name(namemap, name_id, 0);
}
-int evp_is_a(OSSL_PROVIDER *prov, int number, const char *name)
+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;
}