* [PATCH v2 13/13] lib/crypto: Add documentation about zeroization of key and context data
[not found] <20260909115455.157093-1-thuth@redhat.com>
@ 2026-09-09 11:54 ` Thomas Huth
2026-09-09 13:22 ` Jonathan Corbet
0 siblings, 1 reply; 3+ messages in thread
From: Thomas Huth @ 2026-09-09 11:54 UTC (permalink / raw)
To: Eric Biggers, Herbert Xu, David S. Miller, Jason A. Donenfeld,
Ard Biesheuvel, Jonathan Corbet
Cc: linux-crypto, linux-kernel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, Shuah Khan, Randy Dunlap, linux-doc
Add a central document about zeroization in libcrypto so we don't
have to repeat this information in the individual kernel docs of
the zeroization functions all over the place.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
.../crypto/libcrypto-zeroization.rst | 129 ++++++++++++++++++
Documentation/crypto/libcrypto.rst | 1 +
2 files changed, 130 insertions(+)
create mode 100644 Documentation/crypto/libcrypto-zeroization.rst
diff --git a/Documentation/crypto/libcrypto-zeroization.rst b/Documentation/crypto/libcrypto-zeroization.rst
new file mode 100644
index 0000000000000..ba9b05320ad53
--- /dev/null
+++ b/Documentation/crypto/libcrypto-zeroization.rst
@@ -0,0 +1,129 @@
+.. SPDX-License-Identifier: GPL-2.0-or-later
+
+Crypto Key Zeroization
+======================
+
+This document describes the conventions for zeroizing crypto structures in the
+kernel.
+
+.. contents::
+
+Overview
+--------
+
+Cryptographic key material and intermediate state (such as HMAC contexts) must
+be zeroized after use to prevent sensitive data from lingering on the stack or
+heap, where it could be leaked through memory disclosure vulnerabilities,
+crash dumps, or cold-boot attacks.
+
+For memory that has been allocated with kmalloc() or a similar function,
+kfree_sensitive() should be used instead of kfree() to release the memory.
+
+For other cases, the kernel provides ``memzero_explicit()`` for clearing the
+memory. Unlike plain ``memset()``, ``memzero_explicit()`` is guaranteed not
+to be optimized away by the compiler, even when the memory being cleared
+appears to be dead.
+
+The crypto library builds on ``memzero_explicit()`` by providing typed
+zeroization helpers for each key and context structure. These helpers serve
+two purposes:
+
+1. They make ``__cleanup()`` annotations possible, so that structures on
+ the stack are automatically zeroized when they go out of scope.
+
+2. They improve readability by replacing ``memzero_explicit(&key, sizeof(key))``
+ with a self-documenting call like ``aes_zeroize_key(&key)``.
+
+
+What to zeroize
+---------------
+
+The following types of structures hold sensitive material and should be
+zeroized after use:
+
+- **Key structures** (e.g. ``struct aes_key``, ``struct hmac_sha256_key``):
+ contain expanded round keys or prepared key material.
+
+- **HMAC/MAC context structures** (e.g. ``struct hmac_sha256_ctx``,
+ ``struct aes_cmac_ctx``): contain inner and outer hash states derived from
+ the key.
+
+- **Hash context structures** (e.g. ``struct sha256_ctx``): may contain
+ sensitive data being hashed.
+
+Not all of these require explicit cleanup by callers. Many ``..._final()``
+functions already zeroize their context internally (see `Automatic vs. manual
+zeroization`_ below).
+
+
+Zeroization helpers
+-------------------
+
+Each crypto structure that callers may need to zeroize should have a
+corresponding inline helper function. The naming convention is::
+
+ <algorithm>_zeroize_<type>(struct <algorithm>_<type> *p);
+
+For example::
+
+ void aes_zeroize_key(struct aes_key *key);
+ void aes_zeroize_enckey(struct aes_enckey *key);
+ void hmac_sha256_zeroize_ctx(struct hmac_sha256_ctx *ctx);
+ void aes_cmac_zeroize_key(struct aes_cmac_key *key);
+ void aes_cmac_zeroize_ctx(struct aes_cmac_ctx *ctx);
+
+Each helper is a ``static inline`` function in the algorithm's header that
+wraps ``memzero_explicit()``, for example::
+
+ static inline void hmac_sha256_zeroize_ctx(struct hmac_sha256_ctx *ctx)
+ {
+ memzero_explicit(ctx, sizeof(*ctx));
+ }
+
+These helpers should include kernel-doc comments following the standard
+conventions::
+
+ /**
+ * hmac_sha256_zeroize_ctx() - Zeroize an hmac_sha256_ctx structure
+ * @ctx: The hmac_sha256_ctx context to zeroize
+ */
+
+
+Using __cleanup for automatic zeroization
+-----------------------------------------
+
+The preferred way to zeroize stack-allocated key and context structures is
+with the ``__cleanup()`` attribute. This ensures zeroization happens on all
+exit paths, including error returns and early exits.
+
+Note that __cleanup() attributes should not be used in functions that use
+"goto" statements. The benefit of cleanup helpers is the removal of "gotos",
+and that "goto" statements can jump between scopes, so the expectation is
+that usage of "goto" and cleanup helpers is never mixed in the same function.
+
+
+Automatic vs. manual zeroization
+--------------------------------
+
+Many ``..._final()`` functions in the crypto library automatically zeroize
+their context before returning. When this is the case, the kernel-doc for the
+function documents it::
+
+ After finishing, this zeroizes @ctx. So the caller does not need to do it.
+
+In these cases, callers on simple code paths (where ``..._final()`` is always
+reached) do not need to add ``__cleanup()`` or explicit zeroization.
+However, ``__cleanup()`` is still recommended whenever there are error paths
+that bypass ``..._final()``, as it ensures zeroization on all paths.
+
+For algorithms where ``_final()`` does *not* zeroize the context (such as the
+SHAKE XOFs, where ``shake_squeeze()`` can be called multiple times), callers
+must explicitly zeroize the context by calling the appropriate helper or using
+``__cleanup()``, for example::
+
+ struct shake_ctx ctx __cleanup(shake_zeroize_ctx);
+
+ shake256_init(&ctx);
+ shake_update(&ctx, data, data_len);
+ shake_squeeze(&ctx, out, out_len);
+ /* ctx is automatically zeroized at end of scope */
diff --git a/Documentation/crypto/libcrypto.rst b/Documentation/crypto/libcrypto.rst
index e911e05215979..9533c12caa79d 100644
--- a/Documentation/crypto/libcrypto.rst
+++ b/Documentation/crypto/libcrypto.rst
@@ -165,4 +165,5 @@ API documentation
libcrypto-signature
libcrypto-unauth-encryption
libcrypto-utils
+ libcrypto-zeroization
sha3
--
2.55.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2 13/13] lib/crypto: Add documentation about zeroization of key and context data
2026-09-09 11:54 ` [PATCH v2 13/13] lib/crypto: Add documentation about zeroization of key and context data Thomas Huth
@ 2026-09-09 13:22 ` Jonathan Corbet
2026-09-10 9:09 ` Thomas Huth
0 siblings, 1 reply; 3+ messages in thread
From: Jonathan Corbet @ 2026-09-09 13:22 UTC (permalink / raw)
To: Thomas Huth, Eric Biggers, Herbert Xu, David S. Miller,
Jason A. Donenfeld, Ard Biesheuvel
Cc: linux-crypto, linux-kernel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, Shuah Khan, Randy Dunlap, linux-doc
Thomas Huth <thuth@redhat.com> writes:
> Add a central document about zeroization in libcrypto so we don't
> have to repeat this information in the individual kernel docs of
> the zeroization functions all over the place.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> .../crypto/libcrypto-zeroization.rst | 129 ++++++++++++++++++
> Documentation/crypto/libcrypto.rst | 1 +
> 2 files changed, 130 insertions(+)
> create mode 100644 Documentation/crypto/libcrypto-zeroization.rst
One nit...
> diff --git a/Documentation/crypto/libcrypto-zeroization.rst b/Documentation/crypto/libcrypto-zeroization.rst
> new file mode 100644
> index 0000000000000..ba9b05320ad53
> --- /dev/null
> +++ b/Documentation/crypto/libcrypto-zeroization.rst
> @@ -0,0 +1,129 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +Crypto Key Zeroization
> +======================
> +
> +This document describes the conventions for zeroizing crypto structures in the
> +kernel.
> +
> +.. contents::
> +
> +Overview
> +--------
> +
> +Cryptographic key material and intermediate state (such as HMAC contexts) must
> +be zeroized after use to prevent sensitive data from lingering on the stack or
> +heap, where it could be leaked through memory disclosure vulnerabilities,
> +crash dumps, or cold-boot attacks.
> +
> +For memory that has been allocated with kmalloc() or a similar function,
> +kfree_sensitive() should be used instead of kfree() to release the memory.
> +
> +For other cases, the kernel provides ``memzero_explicit()`` for clearing the
> +memory. Unlike plain ``memset()``, ``memzero_explicit()`` is guaranteed not
> +to be optimized away by the compiler, even when the memory being cleared
> +appears to be dead.
Don't mark up function names, just say memzero_explicit(). The
automarkup code will then do the right thing, including cross-references
when the functions have kerneldoc documentation.
Thanks,
jon
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2 13/13] lib/crypto: Add documentation about zeroization of key and context data
2026-09-09 13:22 ` Jonathan Corbet
@ 2026-09-10 9:09 ` Thomas Huth
0 siblings, 0 replies; 3+ messages in thread
From: Thomas Huth @ 2026-09-10 9:09 UTC (permalink / raw)
To: Jonathan Corbet, Eric Biggers, Herbert Xu, David S. Miller,
Jason A. Donenfeld, Ard Biesheuvel
Cc: linux-crypto, linux-kernel, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, Shuah Khan, Randy Dunlap, linux-doc
On 09/09/2026 15.22, Jonathan Corbet wrote:
> Thomas Huth <thuth@redhat.com> writes:
...
>> +For other cases, the kernel provides ``memzero_explicit()`` for clearing the
>> +memory. Unlike plain ``memset()``, ``memzero_explicit()`` is guaranteed not
>> +to be optimized away by the compiler, even when the memory being cleared
>> +appears to be dead.
>
> Don't mark up function names, just say memzero_explicit(). The
> automarkup code will then do the right thing, including cross-references
> when the functions have kerneldoc documentation.
OK, thanks for the hint, I'll fix it in the next version!
Thomas
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-09-10 9:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260909115455.157093-1-thuth@redhat.com>
2026-09-09 11:54 ` [PATCH v2 13/13] lib/crypto: Add documentation about zeroization of key and context data Thomas Huth
2026-09-09 13:22 ` Jonathan Corbet
2026-09-10 9:09 ` Thomas Huth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox