The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx
@ 2026-08-10  9:29 Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 01/10] crypto: Provide a wrapper " Thomas Huth
                   ` (9 more replies)
  0 siblings, 10 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:29 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart

Several crypto drivers need to zeroize their local crypto_aes_ctx
structures after use to avoid leaking key material on the stack.
Currently some call sites do this with their own memzero_explicit()
call, which is error-prone since it is easy to miss a return path
(what already happened in a driver). Some other call sites miss
to clear crypto_aes_ctx completely.

To improve this situation, the first patch introduces an aes_zeroize_ctx()
helper that can be used with __cleanup() to automatically zeroize the
context when it goes out of scope. The following 6 patches add this
__cleanup() to spots in the code where this has been forgotten so far.
The final patches change some files to do the zeroization with
the new __cleanup() way instead of calling memzero_explicit() manually.

v5:
- Use aes_check_keylen() in the eip93 patch and in the 1st safexcel patch

v4:
- Updated the function description in the first patch
- Fixed "return err" bug in the "safexcel - Rework cleanup..." patch

v3:
- Renamed aes_clear_ctx() to aes_zeroize_ctx()
- Split up the safeexcel patch to rework safexcel_aead_setkey in a
  separate patch
- Removed goto in the padlock patch

v2:
- Rebased onto cryptodev master branch, updated the "qat" patch accordingly

Thomas Huth (10):
  crypto: Provide a wrapper function for zeroizing crypto_aes_ctx
  crypto: aspeed - clear the crypto_aes_ctx when done
  crypto: padlock-aes - clear the crypto_aes_ctx when done
  crypto: sa2ul - clear the crypto_aes_ctx when done
  crypto: arm/aes-neonbs - clear the crypto_aes_ctx when done
  crypto: arm64/aes-neonbs - clear the crypto_aes_ctx when done
  crypto: qat - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx)
  crypto: safexcel - Simplify the check for a valid AES key
  crypto: safexcel - zeroize crypto_aes_ctx with
    __cleanup(aes_zeroize_ctx)
  crypto: eip93 - Simplify the check for a valid AES key

 arch/arm/crypto/aes-neonbs-glue.c             |  2 +-
 arch/arm64/crypto/aes-neonbs-glue.c           |  2 +-
 drivers/crypto/aspeed/aspeed-hace-crypto.c    |  3 +--
 .../crypto/inside-secure/eip93/eip93-aead.c   |  3 +--
 .../crypto/inside-secure/safexcel_cipher.c    | 16 +++++---------
 drivers/crypto/inside-secure/safexcel_hash.c  |  3 +--
 .../crypto/intel/qat/qat_common/qat_algs.c    |  3 +--
 drivers/crypto/padlock-aes.c                  | 22 +++++++++----------
 drivers/crypto/sa2ul.c                        |  2 +-
 include/crypto/aes.h                          | 13 +++++++++++
 10 files changed, 35 insertions(+), 34 deletions(-)

-- 
2.55.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v5 01/10] crypto: Provide a wrapper function for zeroizing crypto_aes_ctx
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
@ 2026-08-10  9:29 ` Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 02/10] crypto: aspeed - clear the crypto_aes_ctx when done Thomas Huth
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:29 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart

From: Thomas Huth <thuth@redhat.com>

Several crypto drivers need to zeroize their local crypto_aes_ctx
structures after use to avoid leaking key material on the stack.
Currently some call sites do this with their own memzero_explicit()
call, which is error-prone since it is easy to miss a return path
(what already happened in some drivers). Some other call sites miss
to clear crypto_aes_ctx completely.

Provide an aes_zeroize_ctx() helper that can be used with __cleanup()
to automatically zeroize the context when it goes out of scope.

Acked-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 include/crypto/aes.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/include/crypto/aes.h b/include/crypto/aes.h
index 3279cfa546085..e70607249ae5c 100644
--- a/include/crypto/aes.h
+++ b/include/crypto/aes.h
@@ -159,6 +159,19 @@ static inline int aes_check_keylen(size_t keylen)
 int aes_expandkey(struct crypto_aes_ctx *ctx, const u8 *in_key,
 		  unsigned int key_len);
 
