[Last-Call] Re: [TLS] Re: Last Call: <draft-ietf-tls-mldsa-03.txt> (Use of ML-DSA in TLS 1.3) to Informational RFC

"D. J. Bernstein" <djb@cr.yp.to> Tue, 02 June 2026 21:08 UTC

Return-Path: <djb-dsn2-1406711340.7506@cr.yp.to>
X-Original-To: last-call@mail2.ietf.org
Delivered-To: last-call@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 60CF4F999D29 for <last-call@mail2.ietf.org>; Tue, 2 Jun 2026 14:08:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1780434512; bh=2z9YRnNFFtkRDi8Kdc7/XieEgTwAmxBGnECQLWUNyK0=; h=Date:From:To:Subject:In-Reply-To; b=hy+km5/DsnlfK1yMgYa3OLRxyjkryMLhmp5bDUIUemoDEb90+LiLT1+931bsgHBUR gX2gzumtaNAd8a0d+TQYQ71hg4e++mtnK8sVIeKwvZptQP+NM07hQIe3CKHcrNt+TC 4gNYx1inw6cFbeVLKxTPaMPHE/5IGqYewTLhRKuk=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -4.197
X-Spam-Level:
X-Spam-Status: No, score=-4.197 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001] autolearn=ham autolearn_force=no
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id IFQFi7cWhESs for <last-call@mail2.ietf.org>; Tue, 2 Jun 2026 14:08:31 -0700 (PDT)
Received: from salsa.cs.uic.edu (salsa.cs.uic.edu [131.193.32.108]) by mail2.ietf.org (Postfix) with SMTP id 88FC4F999AC8 for <last-call@ietf.org>; Tue, 2 Jun 2026 14:05:36 -0700 (PDT)
Received: (qmail 910251 invoked by uid 1010); 2 Jun 2026 21:05:30 -0000
Received: from unknown (unknown) by unknown with QMTP; 2 Jun 2026 21:05:30 -0000
Received: (qmail 2289935 invoked by uid 1000); 2 Jun 2026 21:05:27 -0000
Date: Tue, 02 Jun 2026 21:05:27 -0000
Message-ID: <20260602210527.2289933.qmail@cr.yp.to>
From: "D. J. Bernstein" <djb@cr.yp.to>
To: Filippo Valsorda <filippo@ml.filippo.io>, tls@ietf.org, last-call@ietf.org
Mail-Followup-To: tls@ietf.org, last-call@ietf.org
In-Reply-To: <85821685-f12a-41e2-a136-3b068647b7f7@app.fastmail.com>
Message-ID-Hash: 4ZW6OKO3DHW6JGYG6JAKA25FE4MBOE4X
X-Message-ID-Hash: 4ZW6OKO3DHW6JGYG6JAKA25FE4MBOE4X
X-MailFrom: djb-dsn2-1406711340.7506@cr.yp.to
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Last-Call] Re: [TLS] Re: Last Call: <draft-ietf-tls-mldsa-03.txt> (Use of ML-DSA in TLS 1.3) to Informational RFC
List-Id: IETF Last Calls <last-call.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/last-call/2FdcE63Z0rEkYdAsvQjLGoPSR-I>
List-Archive: <https://mailarchive.ietf.org/arch/browse/last-call>
List-Help: <mailto:last-call-request@ietf.org?subject=help>
List-Owner: <mailto:last-call-owner@ietf.org>
List-Post: <mailto:last-call@ietf.org>
List-Subscribe: <mailto:last-call-join@ietf.org>
List-Unsubscribe: <mailto:last-call-leave@ietf.org>

Filippo Valsorda writes:
> These bugs are so easy to find

