crypto: api - Add crypto_attr_alg2 helper
This patch adds the helper crypto_attr_alg2 which is similar to crypto_attr_alg but takes an extra frontend argument. This is intended to be used by new style algorithm types such as shash. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
942969992d
commit
d06854f024
4 changed files with 40 additions and 13 deletions
|
@ -644,7 +644,9 @@ const char *crypto_attr_alg_name(struct rtattr *rta)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(crypto_attr_alg_name);
|
EXPORT_SYMBOL_GPL(crypto_attr_alg_name);
|
||||||
|
|
||||||
struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask)
|
struct crypto_alg *crypto_attr_alg2(struct rtattr *rta,
|
||||||
|
const struct crypto_type *frontend,
|
||||||
|
u32 type, u32 mask)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
int err;
|
int err;
|
||||||
|
@ -654,9 +656,9 @@ struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask)
|
||||||
if (IS_ERR(name))
|
if (IS_ERR(name))
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
|
|
||||||
return crypto_alg_mod_lookup(name, type, mask);
|
return crypto_find_alg(name, frontend, type, mask);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(crypto_attr_alg);
|
EXPORT_SYMBOL_GPL(crypto_attr_alg2);
|
||||||
|
|
||||||
int crypto_attr_u32(struct rtattr *rta, u32 *num)
|
int crypto_attr_u32(struct rtattr *rta, u32 *num)
|
||||||
{
|
{
|
||||||
|
|
31
crypto/api.c
31
crypto/api.c
|
@ -503,6 +503,27 @@ void *crypto_create_tfm(struct crypto_alg *alg,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(crypto_create_tfm);
|
EXPORT_SYMBOL_GPL(crypto_create_tfm);
|
||||||
|
|
||||||
|
struct crypto_alg *crypto_find_alg(const char *alg_name,
|
||||||
|
const struct crypto_type *frontend,
|
||||||
|
u32 type, u32 mask)
|
||||||
|
{
|
||||||
|
struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask) =
|
||||||
|
crypto_alg_mod_lookup;
|
||||||
|
|
||||||
|
if (frontend) {
|
||||||
|
type &= frontend->maskclear;
|
||||||
|
mask &= frontend->maskclear;
|
||||||
|
type |= frontend->type;
|
||||||
|
mask |= frontend->maskset;
|
||||||
|
|
||||||
|
if (frontend->lookup)
|
||||||
|
lookup = frontend->lookup;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lookup(alg_name, type, mask);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(crypto_find_alg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* crypto_alloc_tfm - Locate algorithm and allocate transform
|
* crypto_alloc_tfm - Locate algorithm and allocate transform
|
||||||
* @alg_name: Name of algorithm
|
* @alg_name: Name of algorithm
|
||||||
|
@ -526,21 +547,13 @@ EXPORT_SYMBOL_GPL(crypto_create_tfm);
|
||||||
void *crypto_alloc_tfm(const char *alg_name,
|
void *crypto_alloc_tfm(const char *alg_name,
|
||||||
const struct crypto_type *frontend, u32 type, u32 mask)
|
const struct crypto_type *frontend, u32 type, u32 mask)
|
||||||
{
|
{
|
||||||
struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask);
|
|
||||||
void *tfm;
|
void *tfm;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
type &= frontend->maskclear;
|
|
||||||
mask &= frontend->maskclear;
|
|
||||||
type |= frontend->type;
|
|
||||||
mask |= frontend->maskset;
|
|
||||||
|
|
||||||
lookup = frontend->lookup ?: crypto_alg_mod_lookup;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct crypto_alg *alg;
|
struct crypto_alg *alg;
|
||||||
|
|
||||||
alg = lookup(alg_name, type, mask);
|
alg = crypto_find_alg(alg_name, frontend, type, mask);
|
||||||
if (IS_ERR(alg)) {
|
if (IS_ERR(alg)) {
|
||||||
err = PTR_ERR(alg);
|
err = PTR_ERR(alg);
|
||||||
goto err;
|
goto err;
|
||||||
|
|
|
@ -106,6 +106,9 @@ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
|
||||||
u32 mask);
|
u32 mask);
|
||||||
void *crypto_create_tfm(struct crypto_alg *alg,
|
void *crypto_create_tfm(struct crypto_alg *alg,
|
||||||
const struct crypto_type *frontend);
|
const struct crypto_type *frontend);
|
||||||
|
struct crypto_alg *crypto_find_alg(const char *alg_name,
|
||||||
|
const struct crypto_type *frontend,
|
||||||
|
u32 type, u32 mask);
|
||||||
void *crypto_alloc_tfm(const char *alg_name,
|
void *crypto_alloc_tfm(const char *alg_name,
|
||||||
const struct crypto_type *frontend, u32 type, u32 mask);
|
const struct crypto_type *frontend, u32 type, u32 mask);
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,16 @@ static inline void crypto_set_spawn(struct crypto_spawn *spawn,
|
||||||
struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb);
|
struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb);
|
||||||
int crypto_check_attr_type(struct rtattr **tb, u32 type);
|
int crypto_check_attr_type(struct rtattr **tb, u32 type);
|
||||||
const char *crypto_attr_alg_name(struct rtattr *rta);
|
const char *crypto_attr_alg_name(struct rtattr *rta);
|
||||||
struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask);
|
struct crypto_alg *crypto_attr_alg2(struct rtattr *rta,
|
||||||
|
const struct crypto_type *frontend,
|
||||||
|
u32 type, u32 mask);
|
||||||
|
|
||||||
|
static inline struct crypto_alg *crypto_attr_alg(struct rtattr *rta,
|
||||||
|
u32 type, u32 mask)
|
||||||
|
{
|
||||||
|
return crypto_attr_alg2(rta, NULL, type, mask);
|
||||||
|
}
|
||||||
|
|
||||||
int crypto_attr_u32(struct rtattr *rta, u32 *num);
|
int crypto_attr_u32(struct rtattr *rta, u32 *num);
|
||||||
void *crypto_alloc_instance2(const char *name, struct crypto_alg *alg,
|
void *crypto_alloc_instance2(const char *name, struct crypto_alg *alg,
|
||||||
unsigned int head);
|
unsigned int head);
|
||||||
|
|
Loading…
Reference in a new issue