{"id":1228,"date":"2026-11-10T08:34:11","date_gmt":"2026-11-10T07:34:11","guid":{"rendered":"https:\/\/hadamard.com\/c\/ml-dsa-vs-slh-dsa-signatures-compared\/"},"modified":"2026-11-10T08:34:11","modified_gmt":"2026-11-10T07:34:11","slug":"ml-dsa-vs-slh-dsa-signatures-compared","status":"publish","type":"post","link":"https:\/\/hadamard.com\/c\/ml-dsa-vs-slh-dsa-signatures-compared\/","title":{"rendered":"ML-DSA vs SLH-DSA: Signature Sizes, Speed and Which to Use"},"content":{"rendered":"<p>ML-DSA (FIPS 204) is NIST&#8217;s primary post-quantum signature. It is lattice-based and fast, and its smallest signatures are 2,420 bytes. SLH-DSA (FIPS 205) is the hash-based backup: its public keys are only 32 to 64 bytes, but its signatures run from 7,856 to 49,856 bytes and take far longer to create. That trade-off makes ML-DSA the default for TLS and high-volume signing, while SLH-DSA suits firmware, software releases and long-lived roots, where a conservative security assumption matters more than speed.<\/p>\n<p>This ML-DSA vs SLH-DSA comparison covers exact sizes for every parameter set, relative speed, why NIST standardized two signatures, and what has changed since the standards were finalized, including the SP 800-230 draft published in April 2026.<\/p>\n<h2>ML-DSA vs SLH-DSA at a glance: two standards, two kinds of math<\/h2>\n<p>NIST published <a href=\"https:\/\/csrc.nist.gov\/pubs\/fips\/204\/final\" target=\"_blank\" rel=\"noopener\">FIPS 204 (ML-DSA)<\/a> and <a href=\"https:\/\/csrc.nist.gov\/pubs\/fips\/205\/final\" target=\"_blank\" rel=\"noopener\">FIPS 205 (SLH-DSA)<\/a> as final standards on August 13, 2024, almost a year after the drafts appeared on August 24, 2023. According to the <a href=\"https:\/\/www.govinfo.gov\/content\/pkg\/FR-2024-08-14\/html\/2024-17956.htm\" target=\"_blank\" rel=\"noopener\">Federal Register notice<\/a>, &#8220;FIPS 203, FIPS 204, and FIPS 205 are effective on August 14, 2024.&#8221;<\/p>\n<p>The two rest on different foundations. In its <a href=\"https:\/\/www.nist.gov\/news-events\/news\/2024\/08\/nist-releases-first-3-finalized-post-quantum-encryption-standards\" target=\"_blank\" rel=\"noopener\">announcement<\/a>, NIST says ML-DSA is module-lattice-based, derived from CRYSTALS-Dilithium, and serves as the primary signature standard. SLH-DSA is hash-based and derived from SPHINCS+. NIST describes it as &#8220;intended as a backup method in case ML-DSA proves vulnerable,&#8221; built on a different mathematical approach.<\/p>\n<p>The FIPS 205 abstract describes SLH-DSA as a stateless hash-based digital signature algorithm whose signatures detect unauthorized changes, authenticate the signer and provide non-repudiation. ML-DSA offers the same properties. What differs is the assumption underneath: lattice problems for ML-DSA, and only the security of the hash function for SLH-DSA.<\/p>\n<h2>ML-DSA vs SLH-DSA signature size, byte for byte<\/h2>\n<p>Size is usually the first constraint engineers hit. The ML-DSA figures below come from <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc9881\" target=\"_blank\" rel=\"noopener\">RFC 9881<\/a>, the IETF Proposed Standard for ML-DSA in X.509 certificates and CRLs. They are raw sizes, without ASN.1 overhead.<\/p>\n<table>\n<thead>\n<tr>\n<th>ML-DSA set<\/th>\n<th>Signature<\/th>\n<th>Public key<\/th>\n<th>Private key (seed)<\/th>\n<th>Private key (expanded)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ML-DSA-44<\/td>\n<td>2,420 B<\/td>\n<td>1,312 B<\/td>\n<td>32 B<\/td>\n<td>2,560 B<\/td>\n<\/tr>\n<tr>\n<td>ML-DSA-65<\/td>\n<td>3,309 B<\/td>\n<td>1,952 B<\/td>\n<td>32 B<\/td>\n<td>4,032 B<\/td>\n<\/tr>\n<tr>\n<td>ML-DSA-87<\/td>\n<td>4,627 B<\/td>\n<td>2,592 B<\/td>\n<td>32 B<\/td>\n<td>4,896 B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>SLH-DSA has twelve parameter sets: six sizes, each available with SHA2 or SHAKE. <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc9909\" target=\"_blank\" rel=\"noopener\">RFC 9909<\/a> lists the sizes, which are the same for both hash families and for both Pure and HashSLH-DSA.<\/p>\n<table>\n<thead>\n<tr>\n<th>SLH-DSA set<\/th>\n<th>NIST level<\/th>\n<th>Signature<\/th>\n<th>Public key<\/th>\n<th>Private key<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>128s<\/td>\n<td>1<\/td>\n<td>7,856 B<\/td>\n<td>32 B<\/td>\n<td>64 B<\/td>\n<\/tr>\n<tr>\n<td>128f<\/td>\n<td>1<\/td>\n<td>17,088 B<\/td>\n<td>32 B<\/td>\n<td>64 B<\/td>\n<\/tr>\n<tr>\n<td>192s<\/td>\n<td>3<\/td>\n<td>16,224 B<\/td>\n<td>48 B<\/td>\n<td>96 B<\/td>\n<\/tr>\n<tr>\n<td>192f<\/td>\n<td>3<\/td>\n<td>35,664 B<\/td>\n<td>48 B<\/td>\n<td>96 B<\/td>\n<\/tr>\n<tr>\n<td>256s<\/td>\n<td>5<\/td>\n<td>29,792 B<\/td>\n<td>64 B<\/td>\n<td>128 B<\/td>\n<\/tr>\n<tr>\n<td>256f<\/td>\n<td>5<\/td>\n<td>49,856 B<\/td>\n<td>64 B<\/td>\n<td>128 B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>How they compare with Ed25519 and RSA-2048<\/h3>\n<p><a href=\"https:\/\/blog.cloudflare.com\/another-look-at-pq-signatures\/\" target=\"_blank\" rel=\"noopener\">Cloudflare&#8217;s comparison<\/a> by Bas Westerbaan and Luke Valenta gives the classical baseline. Ed25519 has a 32-byte public key and a 64-byte signature, and RSA-2048 uses 256 bytes for each. An ML-DSA-44 signature is therefore about 38 times larger than an Ed25519 signature. An SLH-DSA-128s signature is more than 120 times larger.<\/p>\n<p>The two schemes fail on size in different ways. ML-DSA&#8217;s public keys and signatures are both large; as Cloudflare puts it, &#8220;The big downside is that its signatures and public keys are large.&#8221; SLH-DSA&#8217;s public key is as small as Ed25519&#8217;s, but almost all of its cost sits in the signature.<\/p>\n<h2>How fast are ML-DSA and SLH-DSA?<\/h2>\n<p>Cloudflare normalized CPU time to ML-DSA-44 = 1. These are rough ratios, and the post warns that &#8220;CPU performance varies significantly by platform and implementation.&#8221;<\/p>\n<ul>\n<li><strong>SLH-DSA-128s:<\/strong> signing about 14,000x, verification about 40x<\/li>\n<li><strong>Ed25519:<\/strong> signing about 0.15x, verification about 1.3x<\/li>\n<li><strong>RSA-2048:<\/strong> signing about 80x, verification about 0.4x<\/li>\n<\/ul>\n<p>ML-DSA is therefore in the same performance range as the classical schemes it replaces. SLH-DSA signing is orders of magnitude slower. That is acceptable when you sign one firmware image per release, but not when a server signs on every connection.<\/p>\n<h3>What &#8220;s&#8221; and &#8220;f&#8221; mean<\/h3>\n<p>Each SLH-DSA security level comes in two forms. According to RFC 9909, the &#8220;s&#8221; (small) sets are optimized for signature size. The &#8220;f&#8221; (fast) sets sign and generate keys faster, but verify more slowly and roughly double the signature size. At level 1, for example, 128s produces 7,856-byte signatures and 128f produces 17,088-byte signatures.<\/p>\n<h2>Why did NIST standardize a backup signature?<\/h2>\n<p>Lattice cryptography is efficient, but its security rests on mathematical problems that are newer to cryptanalysis than hash functions are. NIST&#8217;s stated reason for SLH-DSA is to hedge against that risk: if a structural attack on lattices breaks ML-DSA, a standardized signature based on different math already exists. SLH-DSA&#8217;s security depends only on its hash functions, and the field has long experience with how hash functions weaken over time. Our article on <a href=\"https:\/\/hadamard.com\/c\/is-sha-1-broken-collisions-explained\/\">how SHA-1 went from a theoretical break to a practical collision<\/a> traces one example.<\/p>\n<p>NIST also explained why it did not hold the standards back. Dustin Moody, the NIST mathematician who heads the PQC standardization project, said: &#8220;There is no need to wait for future standards.&#8221; The same announcement names FN-DSA (FIPS 206, based on FALCON) as a forthcoming third signature standard.<\/p>\n<h3>What NIST changed and declined to change<\/h3>\n<p>NIST&#8217;s responses to public comments in the <a href=\"https:\/\/www.govinfo.gov\/content\/pkg\/FR-2024-08-14\/html\/2024-17956.htm\" target=\"_blank\" rel=\"noopener\">Federal Register notice<\/a> record several design decisions:<\/p>\n<ul>\n<li>A randomized ML-DSA variant &#8220;could enable more efficient side-channel protections,&#8221; but NIST did not adopt it because implementations would be harder to validate.<\/li>\n<li>For SLH-DSA, proposed SHA-256\/SHA-512 variants and a switch from SHAKE256 to TurboSHAKE256 were rejected because &#8220;the improvements were not considered significant enough&#8221; to justify using primitives not currently specified in NIST standards.<\/li>\n<li>NIST said it &#8220;intends to propose&#8221; SLH-DSA parameter sets with smaller signatures and signature limits below 2^64 in a separate Special Publication. That publication is now SP 800-230.<\/li>\n<\/ul>\n<h2>SLH-DSA vs stateful LMS and XMSS<\/h2>\n<p>SLH-DSA was not NIST&#8217;s first hash-based signature recommendation. <a href=\"https:\/\/csrc.nist.gov\/pubs\/sp\/800\/208\/final\" target=\"_blank\" rel=\"noopener\">NIST SP 800-208<\/a>, finalized on October 29, 2020, specifies LMS and XMSS and their multi-tree variants, HSS and XMSS-MT. Those schemes are <em>stateful<\/em>: the signer has to track which one-time keys have already been used. SLH-DSA is <em>stateless<\/em>, so the signer does not have to keep that record.<\/p>\n<p>This difference matters in practice. With a stateful scheme, restoring a key from backup or cloning it across machines can lead to an index being reused, which undermines security. SLH-DSA avoids that failure mode in exchange for larger signatures. Even so, it has a usage ceiling: RFC 9909 notes that each private key is limited to about 2^64 signatures and advises operators to track usage or set validity periods so the limit cannot be reached.<\/p>\n<h2>SP 800-230: smaller SLH-DSA parameter sets capped at 2^24 signatures<\/h2>\n<p>NIST published <a href=\"https:\/\/csrc.nist.gov\/pubs\/sp\/800\/230\/ipd\" target=\"_blank\" rel=\"noopener\">SP 800-230, &#8220;Additional SLH-DSA Parameter Sets for Limited-Signature Use Cases,&#8221;<\/a> as an Initial Public Draft on April 13, 2026. The comment period closed on June 12, 2026, and NIST has posted the comments it received. The document is still a draft.<\/p>\n<p>The draft adds six parameter sets at security levels 1, 3 and 5. They aim at faster verification and smaller signatures for software, firmware and certificate signing. In exchange, each signing key is capped at 2^24 signatures, and the sets are &#8220;not approved for general-purpose use.&#8221; Users must make sure the limit is never exceeded.<\/p>\n<p>A cap of 2^24 is about 16.8 million signatures. That is plenty for a firmware vendor or a root CA and far too few for a busy TLS endpoint. The approach brings back some of the discipline of stateful schemes, because you have to count signatures, but a single slip does not carry the immediate risk of reusing an LMS or XMSS index.<\/p>\n<h2>ML-DSA or SLH-DSA: which should you use?<\/h2>\n<p>The sizes and speeds above point to a fairly clear split.<\/p>\n<h3>TLS, certificates and high-volume signing: ML-DSA<\/h3>\n<p>Handshakes carry several signatures and public keys, and servers sign constantly. According to Cloudflare, SLH-DSA-128s would add about 39 kB to a TLS handshake, and its signing cost is in the thousands of times ML-DSA&#8217;s. ML-DSA-44 or ML-DSA-65 is the practical choice here. Key exchange is a separate problem; our explainer on <a href=\"https:\/\/hadamard.com\/c\/x25519mlkem768-rfc-10024-explained\/\">X25519MLKEM768 in TLS 1.3<\/a> covers that side.<\/p>\n<h3>Firmware, software releases and long-lived roots: SLH-DSA<\/h3>\n<p>When you sign rarely, verify often and need the key to stay trustworthy for many years, SLH-DSA&#8217;s conservative assumption pays off. Slow signing hardly matters for a monthly release, and a 32-byte public key is easy to burn into a boot ROM. Choose &#8220;s&#8221; sets when the signature is stored or transmitted many times.<\/p>\n<h3>Deployment details from RFC 9909<\/h3>\n<ul>\n<li>CAs must choose Pure SLH-DSA or HashSLH-DSA in advance, because the choice is tied to the OID.<\/li>\n<li>Pure SLH-DSA needs the whole message in memory, which can exceed HSM input limits for large CRLs. HashSLH-DSA reduces this problem.<\/li>\n<li>Track signature counts against the roughly 2^64 limit, and against 2^24 if you adopt SP 800-230 sets once they are final.<\/li>\n<\/ul>\n<p>For the dates that drive these migrations, see <a href=\"https:\/\/hadamard.com\/c\/nist-ir-8547-rsa-deprecated-2030\/\">NIST IR 8547&#8217;s deprecation deadlines for RSA and ECC<\/a>. Our <a href=\"https:\/\/hadamard.com\/post-quantum-tracker\/\">post-quantum migration tracker<\/a> follows how standards and platforms are adopting the new algorithms.<\/p>\n<p>Hash-based designs are also being used outside PKI. Hadamard builds <a href=\"https:\/\/bb84.com\/\">BB84<\/a>, an ECDSA-free Layer 2 rollup on Ethereum. Its accounts are one-time addresses based on hash commitments instead of ECDSA keys, so the design relies on hash functions, the same kind of assumption that makes SLH-DSA the conservative choice.<\/p>\n<h2>FAQ<\/h2>\n<h3>Is SLH-DSA more secure than ML-DSA?<\/h3>\n<p>Not in any simple sense. The two rely on different assumptions: SLH-DSA on hash functions, ML-DSA on lattice problems. NIST calls ML-DSA the primary standard and SLH-DSA a backup in case ML-DSA proves vulnerable. SLH-DSA is a hedge, not an upgrade.<\/p>\n<h3>Why are post-quantum signatures so much bigger than Ed25519?<\/h3>\n<p>The schemes rely on different mathematics, which leads to larger outputs. Ed25519 signatures are 64 bytes, compared with 2,420 bytes for ML-DSA-44 and 7,856 bytes for SLH-DSA-128s. ML-DSA also has a 1,312-byte public key, while SLH-DSA keeps the public key at 32 bytes and puts the cost into the signature.<\/p>\n<h3>Should I use the &#8220;s&#8221; or &#8220;f&#8221; SLH-DSA parameter sets?<\/h3>\n<p>Use &#8220;s&#8221; when signature size matters and signing is infrequent, which covers most firmware and code signing. Use &#8220;f&#8221; when signing or key generation speed is the bottleneck and you can accept signatures roughly twice as large and slower verification.<\/p>\n<h3>How does SLH-DSA differ from LMS\/XMSS, and what does SP 800-230 change?<\/h3>\n<p>LMS and XMSS (SP 800-208) are stateful, so the signer must never reuse a one-time key index. SLH-DSA is stateless. The SP 800-230 draft adds smaller-signature SLH-DSA sets limited to 2^24 signatures per key, intended for limited-signature uses rather than general-purpose signing.<\/p>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/csrc.nist.gov\/pubs\/fips\/204\/final\" target=\"_blank\" rel=\"noopener\">FIPS 204: Module-Lattice-Based Digital Signature Standard<\/a> \u2013 NIST CSRC, August 13, 2024<\/li>\n<li><a href=\"https:\/\/csrc.nist.gov\/pubs\/fips\/205\/final\" target=\"_blank\" rel=\"noopener\">FIPS 205: Stateless Hash-Based Digital Signature Standard<\/a> \u2013 NIST CSRC, August 13, 2024<\/li>\n<li><a href=\"https:\/\/www.nist.gov\/news-events\/news\/2024\/08\/nist-releases-first-3-finalized-post-quantum-encryption-standards\" target=\"_blank\" rel=\"noopener\">NIST Releases First 3 Finalized Post-Quantum Encryption Standards<\/a> \u2013 NIST, August 13, 2024 (updated August 29, 2025)<\/li>\n<li><a href=\"https:\/\/www.govinfo.gov\/content\/pkg\/FR-2024-08-14\/html\/2024-17956.htm\" target=\"_blank\" rel=\"noopener\">Federal Register notice 2024-17956 announcing FIPS 203, 204 and 205<\/a> \u2013 govinfo, August 14, 2024<\/li>\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc9881\" target=\"_blank\" rel=\"noopener\">RFC 9881: ML-DSA in X.509 certificates and CRLs<\/a> \u2013 IETF, October 2025<\/li>\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc9909\" target=\"_blank\" rel=\"noopener\">RFC 9909: SLH-DSA in X.509 certificates and CRLs<\/a> \u2013 IETF, December 2025<\/li>\n<li><a href=\"https:\/\/blog.cloudflare.com\/another-look-at-pq-signatures\/\" target=\"_blank\" rel=\"noopener\">Another look at PQ signatures<\/a> \u2013 Cloudflare (Bas Westerbaan, Luke Valenta), November 7, 2024<\/li>\n<li><a href=\"https:\/\/csrc.nist.gov\/pubs\/sp\/800\/230\/ipd\" target=\"_blank\" rel=\"noopener\">SP 800-230 (Initial Public Draft): Additional SLH-DSA Parameter Sets for Limited-Signature Use Cases<\/a> \u2013 NIST CSRC, April 13, 2026<\/li>\n<li><a href=\"https:\/\/csrc.nist.gov\/pubs\/sp\/800\/208\/final\" target=\"_blank\" rel=\"noopener\">SP 800-208: Recommendation for Stateful Hash-Based Signature Schemes<\/a> \u2013 NIST CSRC, October 29, 2020<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>ML-DSA is NIST&#8217;s fast, lattice-based primary signature. SLH-DSA is the hash-based backup, with tiny keys but large, slow-to-create signatures. This guide compares sizes and speed, covers what NIST has changed since 2024, and explains where each one fits.<\/p>\n","protected":false},"author":1,"featured_media":1229,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[794],"tags":[861,832,795,787,860],"class_list":["post-1228","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-post-quantum-cryptography","tag-digital-signatures","tag-ml-dsa","tag-nist","tag-post-quantum-cryptography","tag-slh-dsa","entry"],"jetpack_featured_media_url":"https:\/\/hadamard.com\/c\/wp-content\/uploads\/2026\/11\/2026-11-10-ml-dsa-vs-slh-dsa-signatures-compared.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/posts\/1228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/comments?post=1228"}],"version-history":[{"count":0,"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/posts\/1228\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/media\/1229"}],"wp:attachment":[{"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/media?parent=1228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/categories?post=1228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hadamard.com\/c\/wp-json\/wp\/v2\/tags?post=1228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}