[Ssh] Re: Supporting pure ML-DSA as hostkey and authkey

Filippo Valsorda <filippo@ml.filippo.io> Wed, 29 April 2026 12:17 UTC

Return-Path: <filippo@ml.filippo.io>
X-Original-To: ssh@mail2.ietf.org
Delivered-To: ssh@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 77122E59C3E5 for <ssh@mail2.ietf.org>; Wed, 29 Apr 2026 05:17:53 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1777465073; bh=6Rsy+SIQqXTgTEGO+OcMdVgIydZe5tF+WH4FsS+EWEc=; h=Date:From:To:Cc:In-Reply-To:References:Subject; b=WPN4naNvsh3FF1Wd4uCBUoM/aMVL516uOyRZVagZlmPc+IrWa12R8DMbEYNLe3pQk r6QdpkLqrxVRMlB+55MyKNn3bJudyuglB6TSbRkCDoS8cHGYkRWZ9RkNaa003uAhKB 44ENp8m1RtLsNidvuT5MoRexSzPqtj7HgPqNWgHA=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.699
X-Spam-Level:
X-Spam-Status: No, score=-2.699 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=filippo.io header.b="NGJBci3b"; dkim=pass (2048-bit key) header.d=messagingengine.com header.b="tsC6oFi/"
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 SkOhwrAI3yXR for <ssh@mail2.ietf.org>; Wed, 29 Apr 2026 05:17:52 -0700 (PDT)
Received: from fhigh-a3-smtp.messagingengine.com (fhigh-a3-smtp.messagingengine.com [103.168.172.154]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id DB603E59C3E0 for <SSH@ietf.org>; Wed, 29 Apr 2026 05:17:52 -0700 (PDT)
Received: from phl-compute-09.internal (phl-compute-09.internal [10.202.2.49]) by mailfhigh.phl.internal (Postfix) with ESMTP id 6925E1400105; Wed, 29 Apr 2026 08:17:46 -0400 (EDT)
Received: from phl-imap-02 ([10.202.2.81]) by phl-compute-09.internal (MEProxy); Wed, 29 Apr 2026 08:17:46 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=filippo.io; h=cc :cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm1; t=1777465066; x=1777551466; bh=PQNJ9kqaaJJbINB238wlm0jbk6QBC7H3y/teLT5BLpw=; b= NGJBci3bGtNSN5Gvx5EitnLsGCjWsz0QSUtdxRSvbwjLx9aBiigKu2OssX+9PWou ps6XmtrVrfmAt7/o/uoUDRB3bcmH/04ESZPFQHZT7tfPJyw9r6DChCI34pfWQYpe 6+yOHxT3iK7cpgaguMqGZUWLbtZI0xZeiW/Om7VwgraR4YDaxb+6Ir/D+WR87zPX 5xt6vyPM8sKOFj/IEzVmhUcQvJPTl9GW1FG4V7up1klE7FKNghaiAhEXpIAODBcz xxkS+bnElh/aULiIogIwGac/e9L/aIMN3YA03wb/UshpGiLRuqS/3beaIickyn8A lS+1e25nbNg6XkJuABN/aQ==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1777465066; x= 1777551466; bh=PQNJ9kqaaJJbINB238wlm0jbk6QBC7H3y/teLT5BLpw=; b=t sC6oFi/Yi6PEtI/yOz1+9Vta9xdYUtWDFLBkSvEl9n51c3bIkTS5JFnFclyHmEHX GZQ3W3M3aTJ3odE37PcP/Waje7X6TUSc5eYrzvnjyDNy9++0DSvixb9T1oc81Ff2 6TRsjFbFzun6/0QWwxSACi2ruZoG9tA6Sm80BCOvTXxN1Dz6rtnJRH5arPFwlxhq o0Y8G9k8VNvFJRsNfcuUrbQapuehOafPibiU92RCHGbOKl7c/YcWe4JMcaYEInaW km6qGQFdI1wnPvcFMGqCtcQqlzpcP3+O9ghjgW3UHCNiXnEEScOVVQ4mCaMO9L6M wh5XAxoQUvPkDi/fV3kAA==
X-ME-Sender: <xms:6vbxaUcClVbrtR52h6GaA64aHvap_DNyeWkCYa51IjMych4TQn2mEQ> <xme:6vbxaRCWgESTIucacr1F41H19BR8JBm3sDwdSUaifdLa9ccR6Mh9pa9tV4CGMBRxs urXK_l7hwlAn6UmHrk_FjCuGxPVev_v9mcl853aRc5zEKzfwPg6gw>
X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefhedrtddtgdekgeegvdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpefoggffhffvvefkjghfufgtgfesthejredtredttdenucfhrhhomhepfdfhihhlihhp phhoucggrghlshhorhgurgdfuceofhhilhhiphhpohesmhhlrdhfihhlihhpphhordhioh eqnecuggftrfgrthhtvghrnhepkedvkefhhffgtdfgleffgfdtvddvheffkeehieevieeh feduudfgieejfeekvedunecuffhomhgrihhnpehivghtfhdrohhrghdpghholhgrnhhgrd horhhgpdhgihhthhhusgdrtghomhenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgr mhepmhgrihhlfhhrohhmpehfihhlihhpphhosehmlhdrfhhilhhiphhpohdrihhopdhnsg gprhgtphhtthhopeegpdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehnihgtohhl rgdrmhhurhhinhhosehgmhgrihhlrdgtohhmpdhrtghpthhtohepfigrthhsohhnsghlrg guugesghhmrghilhdrtghomhdprhgtphhtthhopehsshhhsehivghtfhdrohhrghdprhgt phhtthhopegujhhmsehmihhnughrohhtrdhorhhg
X-ME-Proxy: <xmx:6vbxabiXeA9tRaZs4wIlxSoUS5v2EDLkq3o9UNQ-SB7XTQXK9S7Jlw> <xmx:6vbxafCpdr-qm9neAInTbgXERqElRxsXi9fqV-jOsZKTyojty-Uecw> <xmx:6vbxaQEJXlml6Noy2hovS4XfZsLeS7emWjkm6ChgRO-fun2Ci1H8fA> <xmx:6vbxaXLJLI3xVAt8RITsAaDxGhHxePwl5U4p5GxC5mi5Fnhfp-t-bg> <xmx:6vbxaeAcoZdmFRmtyR3rrheW1OfAUaovKrFUTLw-WNk_ar1vAhlxwSBJ>
Feedback-ID: i2e91459c:Fastmail
Received: by mailuser.phl.internal (Postfix, from userid 501) id 3155C700069; Wed, 29 Apr 2026 08:17:46 -0400 (EDT)
X-Mailer: MessagingEngine.com Webmail Interface
MIME-Version: 1.0
X-ThreadId: A_AVEdQZ0ntZ
Date: Wed, 29 Apr 2026 14:17:24 +0200
From: Filippo Valsorda <filippo@ml.filippo.io>
To: Damien Miller <djm@mindrot.org>, Watson Ladd <watsonbladd@gmail.com>
Message-Id: <ba9669a6-65a6-4276-8306-bd55ef0d146f@app.fastmail.com>
In-Reply-To: <461a8358-8bd8-4f45-f8f3-073f993fb18f@mindrot.org>
References: <68bc138c-ccfc-2d97-0f25-64271655c23b@mindrot.org> <CACsn0ckzxMZRN6MxmkUjByzzgbgJdH3eRxVT1dA37TYQHeUq2Q%mail.gmail.com@mailhub.eait.uq.edu.au> <461a8358-8bd8-4f45-f8f3-073f993fb18f@mindrot.org>
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Message-ID-Hash: MU65AKLXLUR3HN2QYUFGDFJOYWQ6AW3M
X-Message-ID-Hash: MU65AKLXLUR3HN2QYUFGDFJOYWQ6AW3M
X-MailFrom: filippo@ml.filippo.io
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
CC: "ssh@ietf.org" <SSH@ietf.org>, Nicola Murino <nicola.murino@gmail.com>
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Ssh] Re: Supporting pure ML-DSA as hostkey and authkey
List-Id: "The SSH mail list will allow discussions on improving aspects of the Secure Shell (SSH) protocol." <ssh.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/ssh/4sb0aPTWeX4KA3GgK77ns17UHrU>
List-Archive: <https://mailarchive.ietf.org/arch/browse/ssh>
List-Help: <mailto:ssh-request@ietf.org?subject=help>
List-Owner: <mailto:ssh-owner@ietf.org>
List-Post: <mailto:ssh@ietf.org>
List-Subscribe: <mailto:ssh-join@ietf.org>
List-Unsubscribe: <mailto:ssh-leave@ietf.org>