+/**
+ * aes_zeroize_ctx - Clear a crypto_aes_ctx structure
+ * @ctx:	The location of the context that should be zeroized
+ *
+ * Explicitly fills the crypto_aes_ctx with zeroes. This should be done
+ * once the context is not required anymore to avoid that its contents
+ * are leaked on the stack or heap (if not using kfree_sensitive()).
+ */
+static inline void aes_zeroize_ctx(struct crypto_aes_ctx *ctx)
+{
+	memzero_explicit(ctx, sizeof(*ctx));
+}
+
 /*
  * The following functions are temporarily exported for use by the AES mode
  * implementations in arch/$(SRCARCH)/crypto/.  These exports will go away when
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 02/10] crypto: aspeed - clear the crypto_aes_ctx when done
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 01/10] crypto: Provide a wrapper " Thomas Huth
@ 2026-08-10  9:29 ` Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 03/10] crypto: padlock-aes " Thomas Huth
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:29 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Neal Liu, Joel Stanley,
	Andrew Jeffery
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart,
	linux-aspeed, linux-arm-kernel

From: Thomas Huth <thuth@redhat.com>

Declare the gen_aes_key with __cleanup(aes_zeroize_ctx) to avoid that
its contents could be leaking via the stack when the function returns.
And since it is only required in one branch of the if-statement there,
move it to that block, too.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/aspeed/aspeed-hace-crypto.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/crypto/aspeed/aspeed-hace-crypto.c b/drivers/crypto/aspeed/aspeed-hace-crypto.c
index fa201dae1f81b..e7d3f611df05c 100644
--- a/drivers/crypto/aspeed/aspeed-hace-crypto.c
+++ b/drivers/crypto/aspeed/aspeed-hace-crypto.c
@@ -576,7 +576,6 @@ static int aspeed_aes_setkey(struct crypto_skcipher *cipher, const u8 *key,
 {
 	struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
 	struct aspeed_hace_dev *hace_dev = ctx->hace_dev;
-	struct crypto_aes_ctx gen_aes_key;
 
 	CIPHER_DBG(hace_dev, "keylen: %d bits\n", (keylen * 8));
 
@@ -585,9 +584,9 @@ static int aspeed_aes_setkey(struct crypto_skcipher *cipher, const u8 *key,
 		return -EINVAL;
 
 	if (ctx->hace_dev->version == AST2500_VERSION) {
+		struct crypto_aes_ctx gen_aes_key __cleanup(aes_zeroize_ctx);
 		aes_expandkey(&gen_aes_key, key, keylen);
 		memcpy(ctx->key, gen_aes_key.key_enc, AES_MAX_KEYLENGTH);
-
 	} else {
 		memcpy(ctx->key, key, keylen);
 	}
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 03/10] crypto: padlock-aes - clear the crypto_aes_ctx when done
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 01/10] crypto: Provide a wrapper " Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 02/10] crypto: aspeed - clear the crypto_aes_ctx when done Thomas Huth
@ 2026-08-10  9:29 ` Thomas Huth
  2026-08-10  9:29 ` [PATCH v5 04/10] crypto: sa2ul " Thomas Huth
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:29 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart

From: Thomas Huth <thuth@redhat.com>

Clear the crypto_aes_ctx structure via __cleanup(aes_zeroize_ctx)
when we're done with it to avoid that key data could leak on the
stack.

And since __cleanup() (and __free()) should not be mixed with
"gotos" in the same function, turn the goto statement here
into a proper block of the related if-statement.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/padlock-aes.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c
index 1be549a07a219..400a889e924d7 100644
--- a/drivers/crypto/padlock-aes.c
+++ b/drivers/crypto/padlock-aes.c
@@ -109,7 +109,7 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 {
 	struct aes_ctx *ctx = aes_ctx(tfm);
 	const __le32 *key = (const __le32 *)in_key;
-	struct crypto_aes_ctx gen_aes;
+	struct crypto_aes_ctx gen_aes __cleanup(aes_zeroize_ctx);
 	int cpu;
 
 	if (key_len % 8)
@@ -137,20 +137,18 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 	ctx->cword.decrypt.ksize = ctx->cword.encrypt.ksize;
 
 	/* Don't generate extended keys if the hardware can do it. */
