Commit ace1366369841c9c3a9788f79baa4d73f1c53107
Committed by
Herbert Xu
1 parent
9382d97af5
Exists in
master
and in
20 other branches
crypto: cryptd - Add support to access underlaying shash
cryptd_alloc_ahash() will allocate a cryptd-ed ahash for specified algorithm name. The new allocated one is guaranteed to be cryptd-ed ahash, so the shash underlying can be gotten via cryptd_ahash_child(). Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Showing 2 changed files with 52 additions and 0 deletions Side-by-side Diff
crypto/cryptd.c
... | ... | @@ -682,6 +682,41 @@ |
682 | 682 | } |
683 | 683 | EXPORT_SYMBOL_GPL(cryptd_free_ablkcipher); |
684 | 684 | |
685 | +struct cryptd_ahash *cryptd_alloc_ahash(const char *alg_name, | |
686 | + u32 type, u32 mask) | |
687 | +{ | |
688 | + char cryptd_alg_name[CRYPTO_MAX_ALG_NAME]; | |
689 | + struct crypto_ahash *tfm; | |
690 | + | |
691 | + if (snprintf(cryptd_alg_name, CRYPTO_MAX_ALG_NAME, | |
692 | + "cryptd(%s)", alg_name) >= CRYPTO_MAX_ALG_NAME) | |
693 | + return ERR_PTR(-EINVAL); | |
694 | + tfm = crypto_alloc_ahash(cryptd_alg_name, type, mask); | |
695 | + if (IS_ERR(tfm)) | |
696 | + return ERR_CAST(tfm); | |
697 | + if (tfm->base.__crt_alg->cra_module != THIS_MODULE) { | |
698 | + crypto_free_ahash(tfm); | |
699 | + return ERR_PTR(-EINVAL); | |
700 | + } | |
701 | + | |
702 | + return __cryptd_ahash_cast(tfm); | |
703 | +} | |
704 | +EXPORT_SYMBOL_GPL(cryptd_alloc_ahash); | |
705 | + | |
706 | +struct crypto_shash *cryptd_ahash_child(struct cryptd_ahash *tfm) | |
707 | +{ | |
708 | + struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(&tfm->base); | |
709 | + | |
710 | + return ctx->child; | |
711 | +} | |
712 | +EXPORT_SYMBOL_GPL(cryptd_ahash_child); | |
713 | + | |
714 | +void cryptd_free_ahash(struct cryptd_ahash *tfm) | |
715 | +{ | |
716 | + crypto_free_ahash(&tfm->base); | |
717 | +} | |
718 | +EXPORT_SYMBOL_GPL(cryptd_free_ahash); | |
719 | + | |
685 | 720 | static int __init cryptd_init(void) |
686 | 721 | { |
687 | 722 | int err; |
include/crypto/cryptd.h
... | ... | @@ -7,6 +7,7 @@ |
7 | 7 | |
8 | 8 | #include <linux/crypto.h> |
9 | 9 | #include <linux/kernel.h> |
10 | +#include <crypto/hash.h> | |
10 | 11 | |
11 | 12 | struct cryptd_ablkcipher { |
12 | 13 | struct crypto_ablkcipher base; |
... | ... | @@ -23,6 +24,22 @@ |
23 | 24 | u32 type, u32 mask); |
24 | 25 | struct crypto_blkcipher *cryptd_ablkcipher_child(struct cryptd_ablkcipher *tfm); |
25 | 26 | void cryptd_free_ablkcipher(struct cryptd_ablkcipher *tfm); |
27 | + | |
28 | +struct cryptd_ahash { | |
29 | + struct crypto_ahash base; | |
30 | +}; | |
31 | + | |
32 | +static inline struct cryptd_ahash *__cryptd_ahash_cast( | |
33 | + struct crypto_ahash *tfm) | |
34 | +{ | |
35 | + return (struct cryptd_ahash *)tfm; | |
36 | +} | |
37 | + | |
38 | +/* alg_name should be algorithm to be cryptd-ed */ | |
39 | +struct cryptd_ahash *cryptd_alloc_ahash(const char *alg_name, | |
40 | + u32 type, u32 mask); | |
41 | +struct crypto_shash *cryptd_ahash_child(struct cryptd_ahash *tfm); | |
42 | +void cryptd_free_ahash(struct cryptd_ahash *tfm); | |
26 | 43 | |
27 | 44 | #endif |