Commit 1cac2cbc76b9f3fce0d4ccc374e724e7f2533a47
Committed by
Herbert Xu
1 parent
1693531e9e
Exists in
master
and in
20 other branches
crypto: cryptd - Add support to access underlying blkcipher
cryptd_alloc_ablkcipher() will allocate a cryptd-ed ablkcipher for specified algorithm name. The new allocated one is guaranteed to be cryptd-ed ablkcipher, so the blkcipher underlying can be gotten via cryptd_ablkcipher_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 62 additions and 0 deletions Side-by-side Diff
crypto/cryptd.c
... | ... | @@ -12,6 +12,7 @@ |
12 | 12 | |
13 | 13 | #include <crypto/algapi.h> |
14 | 14 | #include <crypto/internal/hash.h> |
15 | +#include <crypto/cryptd.h> | |
15 | 16 | #include <linux/err.h> |
16 | 17 | #include <linux/init.h> |
17 | 18 | #include <linux/kernel.h> |
... | ... | @@ -536,6 +537,40 @@ |
536 | 537 | .free = cryptd_free, |
537 | 538 | .module = THIS_MODULE, |
538 | 539 | }; |
540 | + | |
541 | +struct cryptd_ablkcipher *cryptd_alloc_ablkcipher(const char *alg_name, | |
542 | + u32 type, u32 mask) | |
543 | +{ | |
544 | + char cryptd_alg_name[CRYPTO_MAX_ALG_NAME]; | |
545 | + struct crypto_ablkcipher *tfm; | |
546 | + | |
547 | + if (snprintf(cryptd_alg_name, CRYPTO_MAX_ALG_NAME, | |
548 | + "cryptd(%s)", alg_name) >= CRYPTO_MAX_ALG_NAME) | |
549 | + return ERR_PTR(-EINVAL); | |
550 | + tfm = crypto_alloc_ablkcipher(cryptd_alg_name, type, mask); | |
551 | + if (IS_ERR(tfm)) | |
552 | + return ERR_CAST(tfm); | |
553 | + if (crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module != THIS_MODULE) { | |
554 | + crypto_free_ablkcipher(tfm); | |
555 | + return ERR_PTR(-EINVAL); | |
556 | + } | |
557 | + | |
558 | + return __cryptd_ablkcipher_cast(tfm); | |
559 | +} | |
560 | +EXPORT_SYMBOL_GPL(cryptd_alloc_ablkcipher); | |
561 | + | |
562 | +struct crypto_blkcipher *cryptd_ablkcipher_child(struct cryptd_ablkcipher *tfm) | |
563 | +{ | |
564 | + struct cryptd_blkcipher_ctx *ctx = crypto_ablkcipher_ctx(&tfm->base); | |
565 | + return ctx->child; | |
566 | +} | |
567 | +EXPORT_SYMBOL_GPL(cryptd_ablkcipher_child); | |
568 | + | |
569 | +void cryptd_free_ablkcipher(struct cryptd_ablkcipher *tfm) | |
570 | +{ | |
571 | + crypto_free_ablkcipher(&tfm->base); | |
572 | +} | |
573 | +EXPORT_SYMBOL_GPL(cryptd_free_ablkcipher); | |
539 | 574 | |
540 | 575 | static inline int cryptd_create_thread(struct cryptd_state *state, |
541 | 576 | int (*fn)(void *data), const char *name) |
include/crypto/cryptd.h
1 | +/* | |
2 | + * Software async crypto daemon | |
3 | + */ | |
4 | + | |
5 | +#ifndef _CRYPTO_CRYPT_H | |
6 | +#define _CRYPTO_CRYPT_H | |
7 | + | |
8 | +#include <linux/crypto.h> | |
9 | +#include <linux/kernel.h> | |
10 | + | |
11 | +struct cryptd_ablkcipher { | |
12 | + struct crypto_ablkcipher base; | |
13 | +}; | |
14 | + | |
15 | +static inline struct cryptd_ablkcipher *__cryptd_ablkcipher_cast( | |
16 | + struct crypto_ablkcipher *tfm) | |
17 | +{ | |
18 | + return (struct cryptd_ablkcipher *)tfm; | |
19 | +} | |
20 | + | |
21 | +/* alg_name should be algorithm to be cryptd-ed */ | |
22 | +struct cryptd_ablkcipher *cryptd_alloc_ablkcipher(const char *alg_name, | |
23 | + u32 type, u32 mask); | |
24 | +struct crypto_blkcipher *cryptd_ablkcipher_child(struct cryptd_ablkcipher *tfm); | |
25 | +void cryptd_free_ablkcipher(struct cryptd_ablkcipher *tfm); | |
26 | + | |
27 | +#endif |