-	if (aes_hw_extkey_available(key_len))
-		goto ok;
+	if (!aes_hw_extkey_available(key_len)) {
+		ctx->D = ctx->d_data;
+		ctx->cword.encrypt.keygen = 1;
+		ctx->cword.decrypt.keygen = 1;
 
-	ctx->D = ctx->d_data;
-	ctx->cword.encrypt.keygen = 1;
-	ctx->cword.decrypt.keygen = 1;
+		if (aes_expandkey(&gen_aes, in_key, key_len))
+			return -EINVAL;
 
-	if (aes_expandkey(&gen_aes, in_key, key_len))
-		return -EINVAL;
-
-	memcpy(ctx->E, gen_aes.key_enc, AES_MAX_KEYLENGTH);
-	memcpy(ctx->D, gen_aes.key_dec, AES_MAX_KEYLENGTH);
+		memcpy(ctx->E, gen_aes.key_enc, AES_MAX_KEYLENGTH);
+		memcpy(ctx->D, gen_aes.key_dec, AES_MAX_KEYLENGTH);
+	}
 
-ok:
 	for_each_online_cpu(cpu)
 		if (&ctx->cword.encrypt == per_cpu(paes_last_cword, cpu) ||
 		    &ctx->cword.decrypt == per_cpu(paes_last_cword, cpu))
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 04/10] crypto: sa2ul - clear the crypto_aes_ctx when done
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (2 preceding siblings ...)
  2026-08-10  9:29 ` [PATCH v5 03/10] crypto: padlock-aes " Thomas Huth
@ 2026-08-10  9:29 ` Thomas Huth
  2026-08-10  9:30 ` [PATCH v5 05/10] crypto: arm/aes-neonbs " Thomas Huth
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:29 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart

From: Thomas Huth <thuth@redhat.com>

Clear the crypto_aes_ctx structure via __cleanup(aes_zeroize_ctx) when
we're done with it to avoid that key data could leak on the stack.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/sa2ul.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/crypto/sa2ul.c b/drivers/crypto/sa2ul.c
index d865fd4a098cb..f1a7c2cc7a1af 100644
--- a/drivers/crypto/sa2ul.c
+++ b/drivers/crypto/sa2ul.c
@@ -465,7 +465,7 @@ static void sa_prepare_iopads(struct algo_data *data, const u8 *key,
 /* Derive the inverse key used in AES-CBC decryption operation */
 static inline int sa_aes_inv_key(u8 *inv_key, const u8 *key, u16 key_sz)
 {
-	struct crypto_aes_ctx ctx;
+	struct crypto_aes_ctx ctx __cleanup(aes_zeroize_ctx);
 	int key_pos;
 
 	if (aes_expandkey(&ctx, key, key_sz)) {
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 05/10] crypto: arm/aes-neonbs - clear the crypto_aes_ctx when done
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (3 preceding siblings ...)
  2026-08-10  9:29 ` [PATCH v5 04/10] crypto: sa2ul " Thomas Huth
@ 2026-08-10  9:30 ` Thomas Huth
  2026-08-10  9:30 ` [PATCH v5 06/10] crypto: arm64/aes-neonbs " Thomas Huth
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:30 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Russell King
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart,
	linux-arm-kernel

From: Thomas Huth <thuth@redhat.com>

