[TLS] Re: WG Last Call: draft-ietf-tls-mlkem-08 (Ends 20 26-07-08)

Henrick Hellström <[email protected]> Sat, 11 Jul 2026 19:43:59 +0200
Newsgroups gmane.ietf.tls
Message-ID <[email protected]>
Hi Jacob,

On 2026-07-11 18:00, Jacob Appelbaum wrote:
 >
 > The Kyber hash was not merely nostalgia for Dual_EC_DRBG. It was a
 > cheap defense-in-depth step against exposing raw system RNG output to
 > the recipient. Prof. Dr. Peter Schwabe made that point explicitly during
 > the NIST discussion [0]. FIPS 203 removed that step and instead relies
 > on a requirement for approved randomness generation [1]. That dependency
 > is exactly what the TLS draft should surface.

I agree, that discussion could be generalized and carried over to the 
TLS security considerations. In the case of ML-KEM specifically, you get 
it implicitly for TLS as long as the implementation of ML-KEM is fully 
FIPS 203 conformant. This is what the relevant paragraph on page 16 of 
FIPS 203 says:

"Randomness generation. Two algorithms in this standard require the 
generation of randomness as an internal step: ML-KEM.KeyGen and 
ML-KEM.Encaps. In pseudocode, this randomness generation is denoted by a 
statement of the form 𝑚 ←− 𝔹32. A fresh string of random bytes must be 
generated for every such invocation. These random bytes shall be 
generated using an approved RBG, as prescribed in SP 800-90A, SP 
800-90B, and SP 800-90C [18, 19, 20]. Moreover, this RBG shall have a 
security strength of at least 128 bits for ML-KEM-512, at least 192 bits 
for ML-KEM-768, and at least 256 bits for ML-KEM-1024."

