| From a16e772e664b9a261424107784804cffc8894977 Mon Sep 17 00:00:00 2001 |
| From: Eric Biggers <ebiggers@google.com> |
| Date: Wed, 3 Jan 2018 11:16:25 -0800 |
| Subject: crypto: poly1305 - remove ->setkey() method |
| |
| From: Eric Biggers <ebiggers@google.com> |
| |
| commit a16e772e664b9a261424107784804cffc8894977 upstream. |
| |
| Since Poly1305 requires a nonce per invocation, the Linux kernel |
| implementations of Poly1305 don't use the crypto API's keying mechanism |
| and instead expect the key and nonce as the first 32 bytes of the data. |
| But ->setkey() is still defined as a stub returning an error code. This |
| prevents Poly1305 from being used through AF_ALG and will also break it |
| completely once we start enforcing that all crypto API users (not just |
| AF_ALG) call ->setkey() if present. |
| |
| Fix it by removing crypto_poly1305_setkey(), leaving ->setkey as NULL. |
| |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/crypto/poly1305_glue.c | 1 - |
| crypto/poly1305_generic.c | 17 +++++------------ |
| include/crypto/poly1305.h | 2 -- |
| 3 files changed, 5 insertions(+), 15 deletions(-) |
| |
| --- a/arch/x86/crypto/poly1305_glue.c |
| +++ b/arch/x86/crypto/poly1305_glue.c |
| @@ -164,7 +164,6 @@ static struct shash_alg alg = { |
| .init = poly1305_simd_init, |
| .update = poly1305_simd_update, |
| .final = crypto_poly1305_final, |
| - .setkey = crypto_poly1305_setkey, |
| .descsize = sizeof(struct poly1305_simd_desc_ctx), |
| .base = { |
| .cra_name = "poly1305", |
| --- a/crypto/poly1305_generic.c |
| +++ b/crypto/poly1305_generic.c |
| @@ -51,17 +51,6 @@ int crypto_poly1305_init(struct shash_de |
| } |
| EXPORT_SYMBOL_GPL(crypto_poly1305_init); |
| |
| -int crypto_poly1305_setkey(struct crypto_shash *tfm, |
| - const u8 *key, unsigned int keylen) |
| -{ |
| - /* Poly1305 requires a unique key for each tag, which implies that |
| - * we can't set it on the tfm that gets accessed by multiple users |
| - * simultaneously. Instead we expect the key as the first 32 bytes in |
| - * the update() call. */ |
| - return -ENOTSUPP; |
| -} |
| -EXPORT_SYMBOL_GPL(crypto_poly1305_setkey); |
| - |
| static void poly1305_setrkey(struct poly1305_desc_ctx *dctx, const u8 *key) |
| { |
| /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ |
| @@ -80,6 +69,11 @@ static void poly1305_setskey(struct poly |
| dctx->s[3] = le32_to_cpuvp(key + 12); |
| } |
| |
| +/* |
| + * Poly1305 requires a unique key for each tag, which implies that we can't set |
| + * it on the tfm that gets accessed by multiple users simultaneously. Instead we |
| + * expect the key as the first 32 bytes in the update() call. |
| + */ |
| unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx, |
| const u8 *src, unsigned int srclen) |
| { |
| @@ -285,7 +279,6 @@ static struct shash_alg poly1305_alg = { |
| .init = crypto_poly1305_init, |
| .update = crypto_poly1305_update, |
| .final = crypto_poly1305_final, |
| - .setkey = crypto_poly1305_setkey, |
| .descsize = sizeof(struct poly1305_desc_ctx), |
| .base = { |
| .cra_name = "poly1305", |
| --- a/include/crypto/poly1305.h |
| +++ b/include/crypto/poly1305.h |
| @@ -30,8 +30,6 @@ struct poly1305_desc_ctx { |
| }; |
| |
| int crypto_poly1305_init(struct shash_desc *desc); |
| -int crypto_poly1305_setkey(struct crypto_shash *tfm, |
| - const u8 *key, unsigned int keylen); |
| unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx, |
| const u8 *src, unsigned int srclen); |
| int crypto_poly1305_update(struct shash_desc *desc, |