Clear the crypto_aes_ctx structure via __cleanup(aes_zeroize_ctx) when
we're done with it to avoid that key data could leak on the stack.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 arch/arm/crypto/aes-neonbs-glue.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/crypto/aes-neonbs-glue.c b/arch/arm/crypto/aes-neonbs-glue.c
index c49ddafc54f34..f0c8bfd2ac8fc 100644
--- a/arch/arm/crypto/aes-neonbs-glue.c
+++ b/arch/arm/crypto/aes-neonbs-glue.c
@@ -60,7 +60,7 @@ static int aesbs_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
 			unsigned int key_len)
 {
 	struct aesbs_ctx *ctx = crypto_skcipher_ctx(tfm);
-	struct crypto_aes_ctx rk;
+	struct crypto_aes_ctx rk __cleanup(aes_zeroize_ctx);
 	int err;
 
 	err = aes_expandkey(&rk, in_key, key_len);
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 06/10] crypto: arm64/aes-neonbs - clear the crypto_aes_ctx when done
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (4 preceding siblings ...)
  2026-08-10  9:30 ` [PATCH v5 05/10] crypto: arm/aes-neonbs " Thomas Huth
@ 2026-08-10  9:30 ` Thomas Huth
  2026-08-10  9:30 ` [PATCH v5 07/10] crypto: qat - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx) Thomas Huth
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:30 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Catalin Marinas, Will Deacon
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart,
	linux-arm-kernel

From: Thomas Huth <thuth@redhat.com>

Clear the crypto_aes_ctx structure via __cleanup(aes_zeroize_ctx) when
we're done with it to avoid that key data could leak on the stack.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 arch/arm64/crypto/aes-neonbs-glue.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/crypto/aes-neonbs-glue.c b/arch/arm64/crypto/aes-neonbs-glue.c
index 5bcbac9798931..c2f3eac0ca661 100644
--- a/arch/arm64/crypto/aes-neonbs-glue.c
+++ b/arch/arm64/crypto/aes-neonbs-glue.c
@@ -247,7 +247,7 @@ static int aesbs_xts_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
 			    unsigned int key_len)
 {
 	struct aesbs_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
-	struct crypto_aes_ctx rk;
+	struct crypto_aes_ctx rk __cleanup(aes_zeroize_ctx);
 	int err;
 
 	err = xts_verify_key(tfm, in_key, key_len);
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 07/10] crypto: qat - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx)
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (5 preceding siblings ...)
  2026-08-10  9:30 ` [PATCH v5 06/10] crypto: arm64/aes-neonbs " Thomas Huth
@ 2026-08-10  9:30 ` Thomas Huth
  2026-08-10  9:30 ` [PATCH v5 08/10] crypto: safexcel - Simplify the check for a valid AES key Thomas Huth
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:30 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Giovanni Cabiddu
  Cc: linux-crypto, Eric Biggers, linux-kernel, Antoine Tenart,
	qat-linux

From: Thomas Huth <thuth@redhat.com>