>From the point of view of Go, we'd strongly prefer to implement pure ML-DSA,
specifically because of the increased urgency.

 1. If the CRQC are coming sooner than expected, the hypothetical value of
    the ECC component is obviously shorter-lived.

 2. Picking and specifying a composite will take longer, as proven by the
    failure of every other ecosystem to pick and deploy a composite so far.

 3. It's not 2020, ML-DSA has been analyzed for almost a decade, it's a
    delightfully simple and robust algorithm to implement, we have good
    test vectors for it in Wycheproof that survived mutation testing against
    multiple implementations, and remarkably there has not been a single
    security issue in a ML-DSA implementation in the nearly two years since
    it was specified (that I know of).

 4. Composites, unlike hybrid ephemeral key exchange, add complexity across
    the stack, as I have argued on the TLS WG mailing list:

    https://mailarchive.ietf.org/arch/msg/tls/oh3jmmkHzHdp1hk4R4M9QjkmvBk/

    I know some folks hold on to the idea that composites will be "just
    another key type" but that's wishful at best, especially in the context
    of SSH, which is not tightly integrated with the cryptography library.

    Take golang.org/x/crypto/ssh for example: if we put a composite
    public/private key type in that package, we'll not be able to return it
    from ParsePKCS8PrivateKey in crypto/x509, because the latter is in the
    standard library. That's just an example of how composites leak through
    API layers.

