diff options
author | Huang Ying <ying.huang@intel.com> | 2009-10-18 22:53:06 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2009-10-18 22:53:06 -0400 |
commit | 0e1227d356e9b2fe0500d6cc7084f752040a1e0e (patch) | |
tree | 6f059b8e3c31539942ad244e7aadabcb54e8d904 /crypto | |
parent | 4c6ab3ee4cdb86cbd4e9400dd22fad7701cbe795 (diff) |
crypto: ghash - Add PCLMULQDQ accelerated implementation
PCLMULQDQ is used to accelerate the most time-consuming part of GHASH,
carry-less multiplication. More information about PCLMULQDQ can be
found at:
http://software.intel.com/en-us/articles/carry-less-multiplication-and-its-usage-for-computing-the-gcm-mode/
Because PCLMULQDQ changes XMM state, its usage must be enclosed with
kernel_fpu_begin/end, which can be used only in process context, the
acceleration is implemented as crypto_ahash. That is, request in soft
IRQ context will be defered to the cryptd kernel thread.
Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/Kconfig | 8 | ||||
-rw-r--r-- | crypto/cryptd.c | 7 |
2 files changed, 15 insertions, 0 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 26b5dd0cb564..fd6871102b60 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -440,6 +440,14 @@ config CRYPTO_WP512 | |||
440 | See also: | 440 | See also: |
441 | <http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html> | 441 | <http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html> |
442 | 442 | ||
443 | config CRYPTO_GHASH_CLMUL_NI_INTEL | ||
444 | tristate "GHASH digest algorithm (CLMUL-NI accelerated)" | ||
445 | select CRYPTO_SHASH | ||
446 | select CRYPTO_CRYPTD | ||
447 | help | ||
448 | GHASH is message digest algorithm for GCM (Galois/Counter Mode). | ||
449 | The implementation is accelerated by CLMUL-NI of Intel. | ||
450 | |||
443 | comment "Ciphers" | 451 | comment "Ciphers" |
444 | 452 | ||
445 | config CRYPTO_AES | 453 | config CRYPTO_AES |
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index 35335825a4ef..f8ae0d94a647 100644 --- a/crypto/cryptd.c +++ b/crypto/cryptd.c | |||
@@ -711,6 +711,13 @@ struct crypto_shash *cryptd_ahash_child(struct cryptd_ahash *tfm) | |||
711 | } | 711 | } |
712 | EXPORT_SYMBOL_GPL(cryptd_ahash_child); | 712 | EXPORT_SYMBOL_GPL(cryptd_ahash_child); |
713 | 713 | ||
714 | struct shash_desc *cryptd_shash_desc(struct ahash_request *req) | ||
715 | { | ||
716 | struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req); | ||
717 | return &rctx->desc; | ||
718 | } | ||
719 | EXPORT_SYMBOL_GPL(cryptd_shash_desc); | ||
720 | |||
714 | void cryptd_free_ahash(struct cryptd_ahash *tfm) | 721 | void cryptd_free_ahash(struct cryptd_ahash *tfm) |
715 | { | 722 | { |
716 | crypto_free_ahash(&tfm->base); | 723 | crypto_free_ahash(&tfm->base); |