A recent patch by Giovanni Cabiddu already added a memzero_explicit()
for the crypto_aes_ctx in the qat_alg_xts_reverse_key() function,
but since we introduced __cleanup(aes_zeroize_ctx) markers in previous
commits in many spots of the code already, let's use it here now, too,
to have the same code pattern everywhere.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/intel/qat/qat_common/qat_algs.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/crypto/intel/qat/qat_common/qat_algs.c b/drivers/crypto/intel/qat/qat_common/qat_algs.c
index 91663805d9e60..cb669fb661625 100644
--- a/drivers/crypto/intel/qat/qat_common/qat_algs.c
+++ b/drivers/crypto/intel/qat/qat_common/qat_algs.c
@@ -388,7 +388,7 @@ static void qat_alg_skcipher_init_enc(struct qat_alg_skcipher_ctx *ctx,
 static void qat_alg_xts_reverse_key(const u8 *key_forward, unsigned int keylen,
 				    u8 *key_reverse)
 {
-	struct crypto_aes_ctx aes_expanded;
+	struct crypto_aes_ctx aes_expanded __cleanup(aes_zeroize_ctx);
 	int nrounds;
 	u8 *key;
 
@@ -405,7 +405,6 @@ static void qat_alg_xts_reverse_key(const u8 *key_forward, unsigned int keylen,
 		memcpy(key_reverse + AES_BLOCK_SIZE, key - AES_BLOCK_SIZE,
 		       AES_BLOCK_SIZE);
 	}
-	memzero_explicit(&aes_expanded, sizeof(aes_expanded));
 }
 
 static void qat_alg_skcipher_init_dec(struct qat_alg_skcipher_ctx *ctx,
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 08/10] crypto: safexcel - Simplify the check for a valid AES key
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (6 preceding siblings ...)
  2026-08-10  9:30 ` [PATCH v5 07/10] crypto: qat - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx) Thomas Huth
@ 2026-08-10  9:30 ` Thomas Huth
  2026-08-10 14:05   ` Antoine Tenart
  2026-08-10  9:30 ` [PATCH v5 09/10] crypto: safexcel - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx) Thomas Huth
  2026-08-10  9:30 ` [PATCH v5 10/10] crypto: eip93 - Simplify the check for a valid AES key Thomas Huth
  9 siblings, 1 reply; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:30 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Antoine Tenart
  Cc: linux-crypto, Eric Biggers, linux-kernel

From: Thomas Huth <thuth@redhat.com>

safexcel_aead_setkey() currently uses aes_expandkey() to check for a valid
AES key, but then does not use the crypto_aes_ctx afterwards anymore,
i.e. this is just a wasteful way of checking the key length, and thus
aes_check_keylen() should be used instead.
This also fixes a potential leak of sensitive data via the stack, since
this function forgot to zeroize crypto_aes_ctx before returning to the
caller.

Suggested-by: Antoine Tenart <atenart@kernel.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/inside-secure/safexcel_cipher.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c
index a8349b684693e..f07d043c67d45 100644
--- a/drivers/crypto/inside-secure/safexcel_cipher.c
+++ b/drivers/crypto/inside-secure/safexcel_cipher.c
@@ -407,7 +407,6 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
 	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct safexcel_crypto_priv *priv = ctx->base.priv;
 	struct crypto_authenc_keys keys;
-	struct crypto_aes_ctx aes;
 	int err = -EINVAL, i;
 	const char *alg;
 
@@ -438,7 +437,7 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
 			goto badkey;
 		break;
 	case SAFEXCEL_AES:
-		err = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
+		err = aes_check_keylen(keys.enckeylen);
 		if (unlikely(err))
 			goto badkey;
 		break;
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 09/10] crypto: safexcel - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx)
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (7 preceding siblings ...)
  2026-08-10  9:30 ` [PATCH v5 08/10] crypto: safexcel - Simplify the check for a valid AES key Thomas Huth
@ 2026-08-10  9:30 ` Thomas Huth
  2026-08-10  9:30 ` [PATCH v5 10/10] crypto: eip93 - Simplify the check for a valid AES key Thomas Huth
  9 siblings, 0 replies; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:30 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Antoine Tenart
  Cc: linux-crypto, Eric Biggers, linux-kernel

From: Thomas Huth <thuth@redhat.com>

The code clears the crypto_aes_ctx in most cases already with
memzero_explicit(), but safexcel_skcipher_aesxts_setkey() runs
aes_expandkey() twice, and in case the second call fails, the
context from the first call is leaked.

To fix this issue and to avoid future similar problems, let's use
the new __cleanup(aes_zeroize_ctx) mechanism to make sure that we
always clear the crypto_aes_ctx in all cases.

Acked-by: Antoine Tenart <atenart@kernel.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/inside-secure/safexcel_cipher.c | 13 ++++---------
 drivers/crypto/inside-secure/safexcel_hash.c   |  3 +--
 2 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c
