Demi Marie Obenour writes:
> In this case, one doesn't actually need the full implicit rejection
> machinery, though. All one needs is for the KEM to output a (random
> or deterministic) secret value not related to other secrets. This
> will cause the AEAD to fail no matter what ciphertext is provided.
Handling a decryption failure of the internal PKE by having the KEM
output a long-term secret z or a new random z would indeed fit an
error-free KEM API. However, by itself this wouldn't defend against
chosen-ciphertext attacks, such as the NTRU-HRSS attack we're talking
about. One of the basic types of chosen-ciphertext attacks is to try
modifications of a ciphertext and observe the pattern of decryption
failures; if an output of z were the only defense, this pattern would be
revealed via the subsequent MAC failures.
Implicit rejection is just one extra step to hash a long-term secret z
together with the ciphertext. This still gives an error-free KEM API; it
defends against the pattern of failures being visible outside the KEM
boundary; it blocks tons of known attacks, including this attack; and it
leads to better proofs than the proofs available for systems without
implicit rejection.
I often see wild exaggerations of the guarantees provided by proofs, so
I think it's important to emphasize that, when I say "better" for
implicit-rejection proofs, I don't mean "perfect":
* These proofs rely solely on one-wayness of the underlying PKE,
unlike many other FO proofs making stronger assumptions about the
PKE; but we've seen many examples of PKEs for which one-wayness
was broken because of mathematical flaws in the PKEs, bugs in the
software (the deployed PKE isn't necessarily the specified PKE),
or side-channel attacks against the software.
* These proofs are simpler than many other FO proofs, but this isn't
a magical guarantee of correctness. Within my list, this is the
limitation that feels easiest to fix via formal verification, but
clearly more work is needed to get this right. (For example, a
week ago there was a wrong AI-generated proof getting past the
built-in Lean verifier and an "independent" Lean verifier:
<
https://web.archive.org/web/20260731201835/https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/Counterexample.20to.20the.20Lean.20Conjecture.20.28Soundness.20Bug.29/near/613316580>.)
* These proofs have security levels much closer to one-wayness
security levels than many FO proofs, but there are still at least
a few bits of gap, and there are further limits coming from the
hash sizes and from many proposed PKEs not being perfectly correct
(PKE decryption not always inverting PKE encryption; people often
talk about decryption failures here, not to be confused with the
decryption failures coming from attacker-generated ciphertexts).
* These proofs have the rare feature of coming close to the
one-wayness security level for QROM IND-CCA2, but there could be
IND-CCA2 attacks much faster than QROM IND-CCA2 attacks. Maybe
there are vulnerabilities in the choice of hash function, for
example, or in the software doing the hashing. Even if this is a
lower risk than the PKE risks, it isn't zero risk. (The official
Keccak software allowed buffer overflows for many years! On the
bright side, I don't think typical KEMs could trigger those.)
https://eprint.iacr.org/2019/1336 gives an impressive list of examples
of "provable security" failing to live up to what it promises, even when
software is perfect.
> I think of implicit rejection and plaintext confirmation as transforms from KEMs to KEMs.
> 1. _Implicit rejection_ takes an explicitly-rejecting KEM and returns
> an implicitly-rejecting KEM.
> 2. _Plaintext confirmation_ takes a KEM, which may be explicitly _or_
> implicitly rejecting, and returns an explicitly-rejecting KEM.
That's session-key confirmation, not plaintext confirmation. (My own
motivation for introducing and switching to the plaintext-confirmation
terminology some years ago was to make this distinction clear. I think
the terminology is solidly established at this point.)
Plaintext confirmation converts a PKE into another PKE by sending and
checking a hash of the PKE plaintext. Once you wrap the PKE into a KEM
with Shoup's hashing of the plaintext, the plaintext is no longer
visible, so outside that layer you can't send a hash of the plaintext.
KEMs that use both plaintext confirmation and implicit rejection have
the plaintext confirmation on the inside.
Here's an example of how wrapping session-key hashing around that raises
different concerns: the session key can easily be shorter than the PKE
plaintext. Concretely, maybe the session key is only 128 bits (e.g., to
fit with usage of AES-128), and then sending a hash of that key opens up
a 2^128/T attack that finds one of T session keys (so already feasible
for moderate T), even if the PKE plaintext is bigger than 128 bits.
This example is part of a broader problem with people cutting corners.
Common defense layers include (1) trying to randomize every output,
which can damage security via RNG failures and in any case is a lot of
work that people keep screwing up (which is why, e.g., FrodoKEM issued a
security patch in 2023), and (2) moving up to 256-bit secrets, which is
relatively easy to get right.
> In the case of ML-KEM and HQC, my understanding is that implicit
> rejection is not actually required for security. This is due to the
> T-transform, which makes the ciphertexts non-malleable.
It's clear how the T transform gets in the way of some known types of
chosen-ciphertext attacks, but it's not at all clear how strong this
protection is. For example, Theorem 9 of
https://web.archive.org/web/20260215132734/https://eprint.iacr.org/2025/062.pdf
multiplies the expected sqrt(CCA advantage) by 8(d+q_D)sqrt(w), where
d is the number of stages of hash queries, w is the number of hash
queries per stage, and q_D is the number of decapsulation queries, and
then adds further terms related to correctness failures and how "spread"
the PKE is.
The factor 8(d+q_D)sqrt(w) by itself makes the theorem content-free for
proposed cryptosystems. It's not as if there has been intensive public
cryptanalysis trying to figure out whether this gap is exploitable;
cryptanalysts are overloaded with attack targets.
> Omitting implicit rejection from ML-KEM would have improved binding
> properties and saved 32 bytes from secret keys. One could maintain
> API compatibility by returning 32 random bytes instead of an error.
This seems difficult to evaluate without a clear definition of the
binding properties at issue, evidence that aiming for those properties
_decreases_ risks rather than _increasing_ risks (otherwise "improved"
is not the right word), and evidence that the two changes in question
achieve these properties.
Meanwhile the changes have other effects. The first change introduces
errors into the API. The second change avoids that, but amplifies the
question of what sort of binding we're talking about. Each change
eliminates the CCA protection provided by implicit rejection; this
_maybe_ isn't a problem given other defenses, but the evidence is
quantitatively and qualitatively weak. Removing a defense needs clear
justification.
Two years ago, when I saw a claim that compressing the ML-KEM secret key
to a 32-byte seed would achieve some "MAL-BIND-K-CT" property, I asked
for an explanation of what exactly the security problems are that were
supposedly addressed by this compression, and why those problems aren't
triggered at the moment that, e.g., someone decompresses a seed for
decapsulation. I haven't seen an answer.
Standard ML-KEM is like many other cryptosystems in not providing
MAL-BIND-K-CT. People who think that the lack of MAL-BIND-K-CT is a
security risk should be able to spell out concrete scenarios of security
failures that would be stopped by MAL-BIND-K-CT, so that the probability
and impact of such failures can be evaluated and weighed against
competing considerations. For comparison, there are many papers stating
CCA attacks that worked only because there wasn't implicit rejection,
and in the broader security literature there are many attacks that rely
on errors from APIs being mishandled.
---D. J. Bernstein