Patch "crypto: vmx - Fix memory corruption caused by p8_ghash" has been added to the 4.7-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
crypto: vmx - Fix memory corruption caused by p8_ghash
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
crypto-vmx-fix-memory-corruption-caused-by-p8_ghash.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
80da44c29d997e28c4442825f35f4ac339813877Mon Sep 17 00:00:00 2001
From: Marcelo Cerri <[email protected]>
Date: Wed, 28 Sep 2016 13:42:10 -0300
Subject: crypto: vmx - Fix memory corruption caused by p8_ghash
From: Marcelo Cerri <[email protected]>
commit 80da44c29d997e28c4442825f35f4ac339813877 upstream.
This patch changes the p8_ghash driver to use ghash-generic as a fixed fallback implementation. This allows the correct value of descsize to be defined directly in its shash_alg structure and avoids problems with incorrect buffer sizes when its state is exported or imported.
--- drivers/crypto/vmx/ghash.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-)
drivers/crypto/vmx/ghash.c +16 -15
@@ -26,16 +26,13 @@#include <linux/hardirq.h> #include <asm/switch_to.h> #include <crypto/aes.h> +#include <crypto/ghash.h> #include <crypto/scatterwalk.h> #include <crypto/internal/hash.h> #include <crypto/b128ops.h> #define IN_INTERRUPT in_interrupt() -#define GHASH_BLOCK_SIZE (16) -#define GHASH_DIGEST_SIZE (16) -#define GHASH_KEY_LEN (16) -void gcm_init_p8 (u128 htable[16 ],const u64 Xi[2 ]);void gcm_gmult_p8 (u64 Xi[2 ],const u128 htable[16 ]); void gcm_ghash_p8(u64 Xi[2], const u128 htable[16],
@@ -55,16 +52,11 @@ struct p8_ghash_desc_ctx {static int p8_ghash_init_tfm (struct crypto_tfm *tfm) { -const char *alg; +const char *alg ="ghash-generic" ;struct crypto_shash *fallback;struct crypto_shash *shash_tfm =__crypto_shash_cast (tfm);struct p8_ghash_ctx *ctx =crypto_tfm_ctx (tfm); -if (!(alg =crypto_tfm_alg_name (tfm))) { -printk (KERN_ERR "Failed to get algorithm name.\n" ); -return -ENOENT ; - } - fallback =crypto_alloc_shash (alg,0 ,CRYPTO_ALG_NEED_FALLBACK );if (IS_ERR (fallback)) { printk(KERN_ERR
@@ -78,10 +70,18 @@ static int p8_ghash_init_tfm(struct crypcrypto_shash_set_flags (fallback,crypto_shash_get_flags ((struct crypto_shash *) tfm)); - ctx->fallback = fallback; - shash_tfm->descsize =sizeof (struct p8_ghash_desc_ctx ) - +crypto_shash_descsize (fallback); +/* Check if the descsize defined in the algorithm is still enough. */ +if (shash_tfm->descsize <sizeof (struct p8_ghash_desc_ctx ) + +crypto_shash_descsize (fallback)) { +printk (KERN_ERR +"Desc size of the fallback implementation (%s) does not match the expected value: %lu vs %u\n" , + alg, + shash_tfm->descsize -sizeof (struct p8_ghash_desc_ctx ), +crypto_shash_descsize (fallback)); +return -EINVAL ; + } + ctx->fallback = fallback;return 0 ; }
@@ -113,7 +113,7 @@ static int p8_ghash_setkey(struct crypto {struct p8_ghash_ctx *ctx =crypto_tfm_ctx (crypto_shash_tfm (tfm)); -if (keylen !=GHASH_KEY_LEN ) +if (keylen !=GHASH_BLOCK_SIZE )return -EINVAL ;preempt_disable ();
@@ -211,7 +211,8 @@ struct shash_alg p8_ghash_alg = { .update = p8_ghash_update, .final = p8_ghash_final, .setkey = p8_ghash_setkey, - .descsize = sizeof(struct p8_ghash_desc_ctx), + .descsize =sizeof (struct p8_ghash_desc_ctx ) + + sizeof(struct ghash_desc_ctx), .base = { .cra_name = "ghash", .cra_driver_name = "p8_ghash",
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/crypto-vmx-fix-memory-corruption-caused-by-p8_ghash.patch queue-4.7/crypto-ghash-generic-move-common-definitions-to-a-new-header-file.patch