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

Commit 70ec7bb9 authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: api - Add crypto_alloc_instance2



This patch adds a new argument to crypto_alloc_instance which
sets aside some space before the instance for use by algorithms
such as shash that place type-specific data before crypto_alg.

For compatibility the function has been renamed so that existing
users aren't affected.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent f2ac72e8
Loading
Loading
Loading
Loading
+31 −6
Original line number Original line Diff line number Diff line
@@ -627,17 +627,20 @@ int crypto_attr_u32(struct rtattr *rta, u32 *num)
}
}
EXPORT_SYMBOL_GPL(crypto_attr_u32);
EXPORT_SYMBOL_GPL(crypto_attr_u32);


struct crypto_instance *crypto_alloc_instance(const char *name,
void *crypto_alloc_instance2(const char *name, struct crypto_alg *alg,
					      struct crypto_alg *alg)
			     unsigned int head)
{
{
	struct crypto_instance *inst;
	struct crypto_instance *inst;
	struct crypto_spawn *spawn;
	char *p;
	int err;
	int err;


	inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
	p = kzalloc(head + sizeof(*inst) + sizeof(struct crypto_spawn),
	if (!inst)
		    GFP_KERNEL);
	if (!p)
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);


	inst = (void *)(p + head);

	err = -ENAMETOOLONG;
	err = -ENAMETOOLONG;
	if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s(%s)", name,
	if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s(%s)", name,
		     alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
		     alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
@@ -647,6 +650,25 @@ struct crypto_instance *crypto_alloc_instance(const char *name,
		     name, alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
		     name, alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
		goto err_free_inst;
		goto err_free_inst;


	return p;

err_free_inst:
	kfree(p);
	return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(crypto_alloc_instance2);

struct crypto_instance *crypto_alloc_instance(const char *name,
					      struct crypto_alg *alg)
{
	struct crypto_instance *inst;
	struct crypto_spawn *spawn;
	int err;

	inst = crypto_alloc_instance2(name, alg, 0);
	if (IS_ERR(inst))
		goto out;

	spawn = crypto_instance_ctx(inst);
	spawn = crypto_instance_ctx(inst);
	err = crypto_init_spawn(spawn, alg, inst,
	err = crypto_init_spawn(spawn, alg, inst,
				CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC);
				CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC);
@@ -658,7 +680,10 @@ struct crypto_instance *crypto_alloc_instance(const char *name,


err_free_inst:
err_free_inst:
	kfree(inst);
	kfree(inst);
	return ERR_PTR(err);
	inst = ERR_PTR(err);

out:
	return inst;
}
}
EXPORT_SYMBOL_GPL(crypto_alloc_instance);
EXPORT_SYMBOL_GPL(crypto_alloc_instance);


+2 −0
Original line number Original line Diff line number Diff line
@@ -132,6 +132,8 @@ 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_alg(struct rtattr *rta, u32 type, u32 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,
			     unsigned int head);
struct crypto_instance *crypto_alloc_instance(const char *name,
struct crypto_instance *crypto_alloc_instance(const char *name,
					      struct crypto_alg *alg);
					      struct crypto_alg *alg);