Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d06854f0 authored by Herbert Xu's avatar Herbert Xu
Browse files

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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 94296999
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -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)
{
{
+22 −9
Original line number Original line Diff line number Diff line
@@ -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;
+3 −0
Original line number Original line Diff line number Diff line
@@ -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);


+10 −1
Original line number Original line Diff line number Diff line
@@ -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);