index f07d043c67d45..b031cb9652ec3 100644
--- a/drivers/crypto/inside-secure/safexcel_cipher.c
+++ b/drivers/crypto/inside-secure/safexcel_cipher.c
@@ -375,7 +375,7 @@ static int safexcel_skcipher_aes_setkey(struct crypto_skcipher *ctfm,
 	struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
 	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct safexcel_crypto_priv *priv = ctx->base.priv;
-	struct crypto_aes_ctx aes;
+	struct crypto_aes_ctx aes __cleanup(aes_zeroize_ctx);
 	int ret, i;
 
 	ret = aes_expandkey(&aes, key, len);
@@ -396,7 +396,6 @@ static int safexcel_skcipher_aes_setkey(struct crypto_skcipher *ctfm,
 
 	ctx->key_len = len;
 
-	memzero_explicit(&aes, sizeof(aes));
 	return 0;
 }
 
@@ -1361,7 +1360,7 @@ static int safexcel_skcipher_aesctr_setkey(struct crypto_skcipher *ctfm,
 	struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
 	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct safexcel_crypto_priv *priv = ctx->base.priv;
-	struct crypto_aes_ctx aes;
+	struct crypto_aes_ctx aes __cleanup(aes_zeroize_ctx);
 	int ret, i;
 	unsigned int keylen;
 
@@ -1387,7 +1386,6 @@ static int safexcel_skcipher_aesctr_setkey(struct crypto_skcipher *ctfm,
 
 	ctx->key_len = keylen;
 
-	memzero_explicit(&aes, sizeof(aes));
 	return 0;
 }
 
@@ -2541,7 +2539,7 @@ static int safexcel_skcipher_aesxts_setkey(struct crypto_skcipher *ctfm,
 	struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
 	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct safexcel_crypto_priv *priv = ctx->base.priv;
-	struct crypto_aes_ctx aes;
+	struct crypto_aes_ctx aes __cleanup(aes_zeroize_ctx);
 	int ret, i;
 	unsigned int keylen;
 
@@ -2589,7 +2587,6 @@ static int safexcel_skcipher_aesxts_setkey(struct crypto_skcipher *ctfm,
 
 	ctx->key_len = keylen << 1;
 
-	memzero_explicit(&aes, sizeof(aes));
 	return 0;
 }
 
@@ -2755,12 +2752,11 @@ static int safexcel_aead_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,
 	struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
 	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct safexcel_crypto_priv *priv = ctx->base.priv;
-	struct crypto_aes_ctx aes;
+	struct crypto_aes_ctx aes __cleanup(aes_zeroize_ctx);
 	int ret, i;
 
 	ret = aes_expandkey(&aes, key, len);
 	if (ret) {
-		memzero_explicit(&aes, sizeof(aes));
 		return ret;
 	}
 
@@ -2789,7 +2785,6 @@ static int safexcel_aead_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,
 	else
 		ctx->hash_alg = CONTEXT_CONTROL_CRYPTO_ALG_XCBC128;
 
-	memzero_explicit(&aes, sizeof(aes));
 	return 0;
 }
 
diff --git a/drivers/crypto/inside-secure/safexcel_hash.c b/drivers/crypto/inside-secure/safexcel_hash.c
index 3402e570d045c..20c17eb09495e 100644
--- a/drivers/crypto/inside-secure/safexcel_hash.c
+++ b/drivers/crypto/inside-secure/safexcel_hash.c
@@ -1905,7 +1905,7 @@ static int safexcel_cbcmac_setkey(struct crypto_ahash *tfm, const u8 *key,
 				 unsigned int len)
 {
 	struct safexcel_ahash_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
-	struct crypto_aes_ctx aes;
+	struct crypto_aes_ctx aes __cleanup(aes_zeroize_ctx);
 	int ret, i;
 
 	ret = aes_expandkey(&aes, key, len);
@@ -1928,7 +1928,6 @@ static int safexcel_cbcmac_setkey(struct crypto_ahash *tfm, const u8 *key,
 	}
 	ctx->cbcmac  = true;
 
-	memzero_explicit(&aes, sizeof(aes));
 	return 0;
 }
 
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v5 10/10] crypto: eip93 - Simplify the check for a valid AES key
  2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
                   ` (8 preceding siblings ...)
  2026-08-10  9:30 ` [PATCH v5 09/10] crypto: safexcel - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx) Thomas Huth
