diff options
Diffstat (limited to 'arch/x86/crypto/ghash-clmulni-intel_glue.c')
-rw-r--r-- | arch/x86/crypto/ghash-clmulni-intel_glue.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c index 6759dd1135be..d785cf2c529c 100644 --- a/arch/x86/crypto/ghash-clmulni-intel_glue.c +++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c | |||
@@ -30,8 +30,6 @@ void clmul_ghash_mul(char *dst, const be128 *shash); | |||
30 | void clmul_ghash_update(char *dst, const char *src, unsigned int srclen, | 30 | void clmul_ghash_update(char *dst, const char *src, unsigned int srclen, |
31 | const be128 *shash); | 31 | const be128 *shash); |
32 | 32 | ||
33 | void clmul_ghash_setkey(be128 *shash, const u8 *key); | ||
34 | |||
35 | struct ghash_async_ctx { | 33 | struct ghash_async_ctx { |
36 | struct cryptd_ahash *cryptd_tfm; | 34 | struct cryptd_ahash *cryptd_tfm; |
37 | }; | 35 | }; |
@@ -58,13 +56,23 @@ static int ghash_setkey(struct crypto_shash *tfm, | |||
58 | const u8 *key, unsigned int keylen) | 56 | const u8 *key, unsigned int keylen) |
59 | { | 57 | { |
60 | struct ghash_ctx *ctx = crypto_shash_ctx(tfm); | 58 | struct ghash_ctx *ctx = crypto_shash_ctx(tfm); |
59 | be128 *x = (be128 *)key; | ||
60 | u64 a, b; | ||
61 | 61 | ||
62 | if (keylen != GHASH_BLOCK_SIZE) { | 62 | if (keylen != GHASH_BLOCK_SIZE) { |
63 | crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); | 63 | crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); |
64 | return -EINVAL; | 64 | return -EINVAL; |
65 | } | 65 | } |
66 | 66 | ||
67 | clmul_ghash_setkey(&ctx->shash, key); | 67 | /* perform multiplication by 'x' in GF(2^128) */ |
68 | a = be64_to_cpu(x->a); | ||
69 | b = be64_to_cpu(x->b); | ||
70 | |||
71 | ctx->shash.a = (__be64)((b << 1) | (a >> 63)); | ||
72 | ctx->shash.b = (__be64)((a << 1) | (b >> 63)); | ||
73 | |||
74 | if (a >> 63) | ||
75 | ctx->shash.b ^= cpu_to_be64(0xc2); | ||
68 | 76 | ||
69 | return 0; | 77 | return 0; |
70 | } | 78 | } |