The CVE-2026-24850 bug ("the ML-DSA signature verification
implementation in the RustCrypto 'ml-dsa' crate incorrectly accepts
signatures with repeated (duplicate) hint indices") was so easy to find:
just try a fuzzer. So why wasn't it found before release?

The CVE-2026-22705 timing leak ("a timing side-channel was discovered in
the Decompose algorithm which is used during ML-DSA signing") was so
easy to find: just run standard constant-time checkers. So why wasn't it
found before release? (Btw, maybe this one is exploitable, but my paper
explicitly presumes unexploitable since there's no analysis.)

The CVE-2026-41990 bug ("Libgcrypt before 1.12.2 mishandles Dilithium
signing. Writes to a static array lack a bounds check but do not use
attacker-controlled data") was so easy to find: just try a fuzzer. So
why wasn't it found before release?

The "previous" vs. "current" bug in Cryspen's "verified" ML-DSA software
was so easy to find: just try a fuzzer. So why wasn't it found before
release? (Btw, anyone claiming that signature malleability is severe has
to count this bug as severe.)

Both of the official Dilithium 1.0 implementations submitted to NIST
were vulnerable (and, as my paper shows for an analogous bug in
Dilithium 3.4 = ML-DSA, exploitable in under 1 second on 1 core). This
bug was so easy to find: just check KATs against a Python translation of
the spec. So why wasn't it found before release?

Et cetera. My paper is looking at the real world, not at some fantasy
world where every bug that could easily have been caught _is_ caught.
Cryptographic deployments use a wide range of libraries with a wide
range of testing practices; saying that better tests exist is really
missing the point.

Most Dilithium software is new, so the CVEs are just getting started,
and trying to extrapolate from those would obviously be error-prone. But
this extrapolation is what you're doing in emphasizing the small number
of severe vulnerabilities found so far.

My paper instead uses the normal technique of measuring ML-DSA software
complexity to predict ML-DSA bug rates. My paper also looks much more
closely at some structural aspects of ML-DSA software that make a wide
range of ML-DSA bugs likely to evade typical tests. The word "typical"
is important; again, saying that better tests exist misses the point.

You claimed that there are going to be "exceedingly few bugs" in ML-DSA
software. How many is "exceedingly few"? Where do you get this number
from? If there's no specific number that would disprove the claim, then
the claim is content-free, so why are you advocating decisions on the
basis of the claim?

As for severity, a 2021 study of cryptographic libraries found that
about 1/8 of cryptographic CVEs are severe. Are you claiming that ML-DSA
CVEs will end up with a lower severity rate than that? Why? How low?

In the same posting, you wrote that "a single broken key per month can
be catastrophic" and that a disaster chance above 1% is unacceptable
since "you are betting with your users' lives". Are you claiming that
the chance of a severe ML-DSA software vulnerability is below 1%?

---D. J. Bernstein


===== NOTICES =====

IETF BCP 78, "Rights Contributors Provide to the IETF Trust", Section 5
(normative), "Rights in Contributions", provides a modification right
"unless explicitly disallowed in the notices contained in a Contribution
(in the form specified by the Legend Instructions)".

The official language from IETF's "Legend Instructions" for the
situation that "the Contributor does not wish to allow modifications nor
to allow publication as an RFC" is as follows: "This document may not be
modified, and derivative works of it may not be created, and it may not
be published except as an Internet-Draft."
<https://trustee.ietf.org/wp-content/uploads/Corrected-TLP-5.0-legal-provsions.pdf>

The same language is used in, e.g., RFC 5831. The same language hereby
applies to this document. This is not disclaiming or limiting the
applicability of IETF policies; it is strictly following IETF policies.

IESG claims that the "explicitly disallowed" provision in BCP 78 is
limited to the examples in Section 3 in BCP 78. That is incorrect. BCP
78 states that Section 5, "Rights in Contributions", is normative, while
Section 3, "Exposition of Why These Procedures Are the Way They Are", is
informative. The opt-out provision in the normative text is clear, and
cannot be limited by an informative section. BCP 78 does not give IESG
any authority to issue changes or purported clarifications of the rules.

Rationale for exercising the BCP 78 opt-out provision: I'm fine with
redistribution of copies of this document. The issue is instead with
modification, such as (1) IESG's May 2025 posting of an IESG-mangled
version of an appeal that I had filed and (2) IETF management selling
IETF mailing-list text to AI companies. This goes far beyond what
copyright law allows as fair use (such as giving quotes for purposes of
commentary). When I complained about the mangled document, the IETF
Executive Director responded not by apologizing but instead by asserting
that IETF management "has a license" to do anything it wants.