If we do absolutely need to implement composites:

 1. We will categorically implement at most one combination, ever.

    At least this way we can implement "the SSH hybrid" instead of having
    to build a framework to combine different key types and parameters.

 2. The ECC side should at least be useful for hardware binding.

    There is one benefit to hybrids, and it's using hardware keys that
    provide protections like limited PIN retries and per-signature user
    intent (i.e. touching the YubiKey). We don't have yet widely available
    ML-DSA hardware, so it might make sense for tools like
    https://github.com/FiloSottile/yubikey-agent to do software / hardware
    hybrids (which by the way breaks the "composites are just an opaque
    key type" illusion).

    That means using ECDSA P-256. (Which by the way these days can be
    implemented with equivalent or better safety than Ed25519 by following
    draft-irtf-cfrg-det-sigs-with-noise-05.)

 3. The only PQ parameters that make sense to us are ML-DSA-44 and -87.

    If we are making a risk- and security-based analysis, ML-DSA-44 is
    perfectly fine. Unlike ML-KEM-512, which was... hotly debated, leading
    to the selection of ML-KEM-768 for hybrids, ML-DSA-44 is Category 2,
    so it already has a healthy margin for small improvements in lattice
    cryptanalysis. There is no reason to think large improvements would
    leave any parameter set standing.

    If we are making a bigger-is-better or compliance-based analysis, then
    the obvious answer is ML-DSA-87, which is the only one allowed by
    CNSA 2.0, and is... bigger! (Both the bigger-is-better and compliance
    arguments are weaker when selecting a hybrid, because the hybrid is
    already supposed to provide additional margin, and because CNSA 2.0
    actually has a preference against hybrids, so ML-DSA-87 makes more
    sense as a pure parameter set.)

    I see no logical argument for selecting ML-DSA-65.

Putting all that together, if we really must have a composite, the only one
that would make sense to us is ML-DSA-44 + ECDSA P-256.

But please, don't block pure ML-DSA availability on the composites debate.

2026-04-28 01:38 GMT+02:00 Damien Miller <djm@mindrot.org>:
> On Mon, 27 Apr 2026, Watson Ladd wrote:
> 
> > > FWIW I have a test implementation of hybrid ML-DSA 65 / Ed25519 for
> > > OpenSSH using the draft-ietf-lamps-pq-composite-sigs construction
> > > and was planning on writing it up as an I-D is anyone is interested.
> > >
> > > https://github.com/djmdjm/openssh-portable-wip/pull/11
> > 
> > I don't want to drag us down the composite rabbit hole but short PQ
> > timelines and the nature of authentication make me less interested.
> 
> Basing this on an document that is in the RFC editor queue as opposed
> to one of the other myriad constructions was an attempt to step over
> the rabbit hole as much as possible.
> 
> IMO, the increased urgency for deployment of PQ sig algs (I have seen
> requests for by-default deployment in 2028) *heightens* the
> desirability of a hybrid construction. I was more comfortable with
> pure ML-DSA when it was a 2030s thing on the basis that we'd have
> more time for algorithmic and implementation scrutiny.
> 
> -d
>