On 2026-07-11 18:00, Jacob Appelbaum wrote:
> Hi Henrick,
> 
> On 7/11/26 13:53, Henrick Hellström wrote:
>> Hi Jacob,
>>
>> On 2026-07-09 18:11, Jacob Appelbaum wrote:
>>  > Obviously no one should use Dual_EC_DRBG. The problem is that users
>>  > often do not know when their randomness source is sabotaged. Hashing
>>  > does not solve all bad-RNG problems, but it does destroy the algebraic
>>  > structure used in this known attack class.
>>
>> Yes, I understand this might once have been brought in as a quick-fix 
>> for Dual_EC-DRBG debacle, but at this time it ought to be replaced by 
>> a more permanent fix.
>>
> I agree that a permanent fix is better than an ad hoc fix.
> 
> Where I disagree is the implication that the issue has already been
> permanently fixed in the TLS draft. If the permanent fix is "never hand
> raw primary RBG output to ML-KEM.Encaps() as decapsulator-recoverable
> `m`", then that should be stated clearly in the Security Considerations.
> 
> The Kyber hash was not merely nostalgia for Dual_EC_DRBG. It was a
> cheap defense-in-depth step against exposing raw system RNG output to
> the recipient. Prof. Dr. Peter Schwabe made that point explicitly during
> the NIST discussion [0]. FIPS 203 removed that step and instead relies
> on a requirement for approved randomness generation [1]. That dependency
> is exactly what the TLS draft should surface.
> 
>  > Because who exactly do you mean by "user" in this context, and what
>  > kind of conformance certification is required?
> 
> By "user" I mean the people who rely on TLS deployments: browser users,
> citizens using government systems, operators, administrators, device
> owners, library consumers, and people depending on remote services. They
> are usually not in a position to audit whether a hardware RNG, firmware
> RNG, HSM, cloud module, or library RNG is sabotaged.
> 
> That is why this belongs in protocol security guidance. A lab
> conformance story is not the same thing as user protection.
> 
>  > If you would want the implementation to be FIPS 140 conformant, the
>  > randomness source consumed by ML-KEM would have to be an approved
>  > DRBG, but it can be a secondary DRBG, like I described, and it
>  > should be one of the symmetric, more easily analysed DRBGs.
> 
> That may indeed be a good answer if it is mandatory, isolated, and
> specified carefully.
> 
> A secondary symmetric DRBG seeded from a primary RBG can plausibly
> destroy Dual_EC_DRBG-shaped (x-coordinate) structure, provided that raw
> primary output is not exposed elsewhere and the secondary DRBG is
> properly instantiated, reseeded, separated by use, and implemented. If
> that is the intended FIPS-friendly permanent fix, then the draft should
> say so.
> 
> What the draft should not do is silently inherit the assumption
> "approved RBG" as if that alone answered the historical failure mode.
> Dual_EC_DRBG was once standardized in the same general standards family.
> The lesson should not be "trust the label"; it should be "do not expose
> structured RBG output when cheap separation or whitening avoids it."
> 
>  > On the other hand, if you add a hash between the approved DRBG and
>  > the ML-KEM implementation, it would become an algorithm that clearly
>  > differs from the specifications and requirements of NIST SP 800-90,
>  > so I doubt it would be FIPS 140 certifiable.
> 
> This may be true for a strict FIPS validation boundary. If so, it is not
> a rebuttal; it is the problem stated plainly. Also, this isn't a draft 
> about FIPS per se, though it is clearly very related to IETF finding 
> consensus on FIPS 203.
> 
> If restoring Kyber's `m <- H(m)` step would make an implementation no
> longer FIPS 140 certifiable as ML-KEM, then the TLS draft should say
> what FIPS-constrained implementations are expected to do instead. For
> example: use an approved, separate, symmetric DRBG or approved
> derivation construction for ML-KEM encapsulation randomness, with domain
> separation, so that raw primary RBG output is never used directly as
> `m`.
> 
> For non-FIPS-constrained implementations, Kyber-style hashing or
> context-bound derivation of `m` remains the simple defense-in-depth
> answer. For FIPS-constrained implementations, the answer may be a
> validated secondary DRBG construction. Either way, the security goal is
> the same: do not give the decapsulating peer a clean sample of raw,
> structured RNG output.
> 
> So I think we may be closer than it first appeared. If your position is:
> 
>    "Do not use raw primary RBG output directly as ML-KEM `m`; use a
>    properly separated approved secondary DRBG instead if FIPS validation
>    is required"
> 
> then I would appreciate seeing that written into the draft's Security
> Considerations, along with the reason it matters to implementers.
> 
> Kind regards,
> Jacob
> 
> [0] https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/WFRDl8DqYQ4/ 
> m/o2XJ2YvfAwAJ
> 
> [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf
> 
> [2] https://csrc.nist.gov/pubs/fips/140-3/final
> 
>>> On 7/9/26 10:39, Henrick Hellstrom wrote:
>>>
>>>> On 2026-07-09 10:10, Tanja Lange wrote:
>>>>
>>>>> The question by Benjamin Kaduk was if there are cases where the
>>> server hellow would not leak the state of the PRNG (adding P for
>>> clarity^*) and Botan implements that protection. There are other
>>> libraries that have seperate PRNGs for public and private values.
>>>
>>> To further support Tanja's point: The sub-topic is not ordinary PRNG
>>> quality. It is avoiding leakage of bytes that can form a covert channel
>>> and carry algebraic structure from kleptographic RNGs such as
>>> Dual_EC_DRBG. That kind of leakage can happen through many protocol
>>> fields, including TLS fields, and it is a specification-level defense-
>>> in-depth gap.
>>>
>>> ML-KEM as finalized in FIPS 203 removed Kyber's hash over `m`, even
>>> though at least one Kyber designer explicitly argued that hashing `m`
>>> avoids sending system RNG output to the recipient [0]. NIST later
>>> announced that the hash would be removed [1]. I have not seen an
>>> analysis from NIST showing that this removal remains safe against their
>>> own historical example: Dual_EC_DRBG, a DRBG NIST described as "provided
>>> by NSA," which NIST later said there were many reasons to reject or
>>> modify, but "instead, we left it in" [2][3].
>>>
>>> Any such analysis would have had to address the central point: hashing
>>> destroys the Dual_EC_DRBG algebraic structure needed for efficient state
>>> recovery.
>>>
>>>> Yes, but just hashing the output from a DRBG is not the approved way
>>> to do it. Instead you are supposed to spawn a secondary DRBG with a seed
>>> generated from a primary DRBG.
>>>
>>> That may be an approved construction for ordinary DRBG engineering, but
>>> it is not obviously a defense against a DRBG whose output is
>>> intentionally structured to leak its state. If the primary DRBG is
>>> Dual_EC_DRBG-shaped, spawning another DRBG from it may simply give the
>>> defender two things to audit. Please point me to the specific approval
>>> text you mean where the "do it" is defending against this class of
>>> Dual_EC_DRBG kleptographic backdoor.
>>>
>>> Dual_EC_DRBG output can look secure by many metrics and still act as a
>>> covert channel [4]. With the relevant trapdoor/secret key(s), an
>>> Adversary who can sample enough output can recover DRBG state and
>>> predict future outputs. The general attack is well established [5][6]
>>> [7]. The RSA/Dual_EC_DRBG reporting and the BULLRUN reporting are the
>>> relevant historical context here [8][9].
>>>
>>> Obviously no one should use Dual_EC_DRBG. The problem is that users
>>> often do not know when their randomness source is sabotaged. Hashing
>>> does not solve all bad-RNG problems, but it does destroy the algebraic
>>> structure used in this known attack class.
>>>
>>>> Just hashing wouldn't do much good, if you are really concerned that
>>> the DRBG output might reveal anything about the internal state.
>>>
>>> For this attack class, it does good.
>>>
>>> Hashing `m` during `ML-KEM.Encaps()`, for example with the ML-KEM public
>>> key and/or transcript context, binds `m` to context before the ML-KEM
>>> ciphertext is sent. In the normal non-ECH TLS 1.3 case, that closes the
>>> Dual_EC_DRBG-shaped oracle against the server's RNG output. With ECH
>>> using ML-KEM or a hybrid KEM, the same concern can arise in both 
>>> directions.
>>>
>>> A few objections have come up repeatedly:
>>>
>>> 0. Ad-hominem attacks
>>>
>>> 1. TLS already has random fields written to the wire, so we should not
>>> worry about ML-KEM
>>>
>>> 2. NIST already issued FIPS 203, so the IETF should not revisit the 
>>> issue
>>>
>>> 3. Updating drafts, RFCs, or implementations would be work
>>>
>>> 4. The issue also affects hybrids, so the hybrid recommendation should
>>> be weakened
>>>
>>> 5. Hashing may not increase entropy
>>>
>>> 6. Hashing DRBG output merely creates a new DRBG, DRBG'
>>>
>>> Briefly:
>>>
>>> 0. The IETF mission is to make the Internet work better for the people
>>> who use and manage it [10], and the IETF considers pervasive monitoring
>>> an attack [11]. Cryptographic sabotage is part of how pervasive
>>> monitoring becomes actionable intelligence. Attacking the person raising
>>> the issue is irrelevant to the technical question.
>>>
>>> 1. It is true that TLS has a broader problem with raw random bytes in
>>> protocol-visible fields. That is a reason to fix the broader issue, not
>>> a reason to preserve the same problem in ML-KEM. Tanja pointed out that
>>> Botan already has a TLS protection strategy. Other libraries use
>>> different ad-hoc strategies, or none. That is exactly why IETF guidance
>>> would help.
>>>
>>> 2. FIPS 203 being final is not the end of the story. NIST can publish
>>> errata, revisions, or clarifications. NIST withdrew Dual_EC_DRBG after
>>> public reporting on BULLRUN and related cryptographic sabotage. A NIST
>>> participant who described himself as a main author of FIPS 203 is on
>>> this list, and I have asked for clarification on both the hashing
>>> decision and the IPR implications.
>>>
>>> 3. Yes, updates take work. That is not a security argument. If the
>>> Security Considerations of the draft omit an important assumption and a
>>> cheap mitigation, that should be fixed. This is a constructive
>>> suggestion and an easy win to build consensus.
>>>
>>> 4. The issue also applies to hybrid X25519MLKEM* constructions. The
>>> answer is not to weaken hybrids; it is to hash `m` in the ML-KEM
>>> component. Failure to hash `m` can contribute to compromising later
>>> values, including later X25519 keypairs, if the same long-running RNG
>>> state is used and no strong reseed or unknown additional input 
>>> intervenes.
>>>
>>> 5. Hashing Dual_EC_DRBG output does not magically add entropy, and may
>>> reduce it in some constructions. That is not the point. The point is
>>> destroying hidden algebraic structure. We should not shift the
>>> discussion from structure recovery to entropy accounting and then
>>> conclude that no mitigation is useful.
>>>
>>> 6. Yes, hashing DRBG output can be described as constructing DRBG'. That
>>> is fine. DRBG' should still be treated as suspect, but it no longer
>>> preserves the Dual_EC_DRBG x-coordinate structure needed by the
>>> published attacks. Unkeyed hashing appears sufficient to block the known
>>> Dual_EC_DRBG recovery attacks; a keyed hash may be useful for stronger
>>> designs, but it is not needed to make this point.
>>>
>>> My conclusion is simple: when history and user-centered harm reduction
>>> are the concern, the arguments favor hashing. We know this class of
>>> kleptographic attack is real. We know standards influence is part of the
>>> game. We should not leak raw pre-whitened system entropy to the network,
>>> and we should not hand raw RNG-derived `m` to a potentially adversarial
>>> decapsulator.
>>>
>>> To restate the completely obvious: this isn't an accusation of a
>>> backdoor in ML-KEM. It is a statement of fact that a defense-in-depth
>>> protection was knowingly removed by NIST. NIST did so over the objection
>>> of several people participating in the NIST PQC process, and without
>>> analysis that accounts for the extremely serious failures of NIST in the
>>> very recent past with regard to Dual_EC_DRBG. The change by NIST serves
>>> as an example where surprise: no one is responsible for the user's
>>> security even though the difference in exploitability for the
>>> Dual_EC_DRBG scenario is roughly a single hash function call.
>>>
>>> The IETF should give implementers clear guidance and it should be in the
>>> draft's Security Consideration at the very least. Hash `m`. Relatedly,
>>> do not write raw RNG output into protocol-visible fields when cheap
>>> whitening destroys known hidden structure.
>>>
>>> Kind regards,
>>> Jacob Appelbaum
>>>
>>> P.S.
>>>
>>> Consider also the scale of the budgets for only a single agency [12]. It
>>> may also be worth your time looking at the cryptographic libraries
>>> worked on by former NSA people once they were officially out of
>>> government and firmly on the defending side of the fence. It is also
>>> informative for spotting the folks who have retained their first job
>>> while taking on another, another thing we learned about PROJECT BULLRUN.
>>> Remember: there is no need for accusations of a conspiracy as the
>>> business plan as the documented [12] attack budget appears to exceed the
>>> IETF's operating budget by a very large margin. The larger issue isn't
>>> even really about the NSA as the NSA's track record serves as a fairly
>>> clear example of what to look for from many other large-scale 
>>> adversaries.
>>>
>>> [0] https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ 
>>> WFRDl8DqYQ4/ m/o2XJ2YvfAwAJ
>>>
>>> [1] https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/ 
>>> WFRDl8DqYQ4/ m/MRa5O0CvAAAJ
>>>
>>> [2] https://rwc.iacr.org/2015/Slides/RWC-2015-Kelsey-final.pdf
>>>
>>> [3] https://csrc.nist.gov/csrc/media/projects/crypto-standards- 
>>> development-process/documents/dualec_in_x982_and_sp800-90.pdf
>>>
>>> [4] https://csrc.nist.gov/glossary/term/covert_channel
>>>
>>> [5] https://rump2007.cr.yp.to/15-shumow.pdf
>>>
>>> [6] https://eprint.iacr.org/2015/767
>>>
>>> [7] https://www.usenix.org/system/files/conference/usenixsecurity14/ 
>>> sec14-paper-checkoway.pdf
>>>
>>> [8] https://www.reuters.com/article/world/exclusive-secret-contract- 
>>> tied-nsa-and-security-industry-pioneer-idUSBRE9BJ1C5/
>>>
>>> [9] https://www.theguardian.com/world/2013/sep/05/nsa-gchq- 
>>> encryption- codes-security
>>>
>>> [10] https://datatracker.ietf.org/doc/html/rfc3935
>>>
>>> [11] https://datatracker.ietf.org/doc/html/rfc7258
>>>
>>> [12] https://archive.nytimes.com/www.nytimes.com/ 
>>> interactive/2013/09/05/ us/documents-reveal-nsa-campaign-against- 
>>> encryption.html
>>
>

_______________________________________________
TLS mailing list -- [email protected]
To unsubscribe send an email to [email protected]
smime.p7s (application/pkcs7-signature, 4.4 KB) - not displayed