@ 2026-08-10  9:30 ` Thomas Huth
  2026-08-10 14:14   ` Antoine Tenart
  9 siblings, 1 reply; 13+ messages in thread
From: Thomas Huth @ 2026-08-10  9:30 UTC (permalink / raw)
  To: Herbert Xu, David S. Miller, Christian Marangi, Antoine Tenart
  Cc: linux-crypto, Eric Biggers, linux-kernel

From: Thomas Huth <thuth@redhat.com>

eip93_aead_setkey() currently uses aes_expandkey() to check for a valid
AES key, but then does not use the crypto_aes_ctx afterwards anymore,
i.e. this is just a wasteful way of checking the key length, and thus
aes_check_keylen() should be used instead.
This also fixes a potential leak of sensitive data via the stack, since
this function forgot to zeroize crypto_aes_ctx before returning to the
caller.

Suggested-by: Antoine Tenart <atenart@kernel.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 drivers/crypto/inside-secure/eip93/eip93-aead.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/crypto/inside-secure/eip93/eip93-aead.c b/drivers/crypto/inside-secure/eip93/eip93-aead.c
index 2bbd0af7b0e0e..0b7a899b14d76 100644
--- a/drivers/crypto/inside-secure/eip93/eip93-aead.c
+++ b/drivers/crypto/inside-secure/eip93/eip93-aead.c
@@ -92,7 +92,6 @@ static int eip93_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
 	struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct crypto_authenc_keys keys;
-	struct crypto_aes_ctx aes;
 	struct sa_record *sa_record = ctx->sa_record;
 	u32 nonce = 0;
 	int ret;
@@ -126,7 +125,7 @@ static int eip93_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
 
 		break;
 	case EIP93_ALG_AES:
-		ret = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
+		ret = aes_check_keylen(keys.enckeylen);
 		if (ret)
 			return ret;
 
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v5 08/10] crypto: safexcel - Simplify the check for a valid AES key
  2026-08-10  9:30 ` [PATCH v5 08/10] crypto: safexcel - Simplify the check for a valid AES key Thomas Huth
@ 2026-08-10 14:05   ` Antoine Tenart
  0 siblings, 0 replies; 13+ messages in thread
From: Antoine Tenart @ 2026-08-10 14:05 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Herbert Xu, David S. Miller, linux-crypto, Eric Biggers,
	linux-kernel

On Mon, Aug 10, 2026 at 11:30:03AM +0200, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> safexcel_aead_setkey() currently uses aes_expandkey() to check for a valid
> AES key, but then does not use the crypto_aes_ctx afterwards anymore,
> i.e. this is just a wasteful way of checking the key length, and thus
> aes_check_keylen() should be used instead.
> This also fixes a potential leak of sensitive data via the stack, since
> this function forgot to zeroize crypto_aes_ctx before returning to the
> caller.
> 
> Suggested-by: Antoine Tenart <atenart@kernel.org>
> Signed-off-by: Thomas Huth <thuth@redhat.com>

Acked-by: Antoine Tenart <atenart@kernel.org>

Thanks!

> ---
>  drivers/crypto/inside-secure/safexcel_cipher.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c
> index a8349b684693e..f07d043c67d45 100644
> --- a/drivers/crypto/inside-secure/safexcel_cipher.c
> +++ b/drivers/crypto/inside-secure/safexcel_cipher.c
> @@ -407,7 +407,6 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
>  	struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
>  	struct safexcel_crypto_priv *priv = ctx->base.priv;
>  	struct crypto_authenc_keys keys;
> -	struct crypto_aes_ctx aes;
>  	int err = -EINVAL, i;
>  	const char *alg;
>  
> @@ -438,7 +437,7 @@ static int safexcel_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
>  			goto badkey;
>  		break;
>  	case SAFEXCEL_AES:
> -		err = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
> +		err = aes_check_keylen(keys.enckeylen);
>  		if (unlikely(err))
>  			goto badkey;
>  		break;
> -- 
> 2.55.0
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v5 10/10] crypto: eip93 - Simplify the check for a valid AES key
  2026-08-10  9:30 ` [PATCH v5 10/10] crypto: eip93 - Simplify the check for a valid AES key Thomas Huth
@ 2026-08-10 14:14   ` Antoine Tenart
  0 siblings, 0 replies; 13+ messages in thread
