Commit 1cac2cbc76b9f3fce0d4ccc374e724e7f2533a47

Authored by Huang Ying
Committed by Herbert Xu
1 parent 1693531e9e

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

... ... @@ -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