From: Eric Biggers <ebiggers@kernel.org>
To: David Howells <dhowells@redhat.com>
Cc: linux-crypto@vger.kernel.org, Ard Biesheuvel <ardb@kernel.org>,
"Jason A . Donenfeld" <Jason@zx2c4.com>,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-s390@vger.kernel.org
Subject: Re: [PATCH 11/17] lib/crypto: sha3: Simplify the API
Date: Mon, 20 Oct 2025 10:18:38 -0700 [thread overview]
Message-ID: <20251020171838.GB1644@sol> (raw)
In-Reply-To: <1062182.1760956416@warthog.procyon.org.uk>
On Mon, Oct 20, 2025 at 11:33:36AM +0100, David Howells wrote:
> Eric Biggers <ebiggers@kernel.org> wrote:
>
> > Instead of having separate types and functions for each of the six SHA-3
> > algorithms, instead divide them into two groups: the digests and the
> > XOFs. The digests use sha3_ctx and the XOFs use shake_ctx. The
> > internal context is now called __sha3_ctx.
>
> Please roll changes into the original patches rather than posting them with a
> set of "fixes" and add a Co-developed-by tag for yourself.
Sure, that sounds good to me. I'll do that on the next version. For
this version I wanted to make it clear what I had changed. Also, some
people don't like it when their patches are changed, so I wanted to make
sure you were okay with it first.
> > +/** Context for SHA3-224, SHA3-256, SHA3-384, or SHA3-512 */
> > +struct sha3_ctx {
> > + struct __sha3_ctx ctx;
> > + u8 digest_size; /* Digest size in bytes */
> > +};
>
> Don't do that. That expands the context by an extra word when there's spare
> space in __sha3_ctx. If you go with the separate types, then this field is
> redundant.
Right, packing the struct tightly is nice. On the other hand, having
the digest_size be in the digest-specific struct prevents it from
accidentally be used during XOF operations.
Consider that the arm64 SHA-3 assembly function took a digest_size
argument. It was tempting to just use __sha3_ctx::digest_size, but of
course that would have been wrong.
But it looks like we could tighten sha3_absorb_blocks() to take a
(sha3_state, block_size) pair. That would reduce the number of places
in which __sha3_ctx is used. We should do that anyway. So I'll
tentatively plan to do that and also move the digest_size to __sha3_ctx.
> Actually, I lean slightly towards passing in the desired digest length
> to sha3_*final() and doing a WARN if it doesn't match.
That would be redundant though. It would make the API more difficult to
use, especially in the case where the caller is supporting multiple
SHA-3 variants, e.g. crypto/sha3.c.
Note that BLAKE2s has a variable-length digest too, and the BLAKE2s API
only requires that the digest size be passed to init.
I prefer the simpler version that's consistent with the BLAKE2s API.
> > +static inline void sha3_zeroize_ctx(struct sha3_ctx *ctx)
>
> sha3_zero_ctx() please if you don't like "sha3_clear_ctx". "zero" is a
> perfectly usable as verb in itself.
In cryptography it's normally zeroize. See
https://en.wikipedia.org/wiki/Zeroisation
And also try 'git grep zeroize include/crypto/':
include/crypto/acompress.h: * acomp_request_free() -- zeroize and free asynchronous (de)compression
include/crypto/aead.h: * crypto_free_aead() - zeroize and free aead handle
include/crypto/aead.h: * aead_request_free() - zeroize and free request data structure
include/crypto/akcipher.h: * akcipher_request_free() - zeroize and free public key request
include/crypto/chacha.h:static inline void chacha_zeroize_state(struct chacha_state *state)
include/crypto/hash.h: * crypto_free_ahash() - zeroize and free the ahash handle
include/crypto/hash.h: * ahash_request_free() - zeroize and free the request data structure
include/crypto/hash.h: * crypto_free_shash() - zeroize and free the message digest handle
include/crypto/internal/cipher.h: * crypto_free_cipher() - zeroize and free the single block cipher handle
include/crypto/kpp.h: * kpp_request_free() - zeroize and free kpp request
include/crypto/md5.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/md5.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/rng.h: * crypto_free_rng() - zeroize and free RNG handle
include/crypto/sha1.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha1.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/sha2.h: * After finishing, this zeroizes @ctx. So the caller does not need to do it.
include/crypto/skcipher.h: * crypto_free_skcipher() - zeroize and free cipher handle
include/crypto/skcipher.h: * crypto_free_lskcipher() - zeroize and free cipher handle
include/crypto/skcipher.h: * skcipher_request_free() - zeroize and free request data structure
Point is, we should prefer standard terminology that is already used in
the code and the wider problem domain, instead of coming up with new
terminology each time a new contributor hops in.
- Eric
next prev parent reply other threads:[~2025-10-20 17:20 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-20 0:50 [PATCH 00/17] SHA-3 library Eric Biggers
2025-10-20 0:50 ` [PATCH 01/17] s390/sha3: Rename conflicting functions Eric Biggers
2025-10-20 0:50 ` [PATCH 02/17] arm64/sha3: " Eric Biggers
2025-10-20 0:50 ` [PATCH 03/17] lib/crypto: Add SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256 Eric Biggers
2025-10-20 7:07 ` Bagas Sanjaya
2025-10-20 10:39 ` David Howells
2025-10-20 23:54 ` Bagas Sanjaya
2025-10-20 0:50 ` [PATCH 04/17] lib/crypto: Move the SHA3 Iota transform into the single round function Eric Biggers
2025-10-20 0:50 ` [PATCH 05/17] lib/crypto: Add SHA3 kunit tests Eric Biggers
2025-10-20 0:50 ` [PATCH 06/17] lib/crypto: sha3: Fix libsha3 build condition Eric Biggers
2025-10-20 0:50 ` [PATCH 07/17] lib/crypto: sha3: Use appropriate conversions in sha3_keccakf_generic() Eric Biggers
2025-10-20 0:50 ` [PATCH 08/17] lib/crypto: sha3: Drop unfinished SHAKE support from gen-hash-testvecs.py Eric Biggers
2025-10-20 0:50 ` [PATCH 09/17] lib/crypto: sha3: Consistently use EXPORT_SYMBOL_GPL Eric Biggers
2025-10-20 0:50 ` [PATCH 10/17] lib/crypto: sha3: Replace redundant ad-hoc test with FIPS test Eric Biggers
2025-10-20 0:50 ` [PATCH 11/17] lib/crypto: sha3: Simplify the API Eric Biggers
2025-10-20 0:50 ` [PATCH 12/17] lib/crypto: sha3: Document one-shot functions in header and improve docs Eric Biggers
2025-10-20 0:50 ` [PATCH 13/17] crypto: arm64/sha3 - Update sha3_ce_transform() to prepare for library Eric Biggers
2025-10-20 0:50 ` [PATCH 14/17] lib/crypto: arm64/sha3: Migrate optimized code into library Eric Biggers
2025-10-20 0:50 ` [PATCH 15/17] lib/crypto: s390/sha3: " Eric Biggers
2025-10-20 14:00 ` Holger Dengler
2025-10-20 14:23 ` Holger Dengler
2025-10-20 17:57 ` Eric Biggers
2025-10-21 7:24 ` Holger Dengler
2025-10-21 8:43 ` Holger Dengler
2025-10-21 15:49 ` Eric Biggers
2025-10-24 14:24 ` Harald Freudenberger
2025-10-24 16:11 ` Eric Biggers
2025-10-20 0:50 ` [PATCH 16/17] crypto: jitterentropy - use default sha3 implementation Eric Biggers
2025-10-20 0:50 ` [PATCH 17/17] crypto: sha3 - Reimplement using library API Eric Biggers
2025-10-20 10:33 ` [PATCH 11/17] lib/crypto: sha3: Simplify the API David Howells
2025-10-20 17:18 ` Eric Biggers [this message]
2025-10-20 10:35 ` [PATCH 16/17] crypto: jitterentropy - use default sha3 implementation David Howells
2025-10-20 21:20 ` Eric Biggers
2025-10-21 6:53 ` [PATCH 17/17] crypto: sha3 - Reimplement using library API David Howells
2025-10-22 10:13 ` [PATCH 00/17] SHA-3 library Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251020171838.GB1644@sol \
--to=ebiggers@kernel.org \
--cc=Jason@zx2c4.com \
--cc=ardb@kernel.org \
--cc=dhowells@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).