From: Antoine Tenart @ 2026-08-10 14:14 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Herbert Xu, David S. Miller, Christian Marangi, linux-crypto,
	Eric Biggers, linux-kernel

On Mon, Aug 10, 2026 at 11:30:05AM +0200, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> eip93_aead_setkey() currently uses aes_expandkey() to check for a valid
> AES key, but then does not use the crypto_aes_ctx afterwards anymore,
> i.e. this is just a wasteful way of checking the key length, and thus
> aes_check_keylen() should be used instead.
> This also fixes a potential leak of sensitive data via the stack, since
> this function forgot to zeroize crypto_aes_ctx before returning to the
> caller.
> 
> Suggested-by: Antoine Tenart <atenart@kernel.org>
> Signed-off-by: Thomas Huth <thuth@redhat.com>

Reviewed-by: Antoine Tenart <atenart@kernel.org>

> ---
>  drivers/crypto/inside-secure/eip93/eip93-aead.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/crypto/inside-secure/eip93/eip93-aead.c b/drivers/crypto/inside-secure/eip93/eip93-aead.c
> index 2bbd0af7b0e0e..0b7a899b14d76 100644
> --- a/drivers/crypto/inside-secure/eip93/eip93-aead.c
> +++ b/drivers/crypto/inside-secure/eip93/eip93-aead.c
> @@ -92,7 +92,6 @@ static int eip93_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
>  	struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
>  	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
>  	struct crypto_authenc_keys keys;
> -	struct crypto_aes_ctx aes;
>  	struct sa_record *sa_record = ctx->sa_record;
>  	u32 nonce = 0;
>  	int ret;
> @@ -126,7 +125,7 @@ static int eip93_aead_setkey(struct crypto_aead *ctfm, const u8 *key,
>  
>  		break;
>  	case EIP93_ALG_AES:
> -		ret = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
> +		ret = aes_check_keylen(keys.enckeylen);
>  		if (ret)
>  			return ret;
>  
> -- 
> 2.55.0
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-08-10 14:14 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-10  9:29 [PATCH v5 00/10] crypto: Provide a function for zeroizing crypto_aes_ctx Thomas Huth
2026-08-10  9:29 ` [PATCH v5 01/10] crypto: Provide a wrapper " Thomas Huth
2026-08-10  9:29 ` [PATCH v5 02/10] crypto: aspeed - clear the crypto_aes_ctx when done Thomas Huth
2026-08-10  9:29 ` [PATCH v5 03/10] crypto: padlock-aes " Thomas Huth
2026-08-10  9:29 ` [PATCH v5 04/10] crypto: sa2ul " Thomas Huth
2026-08-10  9:30 ` [PATCH v5 05/10] crypto: arm/aes-neonbs " Thomas Huth
2026-08-10  9:30 ` [PATCH v5 06/10] crypto: arm64/aes-neonbs " Thomas Huth
2026-08-10  9:30 ` [PATCH v5 07/10] crypto: qat - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx) Thomas Huth
2026-08-10  9:30 ` [PATCH v5 08/10] crypto: safexcel - Simplify the check for a valid AES key Thomas Huth
2026-08-10 14:05   ` Antoine Tenart
2026-08-10  9:30 ` [PATCH v5 09/10] crypto: safexcel - zeroize crypto_aes_ctx with __cleanup(aes_zeroize_ctx) Thomas Huth
2026-08-10  9:30 ` [PATCH v5 10/10] crypto: eip93 - Simplify the check for a valid AES key Thomas Huth
2026-08-10 14:14   ` Antoine Tenart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox