aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/algapi.c53
-rw-r--r--include/crypto/algapi.h5
2 files changed, 58 insertions, 0 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c
index 36c4f1bdb521..c91530021e9c 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -16,6 +16,7 @@
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/list.h> 17#include <linux/list.h>
18#include <linux/module.h> 18#include <linux/module.h>
19#include <linux/rtnetlink.h>
19#include <linux/string.h> 20#include <linux/string.h>
20 21
21#include "internal.h" 22#include "internal.h"
@@ -415,6 +416,58 @@ int crypto_unregister_notifier(struct notifier_block *nb)
415} 416}
416EXPORT_SYMBOL_GPL(crypto_unregister_notifier); 417EXPORT_SYMBOL_GPL(crypto_unregister_notifier);
417 418
419struct crypto_alg *crypto_get_attr_alg(void *param, unsigned int len,
420 u32 type, u32 mask)
421{
422 struct rtattr *rta = param;
423 struct crypto_attr_alg *alga;
424
425 if (!RTA_OK(rta, len))
426 return ERR_PTR(-EBADR);
427 if (rta->rta_type != CRYPTOA_ALG || RTA_PAYLOAD(rta) < sizeof(*alga))
428 return ERR_PTR(-EINVAL);
429
430 alga = RTA_DATA(rta);
431 alga->name[CRYPTO_MAX_ALG_NAME - 1] = 0;
432
433 return crypto_alg_mod_lookup(alga->name, type, mask);
434}
435EXPORT_SYMBOL_GPL(crypto_get_attr_alg);
436
437struct crypto_instance *crypto_alloc_instance(const char *name,
438 struct crypto_alg *alg)
439{
440 struct crypto_instance *inst;
441 struct crypto_spawn *spawn;
442 int err;
443
444 inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
445 if (!inst)
446 return ERR_PTR(-ENOMEM);
447
448 err = -ENAMETOOLONG;
449 if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s(%s)", name,
450 alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
451 goto err_free_inst;
452
453 if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
454 name, alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
455 goto err_free_inst;
456
457 spawn = crypto_instance_ctx(inst);
458 err = crypto_init_spawn(spawn, alg, inst);
459
460 if (err)
461 goto err_free_inst;
462
463 return inst;
464
465err_free_inst:
466 kfree(inst);
467 return ERR_PTR(err);
468}
469EXPORT_SYMBOL_GPL(crypto_alloc_instance);
470
418static int __init crypto_algapi_init(void) 471static int __init crypto_algapi_init(void)
419{ 472{
420 crypto_init_proc(); 473 crypto_init_proc();
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h
index b20f4bdb23ba..1a598f829417 100644
--- a/include/crypto/algapi.h
+++ b/include/crypto/algapi.h
@@ -51,6 +51,11 @@ int crypto_init_spawn(struct crypto_spawn *spawn, struct crypto_alg *alg,
51void crypto_drop_spawn(struct crypto_spawn *spawn); 51void crypto_drop_spawn(struct crypto_spawn *spawn);
52struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn); 52struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn);
53 53
54struct crypto_alg *crypto_get_attr_alg(void *param, unsigned int len,
55 u32 type, u32 mask);
56struct crypto_instance *crypto_alloc_instance(const char *name,
57 struct crypto_alg *alg);
58
54static inline void *crypto_instance_ctx(struct crypto_instance *inst) 59static inline void *crypto_instance_ctx(struct crypto_instance *inst)
55{ 60{
56 return inst->__ctx; 61 return inst->__ctx;