<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Parag Mali - tag: zero-knowledge-proofs</title><description>Posts tagged zero-knowledge-proofs.</description><link>https://paragmali.com/</link><language>en-US</language><lastBuildDate>Sun, 07 Jun 2026 04:13:12 GMT</lastBuildDate><atom:link href="https://paragmali.com/tags/zero-knowledge-proofs/rss.xml" rel="self" type="application/rss+xml"/><item><title>The Age Gate That Doesn&apos;t Know Your Age: How Anonymous Credentials Finally Crossed the Deployment Chasm</title><link>https://paragmali.com/blog/the-age-gate-that-doesnt-know-your-age-how-anonymous-credent/</link><guid isPermaLink="true">https://paragmali.com/blog/the-age-gate-that-doesnt-know-your-age-how-anonymous-credent/</guid><description>Forty years after David Chaum&apos;s manifesto, anonymous credentials -- Privacy Pass, BBS, SD-JWT, Longfellow-zk -- have shipped into every major browser.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><content:encoded>
Anonymous credentials -- cryptographic schemes that prove a claim about a person without revealing identity -- spent forty years in academic papers and have, in the last eighteen months, crossed the deployment chasm. The Privacy Pass family (IETF RFCs 9576, 9577, and 9578, all June 2024) now serves anti-abuse attestation at internet scale across Cloudflare, Apple, Google Chrome, and Microsoft Edge. For multi-attribute credentials, four schemes are racing for the EUDI Wallet and mDL slot -- BBS, SD-JWT (RFC 9901, November 2025), the ISO/IEC 18013-5 mdoc baseline, and Google&apos;s open-sourced Longfellow-zk SNARK-over-ECDSA library -- with the EU age-verification app, announced &quot;technically ready&quot; on 15 April 2026, the first population-scale test. Revocation under unlinkability, post-quantum security, and cross-platform interop remain unsolved.
&lt;h2&gt;1. A Press Conference, Forty-One Years Late&lt;/h2&gt;
&lt;p&gt;On 15 April 2026, Ursula von der Leyen stood at a Commission lectern in Brussels and announced that the European Union&apos;s age-verification app was &quot;technically ready.&quot; The app, she said, is &quot;completely anonymous, works on any device, and is fully open source&quot;[@ec-2026-age-app].&lt;/p&gt;
&lt;p&gt;Forty-one years earlier, in October 1985, a Berkeley cryptographer named David Chaum had described the same idea in &lt;em&gt;Communications of the ACM&lt;/em&gt;: a system in which a citizen could prove a fact about themselves -- over eighteen, holds a driver&apos;s licence, has paid the toll -- without revealing who they are, and without two presentations of that proof being linkable to each other[@chaum-1985-doi].&lt;/p&gt;
&lt;p&gt;For four decades Chaum&apos;s framing lived almost entirely in cryptography conferences. In the last eighteen months it has shipped into every major browser, into IETF Standards-Track RFCs, into Google&apos;s open-source zero-knowledge library, and -- if Brussels delivers on its 24 December 2026 deadline -- into roughly 450 million European pockets[@eidas2].&lt;/p&gt;
&lt;p&gt;Two days after the Commission press conference, the Johns Hopkins cryptographer Matthew Green published Part 2 of his &lt;em&gt;Anonymous Credentials: An Illustrated Primer&lt;/em&gt;, an unusual two-part deep-technical exposition aimed at engineers. Part 1, published 2 March 2026, lays out the formal Issuer / User / Resource model and the unlinkability requirement[@green-2026-part1]. Green&apos;s framing in Part 2 has since become the field&apos;s working summary: Privacy Pass, the IETF anti-abuse token scheme deployed by Cloudflare and Apple and shipped into Chrome and Edge, &quot;is the most widely-deployed anonymous credential standard in the world&quot;[@green-2026-part2].&lt;/p&gt;

Privacy Pass... is the most widely-deployed anonymous credential standard in the world. -- Matthew Green, *Anonymous Credentials: An Illustrated Primer (Part 2)*, 17 April 2026
&lt;p&gt;Three layers of the stack shipped at different times for different reasons.&lt;/p&gt;
&lt;p&gt;At the &lt;strong&gt;hardware layer&lt;/strong&gt;, the Trusted Computing Group first specified &lt;a href=&quot;https://paragmali.com/blog/direct-anonymous-attestation-the-zero-knowledge-proof-alread/&quot; rel=&quot;noopener&quot;&gt;Direct Anonymous Attestation&lt;/a&gt; in the &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM 1.2 Main Specification&lt;/a&gt; in 2005 using an RSA-based construction (Brickell-Camenisch-Chen) -- the first anonymous credential primitive ever burned into commodity silicon -- and re-defined it in elliptic-curve form (ECDAA) in the TPM 2.0 Library Specification in October 2014[@tpm-2-spec][@daa-2004-doi]. It sat largely dormant because the algorithm is optional and consumer-TPM vendors did not enable it.&lt;/p&gt;
&lt;p&gt;At the &lt;strong&gt;network layer&lt;/strong&gt;, Cloudflare engineers in 2017 took an academic primitive called a verifiable oblivious pseudorandom function and built a one-bit anonymous token that proves a client solved a CAPTCHA. That scheme became Privacy Pass, became three IETF RFCs in June 2024, and now sits behind Apple&apos;s Private Access Tokens, Chrome&apos;s Private State Tokens, and Cloudflare&apos;s anti-abuse pipeline[@rfc9576][@rfc9577][@rfc9578].&lt;/p&gt;
&lt;p&gt;At the &lt;strong&gt;application layer&lt;/strong&gt;, four multi-attribute credential schemes are racing for the European Digital Identity Wallet and mobile driving licence slot, with the EU age-verification app as the first population-scale test case. The contenders are BBS pairing signatures, SD-JWT, the ISO/IEC 18013-5 mdoc baseline, and Google&apos;s Longfellow-zk -- a SNARK that proves &quot;I know an ECDSA signature on a credential that says I am over eighteen&quot; without revealing the signature or any other attribute[@google-2025-zkp-blog].&lt;/p&gt;
&lt;p&gt;Why did the deployment take so long? What finally broke the pattern? And what can the cryptography still not do? To understand any of that, start with the person who first described the problem.&lt;/p&gt;
&lt;h2&gt;2. The Move That Started Everything&lt;/h2&gt;
&lt;p&gt;In 1982, David Chaum was a doctoral candidate at Berkeley looking at the emerging computerised payment system and seeing something that disturbed him: a dossier-building machine. Account-based authentication, the model that banks were quietly digitising, left a stable identifier on every transaction. The merchant knew who you were. The bank knew what you bought. The state, given a court order or a National Security Letter, knew both. Chaum&apos;s contribution to the 1982 &lt;em&gt;CRYPTO&lt;/em&gt; proceedings, and then to &lt;em&gt;Communications of the ACM&lt;/em&gt; three years later, was the first formal way out.&lt;/p&gt;
&lt;p&gt;The 1982 paper introduced a primitive called the &lt;strong&gt;blind signature&lt;/strong&gt; -- a signature scheme in which the signer signs a message they cannot read.&lt;/p&gt;

A signature scheme in which the signer produces a signature on a message it never directly sees, by virtue of the user multiplicatively masking the message with a blinding factor before requesting the signature. After the signer signs the masked value, the user un-blinds the result and is left with a valid signature on the original message -- but the signer cannot link the issued signature to its signing act.
&lt;p&gt;The RSA construction is the easiest one to picture. The signer holds the standard RSA key pair $(N, e, d)$. The user wants a signature on a message $m$ but does not want the signer to learn $m$.&lt;/p&gt;
&lt;p&gt;The user picks a random blinding factor $r$, computes the blinded message $m&apos; = m \cdot r^e \bmod N$, and sends $m&apos;$ to the signer. The signer, who sees only a uniformly random element of $\mathbb{Z}_N^*$, signs as usual: $s&apos; = (m&apos;)^d \bmod N$. The user un-blinds by dividing out the blinding factor: $s = s&apos; \cdot r^{-1} \bmod N$.&lt;/p&gt;
&lt;p&gt;Because $(m \cdot r^e)^d = m^d \cdot r$, what comes out is $s = m^d \bmod N$, a valid RSA signature on the original $m$. The signer held a valid signature in their hand for an instant -- and cannot match it to any later appearance.&lt;/p&gt;

sequenceDiagram
    participant User
    participant Signer
    User-&amp;gt;&amp;gt;User: pick random r, compute m&apos; = m · r^e mod N
    User-&amp;gt;&amp;gt;Signer: send blinded message m&apos;
    Signer-&amp;gt;&amp;gt;Signer: sign s&apos; = (m&apos;)^d mod N
    Signer-&amp;gt;&amp;gt;User: return s&apos;
    User-&amp;gt;&amp;gt;User: unblind s = s&apos; · r^(-1) mod N
    User-&amp;gt;&amp;gt;User: hold valid signature s = m^d mod N on m
&lt;p&gt;That single move is the cryptographic kernel of every anonymous credential system since. Privacy Pass token type 0x0002 in RFC 9578 is Chaum&apos;s blind RSA signature with a 2048-bit modulus and an RSA-PSS padding wrapper; the RFC&apos;s text explicitly credits &quot;Chaum83&quot;[@rfc9474][@rfc9578]. The construction is forty-four years old and is on the wire today.&lt;/p&gt;
&lt;p&gt;In 1985 Chaum extended the framing from payments to a general theory in his &lt;em&gt;Comm. ACM&lt;/em&gt; paper &quot;Security without Identification: Transaction Systems to Make Big Brother Obsolete&quot;[@chaum-1985-doi]. The manifesto&apos;s claim is the one Brussels was making in 2026: a citizen should be able to prove a transaction-relevant fact (over eighteen, holds a licence, has paid) without revealing identity, and without two presentations being linkable to each other. The article uses the term &lt;em&gt;anonymous credential&lt;/em&gt; in the modern sense.&lt;/p&gt;

A cryptographic credential that lets a holder prove a fact about themselves -- for example, &quot;I am over 18&quot; or &quot;I am licensed to drive&quot; -- without revealing identity, and without two presentations of the same credential being linkable to each other across verifiers (or, in stronger formulations, even across the issuer and a colluding verifier).
&lt;p&gt;There are two things to notice about this framing in 1985.&lt;/p&gt;
&lt;p&gt;First, it is forty years early. The post-GDPR, post-Snowden privacy concerns the credential model implicitly addresses had no political constituency in 1985. The deployments Chaum was writing about -- electronic payments, toll roads, public-transit cards -- mostly did not exist yet. The standards bodies that would eventually publish RFCs on this topic had not been formed.&lt;/p&gt;
&lt;p&gt;Second, a bare blind signature is not yet a credential system. A blind signature signs a single opaque message. To prove &quot;I am over 18&quot; without revealing my date of birth, you need a way to sign multiple attributes -- name, date of birth, licence class, expiration -- separately, then prove a &lt;em&gt;predicate&lt;/em&gt; over the bundle (&quot;the date-of-birth field, whatever it is, satisfies birth_year &amp;lt; 2008&quot;) without disclosing the field itself. A naked blind RSA signature on a single value cannot do that. The field would spend the next sixteen years trying to solve the multi-attribute version of the same problem.&lt;/p&gt;
&lt;p&gt;Chaum&apos;s own attempt to commercialise the payment variant was DigiCash, founded by Chaum in 1989 and bankrupt by 1998[@wiki-digicash].The cryptography of DigiCash worked. ING discussed a partnership; Deutsche Bank licensed the technology; both declined to launch consumer-scale deployments[@wiki-digicash]. What did not exist was a merchant network. DigiCash&apos;s tokens were redeemable at only a few hundred merchants worldwide at the company&apos;s peak (about 300, with roughly 5,000 users by 1998)[@wiki-digicash]. It is the canonical &quot;right cryptography, wrong substrate&quot; failure -- the first one in this story, but not the last.&lt;/p&gt;
&lt;p&gt;Chaum had named the problem. The field would now spend two decades trying to extend the primitive to a full multi-attribute credential system, and would quietly fail to ship anything outside research code.&lt;/p&gt;
&lt;h2&gt;3. The Multi-Attribute Decades&lt;/h2&gt;
&lt;p&gt;Between 1993 and 2014, the academic literature produced two complete family trees of multi-attribute anonymous credential schemes, each of them correct cryptography, neither of them deploying at scale. The drumbeat of these two decades is a single sentence: the math worked, and nobody used it.&lt;/p&gt;
&lt;h3&gt;Brands and the Wallet-with-Observer&lt;/h3&gt;
&lt;p&gt;Stefan Brands, working in Amsterdam and later at Microsoft Research, gave the &lt;em&gt;CRYPTO &apos;93&lt;/em&gt; paper that defined a deployment architecture twenty-five years too early[@brands-1993-doi]. His scheme combined a restrictive blind signature with what he called a &quot;wallet with observer&quot; -- a tamper-resistant chip that holds a per-user secret, plus a host computer that runs the privacy-preserving protocol around it. The chip&apos;s job is to prevent the user from double-spending or copying credentials; the host&apos;s job is to compute the unlinkable presentation. Double-spending mathematically reveals the user&apos;s identity (a feature, not a bug).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Brands&apos; 1993 architecture -- a tamper-resistant chip that holds a per-user secret, plus a host that computes the privacy-respecting transformation -- is structurally identical to the EUDI Wallet&apos;s secure-element-plus-on-device-prover architecture in 2026. The chip is the observer, the host is the wallet. The architecture was right; the hardware -- a programmable secure element with attestation, present in every smartphone -- was decades late.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Brands founded Credentica in the early 2000s to commercialise the construction; Microsoft acquired Credentica on 6 March 2008 and renamed the technology &lt;em&gt;U-Prove&lt;/em&gt;[@wiki-brands][@microsoft-uprove]. Microsoft folded U-Prove into the CardSpace identity selector, then announced on 15 February 2011 that CardSpace 2.0 would not ship[@wiki-cardspace]. The Microsoft Research project page still documents U-Prove as of 2026, but no Microsoft product ships it[@microsoft-uprove]. It is the second canonical &quot;right cryptography, no relying-party demand&quot; deployment death.&lt;/p&gt;
&lt;p&gt;The lowercase &quot;a&quot; in abhi shelat&apos;s name -- the Northeastern professor who, with Matteo Frigo, designs Longfellow-zk in Section 5 -- is intentional and consistent across his publications.&lt;/p&gt;
&lt;h3&gt;Camenisch-Lysyanskaya and the CL Signature Family&lt;/h3&gt;
&lt;p&gt;In 2001, Jan Camenisch and Anna Lysyanskaya at IBM Zurich gave the first practical and provably-secure multi-show anonymous credential system at &lt;em&gt;EUROCRYPT&lt;/em&gt;[@cl2001-doi]. CL signatures use a Strong-RSA assumption to sign a committed vector of messages; the holder then proves possession of the signature in zero knowledge using a Sigma protocol. The construction anchored the field&apos;s pedagogy for the next decade. Two properties matter here.&lt;/p&gt;

The property that a credential holder can reveal an arbitrary subset of the attributes on the credential while keeping the rest hidden, with a cryptographic proof that the revealed subset is consistent with the issuer&apos;s signature on the full credential.

The property that two or more presentations of the same credential -- by the same holder, to the same verifier or to colluding verifiers -- cannot be cryptographically linked to each other. The holder can present the credential many times, and each presentation looks fresh.
&lt;p&gt;CL signatures gave both properties. IBM built a production-quality library on top called &lt;em&gt;Idemix&lt;/em&gt; and open-sourced it in the early 2010s[@idemix-ibm].The exact open-source release date is folk-knowledge-ambiguous. The IBM Zurich identity-mixer project page (still live as of 2026 and now serving as Hyperledger Fabric Idemix documentation) confirms the project but does not pin the release year. Multiple secondary sources say &quot;around 2010&quot;; no canonical IBM press release survived. Idemix is the ancestor of every &quot;self-sovereign identity&quot; deployment today; the Hyperledger AnonCreds specification is its direct production descendant[@anoncreds-spec].&lt;/p&gt;
&lt;p&gt;Why didn&apos;t Idemix deploy at internet scale? Two reasons that the field would meet again and again. Per-presentation proofs were kilobyte-scale and the Sigma-protocol verification was substantially slower than ECDSA on 2010 hardware -- the &lt;em&gt;PoPETs 2018&lt;/em&gt; Privacy Pass paper later wrote that prior CL-based approaches &quot;require an order of magnitude more computational resources than our protocol&quot;[@popets-2018]. And, more importantly than either: no browser parsed a CL credential, no website asked for one, no operating system surfaced a credential picker UI. The cryptography was twenty years ahead of the relying-party layer it needed to ride.&lt;/p&gt;
&lt;h3&gt;DAA: A Credential System on Every TPM (Almost)&lt;/h3&gt;
&lt;p&gt;In 2004, Ernie Brickell, Jan Camenisch, and Liqun Chen adapted a CL-family scheme into something a Trusted Platform Module could compute, calling it Direct Anonymous Attestation[@daa-2004-doi]. DAA targeted TPM 1.2 chips (shipped from 2005)[@daa-2004-doi]. When the TCG redrew the TPM 2.0 Library Specification in October 2014, they re-defined the scheme in elliptic-curve form -- ECDAA on pairing-friendly curves -- and folded it into the spec as an optional algorithm[@tpm-2-spec].&lt;/p&gt;

A TPM-deployable anonymous-credential primitive (Brickell, Camenisch, and Chen, 2004) that lets a TPM prove it is a genuine TPM certified by its manufacturer without revealing which specific TPM. ECDAA, the elliptic-curve form, is standardised in the TPM 2.0 Library Specification (TCG, October 2014) as an *optional* algorithm.
&lt;p&gt;The hardware-root anonymous credential genuinely shipped. By 2026, every PC sold in the last several years carries a TPM 2.0[@tpm-2-spec] capable of running ECDAA[@daa-2004-doi] -- Microsoft has required a TPM 2.0 on every Windows 11 device since October 2021[@win11-tpm-req], putting billions of chips in the field (see the corpus &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM in Windows post&lt;/a&gt; for the deployment-scale figure). In practice almost none of them do.&lt;/p&gt;
&lt;p&gt;The TCG made ECDAA optional, and the major consumer-TPM vendors mostly did not enable it. Intel&apos;s firmware TPM, AMD&apos;s fTPM, the Infineon, STMicroelectronics, and Nuvoton discrete TPMs in the retail channel -- the relying-party-side software simply does not issue DAA challenges, so the TPM-side implementation is dead code at best and absent at worst. &lt;a href=&quot;https://paragmali.com/blog/webauthn-and-passkeys-on-windows-from-ctap-to-the-credential/&quot; rel=&quot;noopener&quot;&gt;WebAuthn&lt;/a&gt;, which lets a browser identify a device with consent and trades anonymity for usability, became the deployed device-attestation protocol because it has a relying-party-side consumption story. The pre-existing post in this corpus on DAA gives the long-form treatment.&lt;/p&gt;
&lt;h3&gt;BBS: Eighty-Byte Signatures, Nobody to Sign Them&lt;/h3&gt;
&lt;p&gt;The other family tree starts in 2004 with Boneh, Boyen, and Shacham&apos;s &lt;em&gt;Short Group Signatures&lt;/em&gt;, the construction now universally called &lt;em&gt;BBS&lt;/em&gt;[@bbs-2004-chapter]. BBS uses bilinear pairings on a pairing-friendly elliptic curve -- BLS12-381 in the modern IETF draft -- to produce signatures that are roughly eighty bytes, two orders of magnitude smaller than the CL-RSA equivalent. Au, Susilo, and Mu extended BBS to a multi-message form in 2006 (originally titled &lt;em&gt;Constant-Size Dynamic k-TAA&lt;/em&gt;), which is the scheme the W3C Verifiable Credentials community now calls BBS+[@bbs-plus-2006-chapter].&lt;/p&gt;

A pairing-based multi-message signature scheme (Au, Susilo, and Mu, 2006) over a pairing-friendly curve, BLS12-381 in the current IETF draft. BBS+ supports zero-knowledge proofs of possession with selective disclosure, achieves multi-show unlinkability, and produces signatures of roughly 80 bytes and proofs of roughly 256 bytes -- the smallest known for any scheme with these properties.
&lt;p&gt;BBS is, by 2026, the cleanest cryptography in the credentials portfolio. The IETF CFRG &lt;code&gt;draft-irtf-cfrg-bbs-signatures-10&lt;/code&gt;, dated 8 January 2026 with authors Looker, Kalos, Whitehead, and Lodder, gives an interoperable specification[@bbs-draft-10]. The MATTR and Trinsic stacks ship BBS implementations[@mattr-bbs][@trinsic-id]. The W3C Verifiable Credentials Data Model 2.0 (Recommendation, 15 May 2025) accommodates BBS as a securing mechanism[@w3c-vcdm-2]. None of that translates to mainstream issuer adoption, because no driver&apos;s-licence-issuing DMV, no national-ID authority, no banking customer-identification scheme has switched to signing credentials with a pairing on BLS12-381. The infrastructure asks for ECDSA-P-256, what every existing PKI emits.&lt;/p&gt;
&lt;p&gt;Every theoretically pure proposal in this twenty-year era assumed the verifier wanted multi-attribute selective disclosure. Every verifier in 2010 just wanted to verify a cookie. The cryptography sat in libraries. The deployment substrate to call it did not exist.&lt;/p&gt;
&lt;h2&gt;4. Eight Generations, One Pattern&lt;/h2&gt;
&lt;p&gt;Pull back from the individual papers and the four-decade arc has a clean shape. Each generation produces correct cryptography. Each generation fails to ship at consumer scale, for one of two reasons: the construction needs hardware that does not exist yet, or the construction needs a relying-party-side protocol that does not exist yet. The single generation that broke the pattern in 2017 did so by giving up the multi-attribute ambition entirely.&lt;/p&gt;

gantt
    dateFormat YYYY-MM
    axisFormat %Y
    section Foundational primitives
    Blind signatures (Chaum)          :done, ch1, 1982-01, 1985-12
    Security without ID (Chaum CACM)  :done, ch2, 1985-10, 1990-01
    section Multi-attribute (academic)
    Brands wallets + observers        :done, br, 1993-08, 2001-01
    CL signatures (Camenisch-Lysyanskaya) :done, cl, 2001-05, 2010-01
    BBS short group signatures        :done, bbs, 2004-08, 2014-01
    BBS+ (Au-Susilo-Mu)               :done, bbsp, 2006-08, 2016-01
    Microsoft acquires Credentica     :done, ms, 2008-03, 2011-01
    section Hardware root
    DAA paper (Brickell-Camenisch-Chen) :done, daa, 2004-10, 2014-10
    TPM 2.0 spec with optional ECDAA   :done, tpm, 2014-10, 2020-01
    section Deployment era
    Cloudflare ships Privacy Pass extension :done, cf, 2017-11, 2018-06
    PoPETs Privacy Pass paper           :done, popets, 2018-06, 2020-01
    Apple PAT in iOS 16                 :done, apat, 2022-06, 2023-01
    RFC 9474 RSA Blind Signatures       :done, r74, 2023-10, 2024-01
    RFC 9497 OPRF                       :done, r97, 2023-12, 2024-06
    eIDAS 2 enters into force           :done, eidas, 2024-05, 2024-12
    Privacy Pass RFCs 9576-9578         :done, ppppp, 2024-06, 2025-01
    section Multi-attribute resurgence
    Frigo-shelat Longfellow paper       :done, lf1, 2024-12, 2025-06
    W3C VCDM 2.0 Recommendation         :done, vcdm, 2025-05, 2025-11
    Google open-sources Longfellow-zk   :done, lf2, 2025-07, 2026-04
    SD-JWT becomes RFC 9901             :done, sd, 2025-11, 2026-04
    Green primer Part 1                 :done, g1, 2026-03, 2026-04
    EU age app technically ready        :done, eu, 2026-04, 2026-12
    Green primer Part 2                 :done, g2, 2026-04, 2026-05
    EUDI Wallet Member-State deadline   :crit, mdl, 2026-12, 2027-12
&lt;p&gt;&lt;strong&gt;Generation 1 (1982-1985): blind signatures.&lt;/strong&gt; Chaum&apos;s single primitive. Signs one opaque message. No multi-attribute support. DigiCash bankruptcy 1998. The substrate was a merchant network that did not exist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 2 (1993): Brands&apos; wallet-with-observer.&lt;/strong&gt; The correct architecture for a tamper-resistant chip plus host computer. Hardware that could play the observer role did not exist; consumer smartphones with secure elements would not arrive until the 2010s. U-Prove acquired by Microsoft 2008; never shipped[@wiki-brands][@microsoft-uprove].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 3 (2001-2010): CL signatures + Idemix.&lt;/strong&gt; First multi-show unlinkable, selectively-disclosing credentials with provable security. Multi-kilobyte presentation proofs. No browser parsed them. The Davidson et al. &lt;em&gt;PoPETs 2018&lt;/em&gt; paper later wrote that prior CL-based approaches &quot;require an order of magnitude more computational resources than our protocol&quot;[@popets-2018].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 4 (2004-2006): BBS, BBS+.&lt;/strong&gt; Eighty-byte pairing signatures and 256-byte proofs. Still undeployed at issuer scale in 2026 because no national identity authority has switched its PKI to BLS12-381[@bbs-draft-10].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 5 (2004-2014): DAA / TPM 2.0 ECDAA.&lt;/strong&gt; Shipped into the spec; mostly not into consumer hardware; never into a browser-side challenge.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The TPM 2.0 Library Specification (TCG, October 2014) defines ECDAA but makes it an optional algorithm. Consumer-TPM vendors mostly do not enable it, and no major operating system or browser issues DAA challenges. The often-repeated claim &quot;DAA shipped on every TPM 2.0 chip&quot; is wrong on two counts -- the algorithm is optional in the spec, and the relying-party-side consumption path was never built[@tpm-2-spec].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Generation 6 (2017-2018): Privacy Pass.&lt;/strong&gt; Alex Davidson, Ian Goldberg, Nick Sullivan, George Tankersley, and Filippo Valsorda looked at the Cloudflare CAPTCHA crisis -- Tor users especially were being challenged on every Cloudflare-fronted site -- and asked the question the field had refused to ask for fifteen years: &lt;em&gt;what if we just need one bit?&lt;/em&gt;[@popets-2018]&lt;/p&gt;
&lt;p&gt;Drop selective disclosure. Drop multi-attribute. The credential becomes &quot;this client solved a CAPTCHA.&quot; For one bit, you do not need CL or BBS+. You need a verifiable oblivious pseudorandom function, or a blind RSA signature, both of which fit in two group operations. Cloudflare shipped the original browser extension on 9 November 2017[@cloudflare-2017-pp].The 2017 launch date is sometimes given as 24 October, but the surviving canonical post slug is &lt;code&gt;cloudflare-supports-privacy-pass&lt;/code&gt; and is dated 2017-11-09. The earlier introducing-privacy-pass URL returns 404 today; Cloudflare&apos;s current documentation page links the November date[@cloudflare-pp-docs].&lt;/p&gt;

An Oblivious Pseudorandom Function: a two-party protocol that computes $F(k, x)$ where one party knows the key $k$ but learns nothing about the input $x$, and the other party knows $x$ but learns nothing about $k$. The Verifiable variant additionally proves that the same $k$ was used as in a published public key. RFC 9497 standardises OPRF, VOPRF, and POPRF (a partially-oblivious variant) over prime-order groups[@rfc9497].

An IETF Standards-Track protocol family (RFCs 9576, 9577, and 9578, all June 2024) for issuing and redeeming unlinkable one-bit anonymous tokens at internet scale. Deployed in production by Cloudflare, by Apple as Private Access Tokens, by Google Chrome as Private State Tokens, and -- per Matthew Green&apos;s April 2026 primer -- by Microsoft Edge[@rfc9576][@rfc9577][@rfc9578][@green-2026-part2].
&lt;p&gt;The IETF threat model that the RFCs eventually codified splits the world into four parties. The client wants a token. The attester decides whether the client deserves one (CAPTCHA solved, device attested, account in good standing). The issuer cryptographically issues the token without learning what the attester learned. The origin -- the website the client wants to access -- redeems the token without learning who the client is. The separation between attester and issuer is what gives Privacy Pass its formal anonymity property; an attacker would need both parties to collude to link a token to the human who earned it.&lt;/p&gt;

flowchart LR
    Client[Client browser or app]
    Attester[Attester: checks device or CAPTCHA]
    Issuer[Issuer: blind-signs token]
    Origin[Origin: target website]
    Client --&amp;gt;|1. request attestation| Attester
    Attester --&amp;gt;|2. forward blinded token| Issuer
    Issuer --&amp;gt;|3. return blinded signature| Client
    Client --&amp;gt;|4. redeem unblinded token| Origin
&lt;p&gt;&lt;strong&gt;Generation 7 (2023-2024): IETF standardisation.&lt;/strong&gt; Privacy Pass moved from a Cloudflare experiment to a Standards-Track protocol in a tight eight-month window. RFC 9474 (RSA Blind Signatures, CFRG, Informational) appeared in October 2023[@rfc9474]. RFC 9497 (OPRF/VOPRF/POPRF, CFRG, Informational) appeared in December 2023[@rfc9497]. The three Privacy Pass RFCs followed in June 2024 -- RFC 9576 (Architecture, Informational)[@rfc9576], RFC 9577 (HTTP Authentication Scheme, Standards Track)[@rfc9577], and RFC 9578 (Issuance Protocols, Standards Track), which defines token type 0x0001 (VOPRF) and token type 0x0002 (Blind RSA) in a public registry[@rfc9578].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 8 (2022-2026): the multi-attribute resurgence.&lt;/strong&gt; Once Privacy Pass made the issuer-attester-origin abstraction a standardised wire format, the field went back to the multi-attribute problem with a clearer head. By 2026 there is a three-way race for the EUDI Wallet and mobile-driving-licence slot:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SD-JWT VC&lt;/strong&gt;, the JSON Web Signature plus salted-hash selective-disclosure scheme by Daniel Fett, Kristina Yasuda, and Brian Campbell. Promoted from a long-running IETF draft to &lt;strong&gt;RFC 9901 (Standards Track) in November 2025&lt;/strong&gt;, and the EUDI Wallet Architecture and Reference Framework&apos;s mandatory baseline[@rfc9901].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ISO/IEC 18013-5 mdoc baseline&lt;/strong&gt;, the CBOR-plus-ECDSA mobile driving licence format, published 2021, deployed by US state DMVs in Arizona, Colorado, Georgia, Maryland and others, and adopted as the EUDI Wallet PID co-baseline[@iso-18013-5].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Longfellow-zk&lt;/strong&gt;, the MPC-in-the-head SNARK by Matteo Frigo and abhi shelat that wraps an existing ECDSA-signed mdoc, posted as IACR ePrint 2024/2010 in December 2024 and open-sourced by Google under Apache-2.0 on &lt;strong&gt;3 July 2025&lt;/strong&gt;[@google-2025-zkp-blog][@longfellow-repo][@libzk-draft].The Google announcement is dated 3 July 2025, not April 2026. The April 2026 date occasionally seen in press coverage conflates Google&apos;s open-sourcing with Matthew Green&apos;s April 2026 primer that brought broader engineering attention to it.&lt;/li&gt;
&lt;/ul&gt;

The cryptography community had spent fifteen years on selective-disclosure schemes, predicate proofs, and pairing-based protocols meant to fold every credential anyone might want into a single cryptographically clean structure. Cloudflare&apos;s deployment team in 2017 said, in effect, *we do not need any of that, we need one bit, and we need it now*. The bit is &quot;did this client solve a CAPTCHA in the last day or so.&quot; A VOPRF-issued token is the bit; nothing else has to ship. That constraint relaxation is what crossed the deployment chasm -- and the multi-attribute resurgence of 2022-2026 is happening on top of the wire-format substrate that Privacy Pass established.&lt;p&gt;The cultural reset matters as much as the cryptography. Before Privacy Pass, the field&apos;s working assumption was that an anonymous credential needed to be a general-purpose identity certificate. After Privacy Pass, an anonymous credential can be as narrow as a single bit -- and the multi-attribute schemes return as one more option in a portfolio rather than the only thing that can ship.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In eighteen months -- between June 2024 and April 2026 -- anonymous credentials went from &quot;Cloudflare&apos;s anti-abuse experiment&quot; to &quot;shipped in every browser, standardised at IETF, mandated by the EU.&quot; How did the field finally crack a problem that had been open for four decades? The answer is not &quot;better cryptography.&quot; It is one insight, repeated twice in different decades.&lt;/p&gt;
&lt;h2&gt;5. The Two Insights That Finally Shipped It&lt;/h2&gt;
&lt;p&gt;Two breakthroughs, twenty years apart, neither of which was a new cryptographic primitive.&lt;/p&gt;
&lt;h3&gt;Breakthrough 1: One Bit (2017)&lt;/h3&gt;
&lt;p&gt;In 2017, the academic problem statement for an anonymous credential read roughly &lt;em&gt;prove a predicate over a multi-attribute signed bundle without revealing any unrelated attribute&lt;/em&gt;. That problem, in full generality, demands selective disclosure, predicate proofs, and multi-show unlinkability -- the entire CL and BBS+ machinery. For fifteen years the field had been trying to make that machinery fast enough and small enough to ship inside a browser.&lt;/p&gt;
&lt;p&gt;Cloudflare&apos;s anti-abuse team was looking at a different problem. The dominant real-world need for anonymous authentication on the web was: prove that a client is human, prove nothing else. Tor users solving a CAPTCHA on every Cloudflare-fronted page wanted that bit redeemable across many subsequent page loads. Privacy-preserving advertising fraud signals wanted that bit. The protocol did not need to express &quot;I am over 18 and a licensed driver in California&quot; -- it needed to express &quot;this client is not a bot.&quot; One bit.&lt;/p&gt;
&lt;p&gt;For one bit, all of the multi-attribute machinery falls away. A blind RSA signature is exactly one bit of authentication (the signature either verifies or it does not), and the holder gets unlinkability because the issuer cannot match the unblinded token to its signing act. A VOPRF token is the same shape, with the issuer learning nothing about the token&apos;s content and only the holder of the input knowing what was authenticated.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Two decades of failed anonymous-credential deployment ended not because the cryptography got better, but because the field accepted constraints (one bit per token; multi-kilobyte SNARK proofs) that the elegant multi-attribute schemes had refused. The constraint relaxation was the breakthrough, not the math.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;em&gt;PoPETs 2018&lt;/em&gt; paper by Davidson, Goldberg, Sullivan, Tankersley, and Valsorda made this explicit[@popets-2018]. Privacy Pass advertises &quot;1-RTT&quot; issuance, sub-millisecond per token, 64-96 bytes on the wire. The construction is so light that Cloudflare&apos;s edge could run an issuer in the same datacentre as a CAPTCHA solver and bill the whole flow as latency-equivalent to a single HTTP redirect[@popets-2018][@cloudflare-2017-pp].&lt;/p&gt;
&lt;h3&gt;Breakthrough 2: Keep the Issuer&apos;s ECDSA Key (2024)&lt;/h3&gt;
&lt;p&gt;The same move happened again, in the same shape, in December 2024.&lt;/p&gt;
&lt;p&gt;For multi-attribute credentials, the obvious cryptographic answer was BBS. Eighty-byte signatures, 256-byte proofs, multi-show unlinkability, predicate proofs in progress. Cryptographically clean. The barrier was issuer adoption: every credential issuer in the world signs with ECDSA-P-256 today. Persuading the European Member State driving-licence authorities to switch their PKI to pairings on BLS12-381 is a twenty-seven-jurisdiction infrastructure project, not a software upgrade.&lt;/p&gt;
&lt;p&gt;Matteo Frigo and abhi shelat (then both at Northeastern, with Frigo later at Google) accepted a different constraint. Their idea: build a SNARK that proves &quot;I know an ECDSA-P-256 signature, by the DMV&apos;s public key, on an mdoc whose &lt;code&gt;age_over_18&lt;/code&gt; element is &lt;code&gt;true&lt;/code&gt;,&quot; and let the holder hand over only the SNARK proof. The issuer never changes anything. The DMV keeps signing ECDSA mdocs the way it already does. The holder&apos;s device runs the SNARK at presentation time[@google-2025-zkp-blog][@libzk-draft].&lt;/p&gt;

A proof-system construction (Ishai, Kushilevitz, Ostrovsky, and Sahai, 2007) in which the prover simulates a multi-party computation &quot;in their head&quot; and commits to each party&apos;s view; the verifier opens a random subset of views to check consistency. The Ligero variant plus a sumcheck protocol is the proof system that underlies Longfellow-zk and lets it verify an ECDSA signature inside a SNARK at acceptable cost on a 2024 mobile CPU.
&lt;p&gt;The proof system Frigo and shelat picked -- MPC-in-the-head plus sumcheck -- had been sitting in the literature since 2007 (Ishai-Kushilevitz-Ostrovsky-Sahai, STOC[@ikos-2007-dblp][@ikos-doi]) and 2017 (Ligero, Ames-Hazay-Ishai-Venkitasubramaniam, CCS[@ligero-2017-dblp][@ligero-doi]), largely dormant because mobile CPUs were too slow to make it practical for a real signature verification circuit. By 2024, an iPhone 14 or a 2024-era Pixel could produce a Longfellow proof on an mdoc in roughly 1.2 seconds, with a proof size of roughly 30 KB on the wire[@google-2025-zkp-blog][@longfellow-docs]. Not pretty. Two orders of magnitude bigger than a BBS proof. But the issuer&apos;s PKI does not move an inch.&lt;/p&gt;

The protocol step is worth unpacking. The prover wants to convince a verifier that they know a witness $w$ such that a circuit $C(x, w) = 1$ for public input $x$. The prover imagines an $n$-party MPC that evaluates $C$ on a random secret-sharing of $w$ across the $n$ parties; runs the entire MPC in their head; and *commits* to each party&apos;s complete view (its share, its randomness, every message it received). The verifier picks a random subset of $t &amp;lt; n$ views to open, and the prover reveals those views. The verifier then re-runs each opened party&apos;s MPC locally, checks that each opened view is internally consistent with the protocol it claims to run, and checks that every pair of opened views agrees on the messages they exchanged. If any opened view cheats -- if the prover faked a share or a message -- two opened parties will disagree, and the verifier rejects.&lt;p&gt;The per-check soundness error is $\binom{n-c}{t}/\binom{n}{t}$, where $c$ is the number of views the prover would need to cheat in to forge. For the standard $(n,t)=(3,2)$ IKOS parameters this is $1/3$ per check, so $O(\lambda)$ independent column-openings drive the total error below $2^{-\lambda}$.&lt;/p&gt;
&lt;p&gt;Ligero swaps the view-commitment for a Reed-Solomon-encoded matrix of secret values and adds a sumcheck-style verification step, letting the verifier check large arithmetic constraints with logarithmic interaction. The composite proof size scales as $O(\sqrt{|C|}\cdot\lambda)$ in the verified circuit. For ECDSA-P-256 verification (a few thousand gates), that lands at the ~30 KB Longfellow reports.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

flowchart LR
    DMV[mDL issuer: state DMV]
    Mdoc[ECDSA-P-256 signed mdoc]
    Wallet[Holder wallet on phone]
    Proof[Longfellow SNARK proof: age_over_18 is true]
    Verifier[Age-gate verifier]
    DMV --&amp;gt;|sign with existing ECDSA key| Mdoc
    Mdoc --&amp;gt;|stored in| Wallet
    Wallet --&amp;gt;|MPC-in-the-head + sumcheck SNARK| Proof
    Proof --&amp;gt;|verify against issuer pubkey| Verifier
    Verifier --&amp;gt;|accept or reject| Wallet
&lt;p&gt;Both breakthroughs accept constraints the cryptography community had refused to accept -- and the elegant alternatives (CL signatures, BBS+) sat unshipped for two decades each. The deployment picture in May 2026 is therefore no longer hypothetical.&lt;/p&gt;
&lt;h2&gt;6. What&apos;s Actually on the Wire in May 2026&lt;/h2&gt;
&lt;p&gt;The deployment picture partitions into three layers: hardware root, network layer, application layer. Each has shipped, each has a story, and the story differs sharply by layer.&lt;/p&gt;

flowchart TD
    subgraph L1[&quot;Hardware root: shipped on paper&quot;]
        Daa[&quot;TPM 2.0 ECDAA (optional in spec)&quot;]
    end
    subgraph L2[&quot;Network layer: ubiquitous&quot;]
        Apl[&quot;Apple Private Access Tokens&quot;]
        Cf[&quot;Cloudflare Privacy Pass&quot;]
        Ch[&quot;Chrome Private State Tokens&quot;]
        Edg[&quot;Microsoft Edge Privacy Pass&quot;]
        Apl --&amp;gt; RFCs[&quot;RFC 9576 / 9577 / 9578&quot;]
        Cf --&amp;gt; RFCs
        Ch --&amp;gt; RFCs
        Edg --&amp;gt; RFCs
    end
    subgraph L3[&quot;Application layer: four-way race&quot;]
        Bbs[&quot;BBS (draft-irtf-cfrg-bbs-signatures-10)&quot;]
        Sd[&quot;SD-JWT (RFC 9901)&quot;]
        Mdoc[&quot;mdoc (ISO/IEC 18013-5)&quot;]
        Lf[&quot;Longfellow-zk over ECDSA mdoc&quot;]
        Bbs --&amp;gt; Vcdm[&quot;W3C VC Data Model 2.0&quot;]
        Sd --&amp;gt; Vcdm
        Mdoc --&amp;gt; Vcdm
        Lf --&amp;gt; Vcdm
    end
&lt;h3&gt;Layer 1: The Hardware Root That Almost Was&lt;/h3&gt;
&lt;p&gt;ECDAA is the longest-standing &quot;shipped on paper, not in consumer hardware&quot; case in this story; §3 gives the full vendor-by-vendor diagnosis (Intel fTPM, AMD fTPM, Infineon, STMicroelectronics, Nuvoton). The hardware root is a layer in the diagram because the spec says so[@tpm-2-spec], not because anything depends on it day to day.&lt;/p&gt;
&lt;h3&gt;Layer 2: Privacy Pass, Ubiquitous&lt;/h3&gt;
&lt;p&gt;The network layer is where Privacy Pass actually lives at scale. RFC 9576 specifies the four-party architecture[@rfc9576]. RFC 9577 specifies the &lt;code&gt;PrivateToken&lt;/code&gt; HTTP authentication scheme that gives a browser a uniform way to receive a 401 challenge and present an unblinded token in response[@rfc9577]. RFC 9578 defines two interchangeable token types in a public registry: token type 0x0001 (VOPRF on P-384, RFC 9497 cryptography) and token type 0x0002 (Blind RSA on RFC 9474 cryptography)[@rfc9578][@rfc9497][@rfc9474].&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Privacy Pass token type&lt;/th&gt;
&lt;th&gt;Cryptography&lt;/th&gt;
&lt;th&gt;Publicly verifiable?&lt;/th&gt;
&lt;th&gt;Typical deployment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0x0001 (VOPRF)&lt;/td&gt;
&lt;td&gt;VOPRF on P-384 (RFC 9497)&lt;/td&gt;
&lt;td&gt;No -- verifier needs issuer secret&lt;/td&gt;
&lt;td&gt;Single-tenant: issuer == verifier (Cloudflare anti-abuse, Chrome Private State Tokens)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0x0002 (Blind RSA)&lt;/td&gt;
&lt;td&gt;RSA-PSS with blinding (RFC 9474)&lt;/td&gt;
&lt;td&gt;Yes -- verifier needs only the issuer public key&lt;/td&gt;
&lt;td&gt;Federated: issuer != verifier (Apple Private Access Tokens)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The two-token-type design is the IETF&apos;s recognition that the deployment models are genuinely different.&lt;/p&gt;
&lt;p&gt;If the issuer and verifier are the same party -- say, Cloudflare issues a token to a client that solved its CAPTCHA, then verifies that token on a Cloudflare-fronted origin -- the VOPRF saves bytes on the wire (~96 bytes per token) and keeps the issuer secret unexposed. If issuer and verifier are separate -- say, a Cloudflare or Fastly issuer attests a device for an Apple-served website that has never seen the issuer secret -- the publicly-verifiable blind-RSA token is the right choice; any party with the issuer public key can verify.&lt;/p&gt;
&lt;p&gt;The deployers, with verified-source attribution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apple Private Access Tokens&lt;/strong&gt; shipped in iOS 16, iPadOS 16, and macOS Ventura, announced at WWDC 2022 and demonstrated by Tommy Pauly in session 10077, &lt;em&gt;Replace CAPTCHAs with Private Access Tokens&lt;/em&gt;. Cloudflare and Fastly are the launch issuers. The token type is 0x0002 (Blind-RSA), publicly verifiable[@apple-pat-news][@apple-wwdc-pat-2022].The Apple PAT WWDC22 session number is 10077. Session 10092 is &quot;Meet passkeys&quot; -- a different session by a different speaker. The two sessions are easy to confuse because both shipped in iOS 16; the Apple Developer News article that introduces PAT links directly to &lt;code&gt;wwdc2022/10077&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; ran the original 2017 browser-extension deployment, deprecated that v1 protocol in March 2024 (now Turnstile), and continues to operate RFC-compliant Privacy Pass issuers for the Apple PAT model[@cloudflare-2017-pp][@cloudflare-pp-docs][@cloudflare-2022-pat].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Chrome&lt;/strong&gt; ships &lt;em&gt;Private State Tokens&lt;/em&gt; -- the renamed successor to &lt;em&gt;Trust Tokens&lt;/em&gt; -- as the VOPRF token-type implementation, currently used for anti-fraud signalling[@google-private-state-tokens].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Edge&lt;/strong&gt; is named by Matthew Green&apos;s April 2026 primer (&quot;Privacy Pass is so ubiquitous that even Microsoft uses it in their Edge browser&quot;)[@green-2026-part2]. No primary Microsoft documentation for an &quot;Edge Private Access Tokens&quot; product name appears in public; the claim is reported with Green-attribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Privacy Pass deployer&lt;/th&gt;
&lt;th&gt;Token type&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Apple (Private Access Tokens)&lt;/td&gt;
&lt;td&gt;0x0002 (Blind RSA)&lt;/td&gt;
&lt;td&gt;Origin and verifier; uses Cloudflare and Fastly as issuers&lt;/td&gt;
&lt;td&gt;Apple WWDC22 session 10077[@apple-wwdc-pat-2022]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;0x0002 issuer for Apple PAT; runs Turnstile in parallel&lt;/td&gt;
&lt;td&gt;Issuer plus anti-abuse origin&lt;/td&gt;
&lt;td&gt;Cloudflare documentation[@cloudflare-pp-docs]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Chrome (Private State Tokens)&lt;/td&gt;
&lt;td&gt;0x0001 (VOPRF)&lt;/td&gt;
&lt;td&gt;Anti-fraud signalling&lt;/td&gt;
&lt;td&gt;Google Privacy Sandbox[@google-private-state-tokens]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Edge (Privacy Pass)&lt;/td&gt;
&lt;td&gt;Not published&lt;/td&gt;
&lt;td&gt;Per Green: &quot;uses it in their Edge browser&quot;&lt;/td&gt;
&lt;td&gt;Matthew Green, April 2026[@green-2026-part2]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Cloudflare&apos;s redemption throughput is the metric every press release wants. Green&apos;s April 2026 primer estimates &quot;hundreds of thousands of transactions per second&quot; across the broader Cloudflare anti-abuse surface, of which Privacy Pass is a fraction[@green-2026-part2]. No primary Cloudflare-side figure for tokens-per-second exists in public, so we report Green&apos;s estimate as Green&apos;s estimate and do not promote it to a Cloudflare-side fact.&lt;/p&gt;
&lt;h3&gt;Layer 3: The Multi-Attribute Four-Way Race&lt;/h3&gt;
&lt;p&gt;The application layer holds the four contenders the EU age-verification app&apos;s eventual design will pick among (and the parallel-path Hyperledger AnonCreds community). The envelope is the &lt;strong&gt;W3C Verifiable Credentials Data Model 2.0&lt;/strong&gt;, a Recommendation since 15 May 2025 that defines a credential format and supports multiple securing mechanisms[@w3c-vcdm-2]. The cryptography lives inside the envelope.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BBS&lt;/strong&gt;, with &lt;code&gt;draft-irtf-cfrg-bbs-signatures-10&lt;/code&gt; dated 8 January 2026[@bbs-draft-10]. Pairing on BLS12-381. 80-byte signature, 256-byte proof. Multi-show unlinkable by construction. Best cryptographic privacy of the four; issuer adoption blocked on pairing-PKI migration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SD-JWT&lt;/strong&gt; -- selective-disclosure JSON Web Tokens -- promoted to &lt;strong&gt;RFC 9901 (Standards Track) in November 2025&lt;/strong&gt; by Daniel Fett, Kristina Yasuda, and Brian Campbell[@rfc9901]. The mechanism is JSON Web Signatures plus salted hashes of individual claims, no zero-knowledge. Lowest deployment cost; the EUDI Wallet ARF&apos;s mandatory baseline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ISO/IEC 18013-5 mdoc baseline&lt;/strong&gt; -- published in 2021, deployed by US state DMVs in Arizona, Colorado, Georgia, Maryland and others, and the EUDI Wallet PID&apos;s mandatory co-baseline. CBOR-encoded mdoc plus ECDSA-signed mobile security object (MSO); same &quot;no ZK&quot; trade-off as SD-JWT[@iso-18013-5].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Longfellow-zk&lt;/strong&gt; -- ~1.2 s prover time, ~30 KB proof, open-sourced by Google under Apache-2.0 on 3 July 2025. Google partnered with Sparkasse for the German banking pilot[@google-2025-zkp-blog][@longfellow-repo][@longfellow-docs][@libzk-draft].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The EU age-verification app&lt;/strong&gt; -- &quot;technically ready&quot; 15 April 2026, with the technical portal at &lt;code&gt;ageverification.dev&lt;/code&gt; describing zero-knowledge proof cryptography as the unlinkability mechanism[@ec-2026-age-app][@ageverification-dev]. The wire format remains a public consultation question; Longfellow-zk over an mdoc is the strongest candidate among the four schemes above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hyperledger AnonCreds&lt;/strong&gt; -- the CL-RSA production stack used in self-sovereign-identity deployments (BC.GOV in Canada, the Ontario Digital Trust pilot)[@anoncreds-spec]. Parallel-path; not a contender for the EUDI Wallet slot, but actively shipping in the SSI community.&lt;/li&gt;
&lt;/ul&gt;

Regulation (EU) 2024/1183 -- the eIDAS 2 regulation that mandates the EUDI Wallet -- entered into force on 20 May 2024. The provisioning deadline for Member States to make at least one EUDI Wallet available is **24 December 2026**. Mandatory private-sector acceptance of an EUDI Wallet for relying parties subject to the regulation begins **6 December 2027**[@eidas2][@eu-cir-2024-2977]. Relying parties planning age-verification or attribute-disclosure deployments should treat these dates as binding regulatory deadlines, not as aspirational targets.
&lt;p&gt;Four schemes, four different optimisation targets, none of them strictly dominant. The choice depends on what you are willing to give up.&lt;/p&gt;
&lt;h2&gt;7. Choosing Among Four Multi-Attribute Schemes&lt;/h2&gt;
&lt;p&gt;There is no single best multi-attribute anonymous credential as of May 2026. There are four, each optimised for a different axis, and the EU&apos;s choice (mandate SD-JWT and mdoc; allow a ZKP overlay later) is the single most important deployment decision the field has made in a generation.&lt;/p&gt;
&lt;p&gt;The head-to-head comparison runs across seven dimensions that matter for any relying party choosing a scheme:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;BBS&lt;/th&gt;
&lt;th&gt;SD-JWT&lt;/th&gt;
&lt;th&gt;mdoc baseline&lt;/th&gt;
&lt;th&gt;Longfellow-zk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Issuer cryptography&lt;/td&gt;
&lt;td&gt;Pairing on BLS12-381&lt;/td&gt;
&lt;td&gt;ECDSA-P-256 / EdDSA&lt;/td&gt;
&lt;td&gt;ECDSA-P-256 (COSE_Sign1)&lt;/td&gt;
&lt;td&gt;ECDSA-P-256 (unchanged from mdoc)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holder cryptography&lt;/td&gt;
&lt;td&gt;Pairing-based ZK proof&lt;/td&gt;
&lt;td&gt;Hash + JWS verify&lt;/td&gt;
&lt;td&gt;Hash + ECDSA verify&lt;/td&gt;
&lt;td&gt;MPC-in-the-head SNARK + sumcheck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selective disclosure&lt;/td&gt;
&lt;td&gt;Native (any subset)&lt;/td&gt;
&lt;td&gt;Native (any disclosed claim)&lt;/td&gt;
&lt;td&gt;Native (any disclosed element)&lt;/td&gt;
&lt;td&gt;Native (any subset of mdoc elements)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-show unlinkability&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; (each ProofGen is fresh)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; (JWS signature is a stable linker)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; (MSO signature is a stable linker)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; (each SNARK is fresh)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native predicate proofs&lt;/td&gt;
&lt;td&gt;Yes (range proofs over committed messages -- draft in progress)&lt;/td&gt;
&lt;td&gt;No (issuer must pre-encode &lt;code&gt;age_over_18&lt;/code&gt; claim)&lt;/td&gt;
&lt;td&gt;No (issuer must pre-encode &lt;code&gt;age_over_18&lt;/code&gt; element)&lt;/td&gt;
&lt;td&gt;Yes (predicate enforced inside SNARK circuit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-presentation size&lt;/td&gt;
&lt;td&gt;~256 B (BBS proof)&lt;/td&gt;
&lt;td&gt;~KB-scale&lt;/td&gt;
&lt;td&gt;~KB-scale (full mdoc)&lt;/td&gt;
&lt;td&gt;~30 KB (SNARK proof)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-presentation prover wall-clock&lt;/td&gt;
&lt;td&gt;~30 ms&lt;/td&gt;
&lt;td&gt;~1 ms&lt;/td&gt;
&lt;td&gt;~1 ms (ECDSA verify on disclosure)&lt;/td&gt;
&lt;td&gt;~1.2 s on mobile (per Google blog)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issuer-side adoption cost&lt;/td&gt;
&lt;td&gt;High (new BLS12-381 PKI; not in any DMV or national ID today)&lt;/td&gt;
&lt;td&gt;Low (stock JWS / OIDC stack)&lt;/td&gt;
&lt;td&gt;Low (stock ECDSA + COSE)&lt;/td&gt;
&lt;td&gt;Zero (reuses existing mdoc issuance)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standards maturity&lt;/td&gt;
&lt;td&gt;IETF CFRG Draft 10 (Jan 2026); not yet RFC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RFC 9901 (Standards Track, Nov 2025)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ISO/IEC 18013-5:2021 published&lt;/td&gt;
&lt;td&gt;IETF CFRG individual draft (libzk); proof system named; credential profile not yet standardised&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EUDI Wallet ARF status&lt;/td&gt;
&lt;td&gt;Optional / future&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Mandatory baseline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Mandatory co-baseline (PID)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Targeted backend for age verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quantum resistance&lt;/td&gt;
&lt;td&gt;No (pairing DLP broken by Shor)&lt;/td&gt;
&lt;td&gt;No (ECDSA broken by Shor)&lt;/td&gt;
&lt;td&gt;No (ECDSA broken by Shor)&lt;/td&gt;
&lt;td&gt;Conditional: SHA-256 circuit is Grover-only but the issuer ECDSA is still Shor-broken&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Read the table top to bottom and a single tension dominates: cryptographic privacy versus issuer adoption cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best cryptographic privacy: BBS.&lt;/strong&gt; A BBS presentation is a single fresh 256-byte proof per show, structurally unlinkable across presentations, supports any selective disclosure subset, and the in-progress range-proof extension will support predicate proofs natively. The price is that every issuer has to operate a pairing-friendly PKI on BLS12-381, which no national-identity authority does today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lowest deployment cost: SD-JWT or mdoc baseline.&lt;/strong&gt; Stock ECDSA, stock JWS or COSE_Sign1, drop-in to any existing OAuth or COSE pipeline. The price is that every presentation reveals the issuer&apos;s deterministic signature on the credential, which is a stable identifier across presentations -- so SD-JWT and mdoc baseline have selective disclosure but not multi-show unlinkability. Two presentations of the same SD-JWT VC to colluding verifiers are trivially linkable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cryptographic privacy without issuer migration: Longfellow-zk.&lt;/strong&gt; The trick is to wrap the existing ECDSA-signed mdoc in a SNARK that proves &quot;I know an ECDSA signature on a credential whose disclosed elements satisfy the predicate.&quot; The issuer changes nothing. The price is 30 KB of proof on the wire and 1.2 seconds of prover time on a 2024-era mobile phone, both two orders of magnitude above what BBS achieves.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; There is no single best multi-attribute anonymous credential as of May 2026. The choice is between cryptographic privacy (BBS), deployment cost (SD-JWT or mdoc), or no issuer migration (Longfellow-zk) -- and the EU has decided the third axis matters most.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The political dynamic behind the EUDI Wallet ARF is worth naming. Version 1.4 of the architecture document mandates SD-JWT VC and mdoc as the credential format baselines -- privacy-suboptimal but deployable in 2026 -- and lists BBS as &quot;optional, future&quot;[@eudi-arf]. Google&apos;s open-sourcing of Longfellow-zk on 3 July 2025 was the strategic move to ensure a zero-knowledge overlay was shipping in a real library before SD-JWT entrenched as the only credential format anyone actually implemented[@google-2025-zkp-blog]. The German banking pilot with Sparkasse is the first test of that strategy at issuer scale. The EU age-verification app is the first test at population scale.&lt;/p&gt;

The cryptography community had spent two decades trying to build a one-credential-for-everything scheme. Privacy Pass shipped because it gave up that ambition and signed one bit. Longfellow ships because it gives up cryptographic minimality so the issuer never moves.
&lt;p&gt;Every shipping scheme is correct cryptography for the constraints it was given. Each scheme makes a different concession -- to deployment, to throughput, to standardisation -- and the concessions reveal what the field still cannot do.&lt;/p&gt;
&lt;h2&gt;8. What the Cryptography Cannot Do&lt;/h2&gt;
&lt;p&gt;Three things the cryptography genuinely cannot do, and one we do not know how to do efficiently.&lt;/p&gt;
&lt;h3&gt;Revocation Under Unlinkability Is Structurally Impossible Without State&lt;/h3&gt;
&lt;p&gt;Revoking a specific credential -- the holder&apos;s wallet was stolen, the holder&apos;s status changed, the credential expired -- means a verifier must be able to recognise &quot;this credential has been revoked.&quot; Recognising a specific credential means keeping some state that maps it to its revocation status. Multi-show unlinkability means no two presentations of the same credential should be linkable. The two requirements are in direct tension.&lt;/p&gt;
&lt;p&gt;The literature has produced three escape hatches, each trading privacy or scale for revocation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accumulator-based revocation&lt;/strong&gt; -- the BBS+ approach -- stores all valid credentials in a cryptographic accumulator and gives each holder a witness of membership; revocation updates the accumulator and the holder must update their witness, which scales badly at nation-state membership counts. &lt;strong&gt;Epoch-based credential rotation&lt;/strong&gt; -- the Hyperledger AnonCreds approach -- has each credential expire at a fixed epoch (a week, a month) and re-issues; the cost is bandwidth and online-issuer dependence. &lt;strong&gt;Verifier-local linkability with revocation tokens&lt;/strong&gt; -- the EPID approach -- gives each verifier a pseudonym derived from the credential plus a verifier-specific tag, sacrificing unlinkability across that verifier in exchange for revocation-list checking[@daa-2004-doi].&lt;/p&gt;
&lt;p&gt;The deployed status-list approaches (used by SD-JWT VC and mdoc baseline today) take an even simpler route: assign each credential an index into a published bitmap. The verifier downloads the bitmap and checks the bit. The trade is brutal: the credential&apos;s index &lt;em&gt;is&lt;/em&gt; a stable identifier across presentations, so status lists give revocation by giving up unlinkability[@oauth-status-list-draft].The Token Status List specification is the IETF draft &lt;code&gt;draft-ietf-oauth-status-list-20&lt;/code&gt; (April 2026, intended Standards Track but not yet an RFC), by Looker, Bastian, and Bormann. An older summary of this stack sometimes cited it as &quot;RFC 9863&quot;; that is a different document about a PCEP Color extension and is unrelated. The Token Status List is still a draft.&lt;/p&gt;
&lt;h3&gt;Selective Disclosure Without ZK and With Multi-Show Unlinkability Is Impossible&lt;/h3&gt;
&lt;p&gt;If the issuer signs the credential with a deterministic signature -- any standard JWS, COSE_Sign1, or mdoc MSO -- the signature itself is a stable bit-string. Two presentations of the same credential expose the same signature, and colluding verifiers can link them by comparing signatures alone.&lt;/p&gt;
&lt;p&gt;The only way to break that link is to randomise the signature per presentation, which mathematically requires a zero-knowledge proof: instead of revealing the signature, the holder proves they know one. SD-JWT and the mdoc baseline are explicit about being on the &quot;no ZK, presentations linkable&quot; side of the dichotomy; BBS and Longfellow-zk are explicit about being on the ZK-required side[@rfc9901][@iso-18013-5]. You can have selective disclosure without ZK, or selective disclosure with multi-show unlinkability via ZK, but you cannot have selective disclosure with multi-show unlinkability and without ZK.&lt;/p&gt;
&lt;h3&gt;Holder Unlinkability Under Issuer-Verifier Collusion Is Structurally Limited&lt;/h3&gt;
&lt;p&gt;If issuer and verifier share state -- a per-credential nonce, a serial number burned into the credential at issuance -- unlinkability against a colluding pair is broken. Privacy Pass mitigates this with the four-party Attester-Issuer-Origin split in RFC 9576, where the issuer learns nothing about the user&apos;s attestation and the origin learns nothing about the issuance event[@rfc9576]. BBS relies on the pairing-based discrete-log assumption and the random-oracle model to ensure that issuer and verifier together cannot link presentations without breaking pairing crypto. Both mitigations work, but both require operational separation between the parties; collapse them into a single trust domain and the unlinkability guarantee weakens.&lt;/p&gt;
&lt;h3&gt;Post-Quantum Migration Is Unsolved for Credentials&lt;/h3&gt;
&lt;p&gt;Every deployed scheme at every layer breaks against a cryptographically relevant quantum computer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BBS depends on pairings on BLS12-381; Shor&apos;s algorithm breaks the underlying discrete-log problem.&lt;/li&gt;
&lt;li&gt;ECDSA in SD-JWT, mdoc baseline, and Longfellow-zk&apos;s issuer signature: broken by Shor.&lt;/li&gt;
&lt;li&gt;RSA in blind-RSA Privacy Pass: broken by Shor.&lt;/li&gt;
&lt;li&gt;TPM 2.0 ECDAA: broken by Shor.&lt;/li&gt;
&lt;li&gt;SHA-256 inside Longfellow-zk&apos;s MPC-in-the-head circuit: Grover-only, which halves the effective security level but does not break the construction outright. The issuer&apos;s ECDSA signature inside the SNARK, however, is still Shor-broken.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lattice-based anonymous-credential constructions exist in the research literature -- the headline blind-signature primitive is &lt;strong&gt;BLOOM&lt;/strong&gt; (Lyubashevsky and Nguyen, IACR ePrint 2022/1307, ASIACRYPT 2022[@bloom-eprint][@bloom-dblp]), and the headline 2023 anonymous-credentials framework built on top is &lt;strong&gt;BLNS&lt;/strong&gt; (Bootle-Lyubashevsky-Nguyen-Sorniotti, ePrint 2023/560[@blns-eprint]). BLNS reports proofs &quot;as small as a few dozen kilobytes&quot; for arbitrarily large user populations[@blns-eprint] -- none are deployed, none are within an order of magnitude of BBS&apos;s eighty-byte signature, and none are inside &lt;a href=&quot;https://paragmali.com/blog/post-quantum-cryptography-on-windows-the-thirty-year-migrati/&quot; rel=&quot;noopener&quot;&gt;NIST&apos;s post-quantum standardisation rounds&lt;/a&gt;. Credentials issued in 2026 with multi-decade validity (a national ID expected to be honoured through 2046, say) face the structural risk that they may be forgeable by a quantum adversary inside their nominal lifetime.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A cryptographically relevant quantum computer breaks every currently deployed scheme in Layers 1, 2, and 3 of this stack. CRQC timelines are uncertain. Credentials issued in 2026 with multi-decade validity periods need a post-quantum migration plan that does not yet exist for anonymous credentials, and that gap is the most consequential open problem in the field.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Revocation under anonymity, multi-show unlinkability without ZK, and post-quantum credentials are not engineering problems waiting on better libraries. They are structural impossibilities or open research questions that require the field to either change assumptions or accept new primitives. The next decade is not &quot;ship better libraries&quot;; it is either &quot;invent new primitives&quot; or &quot;accept that 2046 will see forgeable credentials issued in 2026.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The framing the field tends to avoid is sharper than &quot;this scheme is small.&quot; Two formal results pin where each construction sits. Pointcheval and Stern&apos;s &lt;em&gt;Journal of Cryptology&lt;/em&gt; 2000 paper -- the canonical security proof for blind signatures under the one-more-unforgeability game in the random-oracle model -- gives a reduction whose loss factor scales as the number of random-oracle queries $q_h$ the adversary makes; asymptotically this forces signature size to be $\Omega(\lambda)$ bits at security parameter $\lambda$, or about 16 bytes at $\lambda = 128$[@pointcheval-stern-2000-joc]. Bitansky, Canetti, Chiesa, and Tromer&apos;s ITCS 2012 paper on extractable SNARKs (&quot;...and back again&quot;) proves that any extractable succinct argument of knowledge cannot be shorter than $\Omega(\lambda)$ bits either[@bcct-2012-itcs][@bcct-dblp]. BBS at 80 bytes is therefore within a small constant factor of the SNARK-class floor; that is not &quot;the&quot; information-theoretic minimum, but it sits in the right asymptotic neighbourhood.&lt;/p&gt;
&lt;p&gt;Applying the Pointcheval-Stern[@pointcheval-stern-2000-joc] and BCCT[@bcct-2012-itcs][@bcct-dblp] $\Omega(\lambda)$ bounds from the preceding paragraph to the Longfellow numbers from §5: Longfellow&apos;s ~30 KB proof is roughly $3$ to $4\times$ above the construction-class floor $O(\sqrt{|C|}\cdot\lambda)$ for MPC-in-the-head plus sumcheck on an ECDSA-verification circuit of a few thousand gates[@ligero-2017-dblp][@ligero-doi]. Against the Groth16-class floor of ~128 bytes that a trusted-setup-permitted SNARK reaches[@bcct-2012-itcs], Longfellow is roughly $200$ to $300\times$ larger. That gap is the cost of avoiding trusted setup, not a cryptographic shortcoming.&lt;/p&gt;
&lt;h2&gt;9. Open Problems&lt;/h2&gt;
&lt;p&gt;Five problems the field knows it has and cannot yet solve at the scale shipping demands. For each, the question is not just &quot;what is missing?&quot; but &quot;what is the structural obstacle that the engineering has been bumping into?&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Practical revocation under anonymity at nation-state scale.&lt;/strong&gt; The EUDI Wallet rollout will need revocation across roughly 450 million wallets and tens of thousands of relying parties, preserving multi-show unlinkability.&lt;/p&gt;
&lt;p&gt;The canonical academic answer is the Camenisch-Kohlweiss-Soriente accumulator-based revocation scheme from PKC 2009 -- a dynamic accumulator on bilinear maps with efficient witness updates[@cks-2009-edinburgh][@cks-2009-dblp]. Cryptographically, the accumulator value $V \in G_1$ is a single BLS12-381 group element (48 bytes compressed) that commits to the set of currently-valid credential identifiers. Each holder carries a witness $W_i \in G_1$ of membership (48 more bytes). When the issuer revokes credential $j$, every non-revoked holder must update their witness using a per-revocation broadcast update value $U_j$ (48 bytes per revocation) and one scalar multiplication in $G_1$. CKS prove that the update is correct without re-issuance and can be delegated to untrusted helpers, which is the property that makes the scheme attractive in the first place[@cks-2009-edinburgh].&lt;/p&gt;
&lt;p&gt;Plug nation-state numbers into that arithmetic and the scaling shows up. Assume 10,000 revocations per day across a 50M-wallet population (a single mid-sized member state). Every non-revoked holder must download $10{,}000 \times 48 = 480$ KB per day of update values and perform 10,000 scalar multiplications on BLS12-381 -- on the order of ten seconds of mobile CPU per day.&lt;/p&gt;
&lt;p&gt;Batching the updates helps, but it does not change the asymptotics: the per-holder cost is linear in the number of revocations in the relevant time window. At full-EU scale (450M wallets, the same revocation rate per capita), the per-holder bandwidth stays the same; the &lt;em&gt;issuer-side&lt;/em&gt; aggregation cost grows linearly.&lt;/p&gt;
&lt;p&gt;Status-list revocation -- the Token Status List approach that SD-JWT VC and the mdoc baseline currently use[@oauth-status-list-draft] -- gets around the bandwidth problem by giving each credential an index into a published bitmap. But the index &lt;em&gt;is&lt;/em&gt; a stable identifier across presentations, so the trade is brutal: revocation by giving up unlinkability. No deployed solution today gives both unlinkability and sublinear-per-holder revocation at nation-state scale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Post-quantum BBS and post-quantum Privacy Pass.&lt;/strong&gt; Lattice-based attempts are multi-kilobyte at best and an active research area; pairing-based schemes remain at ~80-byte signatures.&lt;/p&gt;
&lt;p&gt;The structural obstacle is the geometry of lattice commitments. The BLNS framework (Bootle-Lyubashevsky-Nguyen-Sorniotti, 2023[@blns-eprint]) reports proofs &quot;as small as a few dozen kilobytes&quot; for arbitrarily-large user populations -- concretely on the order of 20-40 KB per credential and 30-50 KB per show.&lt;/p&gt;
&lt;p&gt;Three layers of unavoidable cost stack up. First, a module-LWE-based commitment needs a dimension of roughly 10 ring elements of degree 256, so the commitment object alone is around $10 \times 256 \times 32$ bits $= 10$ KB at the smallest plausible parameters. Second, the modulus must grow to $\ge 2^{32}$ for 128-bit security against current lattice attacks. Third, rejection sampling in the zero-knowledge step adds roughly a $2\times$ blow-up to the resulting proof, mitigated to roughly $1.3\times$ by BLOOM&apos;s bimodal-Gaussian trick[@bloom-kcl].&lt;/p&gt;
&lt;p&gt;The 25-fold-or-better signature-size improvements BLOOM reports over prior lattice one-out-of-many proofs are real, but they take you from &quot;very large&quot; to &quot;still large&quot; -- not to byte-scale. Constructing a post-quantum anonymous credential within an order of magnitude of BBS&apos;s wire size is a conjectured open problem. It is not currently in NIST&apos;s PQ standardisation rounds; FIPS 204 ML-DSA, FIPS 205 SLH-DSA, and FIPS 206 FN-DSA all target plain signatures, not anonymous-credential primitives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Cross-platform interop.&lt;/strong&gt; A Bavarian EUDI mdoc presented at a Florida bar that uses AAMVA mDL verification, then the same flow on Apple Wallet, Google Wallet, and Samsung Wallet.&lt;/p&gt;
&lt;p&gt;The W3C Digital Credentials API is the browser-side connective tissue, currently a Working Draft from the Federated Identity Working Group rather than a Recommendation[@w3c-digital-creds]. OpenID for Verifiable Presentations (OID4VP) handles the online-presentation case[@openid4vp-spec]; ISO/IEC 18013-7 handles the offline case[@iso-18013-7].&lt;/p&gt;
&lt;p&gt;The deeper obstacle is in the &lt;em&gt;trust layer&lt;/em&gt;, not the presentation layer. The AAMVA and EUDI worlds publish their issuer trust anchors in structurally different forms. AAMVA&apos;s Digital Trust Service distributes a &lt;strong&gt;VICAL&lt;/strong&gt; -- a Verified Issuer Certificate Authority List -- defined under ISO/IEC 18013-5 §9, where each entry is a self-contained CA root with metadata[@aamva-dts][@iso-18013-5]. The EUDI Wallet&apos;s trust model, defined in the ARF chapter 6 and the implementing acts CIR 2024/2977 (PID and EAA) and CIR 2024/2979 (interop)[@eudi-arf][@eu-cir-2024-2977], runs on Member-State Trust Lists -- national trust-service-provider registries that the European Commission cross-recognises.&lt;/p&gt;
&lt;p&gt;A VICAL entry and a Member-State Trust List entry both express &quot;this CA root is authorised to issue an mDL or a PID,&quot; but no published cross-recognition protocol maps one to the other today. Cross-implementation conformance testing is underway in 2026 but no end-to-end interop story is shipping. The most likely path is an ISO/IEC 18013-7 profile for VICAL plus Member-State Trust List cross-anchoring in the 2027-2030 window.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Quantitative deployment metrics for Privacy Pass.&lt;/strong&gt; No primary Cloudflare or Apple figure for tokens-per-second exists in public. Matthew Green&apos;s April 2026 primer reports &quot;hundreds of thousands of transactions per second&quot; across the broader Cloudflare anti-abuse surface, of which Privacy Pass is a fraction[@green-2026-part2]. The most-deployed anonymous credential in the world lacks an actual deployment metric, which is a striking gap in a field that is otherwise generous with engineering disclosure. The structural reason is the protocol&apos;s own design: the privacy properties depend on the &lt;em&gt;size of the anonymity set per issuer key&lt;/em&gt;, and operators have no incentive to publish per-key issuance counts that would let a third party estimate the set size.&lt;/p&gt;

Matthew Green&apos;s April 2026 primer says Privacy Pass is &quot;so ubiquitous that even Microsoft uses it in their Edge browser.&quot; We could not find primary Microsoft documentation naming a specific &quot;Edge Private Access Tokens&quot; product. The Privacy Pass deployment in Edge is real -- Green is a careful source -- but we do not invent a product name that Microsoft itself does not use. That is the honest limit of the available evidence.
&lt;p&gt;&lt;strong&gt;5. Holder binding without identification.&lt;/strong&gt; Prevent credential transfer (Alice&apos;s age credential used by 17-year-old Bob) while preserving unlinkability. Binding to a hardware key works at the cost of secure-element identifiability across presentations. The cleanest formal answer at the protocol level is Brands&apos; wallet-with-observer architecture from 1993[@brands-1993-doi]; the cleanest &lt;em&gt;modern&lt;/em&gt; one is the IETF draft &lt;code&gt;draft-irtf-cfrg-bbs-per-verifier-linkability-01&lt;/code&gt; by Kalos (MATTR) and Bernstein (Grotto Networking), published March 2025[@bbs-pseudonym-draft].&lt;/p&gt;
&lt;p&gt;The construction in the draft is worth a paragraph. The holder picks a long-term &lt;code&gt;nym_secret&lt;/code&gt; $\in \mathbb{Z}_q$ at the BBS credential&apos;s issuance, committed inside the BBS message vector. For each verifier $V$, the holder derives a per-verifier pseudonym $\text{pseudonym}_V = \text{nym_secret} \cdot \text{HashToCurveG1}(\text{verifier_id}_V) \in G_1$.&lt;/p&gt;
&lt;p&gt;The same holder presenting the same credential to the same verifier twice always yields the same &lt;code&gt;pseudonym_V&lt;/code&gt; -- so the verifier can recognise returning users, which is intentional. Two different verifiers $V_1$ and $V_2$ see two different pseudonyms that they cannot link to a common holder unless they break the Decisional Diffie-Hellman assumption in $G_1$ on BLS12-381 -- a pairing-curve assumption closely related to (though not identical with) the q-Strong Diffie-Hellman assumption that underpins BBS unforgeability.&lt;/p&gt;
&lt;p&gt;Hardware binding is not in the current draft. The spec leaves it as an out-of-band concern handled by the qualified signature creation device layer: &lt;a href=&quot;https://paragmali.com/blog/apple-secure-enclave-vs-microsoft-pluton-two-roads-to-hardwa/&quot; rel=&quot;noopener&quot;&gt;Secure Enclave&lt;/a&gt; on iPhone, StrongBox on Android, Pluton or a discrete TPM on PCs. Tying a hardware-attested key to &lt;code&gt;nym_secret&lt;/code&gt; with provable unforgeability across the device boundary is the open profile work the EUDI and ISO/IEC committees are pushing on in 2026. Nothing yet ships at consumer scale that completely solves the problem.&lt;/p&gt;
&lt;p&gt;These open problems are the next-decade research and engineering agenda. The deployed answers are good enough to ship today. So: what should a relying party actually do?&lt;/p&gt;
&lt;h2&gt;10. A Practical Guide for Relying Parties&lt;/h2&gt;
&lt;p&gt;Seven concrete recommendations for choosing a credential scheme in May 2026, organised by use case.&lt;/p&gt;
&lt;h3&gt;1. Anti-Abuse and Human Attestation&lt;/h3&gt;
&lt;p&gt;Pick the RFC 9578 Privacy Pass token type that matches your operator model.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single-tenant (issuer == verifier)&lt;/strong&gt;: VOPRF, token type 0x0001. ~96 bytes per token, sub-millisecond on both sides, but the verifier must hold the issuer secret. Best for in-house anti-abuse where the issuer and verifier are the same trust domain (Cloudflare&apos;s own surface, Chrome&apos;s Private State Tokens).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Federated (issuer != verifier)&lt;/strong&gt;: Blind RSA, token type 0x0002. 256 bytes per token (RSA-2048), publicly verifiable -- any party with the issuer public key can verify. Best for Apple&apos;s Private Access Tokens model, where Cloudflare or Fastly is the issuer and an arbitrary website is the verifier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The redemption-side check for a publicly-verifiable token is a single RSA-PSS verification against the published issuer key. The pseudocode below shows the verifier&apos;s check in JavaScript -- the point is to make the wire format and the publicly-verifiable property concrete, not to be a drop-in implementation.&lt;/p&gt;
&lt;p&gt;{`
// Pseudocode for redemption-side verification of a Privacy Pass token
// of type 0x0002 (Blind RSA) per RFC 9578 with RFC 9474 cryptography.
// Real implementations should use a vetted crypto library.&lt;/p&gt;
&lt;p&gt;async function verifyPrivacyPassToken(token, issuerPublicKey, origin) {
  // RFC 9578 token layout (token type 0x0002):
  //   token_type (2 bytes) || nonce (32 bytes) || challenge_digest (32 bytes)
  //   || token_key_id (32 bytes) || authenticator (Nk bytes, RSA-PSS sig)
  const view = new DataView(token);
  const tokenType = view.getUint16(0);
  if (tokenType !== 0x0002) return { ok: false, reason: &apos;wrong type&apos; };&lt;/p&gt;
&lt;p&gt;  const nonce = token.slice(2, 34);
  const challengeDigest = token.slice(34, 66);
  const tokenKeyId = token.slice(66, 98);
  const authenticator = token.slice(98);&lt;/p&gt;
&lt;p&gt;  // The signed input is everything except the authenticator itself.
  const signedInput = token.slice(0, 98);&lt;/p&gt;
&lt;p&gt;  // Bind the token to the origin&apos;s challenge (per RFC 9577).
  const expectedDigest = await sha256(buildOriginChallenge(origin));
  if (!constantTimeEquals(challengeDigest, expectedDigest)) {
    return { ok: false, reason: &apos;challenge mismatch&apos; };
  }&lt;/p&gt;
&lt;p&gt;  // The token is a stock RSA-PSS signature over the signed input,
  // under the issuer&apos;s published public key. No issuer secret needed.
  const ok = await crypto.subtle.verify(
    { name: &apos;RSA-PSS&apos;, saltLength: 48 },
    issuerPublicKey,
    authenticator,
    signedInput,
  );
  return { ok, reason: ok ? &apos;valid&apos; : &apos;bad signature&apos; };
}
`}&lt;/p&gt;

The IETF working group considered shipping only one token type. The split survived because the two operator models genuinely want different things. A single-tenant deployment (Cloudflare issues and Cloudflare verifies) saves bytes and keeps the issuer secret in-house with VOPRF, and Cloudflare can afford the operational cost of holding the secret. A federated deployment (Cloudflare issues, Apple verifies) cannot share an issuer secret across organisational trust boundaries, so the verifier needs a publicly-verifiable signature like RSA-PSS. RFC 9578 ships both and lets the deployment pick.
&lt;h3&gt;2. Age Verification in the EU&lt;/h3&gt;
&lt;p&gt;Wait for the EUDI Wallet age-attestation interface. The Member-State provisioning deadline is &lt;strong&gt;24 December 2026&lt;/strong&gt;, and mandatory private-sector acceptance for relying parties subject to eIDAS 2 begins &lt;strong&gt;6 December 2027&lt;/strong&gt;[@eidas2][@eu-cir-2024-2977]. The wire format will be SD-JWT VC over OpenID4VP, with Longfellow-zk available as the optional ZKP overlay for stronger privacy. The EU&apos;s technical portal at &lt;code&gt;ageverification.dev&lt;/code&gt; is the canonical reference for pilot integrators in 2026[@ageverification-dev].&lt;/p&gt;
&lt;h3&gt;3. Age Verification Globally With Strong Privacy&lt;/h3&gt;
&lt;p&gt;Evaluate Google&apos;s Longfellow-zk over an ISO mdoc. The reference implementation is Apache-2.0 at &lt;code&gt;github.com/google/longfellow-zk&lt;/code&gt;; the project documentation site includes security review reports[@longfellow-repo][@longfellow-docs]. The issuer requirements are &quot;do what every mDL issuer already does&quot; -- sign ECDSA-P-256 over the CBOR mdoc. The holder requirements are a phone that can run a ~1.2 s SNARK prover.&lt;/p&gt;
&lt;h3&gt;4. Full Multi-Attribute Privacy With Maximum Cryptographic Cleanliness&lt;/h3&gt;
&lt;p&gt;For a privacy-preserving employee badge, professional credential, or membership card where you control both the issuer and the consumer (an enterprise context), use BBS via &lt;code&gt;draft-irtf-cfrg-bbs-signatures-10&lt;/code&gt;[@bbs-draft-10]. Expect to operate your own pairing-based PKI on BLS12-381. Native predicate proofs and ~256-byte presentations are the reward.&lt;/p&gt;
&lt;h3&gt;5. Quick Deployment Without Multi-Show Unlinkability&lt;/h3&gt;
&lt;p&gt;If selective disclosure is required and multi-show unlinkability is not, SD-JWT VC (RFC 9901) on stock ECDSA or EdDSA is the lowest-friction integration into existing OAuth and OpenID Connect stacks[@rfc9901]. Two presentations of the same credential to colluding verifiers will be linkable; for many enterprise scenarios that is acceptable.&lt;/p&gt;
&lt;h3&gt;6. TPM or Hardware Vendor&lt;/h3&gt;
&lt;p&gt;ECDAA is in the TPM 2.0 spec; consumer-market demand is near zero[@tpm-2-spec]. The pragmatic recommendation is to wait for an operating-system-layer consumption story to mature before allocating silicon area or firmware to ECDAA in a discrete or firmware TPM.&lt;/p&gt;
&lt;h3&gt;7. Self-Sovereign Identity (SSI)&lt;/h3&gt;
&lt;p&gt;Hyperledger AnonCreds 2.0 (BBS-based) is the road forward in the SSI community; AnonCreds 1.0 (CL-RSA) is the production stack actually running in deployments like BC.GOV and Ontario Digital Trust[@anoncreds-spec]. The SSI community has run its own parallel path for years and is unlikely to converge with the EUDI Wallet stack any time soon.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Three lines to memorise. &lt;strong&gt;Anti-abuse&lt;/strong&gt;: Privacy Pass (RFC 9578) -- VOPRF if you are both issuer and verifier, blind-RSA if you are federated. &lt;strong&gt;Age verification in the EU&lt;/strong&gt;: wait for the EUDI Wallet age attestation (Member-State deadline 24 December 2026). &lt;strong&gt;Age verification globally with privacy&lt;/strong&gt;: Longfellow-zk over an ISO mdoc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That covers the deployment matrix. An entire layer of privacy-preserving identity infrastructure now exists, in production, at internet scale. The next question is not whether the cryptography ships -- it has shipped -- but what we choose to use it for.&lt;/p&gt;
&lt;h2&gt;11. Frequently Asked Questions&lt;/h2&gt;

Privacy Pass is anonymous against the verifier under RFC 9576&apos;s Attester / Issuer / Origin non-collusion threat model -- the attester learns which user solved which CAPTCHA, the issuer learns nothing about the user, the origin learns only that a valid token redeemed. It is *not* anonymous against an issuer-verifier colluder who shares state across the trust boundary. It is also subject to residual per-issuer linkability of the kind that comes from seeing thousands of tokens signed by the same issuer key; the formal anonymity set is &quot;all users whose tokens are signed by the same issuer key in the same epoch.&quot;

Passkeys prove WHO -- they bind an authentication event to a specific public key pair associated with a specific account. Anonymous credentials prove WHAT IS TRUE about you -- an attribute (over 18, licensed to drive) -- without identifying the holder. Different primitive, different threat model. WebAuthn and passkeys assume the verifier wants to know who you are; Privacy Pass and BBS assume the verifier specifically does not.

ECDAA is *optional* in TPM 2.0 -- the algorithm is in the spec but the TCG did not require vendors to ship it[@tpm-2-spec], no major browser or operating system ever built a challenge path, and the cryptography sits dormant on the chip. §4&apos;s &quot;DAA is OPTIONAL in TPM 2.0&quot; callout and §3&apos;s DAA subsection give the full diagnosis; the short answer is that [WebAuthn](/blog/webauthn-and-passkeys-on-windows-from-ctap-to-the-credential/) won the device-attestation slot because it has a relying-party-side consumption protocol and gives up anonymity in exchange for a usable enrolment flow.

Matthew Green&apos;s April 2026 primer says Privacy Pass is &quot;so ubiquitous that even Microsoft uses it in their Edge browser&quot;[@green-2026-part2]. We could not find primary Microsoft documentation naming a specific &quot;Edge Private Access Tokens&quot; product. The §9 Aside on this point gives the full diagnosis: the deployment is real (Green is a careful source) but we do not invent a product name that Microsoft itself does not use. That is the honest limit of the available evidence.

Technically yes -- a zero-knowledge proof on a device against a signed mdoc that contains an `age_over_18` element is a constructible and tested protocol[@ec-2026-age-app][@ageverification-dev]. Operationally, the answer depends on the EUDI Wallet rollout (the 24 December 2026 Member-State deadline is binding under eIDAS 2). Politically, the answer depends on enforcement -- whether large platforms accept anonymous proofs or insist on identifying flows that the regulation would treat as non-compliant. The Commission&apos;s &quot;technically ready&quot; claim of 15 April 2026 is verifiable against the cryptography; the deployment timeline is the open question.

Different primitive. Anonymous credentials are designed to allow N unlinkable presentations per user. Proof-of-personhood schemes are explicitly sybil-resistance mechanisms that limit one user to one presentation against a particular service. They are complementary but answer different questions, and we do not cover them here.

Orthogonal. Passkeys and anonymous credentials answer different questions and will continue to coexist. Anonymous credentials do not authenticate you to an account; passkeys do not let you prove a fact about yourself without revealing your account binding. Most production identity flows in 2027 and beyond will combine both -- a passkey for account access, an anonymous credential for attribute disclosure where identification is unnecessary.
&lt;p&gt;Forty-one years after a Berkeley graduate student described an anonymous credential in &lt;em&gt;Communications of the ACM&lt;/em&gt;, every major browser ships one, the IETF has standardised the wire format, and the European Commission has bet the regulation of online age verification on the primitive working at population scale. The cryptography did its work in the 1980s and 1990s. The protocol stack, the standards bodies, the device wallets, and the regulatory deadline came forty years later. What is left to do is the part the cryptography never claimed to do: choose what to use it for.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;anonymous-credentials-shipping&quot; keyTerms={[
  { term: &quot;Blind signature&quot;, definition: &quot;A signature scheme in which the signer signs a value masked by a holder-chosen blinding factor and never sees the underlying message.&quot; },
  { term: &quot;Anonymous credential&quot;, definition: &quot;A credential whose holder can prove a fact about themselves without revealing identity, and without two presentations being linkable.&quot; },
  { term: &quot;Selective disclosure&quot;, definition: &quot;The property that the holder can reveal an arbitrary subset of the attributes on a credential while keeping the rest hidden.&quot; },
  { term: &quot;Multi-show unlinkability&quot;, definition: &quot;The property that two or more presentations of the same credential cannot be linked across verifiers or by colluding verifiers.&quot; },
  { term: &quot;Direct Anonymous Attestation (DAA)&quot;, definition: &quot;A TPM-deployable anonymous credential primitive (Brickell-Camenisch-Chen 2004) standardised as an optional algorithm in TPM 2.0.&quot; },
  { term: &quot;OPRF / VOPRF&quot;, definition: &quot;Oblivious / Verifiable Oblivious Pseudorandom Function (RFC 9497); the cryptographic primitive behind Privacy Pass token type 0x0001.&quot; },
  { term: &quot;Privacy Pass&quot;, definition: &quot;IETF Standards-Track anonymous-token family (RFCs 9576, 9577, 9578, June 2024) deployed by Cloudflare, Apple, Chrome, and Edge.&quot; },
  { term: &quot;BBS+&quot;, definition: &quot;Pairing-based multi-message signature scheme (Au-Susilo-Mu 2006) over BLS12-381; ~80-byte signature, ~256-byte proof, multi-show unlinkable by construction.&quot; },
  { term: &quot;MPC-in-the-head&quot;, definition: &quot;Zero-knowledge proof construction (Ishai-Kushilevitz-Ostrovsky-Sahai 2007) that underlies Longfellow-zk&apos;s ECDSA-circuit SNARK.&quot; },
  { term: &quot;EUDI Wallet&quot;, definition: &quot;European Digital Identity Wallet mandated by eIDAS 2 (Regulation (EU) 2024/1183); Member-State provisioning deadline 24 December 2026.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>anonymous-credentials</category><category>privacy-pass</category><category>zero-knowledge-proofs</category><category>eudi-wallet</category><category>tpm-daa</category><category>bbs-signatures</category><category>longfellow-zk</category><category>age-verification</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>Direct Anonymous Attestation: The Zero-Knowledge Proof Already in Every TPM</title><link>https://paragmali.com/blog/direct-anonymous-attestation-the-zero-knowledge-proof-alread/</link><guid isPermaLink="true">https://paragmali.com/blog/direct-anonymous-attestation-the-zero-knowledge-proof-alread/</guid><description>TPM 2.0 names a zero-knowledge group-signature primitive in its spec. A billion chips ship it. Almost nobody verifies it. The story of why DAA won every standardization fight and lost every deployment one.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>
**Direct Anonymous Attestation is the zero-knowledge proof your laptop already has -- and never uses.** Every TPM 2.0 specification since 2014 names a group-signature primitive called `TPM_ALG_ECDAA`, with a normative command pair (`TPM2_Commit`, `TPM2_Sign`) and a mandatory curve (`TPM_ECC_BN_P256`). A TPM with ECDAA enabled can prove &quot;I am a genuine TPM whose endorsement key was certified by a known issuer&quot; without revealing *which* TPM and without an online third party in the verification path. ISO/IEC 20008-2:2013 Mechanism 4 standardizes it. FIDO Alliance bound it to authenticator attestation in 2018. WebAuthn Level 1 registered ECDAA as an attestation type carried inside the `packed` and `tpm` attestation statement formats in March 2019. Three years later, WebAuthn Level 2 removed it entirely. The TCG PC Client Platform TPM Profile made `TPM_ALG_ECDAA` optional in February 2020. Microsoft Azure Attestation, Windows Health Attestation, AWS Nitro, Apple App Attest, and Google Play Integrity all use Privacy-CA-shaped broker flows instead. This article walks the thirty-year cryptographic lineage, the TPM 2.0 normative surface, the FIDO ECDAA failure, and the structural reasons Microsoft chose brokers over math.
&lt;h2&gt;1. A Billion Chips, Zero Verifiers&lt;/h2&gt;
&lt;p&gt;Every TPM 2.0 Library Specification published since 2014 names a zero-knowledge proof of knowledge. The algorithm identifier &lt;code&gt;TPM_ALG_ECDAA&lt;/code&gt; (value &lt;code&gt;0x001A&lt;/code&gt;) appears in Part 2 (Structures). The command pair &lt;code&gt;TPM2_Commit&lt;/code&gt; and &lt;code&gt;TPM2_Sign&lt;/code&gt; appears in Part 3 (Commands). The mathematical construction appears in Part 1 Annex C.5. The mandatory curve is &lt;code&gt;TPM_ECC_BN_P256&lt;/code&gt; (&lt;code&gt;0x0010&lt;/code&gt;), a 256-bit Barreto-Naehrig curve picked specifically because it admits the asymmetric pairings the protocol needs [@tpm-library-spec]. A conforming &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM 2.0 chip&lt;/a&gt; with ECDAA enabled can produce a signature that proves the chip is a genuine TPM whose endorsement key was certified by a known issuer -- without revealing &lt;em&gt;which&lt;/em&gt; TPM, and without an online certificate authority sitting in the verification path. The cryptography is called Direct Anonymous Attestation, and the Wikipedia article notes that the construction is &quot;implemented by both EPID 2.0 and the TPM 2.0 standard&quot; [@wiki-daa].&lt;/p&gt;
&lt;p&gt;Almost nobody uses it.&lt;/p&gt;
&lt;p&gt;Microsoft Azure Attestation does not. Its public architecture document describes a certificate authority that ingests endorsement-key certificates and issues per-key JWTs with a special issuance policy [@azure-attestation]. The Windows Health Attestation Service does not. AWS Nitro Enclaves does not [@aws-nitro-attestation]. Apple App Attest does not [@apple-app-attest]. Google Play Integrity does not [@google-play-integrity]. WebAuthn Level 1 registered ECDAA as an attestation type carried inside the &lt;code&gt;packed&lt;/code&gt; and &lt;code&gt;tpm&lt;/code&gt; formats in March 2019; WebAuthn Level 2 in April 2021 removed it entirely [@webauthn-2]. The TCG PC Client Platform TPM Profile, the document that governs which TPM 2.0 algorithms an OEM must support to ship a Windows-class platform, made &lt;code&gt;TPM_ALG_ECDAA&lt;/code&gt; and &lt;code&gt;TPM_ALG_ECSCHNORR&lt;/code&gt; optional in v1.04 (February 2020) and has carried that designation through v1.07 RC1 (December 2025) [@tcg-ptp]. &lt;a href=&quot;https://paragmali.com/blog/pluton-a-tpm-on-silicon-microsoft-can-patch/&quot; rel=&quot;noopener&quot;&gt;Microsoft Pluton&lt;/a&gt;&apos;s published surface, which enumerates the algorithms the security processor exposes through its TPM 2.0 personality, does not advertise ECDAA at all [@pluton].&lt;/p&gt;
&lt;p&gt;The most thoroughly standardized hardware-anchored group-signature primitive in the history of platform security sits in firmware on a billion-plus machines and runs on almost none.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Direct Anonymous Attestation solves the same problem as a Privacy-CA -- prove the TPM is genuine without disclosing &lt;em&gt;which&lt;/em&gt; TPM -- by moving the trust assumption from operational (the broker promises not to log) to cryptographic (the math forbids the issuer from learning). The interesting question is not whether the cryptography works. It is why an industry that spent thirty years building the math chose, in production, the architecture the math was meant to replace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article walks the answer in four moves. Sections 2 through 5 reconstruct the cryptographic lineage: the Privacy-CA architecture DAA was invented against (TPM 1.1, 2003), the group-signature pre-history that made the construction possible (Chaum-van Heyst 1991 through Camenisch-Lysyanskaya 2004), the Brickell-Camenisch-Chen breakthrough at ACM CCS 2004, and the seven-year evolution to the elliptic-curve scheme TPM 2.0 actually ships (Chen-Page-Smart, CARDIS 2010). Sections 6 and 7 walk the normative surfaces: the TPM 2.0 ECDAA command surface and the ISO/IEC 20008-2 / 20009-2 standards. Sections 8 and 9 are case studies in non-deployment: FIDO&apos;s three-year experiment with ECDAA-in-WebAuthn, and Microsoft&apos;s two-decade commitment to broker-mediated attestation. Section 10 names the open problems -- post-quantum DAA, confidential computing, the One-TPM-to-Bind-Them-All fix that has not made it into TCG text. Section 11 closes with a role-keyed practical guide and an FAQ.&lt;/p&gt;

timeline
    title Direct Anonymous Attestation, 1991-2024
    1991 : Chaum-van Heyst (EUROCRYPT)
         : Group signature defined
    1997 : Camenisch-Stadler (CRYPTO)
         : Constant-size signatures
    2000 : ACJT (CRYPTO)
         : Coalition resistance
    2004 : Brickell-Camenisch-Chen (CCS)
         : Boneh-Boyen-Shacham short groupsigs
    2005 : DAA-RSA added to TPM 1.2 rev 94
    2007 : Brickell-Li EPID (WPES)
         : Signature-based revocation
    2008 : Brickell-Chen-Li (TRUST)
         : First pairing DAA
         : CMS asymmetric DAA proposed
    2010 : Chen-Li (IPL)
         : CMS proof flaw
         : Chen-Page-Smart (CARDIS)
         : The scheme TPM 2.0 ships
    2013 : BFGSW (IJIS)
         : User-controlled linkability model
         : ISO/IEC 20008-2 / 20009-2
    2014 : TPM 2.0 Library Spec
         : ECDAA in firmware
    2015 : Smyth-Ryan-Chen
         : Retroactive BCC privacy bug
    2018 : FIDO ECDAA v2.0
    2019 : WebAuthn Level 1
         : ecdaa attestation format
    2020 : TCG PTP v1.04
         : ECDAA made optional
    2021 : WebAuthn Level 2
         : ecdaa format removed
    2024 : CoSNIZK
         : Lattice DAA at 38 kB
&lt;p&gt;To answer the question of why, we have to start where every TPM attestation story does -- with the architecture DAA was invented to replace.&lt;/p&gt;
&lt;h2&gt;2. The Privacy-CA Trap (1999-2003)&lt;/h2&gt;
&lt;p&gt;TPM 1.1, originally published by the Trusted Computing Platform Alliance in 2002 and taken over in April 2003 by the Trusted Computing Group that replaced it [@wiki-tcg], had a privacy story. The story was a broker called the Privacy Certificate Authority. The story had a single load-bearing flaw, and the field spent the next two decades writing papers about it.&lt;/p&gt;
&lt;p&gt;The mechanism, paraphrased from the Wikipedia summary that itself paraphrases the TCG spec, is five steps [@wiki-daa]:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A TPM manufacturer embeds a 2048-bit RSA Endorsement Key (EK) at the time the chip is provisioned, along with a certificate &lt;code&gt;EKCert&lt;/code&gt; signed by the manufacturer [@wiki-tpm].&lt;/li&gt;
&lt;li&gt;The platform generates a fresh Attestation Identity Key (AIK) inside the TPM.&lt;/li&gt;
&lt;li&gt;The platform sends &lt;code&gt;(EKCert, AIKpub, proof-of-binding)&lt;/code&gt; to a Privacy-CA.&lt;/li&gt;
&lt;li&gt;The Privacy-CA validates the EK certificate, confirms the binding proof, and issues &lt;code&gt;Cert(AIKpub)&lt;/code&gt; signed by the CA.&lt;/li&gt;
&lt;li&gt;The platform uses the AIK to sign actual attestations -- platform configuration register quotes, boot logs, key-attestation certificates -- and presents &lt;code&gt;Cert(AIKpub)&lt;/code&gt; to relying parties as proof that the AIK is TPM-resident.&lt;/li&gt;
&lt;/ol&gt;

The Endorsement Key is the long-lived, manufacturer-certified asymmetric key burned into the TPM at provisioning. Its public half is the chip&apos;s permanent cryptographic identity; its certificate, signed by the manufacturer, is the platform&apos;s proof that the chip is a real TPM. The Attestation Identity Key is a short-lived TPM-resident key generated for signing attestation outputs. Because the EK is uniquely identifying, the AIK exists to absorb attestation traffic on the EK&apos;s behalf: the EK certifies the AIK once (or once per Privacy-CA), and the AIK does the signing thereafter [@azure-attestation].

The broker introduced by the TCG in TPM 1.1 to separate the unique-by-design Endorsement Key from the per-attestation Attestation Identity Key. The Privacy-CA verifies the EK certificate, attests that the AIK is bound to a real TPM, and issues a certificate on the AIK that the platform then uses to sign quotes. The privacy property is operational, not cryptographic: the CA promises not to log the linkage between EK and AIK [@wiki-daa].
&lt;p&gt;The architecture has three structural problems, and the Wikipedia summary of the original TPM 1.1 design makes the most uncomfortable one explicit: &quot;privacy requirements may be violated if the privacy CA and verifier collude&quot; [@wiki-daa]. The Privacy-CA &lt;em&gt;can&lt;/em&gt; link AIKs to EKs. It promises not to. That promise is enforceable by audit, by legal contract, by reputation, and by the threat of a regulator finding out. It is not enforceable by mathematics.&lt;/p&gt;
&lt;p&gt;The other two problems are availability and concentration. Wikipedia again, on the TPM 1.1 design: &quot;the privacy CA must take part in every transaction&quot; [@wiki-daa]. Every AIK certification is a synchronous network round-trip to a single CA. The CA is therefore a high-availability target, a high-value attack target, and a high-throughput service obligation for whoever decides to operate one. The FIDO Alliance, fifteen years later, wrote down the operational consequences of that obligation with surprising frankness in its ECDAA Algorithm v2.0 specification [@fido-ecdaa-v2]:&lt;/p&gt;

An alternative approach to &apos;group&apos; keys is the use of individual keys combined with a Privacy-CA [TPMv1-2-Part1]. Translated to FIDO, this approach would require one Privacy-CA interaction for each Uauth key. This means relatively high load and high availability requirements for the Privacy-CA. Additionally the Privacy-CA aggregates sensitive information (i.e. knowing the relying parties the user interacts with). This might make the Privacy-CA an interesting attack target. -- FIDO ECDAA Algorithm v2.0 Implementation Draft, 2018
&lt;p&gt;The FIDO document was written in 2018, but it is operating on a problem that was current in 2003. The Privacy-CA model concentrates the very identifiers it is supposed to anonymize. A regulator with a subpoena, an insider with a database query, or a successful attacker with persistent access can recover the linkage the CA promised to forget. In 2003 the TCG named the missing primitive -- a &lt;em&gt;direct&lt;/em&gt; attestation scheme whose anonymity was guaranteed by math rather than a CA&apos;s promise -- and the cryptographic literature went to work on it.The privacy-advocate criticism of the TPM in the 2003-2005 window came from a small but well-placed group. Ross Anderson at Cambridge had been writing critical surveys of trusted computing since 2002, both in a continuously updated TCPA FAQ [@anderson-tcpa-faq] and in a PODC 2003 paper &quot;Cryptography and Competition Policy -- Issues with Trusted Computing&quot; [@anderson-tcpa-paper]. Seth Schoen and the Electronic Frontier Foundation published a 2003 white paper, &quot;Trusted Computing: Promise and Risk,&quot; on the privacy implications of trusted-computing-class identifiers [@eff-schoen-2003]. European data-protection authorities had begun studying TCPA in the same window [@anderson-tcpa-faq]. The DAA construction was, by 2004, a research community answer to these criticisms more than it was a TCG product requirement.&lt;/p&gt;
&lt;p&gt;The Privacy-CA architecture is still production architecture in 2026. Microsoft Azure Attestation runs a Privacy-CA in everything but name. Its public documentation describes a CA-mediated flow whose five-step shape mirrors the TPM 1.1 Privacy-CA almost line for line: &quot;A certification authority (CA) establishes trust in the TPM either via EKPub or EKCert... The CA issues a certificate with a special issuance policy to denote that the key is now attested as protected by a TPM&quot; [@azure-attestation]. The full verbatim Microsoft Learn quote is reproduced in §9, where it anchors the Windows case study.&lt;/p&gt;
&lt;p&gt;The same pattern repeats across every hyperscaler. AWS Nitro Enclaves issues PKIX certificates rooted in AWS-operated CAs that bind enclave measurements to instance identifiers [@aws-nitro-attestation]. Apple App Attest issues per-app device identifiers from Apple-operated infrastructure [@apple-app-attest]. Google Play Integrity ships integrity verdicts signed by Google-operated infrastructure [@google-play-integrity]. In 2026 the operational descendants of TPM 1.1&apos;s Privacy-CA broker run the production attestation surface of every consumer-grade cloud platform.&lt;/p&gt;

flowchart TD
    M[&quot;TPM manufacturer&quot;] --&amp;gt;|&quot;signs EK with EKCert&quot;| EK[&quot;EK in TPM&quot;]
    EK --&amp;gt; AIK[&quot;TPM generates AIK&quot;]
    AIK --&amp;gt;|&quot;(EKCert, AIKpub, proof)&quot;| CA[&quot;Privacy-CA&quot;]
    CA --&amp;gt;|&quot;issues Cert(AIKpub)&quot;| Plat[&quot;Platform&quot;]
    Plat --&amp;gt;|&quot;AIK signs quote&quot;| V[&quot;Verifier / Relying Party&quot;]
    CA -.-&amp;gt;|&quot;can link AIK to EK&lt;br /&gt;(promises not to)&quot;| AIK
&lt;p&gt;By 2003 the field had a name for the missing primitive: a direct attestation scheme that delivered the Privacy-CA&apos;s anonymity property cryptographically rather than operationally. What followed was an academic lineage that had been quietly building, for a decade and a half, the primitives that lineage required.&lt;/p&gt;
&lt;h2&gt;3. The Pre-History: Group Signatures Before DAA (1991-2003)&lt;/h2&gt;
&lt;p&gt;Direct Anonymous Attestation was invented in 2004. The primitive it was built from was invented in 1991, in a paper that had nothing to do with TPMs.&lt;/p&gt;
&lt;p&gt;David Chaum and Eugene van Heyst presented &quot;Group Signatures&quot; at EUROCRYPT 1991 [@chaum-vh-1991]. The construction was a curiosity: a digital signature scheme in which any one of &lt;code&gt;n&lt;/code&gt; group members could sign on behalf of the group, the verifier could check that &lt;em&gt;some&lt;/em&gt; member of the group signed, and a designated &lt;em&gt;group manager&lt;/em&gt; could, given a signature, recover the identity of the signer. The use case Chaum and van Heyst had in mind was organizational: a company spokesperson signs press releases on behalf of the company; the CEO can, if necessary, recover which spokesperson signed which release.&lt;/p&gt;

A digital signature scheme in which any one of `n` group members can sign on behalf of the group such that (i) verifiers can confirm &quot;some member of the group signed this message&quot; using a single group public key, (ii) verifiers cannot determine which member signed, and (iii) a designated group manager, holding a trapdoor, can *open* any signature to recover the original signer. Chaum and van Heyst introduced the primitive in 1991; the next decade was about making the construction efficient enough to deploy [@wiki-group].
&lt;p&gt;The 1991 construction had a fatal practical property: signature size was linear in the size of the group. A 10,000-member group meant a 10,000-component signature. For a primitive intended to handle organizational use cases at organizational scale, this was a non-starter. The next decade is a sequence of papers, each adding one property to the previous, each addressing the issue that made the previous unfit for deployment.&lt;/p&gt;
&lt;p&gt;Jan Camenisch and Markus Stadler, at CRYPTO 1997, gave the field its first constant-size group signature -- signature length independent of the number of group members, suitable for groups of arbitrary size [@camenisch-stadler-1997]. Their construction relied on a particular kind of zero-knowledge proof of knowledge of a discrete logarithm whose form would, six years later, become the structural template for DAA&apos;s Sign protocol. The CS97 scheme had its own problems -- the security proof made strong assumptions, and the construction was vulnerable to &quot;framing&quot; attacks where a malicious group manager could forge signatures attributable to other members -- but the size barrier was broken.&lt;/p&gt;
&lt;p&gt;Three years later, at CRYPTO 2000, Giuseppe Ateniese, Jan Camenisch, Marc Joye, and Gene Tsudik introduced what the field now calls the ACJT scheme [@acjt-2000]. The Springer abstract is unusually direct about what ACJT contributed: the paper &quot;introduces a new provably secure group signature... proven secure and coalition-resistant under the strong RSA and the decisional Diffie-Hellman assumptions.&quot; The property that made ACJT important was &lt;em&gt;coalition resistance&lt;/em&gt; -- a formal guarantee that no subset of &lt;code&gt;k&lt;/code&gt; group members, no matter how large, could collude to produce a valid signature that did not open to one of them. ACJT&apos;s security proofs were the first in the group-signature literature to treat coalitions as a first-class threat model.Coalition resistance as a property predated ACJT, but coalition resistance as a &lt;em&gt;formal&lt;/em&gt; property -- something proven against an adversary defined in a complexity-theoretic model -- did not. Camenisch and Michels in 1998, and several authors in between, had given coalition-resistance arguments that depended on heuristic assumptions about the underlying hash function or signature scheme [@camenisch-michels-1998]. ACJT 2000 gave the proof under the strong RSA assumption, which by 2000 was a well-understood number-theoretic conjecture that the cryptographic community treated as a load-bearing security primitive.&lt;/p&gt;
&lt;p&gt;ACJT was the construction the DAA designers built on. The reason is in its protocol structure. The ACJT signer holds a &lt;em&gt;signed credential&lt;/em&gt; on a secret membership value &lt;code&gt;f&lt;/code&gt;. Signing a message means producing a non-interactive zero-knowledge proof of knowledge of &lt;code&gt;(f, signature)&lt;/code&gt; satisfying the group manager&apos;s verification equation, bound to the message. The proof is constant-size; the verifier checks it against the group public key and learns only that &lt;em&gt;some&lt;/em&gt; member signed.&lt;/p&gt;
&lt;p&gt;Jan Camenisch and Anna Lysyanskaya, working in parallel, were building the other primitive DAA would need. Their EUROCRYPT 2001 paper introduced what the field now calls CL credentials -- a digital signature scheme with two unusual properties [@cl-2001]. First, a signer can issue a signature on a &lt;em&gt;committed&lt;/em&gt; value &lt;code&gt;Commit(f)&lt;/code&gt; without seeing &lt;code&gt;f&lt;/code&gt; itself, so the holder of &lt;code&gt;f&lt;/code&gt; ends up with a signature on something the signer never learned. Second, a holder of &lt;code&gt;(f, signature)&lt;/code&gt; can prove possession of that pair in zero knowledge, revealing neither &lt;code&gt;f&lt;/code&gt; nor the signature itself.&lt;/p&gt;

A digital signature scheme with two algorithmic protocols on top of the standard sign-and-verify pair. A *blind issuance* protocol lets a signer issue a signature on a value the signer cannot see (the holder commits to a value `f` and proves the commitment well-formed; the signer signs the commitment without learning `f`). A *proof-of-possession* protocol lets a holder of `(f, signature)` prove &quot;I have a CL signature from this signer on some value&quot; without revealing either the value or the signature. CL signatures are the primitive a DAA Issuer uses to issue the long-lived attestation credential the TPM keeps after the Join protocol [@cl-2001] [@cl-2004].
&lt;p&gt;CL signatures gave the field a clean way to issue a member credential without the issuer ever learning the member&apos;s secret -- exactly the property a TPM needs when receiving a long-lived DAA credential from an issuer who, by design, must remain unable to recognize the TPM later. Camenisch and Lysyanskaya&apos;s CRYPTO 2004 paper extended the construction to bilinear pairings [@cl-2004], a generalization that would matter for the elliptic-curve DAA schemes of the next decade.&lt;/p&gt;

flowchart LR
    A[&quot;Chaum-van Heyst 1991&lt;br /&gt;Primitive defined&lt;br /&gt;Linear-size signatures&quot;] --&amp;gt; B[&quot;Camenisch-Stadler 1997&lt;br /&gt;Constant-size signatures&quot;]
    B --&amp;gt; C[&quot;ACJT 2000&lt;br /&gt;Coalition resistance&lt;br /&gt;Strong RSA + DDH&quot;]
    C --&amp;gt; D[&quot;Brickell-Camenisch-Chen 2004&lt;br /&gt;DAA-RSA&quot;]
    A --&amp;gt; E[&quot;Camenisch-Lysyanskaya 2001&lt;br /&gt;Blind issuance&lt;br /&gt;Proof of possession&quot;]
    E --&amp;gt; D
    E --&amp;gt; F[&quot;Camenisch-Lysyanskaya 2004&lt;br /&gt;CL on bilinear pairings&quot;]
    F --&amp;gt; G[&quot;Chen-Page-Smart 2010&lt;br /&gt;EC-DAA&quot;]
&lt;p&gt;A sibling lineage was building in parallel. Dan Boneh, Xavier Boyen, and Hovav Shacham presented &quot;Short Group Signatures&quot; at CRYPTO 2004 [@bbs-2004]. The BBS scheme used bilinear pairings to compress group signatures to a few hundred bytes -- signatures, in the abstract&apos;s words, &quot;approximately the size of a standard RSA signature with the same security.&quot; BBS gave the W3C Verifiable Credentials community a primitive that descendants like BBS+ would later use for selective-disclosure credentials. BBS itself did not become the TPM construction. The DAA designers, working from ACJT and CL, took a different path.&lt;/p&gt;
&lt;p&gt;By 2003 the primitives existed. The TPM community had the use case. The two communities had not yet met. In 2004, three authors at three different industrial labs made the introduction.&lt;/p&gt;
&lt;h2&gt;4. The Breakthrough: DAA-RSA (Brickell-Camenisch-Chen, CCS 2004)&lt;/h2&gt;
&lt;p&gt;The introduction happened at ACM CCS 2004. Ernie Brickell at Intel, Jan Camenisch at IBM Zurich, and Liqun Chen at HP Labs Bristol published &quot;Direct Anonymous Attestation&quot; [@bcc-2004]. The IACR ePrint abstract makes the structural contribution explicit:&lt;/p&gt;

Direct anonymous attestation can be seen as a group signature without the feature that a signature can be opened, i.e., the anonymity is not revocable. Moreover, DAA allows for pseudonyms, i.e., for each signature a user (in agreement with the recipient of the signature) can decide whether or not the signature should be linkable to another signature. DAA furthermore allows for detection of &apos;known&apos; keys: if the DAA secret keys are extracted from a TPM and published, a verifier can detect that a signature was produced using these secret keys. -- BCC 2004 (IACR ePrint 2004/205)
&lt;p&gt;Two design moves did the work, and naming them clearly is the first step in understanding why DAA solved the Privacy-CA problem.&lt;/p&gt;
&lt;p&gt;The first move is a &lt;em&gt;subtraction&lt;/em&gt;. Every prior group-signature scheme -- Chaum-van Heyst, Camenisch-Stadler, ACJT, BBS -- gave a designated group manager the power to &lt;em&gt;open&lt;/em&gt; a signature and recover its signer. For a TPM attestation primitive, the opening capability is undesirable. An issuer who can open is morally a Privacy-CA: it has the linkage information the architecture is supposed to forget. BCC 2004 removes the opening capability entirely. No party can de-anonymize a signature -- not the issuer, not the verifier, not a coalition of either. The IACR ePrint 2004/205 abstract captures the consequence: DAA &quot;can be seen as a group signature without the feature that a signature can be opened, i.e., the anonymity is not revocable&quot; [@bcc-2004]. Once the credential is issued, the issuer has no cryptographic handle left to break the user&apos;s privacy.&lt;/p&gt;

A zero-knowledge attestation primitive in which a TPM holds a long-lived membership credential (the output of a one-time Join protocol with an Issuer) and can subsequently produce signatures that prove &quot;the signing TPM holds a credential certified by this Issuer&quot; without revealing which TPM signed and without an online third party in the verification path. No party -- not the Issuer, not the Verifier, not a coalition of either -- can de-anonymize a DAA signature. The construction first appeared in Brickell-Camenisch-Chen 2004 [@bcc-2004].
&lt;p&gt;The second move is a &lt;em&gt;substitution&lt;/em&gt;. Where prior schemes traced misbehaving signers by manager-controlled opening, DAA introduces a &lt;em&gt;user-controlled&lt;/em&gt; linkability mechanism through what the BCC paper calls a basename-keyed pseudonym. The signing TPM holds a secret membership value &lt;code&gt;f&lt;/code&gt;. The verifier supplies a &lt;em&gt;basename&lt;/em&gt; &lt;code&gt;bsn&lt;/code&gt; (a string the verifier picks per session, per relying party, or per global epoch). The TPM derives a pseudonym&lt;/p&gt;
&lt;p&gt;$$N_V = \zeta^f \pmod \Gamma, \qquad \zeta = H_\Gamma(\text{bsn})$$&lt;/p&gt;
&lt;p&gt;where &lt;code&gt;H_Γ&lt;/code&gt; hashes the basename into a generator of a multiplicative group &lt;code&gt;Γ&lt;/code&gt;. The pseudonym &lt;code&gt;N_V&lt;/code&gt; has two structural properties. If the same verifier reuses the same &lt;code&gt;bsn&lt;/code&gt; across sessions, signatures from the same TPM produce the same &lt;code&gt;N_V&lt;/code&gt;, so the verifier can link them (and blacklist them if needed). If the verifier randomizes &lt;code&gt;bsn&lt;/code&gt; per session, or sets &lt;code&gt;bsn&lt;/code&gt; to the special value &lt;code&gt;⊥&lt;/code&gt; indicating &quot;no linkability,&quot; signatures from the same TPM produce different &lt;code&gt;N_V&lt;/code&gt; values that are indistinguishable from random.&lt;/p&gt;

A DAA property in which the *verifier* chooses a basename `bsn` per session or per relying party. Signatures from the same TPM under the same basename produce the same pseudonym; signatures under different basenames produce pseudonyms indistinguishable from random. The TPM, not a group manager, controls which signatures are linkable to which others. The Bernhard-Fuchsbauer-Ghadafi-Smart-Warinschi 2013 paper gives the canonical formal model [@bfgsw-2013].
&lt;p&gt;Together the subtraction and the substitution define the DAA contract. The Issuer issues a CL signature on the TPM&apos;s secret &lt;code&gt;f&lt;/code&gt; during a one-time Join. The TPM thereafter holds the credential &lt;code&gt;(f, A, e, v)&lt;/code&gt; -- the secret membership value plus the CL signature components. To sign a message &lt;code&gt;m&lt;/code&gt; against a verifier-supplied basename &lt;code&gt;bsn&lt;/code&gt;, the TPM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Computes the pseudonym &lt;code&gt;N_V = ζ^f mod Γ&lt;/code&gt; where &lt;code&gt;ζ = H_Γ(bsn)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Randomizes the CL signature: picks a fresh &lt;code&gt;w&lt;/code&gt;, computes &lt;code&gt;T_1 = A · S^w mod n&lt;/code&gt; and &lt;code&gt;T_2 = g^e · h^w mod n&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Produces a Fiat-Shamir non-interactive zero-knowledge proof of knowledge of &lt;code&gt;(f, A, e, v, w)&lt;/code&gt; satisfying the CL verification equation&lt;/p&gt;
&lt;p&gt;$$A^e \equiv Z / (R^f \cdot S^{v&apos; + v&apos;&apos;}) \pmod n,$$&lt;/p&gt;
&lt;p&gt;binding the proof to the tuple &lt;code&gt;(m, T_1, T_2, N_V)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A verifier checks the proof against the Issuer&apos;s public key. The verifier learns nothing about &lt;code&gt;f&lt;/code&gt;, nothing about the TPM&apos;s identity, nothing about which CL signature was randomized -- and either gains a linkable pseudonym (if &lt;code&gt;bsn&lt;/code&gt; was reused) or no linkability at all (if &lt;code&gt;bsn&lt;/code&gt; was fresh).&lt;/p&gt;
&lt;p&gt;The architectural picture, set against §2&apos;s Privacy-CA flow, makes the contrast vivid.&lt;/p&gt;

flowchart TD
    I[&quot;Issuer&lt;br /&gt;(holds CL signing key)&quot;]
    T[&quot;TPM&lt;br /&gt;(holds secret f)&quot;]
    V[&quot;Verifier&lt;br /&gt;(holds Issuer pub key)&quot;]
    I -.-&amp;gt;|&quot;one-time Join&lt;br /&gt;CL signature on f&lt;br /&gt;(blind, issuer never sees f)&quot;| T
    T --&amp;gt;|&quot;credential (f, A, e, v)&lt;br /&gt;stored in TPM forever&quot;| T
    T --&amp;gt;|&quot;DAA-Sign(m, bsn)&lt;br /&gt;= randomized credential + NIZK + N_V&quot;| V
    V --&amp;gt;|&quot;Verify against Issuer pub key&lt;br /&gt;(no online interaction)&quot;| V
&lt;p&gt;This is the first aha. The reader entered §3 thinking &quot;anonymity with manager-controlled traceability&quot; was the goal of group signatures. They exit §4 understanding that for TPM attestation the goal is &lt;em&gt;anonymity without any opener&lt;/em&gt; plus &lt;em&gt;user-controlled, per-verifier linkability&lt;/em&gt;. The breakthrough is structurally a subtraction (remove the opener) plus a substitution (per-verifier basename pseudonyms in place of manager-controlled opening). It is not an addition.Eleven years after BCC 2004, Ben Smyth, Mark Ryan, and Liqun Chen ran a formal analysis of the original BCC construction and found a retroactive privacy bug [@smyth-ryan-chen-2015]. The bug allowed certain Issuer-coalition adversaries to link signatures across basenames in ways the original security argument had not anticipated. The bug was fixed in the 2008-2010 redesigns (specifically the BCL 2009 simplified-security-notions paper [@bcl-2009] and the CDL 2016 strong-Diffie-Hellman revisitation). The reader interested in why &quot;we proved this in 2004&quot; is not the same as &quot;this is provably secure in 2026&quot; should read SRC 2015 alongside the original BCC abstract.&lt;/p&gt;
&lt;p&gt;On paper, the BCC 2004 construction solved the Privacy-CA trap. In practice, DAA-RSA was hard to ship. The CL signature in the original scheme used strong RSA moduli at 2048 bits. A single Sign operation took several seconds on the TPM 1.2 hardware of the time. The signature itself was approximately 2.5 kilobytes -- larger than the entire AIK signature output a Privacy-CA-mediated attestation produced. TPM 1.2 shipped DAA-RSA as an optional capability when revision 94 of the spec added it in 2005 [@tpm-library-spec]. Almost no platform integrator turned it on. The cryptography worked. The implementation budget did not.&lt;/p&gt;
&lt;p&gt;The next decade was about making the construction small enough to deploy. The path was anything but straight.&lt;/p&gt;
&lt;h2&gt;5. The Evolution: From RSA-DAA to EC-DAA (2007-2013)&lt;/h2&gt;
&lt;p&gt;Six papers in seven years, two industrial branches, one dead end, one production scheme. Why was the EC-DAA story so much harder than it should have been?&lt;/p&gt;
&lt;p&gt;The honest answer: the entire toolkit of pairing-based cryptography arrived at the same time the TPM industry needed it, and the field discovered in real time that not every choice of pairing was safe. The path from BCC 2004 to the construction the TPM 2.0 spec actually shipped runs through five waypoints, each addressing the problem the previous one created.&lt;/p&gt;
&lt;h3&gt;5.1 Brickell-Li 2007: EPID and signature-based revocation&lt;/h3&gt;
&lt;p&gt;In 2007 Ernie Brickell, now leading Intel&apos;s trusted-computing work, and Jiangtao Li published &quot;Enhanced Privacy ID: A Direct Anonymous Attestation Scheme with Enhanced Revocation Capabilities&quot; at WPES 2007 [@brickell-li-epid-2007]. The journal version appeared at IEEE TDSC in 2012 [@brickell-li-tdsc-2012]. The single feature EPID added was a revocation list called Sig-RL: a list of &lt;em&gt;signatures&lt;/em&gt; the issuer wished to disavow. A verifier, given a signature &lt;code&gt;σ&lt;/code&gt; and a Sig-RL containing entries &lt;code&gt;σ_1, ..., σ_k&lt;/code&gt;, could prove that &lt;code&gt;σ&lt;/code&gt; was not produced by the same TPM as any &lt;code&gt;σ_i&lt;/code&gt; -- without learning the linking information itself.&lt;/p&gt;
&lt;p&gt;EPID became Intel&apos;s production attestation primitive. Wikipedia records the deployment scale: &quot;It has been incorporated in several Intel chipsets since 2008,&quot; and &quot;at RSAC 2016 Intel disclosed that it has shipped over 2.4B EPID keys since 2008&quot; [@wiki-epid]. EPID is what Intel SGX enclaves used to attest, before SGX attestation migrated to the vendor-CA DCAP architecture. EPID is what certain Intel-platform Widevine L1 implementations use to attest content-decryption modules. The Intel EPID SDK (the reference implementation) was eventually marked public-archive on GitHub [@epid-sdk]. The Wikipedia entry notes that the original EPID 2.0 specification was contributed by Intel into ISO/IEC 20008 and 20009 under royalty-free terms [@wiki-epid].&lt;/p&gt;
&lt;p&gt;EPID is not exactly DAA. EPID is a DAA variant with the Sig-RL revocation layer added. The Chen-Page-Smart construction that TPM 2.0 actually ships is closer to BCC 2004 plus an elliptic-curve substrate; EPID 2.0 is closer to BCC 2004 plus EC plus Sig-RL plus Intel&apos;s specific basename and key-management conventions. The two converge at the cryptographic core and diverge at the deployment surface.&lt;/p&gt;
&lt;h3&gt;5.2 Brickell-Chen-Li 2008: the first pairing-based DAA&lt;/h3&gt;
&lt;p&gt;At the TRUST 2008 conference, Ernie Brickell, Liqun Chen, and Jiangtao Li published &quot;A New Direct Anonymous Attestation Scheme from Bilinear Maps&quot; -- the first DAA scheme constructed over bilinear pairings instead of strong RSA [@bcl-2008]. Signature size dropped by an order of magnitude relative to BCC 2004, from roughly 2.5 kilobytes to a few hundred bytes [@bcl-2008]. TPM-side sign time, on hardware that supported elliptic-curve arithmetic, came down from seconds to fractions of a second [@bcl-2008]. The construction used symmetric (Type-1) pairings -- pairings where the two input groups &lt;code&gt;G_1&lt;/code&gt; and &lt;code&gt;G_2&lt;/code&gt; are the same -- which the implementation community would, two or three years later, decide were too inefficient for production TPM hardware.&lt;/p&gt;

A function `e : G_1 × G_2 -&amp;gt; G_T` on three elliptic-curve subgroups satisfying *bilinearity* (for all integers `a, b` and points `P ∈ G_1, Q ∈ G_2`, `e(aP, bQ) = e(P, Q)^(ab)`) and *non-degeneracy*. Type-3 (asymmetric) pairings, in which `G_1 ≠ G_2` and no efficient homomorphism is known between them, are the production pairing for TPM 2.0 ECDAA because they admit faster implementations and tighter security reductions than Type-1 (symmetric) pairings. The Chen-Page-Smart 2010 construction is built on Type-3 pairings over Barreto-Naehrig curves [@cps-2010].
&lt;h3&gt;5.3 Chen-Morrissey-Smart 2008: the asymmetric proposal and its proof flaw&lt;/h3&gt;
&lt;p&gt;Pairing 2008 hosted the next move. Liqun Chen, Paul Morrissey, and Nigel Smart published &quot;Pairings in Trusted Computing&quot; [@cms-pairing-2008], proposing a DAA scheme on asymmetric Type-3 pairings -- the kind that admit Barreto-Naehrig curves and the speed-ups TPM hardware needed. The same authors published a companion ProvSec 2008 paper &quot;On Proofs of Security for DAA Schemes&quot; providing the security argument [@cms-provsec-2008].&lt;/p&gt;
&lt;p&gt;Two years later, in Information Processing Letters, Liqun Chen and Jiangtao Li published &quot;A note on the Chen-Morrissey-Smart Direct Anonymous Attestation scheme&quot; [@chen-li-2010] showing that the CMS asymmetric-pairing construction had a flawed proof. The cryptographic intuition was correct; the proof technique used an assumption that did not hold in the asymmetric-pairing setting the construction relied on.The Chen-Morrissey-Smart episode is, in 2026, one of the most cited proof-flaw stories in pairing-based cryptography precisely because the construction was simple and the flaw was subtle. The mathematical content of the scheme was salvageable. The security argument was not. The lesson the field took away -- a proof in the symmetric-pairing model does not transfer to the asymmetric-pairing model without a separate argument -- has been a load-bearing convention in cryptographic publishing since.&lt;/p&gt;
&lt;h3&gt;5.4 Chen-Page-Smart 2010: the scheme TPM 2.0 actually ships&lt;/h3&gt;
&lt;p&gt;The fix arrived at CARDIS 2010 in Passau in April 2010 [@cardis-book]. Liqun Chen, Dan Page, and Nigel Smart published &quot;On the Design and Implementation of an Efficient DAA Scheme&quot; [@cps-2010] [@cps-2010-eprint], proposing an asymmetric-pairing DAA over Barreto-Naehrig curves with a Sign protocol &lt;em&gt;split&lt;/em&gt; between the TPM and the host. The TPM, in the new design, performed only the cryptographic operations that absolutely required custody of the secret &lt;code&gt;f&lt;/code&gt;: it produced commitment points and computed a Schnorr-style response over those commitments. The host -- a comparatively powerful general-purpose CPU sitting in front of the TPM -- composed the Fiat-Shamir challenge, performed the pairing computations, and assembled the final signature.&lt;/p&gt;
&lt;p&gt;The Chen-Page-Smart construction is the scheme TPM 2.0 actually ships. The Wikipedia DAA article makes the attribution direct, in a sentence that is itself the most-cited single primary-source extract in this article:&lt;/p&gt;

Chen, Page, and Smart proposed a new elliptic curve cryptography scheme using Barreto-Naehrig curves. This scheme is implemented by both EPID 2.0 and the TPM 2.0 standard. -- Wikipedia, *Direct Anonymous Attestation* [@wiki-daa]

A family of pairing-friendly elliptic curves with embedding degree 12, parameterized by an integer `u` to admit Type-3 pairings whose arithmetic is fast enough for resource-constrained devices [@bn-2006]. The curve identifier `TPM_ECC_BN_P256` (`0x0010`) is the specific 256-bit instance the TPM 2.0 Library Specification mandates for ECDAA, picked because of its pairing-friendly structure rather than as a NIST P-256 equivalent.
&lt;p&gt;Six years after CPS 2010, Taechan Kim and Razvan Barbulescu (CRYPTO 2016) published &quot;Extended Tower Number Field Sieve: A New Complexity for the Medium Prime Case,&quot; giving an improved sieve attack against pairing-friendly elliptic curves at the 256-bit BN level. The improvement dropped the practical security of BN-256 from roughly 128 bits to roughly 100 bits [@kim-barbulescu-2016]. The TCG normative text for TPM 2.0 ECDAA did not, as of late 2025, change the mandatory curve in response. This is the kind of cryptographic technical debt that lives quietly in deployed systems for a decade -- specs do not migrate on the same calendar as research moves.&lt;/p&gt;
&lt;h3&gt;5.5 BFGSW 2013 and SRC 2015: the formal closure&lt;/h3&gt;
&lt;p&gt;The cryptographic engineering of EC-DAA was done by 2010. What the field still owed itself was a clean security model: one definition of &quot;secure DAA&quot; that captured the user-controlled-linkability property and the TPM/host split, against which any candidate scheme could be evaluated.&lt;/p&gt;
&lt;p&gt;In 2013 David Bernhard, Georg Fuchsbauer, Essam Ghadafi, Nigel Smart, and Bogdan Warinschi published &quot;Anonymous attestation with user-controlled linkability&quot; in the &lt;em&gt;International Journal of Information Security&lt;/em&gt; [@bfgsw-2013] [@bfgsw-2013-eprint]. The BFGSW paper formalized the user-controlled-linkability property the BCC 2004 abstract had described in prose, introduced a clean separation of &quot;pre-DAA signing&quot; (TPM-side operations) from &quot;DAA signing&quot; (TPM + host composition), and proved the security of a representative construction in the resulting model.&lt;/p&gt;
&lt;p&gt;In 2015, Ben Smyth, Mark Ryan, and Liqun Chen published the retroactive analysis that closed the BCC 2004 privacy bug [@smyth-ryan-chen-2015]. By 2015 the cryptography was, formally, settled.&lt;/p&gt;
&lt;p&gt;In 2016 Jan Camenisch, Manu Drijvers, and Anja Lehmann revisited the construction at TRUST 2016 in &quot;Anonymous Attestation Using the Strong Diffie Hellman Assumption Revisited&quot; [@cdl-2016] [@cdl-2016-eprint], giving a tighter security argument under the q-SDH assumption and providing a fix for a Diffie-Hellman-oracle issue in the TPM 2.0 ECDAA interface that &quot;One TPM to Bind Them All&quot; would document in 2017 [@one-tpm-2017]. The CDL16 scheme is what most modern DAA library code references as the canonical construction.&lt;/p&gt;

flowchart LR
    BCC[&quot;BCC 2004&lt;br /&gt;RSA-DAA&lt;br /&gt;TPM 1.2&quot;] --&amp;gt; BL[&quot;Brickell-Li 2007&lt;br /&gt;EPID + Sig-RL&lt;br /&gt;Intel SGX / Widevine&quot;]
    BCC --&amp;gt; BCL[&quot;BCL 2008&lt;br /&gt;Type-1 pairing DAA&quot;]
    BCL --&amp;gt; CMS[&quot;CMS 2008&lt;br /&gt;Asymmetric pairing&lt;br /&gt;(broken by CL 2010)&quot;]
    BCL --&amp;gt; CPS[&quot;CPS 2010&lt;br /&gt;Type-3 BN-curve DAA&lt;br /&gt;TPM 2.0 ECDAA&quot;]
    CPS --&amp;gt; BFGSW[&quot;BFGSW 2013&lt;br /&gt;Formal user-controlled&lt;br /&gt;linkability model&quot;]
    BFGSW --&amp;gt; CDL[&quot;CDL 2016&lt;br /&gt;q-SDH revisitation&lt;br /&gt;Canonical modern DAA&quot;]
    BCC --&amp;gt; SRC[&quot;SRC 2015&lt;br /&gt;Retroactive BCC&lt;br /&gt;privacy bug&quot;]
&lt;p&gt;By 2013 the cryptography was complete. The standards organizations took the construction and made it official -- in two different specifications, on two parallel tracks.&lt;/p&gt;
&lt;h2&gt;6. The TPM 2.0 ECDAA Surface (2014-Present)&lt;/h2&gt;
&lt;p&gt;If you own a Windows laptop with a TPM 2.0, this section is the part of the chip you have never used. What does the spec actually say?&lt;/p&gt;
&lt;p&gt;The TPM 2.0 Library Specification, the canonical document published by the Trusted Computing Group, is a four-part normative reference [@tpm-library-spec]. Part 1 (Architecture) describes the threat model and the mathematical primitives. Part 2 (Structures) defines the data types every TPM command accepts and returns. Part 3 (Commands) defines the commands themselves. Part 4 (Supporting Routines) gives a reference C implementation. The ECDAA surface lives across all four parts.&lt;/p&gt;

An algorithm identifier defined in TPM 2.0 Library Specification Part 2 and selectable from any `TPMT_SIG_SCHEME` field. A signing key tagged with `TPM_ALG_ECDAA` produces signatures using the Chen-Page-Smart 2010 elliptic-curve DAA construction. The same algorithm identifier appears in any signature-scheme negotiation point in the TPM 2.0 command surface [@tpm-library-spec].

The 256-bit Barreto-Naehrig curve identifier the TPM 2.0 Library Specification mandates for any ECDAA-capable signing key. BN-P256 is *not* NIST P-256: it is a pairing-friendly curve with embedding degree 12 whose group structure admits the Type-3 pairings the DAA verification equation requires. Implementations that confuse the two will produce signatures that verify against the wrong group.

The command pair defined in TPM 2.0 Library Specification Part 3 that implements the Chen-Page-Smart 2010 split-protocol structure. `TPM2_Commit(keyHandle, P1, s2, y2)` returns commitment points `(K, L, E)` plus a `counter`. The host then computes the Fiat-Shamir challenge `c` over the message and the commitment points. `TPM2_Sign(keyHandle, digest, scheme=TPM_ALG_ECDAA, validation)` returns the Schnorr-style response `s = r + c·f mod p`. The host assembles the final signature from the commitment points, the challenge, and the response [@tpm-library-spec].
&lt;p&gt;The protocol split matters. The TPM, in the CPS 2010 construction, holds the secret &lt;code&gt;f&lt;/code&gt; and must perform exactly two cryptographic operations on it: produce a freshly randomized commitment to &lt;code&gt;f&lt;/code&gt; (via &lt;code&gt;TPM2_Commit&lt;/code&gt;), and produce a Schnorr response that proves knowledge of &lt;code&gt;f&lt;/code&gt; modulo the verifier&apos;s challenge (via &lt;code&gt;TPM2_Sign&lt;/code&gt;). Everything else -- the pairing computations, the curve arithmetic in &lt;code&gt;G_T&lt;/code&gt;, the Fiat-Shamir hash, the final signature assembly -- happens on the host CPU. This is the &lt;em&gt;only&lt;/em&gt; reason the construction is practical on a TPM. A monolithic Sign that did pairing arithmetic inside the chip would be unshippable; the split offloads the expensive operations onto silicon that has them for free.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The most common implementer mistake when working with TPM 2.0 ECDAA for the first time is to reuse the NIST P-256 ECDSA code path with the curve identifier swapped. The two curves share a bit length and a hash function and otherwise nothing. BN-P256 has a pairing-friendly group structure with embedding degree 12; NIST P-256 does not admit efficient pairings at all. Signatures produced by ECDSA over NIST P-256 will not verify against an ECDAA verifier expecting BN-P256, and the converse is true. The pairing requirement is what forces the BN curve choice; treat BN-P256 as a separate primitive with a separate code path.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Join protocol -- the one-time exchange between the Issuer and the TPM that produces the long-lived credential -- piggybacks on a TPM 2.0 command pair already present in every Windows attestation flow: &lt;code&gt;TPM2_MakeCredential&lt;/code&gt; and &lt;code&gt;TPM2_ActivateCredential&lt;/code&gt; [@tpm-library-spec]. The Issuer wraps the DAA credential under an encryption key derived from the TPM&apos;s Endorsement Key, ensuring that only the legitimate TPM (the one that holds the EK private key) can decrypt the credential and bind it to its internal &lt;code&gt;f&lt;/code&gt;.The choice of &lt;code&gt;TPM2_ActivateCredential&lt;/code&gt; as the Join anchor is convenient. The same primitive that TPM 2.0 attestation-key certification flows use for AIK-binding gets reused for DAA-credential binding. An OEM that supports &lt;code&gt;TPM2_ActivateCredential&lt;/code&gt; for ordinary AIK enrollment already has 80% of the firmware path the Join protocol needs. The difference is in what the Issuer ships back -- a per-TPM AIK certificate in the AIK case, an Issuer-randomized CL credential in the DAA case.&lt;/p&gt;
&lt;p&gt;Part 1 Annex C.5 contains the informative mathematical description -- the actual ECDAA verification equation, the basename-pseudonym derivation, the proof-of-knowledge template. Part 3 contains the normative command definitions. An implementer who reads only the Part 3 command definitions without reading Annex C.5 will have correct byte-buffer-level semantics and no idea what the protocol is computing; an implementer who reads only Annex C.5 without the normative command definitions will have correct math and the wrong API.&lt;/p&gt;
&lt;p&gt;The implementation surface, gathered into one place:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;th&gt;Identifier / location&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Algorithm selector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TPM_ALG_ECDAA = 0x001A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TPM 2.0 Library Specification Part 2 [@tpm-library-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mandatory curve&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TPM_ECC_BN_P256 = 0x0010&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Part 2 [@tpm-library-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First-round command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TPM2_Commit(keyHandle, P1, s2, y2) -&amp;gt; (K, L, E, counter)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Part 3 [@tpm-library-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Second-round command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TPM2_Sign(keyHandle, digest, scheme=TPM_ALG_ECDAA, validation) -&amp;gt; signature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Part 3 [@tpm-library-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Join anchor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TPM2_MakeCredential&lt;/code&gt; / &lt;code&gt;TPM2_ActivateCredential&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Part 3 [@tpm-library-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math description&lt;/td&gt;
&lt;td&gt;Part 1 Annex C.5 (informative)&lt;/td&gt;
&lt;td&gt;Part 1 [@tpm-library-spec]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optionality status&lt;/td&gt;
&lt;td&gt;Optional since PTP v1.04 (Feb 2020); carried through v1.07 RC1 (Dec 2025)&lt;/td&gt;
&lt;td&gt;TCG PC Client Platform TPM Profile changelog [@tcg-ptp]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

sequenceDiagram
    participant V as Verifier
    participant H as Host (CPU)
    participant T as TPM
    V-&amp;gt;&amp;gt;H: send basename bsn
    H-&amp;gt;&amp;gt;T: TPM2_Commit(keyHandle, P1, s2, y2)
    T--&amp;gt;&amp;gt;H: (K, L, E, counter)
    H-&amp;gt;&amp;gt;H: compute c = H(K, L, E, message, bsn)
    H-&amp;gt;&amp;gt;T: TPM2_Sign(keyHandle, digest=c, scheme=ECDAA)
    T--&amp;gt;&amp;gt;H: response s = r + c*f mod p
    H-&amp;gt;&amp;gt;H: assemble signature (K, L, E, c, s)
    H-&amp;gt;&amp;gt;V: ECDAA signature
    V-&amp;gt;&amp;gt;V: verify pairing equation
&lt;p&gt;The TCG published the TPM 2.0 Library Specification in 2014. From 2014 through early 2020, the PC Client Platform TPM Profile -- the document that says &quot;to ship a TPM 2.0 in a PC-class device, these algorithms must be present&quot; -- listed &lt;code&gt;TPM_ALG_ECDAA&lt;/code&gt; as mandatory-if-the-platform-supports-elliptic-curve-cryptography. In v1.04 (released February 2020) the TCG PTP working group made a quiet but consequential change. The changelog records the line verbatim: &quot;Made TPM_ALG_ECDAA and TPM_ALG_ECSCHNORR optional.&quot; The same designation has carried through v1.06 RC1 (January 2025) and v1.07 RC1 (December 2025) [@tcg-ptp]. After February 2020, an OEM can ship a Windows-class TPM 2.0 platform that does not implement ECDAA at all and remain conformant.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The Trusted Computing Group&apos;s resource pages (&lt;code&gt;trustedcomputinggroup.org/resource/tpm-library-specification/&lt;/code&gt; and &lt;code&gt;trustedcomputinggroup.org/resource/pc-client-platform-tpm-profile-ptp-specification/&lt;/code&gt;) reject non-browser User-Agents at the HTTP layer. This is a long-standing anti-bot policy. Citations in this article to the TPM 2.0 Library Specification and to the PC Client Platform TPM Profile point to the canonical URLs but are flagged in the verified-source registry as UNVERIFIED_FETCH; the verbatim changelog text was extracted under primary-source rules during the Stage 0a focus-premise audit and is the audit-of-record for the optionality claim. The downstream accuracy and fact-check stages of this pipeline carry the same caveat forward.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Pluton question is the second hedge. Microsoft Pluton is the security processor Microsoft has been shipping in successive Windows-class platforms since AMD&apos;s Ryzen 6000 in 2022, in AMD Ryzen 7040 (Phoenix) in 2023, in Qualcomm Snapdragon X Elite in 2024, and in Intel Core Ultra (Meteor Lake, December 2023; Lunar Lake, September 2024) and successive Intel Core Ultra generations. Pluton exposes a TPM 2.0 personality. The Microsoft Learn documentation page enumerates the cryptographic algorithms the processor exposes and the platform-security primitives it implements [@pluton].&lt;/p&gt;
&lt;p&gt;The page contains zero occurrences of &lt;code&gt;ECDAA&lt;/code&gt; or &lt;code&gt;TPM_ALG_ECDAA&lt;/code&gt;. The honest framing here is &lt;em&gt;not&lt;/em&gt; &quot;Pluton does not implement ECDAA&quot; -- the documentation neither confirms nor denies it -- but &quot;Pluton&apos;s published surface does not advertise ECDAA.&quot; That is the hedged statement this article carries from its opening to its FAQ.&lt;/p&gt;
&lt;p&gt;The runnable demonstration below is &lt;em&gt;educational&lt;/em&gt; -- Microsoft ships no &lt;code&gt;BCryptDirectAnonymousAttestation&lt;/code&gt;, no &lt;code&gt;NCryptDaaSign&lt;/code&gt;, no Windows API at all that exposes ECDAA from a user-mode application. The code shows the &lt;em&gt;logic&lt;/em&gt; an admin or platform engineer would follow when probing a TPM&apos;s reported algorithm set, not a working call against any shipping Windows API.&lt;/p&gt;
&lt;p&gt;{`
// Logic only. Microsoft ships no Windows API that surfaces TPM_ALG_ECDAA.
// In practice an admin would parse the output of Get-TpmEndorsementKeyInfo
// or use a vendor-specific tool to inspect the TPM&apos;s algorithm capability table.
const TPM_ALG_ECDAA = 0x001A;
const TPM_ECC_BN_P256 = 0x0010;&lt;/p&gt;
&lt;p&gt;function probeECDAA(tpmAlgList, tpmEccCurveList) {
  const hasECDAA = tpmAlgList.includes(TPM_ALG_ECDAA);
  const hasBN256 = tpmEccCurveList.includes(TPM_ECC_BN_P256);
  if (!hasECDAA) return &apos;no ECDAA: chip omits algorithm 0x001A&apos;;
  if (!hasBN256) return &apos;ECDAA without BN-P256: nominally compliant, practically unusable&apos;;
  return &apos;ECDAA + BN-P256 present (Join still requires Issuer infrastructure)&apos;;
}&lt;/p&gt;
&lt;p&gt;// Example: a Pluton-class chip whose published surface does not advertise ECDAA.
const plutonLike = [0x0001 /* RSA &lt;em&gt;/, 0x0008 /&lt;/em&gt; SHA-256 &lt;em&gt;/, 0x0023 /&lt;/em&gt; ECDSA &lt;em&gt;/];
console.log(probeECDAA(plutonLike, [0x0003 /&lt;/em&gt; NIST P-256 */]));
// -&amp;gt; &quot;no ECDAA: chip omits algorithm 0x001A&quot;&lt;/p&gt;
&lt;p&gt;// Example: a discrete Infineon SLB9670 TPM 2.0 (vendor docs list ECDAA + BN-P256).
const discreteTpm = [0x0001, 0x0008, 0x0023, TPM_ALG_ECDAA];
console.log(probeECDAA(discreteTpm, [0x0003, TPM_ECC_BN_P256]));
// -&amp;gt; &quot;ECDAA + BN-P256 present (Join still requires Issuer infrastructure)&quot;
`}&lt;/p&gt;
&lt;p&gt;The spec was written. The chips shipped. The TCG was satisfied. So why does no one verify ECDAA signatures?&lt;/p&gt;
&lt;h2&gt;7. The Standards Bridge: ISO/IEC 20008 and 20009&lt;/h2&gt;
&lt;p&gt;There is a difference between a TCG specification section number and an ISO/IEC mechanism identifier. The difference is the price of admission to a Common Criteria protection profile and to most government procurement contracts.&lt;/p&gt;
&lt;p&gt;ISO/IEC 20008 is the international-standards anchor for anonymous digital signatures. It comes in three parts. Part 1 (&quot;General&quot;) sets the framework and terminology [@iso-20008-1]. Part 2 (&quot;Mechanisms using a group public key&quot;) catalogues the specific anonymous-signature schemes the international community has standardized -- and Mechanism 4 is the EPID-derived elliptic-curve DAA construction that aligns with the TPM 2.0 ECDAA surface [@iso-20008-2]. Part 3 (&quot;Mechanisms using multiple public keys&quot;) catalogues a different family of schemes that is not the focus of this article.&lt;/p&gt;

The international-standards series titled &quot;Information technology -- Security techniques -- Anonymous digital signatures.&quot; Part 1 (general framework) and Part 2 (mechanisms using a group public key) were both published in 2013. Mechanism 4 in Part 2 standardizes EPID-derived elliptic-curve DAA. ISO/IEC 20008 is the bibliographic anchor cited by Common Criteria protection profiles, FIPS 140-3 module-validation evidence, and government procurement specifications that need to reference a *named, internationally agreed* anonymous-signature mechanism rather than a vendor-specific construction [@iso-20008-2].
&lt;p&gt;A note on the title. Earlier drafts of this article carried the title of ISO/IEC 20008-2 as &quot;anonymous signatures with message recovery.&quot; That phrasing belongs to a different standard, ISO/IEC 9796. The verified ISO catalogue title for 20008-2 is, verbatim, &quot;Information technology -- Security techniques -- Anonymous digital signatures -- Part 2: Mechanisms using a group public key&quot; [@iso-20008-2].&lt;/p&gt;
&lt;p&gt;ISO/IEC 20009 is the companion standard for authentication. Where 20008 standardizes signatures, 20009 standardizes the challenge-response protocols that wrap signatures into entity-authentication exchanges. Part 2 (&quot;Mechanisms based on signatures using a group public key&quot;) is where TPM-style attestation lives in ISO terminology [@iso-20009-2]. A FIDO authenticator or a TPM-backed Kerberos client that performs an attested authentication is, in ISO-speak, executing a 20009-2 mechanism that wraps a 20008-2 signature.&lt;/p&gt;

Intel held patents on the EPID construction. In contributing the EPID 2.0 algorithm to ISO/IEC 20008 and 20009, Intel made the underlying intellectual property available under royalty-free (RAND-Z) terms. The Wikipedia EPID article records the contribution and notes that EPID &quot;complies with international standards ISO/IEC 20008 / 20009&quot; [@wiki-epid]. The licensing structure mattered: it is what made the construction acceptable to the FIDO Alliance, to the TCG for the TPM 2.0 ECDAA surface, and to the European procurement community whose conformance regimes treat royalty-bearing cryptographic primitives differently from royalty-free ones. Exact licensing-event dates are not directly indexed in publicly fetchable Intel materials; this paragraph is inference-grade reconstruction from the Wikipedia citation chain.
&lt;p&gt;The procurement reason ISO standardization mattered is structural. A Common Criteria Protection Profile cannot, in the general case, reference a TCG specification section number. It can reference an ISO mechanism identifier. The Federal Information Processing Standards 140-3 evidence package for a cryptographic module must, in many cases, demonstrate that the cryptographic primitives the module implements are members of an internationally recognized standard family. The European Cyber Resilience Act, drafted in 2024 and applicable in stages from 2027 onward, treats compliance with a recognized international standard as one of the routes to a presumption of conformity. ISO/IEC 20008-2 Mechanism 4 is the door TPM 2.0 ECDAA walks through to be admissible in those regimes.&lt;/p&gt;
&lt;p&gt;Standardization was complete by 2014. Cryptographic primitive: CPS 2010. Security model: BFGSW 2013. ISO mechanism: 20008-2 Mechanism 4. TPM normative surface: &lt;code&gt;TPM_ALG_ECDAA&lt;/code&gt;, &lt;code&gt;TPM_ECC_BN_P256&lt;/code&gt;, &lt;code&gt;TPM2_Commit&lt;/code&gt;, &lt;code&gt;TPM2_Sign&lt;/code&gt;. Every box was checked. The next question -- the one the standardization community could not answer on its own -- was whether anyone would write a verifier.&lt;/p&gt;
&lt;h2&gt;8. The FIDO Bet That Failed (2017-2021)&lt;/h2&gt;
&lt;p&gt;In 2018, the FIDO Alliance bet that ECDAA was the missing privacy story for &lt;a href=&quot;https://paragmali.com/blog/webauthn-and-passkeys-on-windows-from-ctap-to-the-credential/&quot; rel=&quot;noopener&quot;&gt;WebAuthn&lt;/a&gt;. Three years later, W3C took the bet off the table.&lt;/p&gt;
&lt;p&gt;The bet was not casual. FIDO had a real problem. WebAuthn authenticators -- the YubiKey hardware tokens, the &lt;a href=&quot;https://paragmali.com/blog/your-face-is-not-your-password-inside-windows-hellos-hardwar/&quot; rel=&quot;noopener&quot;&gt;Microsoft Hello&lt;/a&gt; platform authenticators, the Touch ID and Face ID modules -- need to attest that they are genuine hardware. The attestation surface FIDO Alliance had inherited from U2F was &lt;em&gt;Basic Attestation&lt;/em&gt;: every authenticator in a manufacturing batch of 100,000 or more units shared one attestation key [@fido-cert-levels], so a relying party that checked the attestation learned only &quot;this is one of 100,000-plus YubiKey 5 NFCs,&quot; not which device specifically. The cohort-size rule gave Basic Attestation a workable operational privacy property. But there was an architectural fork in the road for an organization that wanted &lt;em&gt;cryptographic&lt;/em&gt; attestation privacy without the cohort-key fan-out problem.&lt;/p&gt;
&lt;p&gt;FIDO Alliance picked the cryptographic fork. The FIDO ECDAA Algorithm v2.0 specification was published as an Implementation Draft on February 27, 2018 [@fido-ecdaa-v2]. The document is the most carefully written specification of the DAA contract from a deployment perspective; the editor was Rolf Lindemann at Nok Nok Labs. The motivation section we have already quoted in §2 names the Privacy-CA failure mode in unusually direct terms.&lt;/p&gt;
&lt;p&gt;WebAuthn Level 1 reached W3C Recommendation status on March 4, 2019 [@webauthn-1]. Section 8 defined six attestation statement formats by &lt;code&gt;fmt&lt;/code&gt; identifier: &lt;code&gt;packed&lt;/code&gt;, &lt;code&gt;tpm&lt;/code&gt;, &lt;code&gt;android-key&lt;/code&gt;, &lt;code&gt;android-safetynet&lt;/code&gt;, &lt;code&gt;fido-u2f&lt;/code&gt;, and &lt;code&gt;none&lt;/code&gt;. ECDAA was not a separate format; the WebAuthn-1 §6.4.4 attestation-type list (Basic, Self, AttCA, ECDAA, None) carried ECDAA as an attestation &lt;em&gt;type&lt;/em&gt; supported &lt;em&gt;within&lt;/em&gt; the &lt;code&gt;packed&lt;/code&gt; and &lt;code&gt;tpm&lt;/code&gt; formats. An independent verification of the live HTML returns 63 occurrences of the string &quot;ecdaa&quot; in the Level 1 Recommendation -- ECDAA had its own type identifier, its own signing logic, and its own verification procedure embedded inside the two formats that mattered [@webauthn-1].&lt;/p&gt;
&lt;p&gt;WebAuthn Level 2 reached W3C Recommendation status on April 8, 2021 [@webauthn-2] [@wiki-webauthn]. The same independent verification against the live Level 2 HTML returns zero occurrences of &quot;ecdaa.&quot; Every reference -- the type identifier, the signing rules, the verifier procedure that the &lt;code&gt;packed&lt;/code&gt; and &lt;code&gt;tpm&lt;/code&gt; formats invoked -- was removed in a single editorial pass. The Yubico migration guide for its Java WebAuthn server library makes the vendor view explicit: &quot;This attestation type was removed from WebAuthn Level 2. ECDAA support has not been implemented in this library, so this value could in practice never be returned&quot; [@yubico-migration].&lt;/p&gt;
&lt;p&gt;Why did the bet fail? Four reasons, each visible from the public record.&lt;/p&gt;
&lt;p&gt;First, no major browser ever shipped an ECDAA verifier inside the &lt;code&gt;packed&lt;/code&gt; or &lt;code&gt;tpm&lt;/code&gt; statement format paths. Chromium, Firefox, and Safari implemented WebAuthn with &lt;code&gt;packed&lt;/code&gt;, &lt;code&gt;tpm&lt;/code&gt;, &lt;code&gt;fido-u2f&lt;/code&gt;, and &lt;code&gt;android-safetynet&lt;/code&gt; attestation, but the ECDAA branch within &lt;code&gt;packed&lt;/code&gt; and &lt;code&gt;tpm&lt;/code&gt; stayed unimplemented. The Yubico migration guide quoted above is the vendor-side confirmation of an industry-wide outcome [@yubico-migration].&lt;/p&gt;
&lt;p&gt;Second, the largest authenticator vendors picked the Basic and AttCA attestation types instead of ECDAA. YubiKey 5 series ships with the &lt;code&gt;packed&lt;/code&gt; format using a Basic Attestation key shared across a 100,000+-unit cohort [@yubico-yk5-attestation] [@fido-cert-levels]. Feitian, Google Titan, and other major FIDO2 authenticator vendors ship Basic Attestation under the same FIDO certification-policy cohort rule [@fido-cert-levels]. Microsoft Hello platform authenticators on Windows TPM-backed devices use the &lt;code&gt;tpm&lt;/code&gt; attestation statement format with an AIK that a Microsoft-operated CA certifies -- the AttCA type, functionally a Privacy-CA [@ms-hello-doc] [@azure-attestation]. The vendor base from which a WebAuthn relying party would actually see an attestation statement, in practice, never produced an ECDAA one.&lt;/p&gt;
&lt;p&gt;Third, FIDO ECDAA v2.0 never advanced beyond Implementation Draft. The URL slug for the document literally encodes its status: &lt;code&gt;fido-v2.0-id-20180227&lt;/code&gt; -- the &lt;code&gt;id-20180227&lt;/code&gt; segment names the format &lt;code&gt;&amp;lt;status&amp;gt;-&amp;lt;date&amp;gt;&lt;/code&gt;, and &quot;id&quot; is &quot;Implementation Draft.&quot; It never reached &quot;Proposed Standard&quot; or &quot;Approved Specification&quot; in FIDO&apos;s process [@fido-ecdaa-v2]. A relying party making a long-term technology bet on an attestation statement format that has never advanced past Implementation Draft has no reason to invest in a verifier library.&lt;/p&gt;
&lt;p&gt;Fourth, FIDO Basic Attestation&apos;s cohort-size rule (100,000+ authenticators per attestation group key, enforced contractually on the certified-authenticator side) gave the underlying privacy concern an &lt;em&gt;operational&lt;/em&gt; answer [@fido-cert-levels]. A WebAuthn relying party that sees a Basic Attestation signature learns &quot;this is one of at least 100,000 identical authenticators&quot; -- a cohort large enough that the relying party cannot, in practice, recover individual identifying information from the attestation alone. The cohort rule does not require pairing arithmetic, does not need a verifier library, and works with the same &lt;code&gt;packed&lt;/code&gt; and &lt;code&gt;tpm&lt;/code&gt; attestation formats every relying party already implements.&lt;/p&gt;

The FIDO Basic Attestation cohort minimum is a particularly clean example of how operational rules can compete directly with cryptographic primitives. The privacy property a relying party wants -- &quot;I cannot single out this device from its peers&quot; -- can be obtained by (a) hardware-anchored zero-knowledge proofs that mathematically forbid linkage (cryptographic DAA), or (b) a contractual obligation that every batch of attestation keys covers at least 100,000 devices (FIDO Basic Attestation) [@fido-cert-levels]. The cryptographic answer is mathematically stronger. The operational answer is dramatically easier to debug, audit, and revoke. Production has consistently chosen the latter.
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; ECDAA shipped chips. It never shipped verifiers. Standardization is necessary but not sufficient for production deployment: production cryptography needs verifier libraries, and verifier libraries are &lt;em&gt;social&lt;/em&gt; phenomena -- they emerge from relying-party demand, SDK presence, incident-response tooling, and library-maintainer attention, none of which the cryptography itself produces. Cryptographic excellence does not predict deployment; library availability does.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the second aha. The reader entered §8 believing that a standardized cryptographic primitive backed by FIDO, three browser vendors, and a publicly authored attestation format would deploy. They exit understanding that ECDAA standardized everything except the social machinery -- and the social machinery is where production attestation actually lives.&lt;/p&gt;
&lt;p&gt;If a consortium with FIDO&apos;s privacy mandate, browser-vendor coalition, and authenticator-vendor base could not generate enough relying-party momentum to keep ECDAA in WebAuthn, what chance did the silent option in TPM 2.0 ever have? The answer requires walking the Microsoft attestation stack.&lt;/p&gt;
&lt;h2&gt;9. Windows: A Billion Chips, Zero Production Use (2014-Present)&lt;/h2&gt;
&lt;p&gt;Microsoft has shipped over a billion Windows TPM 2.0 platforms [@ms-pluton-blog] [@wiki-windows-11]. Microsoft has not shipped a Windows DAA API. The two facts are not in tension. They are the story.&lt;/p&gt;
&lt;p&gt;The shipping Windows attestation stack is documented and unambiguous. Microsoft Azure Attestation is the production-grade attestation service. Its public architecture document describes the protocol in five paragraphs that read, line for line, like TPM 1.1 from 2003 [@azure-attestation]:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Every TPM ships with a unique asymmetric key called the endorsement key (EK)... A certification authority (CA) establishes trust in the TPM either via EKPub or EKCert... A device proves to the CA that the key for which the certificate is being requested is cryptographically bound to the EKPub and that the TPM owns the EKPriv. The CA issues a certificate with a special issuance policy to denote that the key is now attested as protected by a TPM.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The architecture is the Privacy-CA architecture. The Microsoft-operated CA inputs an EK certificate and outputs a JWT that downstream Microsoft services (Defender for Endpoint device-compliance, Intune Conditional Access policies, Entra ID conditional access, customer-defined Azure Attestation policies) consume. The Windows Health Attestation Service, the older Microsoft surface that predated Azure Attestation, used the same broker model with different deployment shape. The Defender for Endpoint device-compliance flow that gates Conditional Access on attested TPM boot state consumes WHAS or Azure Attestation JWTs, not raw DAA quotes.&lt;/p&gt;
&lt;p&gt;Microsoft Pluton&apos;s published surface tells the same story from the silicon side. Pluton is the security processor Microsoft has been shipping in successive Windows-class platforms. Its Microsoft Learn page enumerates the cryptographic algorithms and platform-security primitives the processor exposes [@pluton]. The page is exhaustive about TPM 2.0 baseline algorithms (RSA-2048, ECDSA over NIST P-256, SHA-2 family). It contains zero occurrences of &lt;code&gt;ECDAA&lt;/code&gt;, of &lt;code&gt;TPM_ALG_ECDAA&lt;/code&gt;, or of any phrase like &quot;anonymous attestation.&quot; Insufficient public evidence to assert that Pluton implements ECDAA; sufficient evidence to assert that Pluton&apos;s published surface does not advertise it.&lt;/p&gt;
&lt;p&gt;The Windows API surface gap is the third piece of evidence. The TPM Base Services (&lt;code&gt;Tbsi_*&lt;/code&gt; functions in &lt;code&gt;Tbs.dll&lt;/code&gt;) expose &lt;code&gt;TPM2_Commit&lt;/code&gt; and &lt;code&gt;TPM2_Sign&lt;/code&gt; to user-mode applications -- but only as raw command-buffer submissions. There is no &lt;code&gt;BCryptDirectAnonymousAttestation&lt;/code&gt;. There is no &lt;code&gt;NCryptDaaSign&lt;/code&gt;. There is no Web Authentication API wrapper that surfaces ECDAA.&lt;/p&gt;
&lt;p&gt;The TPM Platform Crypto Provider (PCP) that Windows ships as part of the Cryptography Next Generation (CNG) framework supports RSA and ECDSA TPM-backed keys but does not surface ECDAA. The TSS.MSR open-source TPM stack from Microsoft Research does not ship a DAA wrapper. An application developer who wants ECDAA on Windows today writes raw &lt;code&gt;TBS_SUBMIT_COMMAND&lt;/code&gt; byte buffers against the documented TPM 2.0 command numbering, manages the Join protocol against an Issuer of their own provisioning, and verifies the resulting signatures with a library they wrote themselves or pulled from a research-grade implementation.&lt;/p&gt;
&lt;p&gt;The interesting question is why. Microsoft has never published a &quot;we considered DAA and chose the broker model because...&quot; statement. Treating that absence honestly, the four reasons below are &lt;em&gt;inferences&lt;/em&gt; from observable architecture decisions, not Microsoft-engineer-published rationales. The article labels them as such.&lt;/p&gt;
&lt;p&gt;First, &lt;em&gt;operational simplicity&lt;/em&gt;. A hosted CA with audit logs is more debuggable than a per-relying-party DAA verifier with no central audit point. When a device fails attestation in production, the on-call engineer reading the Azure Attestation logs can answer &quot;why did this device fail?&quot; in seconds; the same question against a DAA verifier requires reasoning about pairing arithmetic, basename derivation, and Issuer-credential validity. Engineering organizations choose architectures whose failure modes they can debug.&lt;/p&gt;
&lt;p&gt;Second, &lt;em&gt;revocation economics&lt;/em&gt;. A Privacy-CA can revoke an AIK by removing one certificate from its issued-certificate store. Revoking a DAA credential, in the construction TPM 2.0 ships, requires either EPID-style signature-based revocation -- which the TPM 2.0 ECDAA scheme does not provide -- or a private-key list distributed to every relying party (extracting the private key from the misbehaving TPM is presumed possible after compromise, and verifiers then check that the signing key is not on the list). The CA&apos;s revocation primitive is a database delete. The DAA revocation primitive is an SDK rollout to every consumer of the verification library.&lt;/p&gt;
&lt;p&gt;Third, &lt;em&gt;the relying-party stack&lt;/em&gt;. DAA verifier libraries are not present in any mainstream cloud platform&apos;s SDK. The .NET CryptoNG surface, the Java JCA, the Python &lt;code&gt;cryptography&lt;/code&gt; library, the Go &lt;code&gt;crypto&lt;/code&gt; standard library, the Rust &lt;code&gt;ring&lt;/code&gt; and &lt;code&gt;dalek&lt;/code&gt; ecosystems -- none ship an ECDAA verifier. X.509 / PKI verifier libraries, by contrast, are everywhere. A relying party building on top of mainstream SDKs gets PKI verification for free; gets DAA verification for nothing close to free.&lt;/p&gt;
&lt;p&gt;Fourth, &lt;em&gt;the Windows API surface gap is itself the obstacle&lt;/em&gt;. Adding a &lt;code&gt;BCrypt&lt;/code&gt; / &lt;code&gt;NCrypt&lt;/code&gt; / WebAuthn DAA wrapper to Windows requires designing a new key-storage provider contract, defining the JOIN-protocol service interface, writing the conformance test suite, drafting the security documentation, and rolling it out on the Windows release calendar. That is a project the size of Windows Hello&apos;s. Microsoft has not, to public knowledge, prioritized it.&lt;/p&gt;

flowchart TD
    HW[&quot;TPM 2.0 hardware&lt;br /&gt;(discrete or Pluton)&lt;br /&gt;TPM_ALG_ECDAA may be present&quot;]
    TBS[&quot;TPM Base Services&lt;br /&gt;(Tbs.dll, kernel)&quot;]
    PCP[&quot;TPM Platform Crypto Provider&lt;br /&gt;(BCrypt / NCrypt)&lt;br /&gt;RSA and ECDSA only&quot;]
    AZ[&quot;Microsoft Azure Attestation&lt;br /&gt;(Privacy-CA architecture)&quot;]
    WHAS[&quot;Windows Health Attestation Service&lt;br /&gt;(Privacy-CA architecture)&quot;]
    RP[&quot;Intune / Defender / Entra&lt;br /&gt;Conditional Access enforcement&quot;]
    HW --&amp;gt; TBS
    TBS --&amp;gt; PCP
    PCP --&amp;gt; AZ
    PCP --&amp;gt; WHAS
    AZ --&amp;gt; RP
    WHAS --&amp;gt; RP
    HW -.-&amp;gt;|&quot;ECDAA path exists&lt;br /&gt;no Windows API&quot;| HW
&lt;p&gt;The deeper reading -- the one that makes Microsoft&apos;s choice look structural rather than accidental -- starts from a comparison the four inferences above already pointed toward.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Privacy-CA brokers and DAA solve the same problem -- prove the TPM is genuine without disclosing which TPM. They differ only in &lt;em&gt;where the trust assumption lives&lt;/em&gt;. The broker treats privacy as an operational policy (the CA promises not to log, audit logs prove it kept the promise, regulators enforce the promise). DAA treats privacy as a mathematical property (the issuer cannot link, period, no audit needed). The architecture that wins in production is the one with the &lt;em&gt;smaller operational surface&lt;/em&gt;, not the one with the &lt;em&gt;better cryptographic guarantee&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the third aha. The reader entered §9 believing that cryptographic superiority should eventually win in production, and that Microsoft&apos;s non-adoption of DAA must be an oversight or a missed product opportunity. They exit understanding that the deployment-economics asymmetry is structural: a broker-mediated attestation flow reduces, end-to-end, to standard X.509 plumbing every cloud SDK already ships, while a DAA-mediated flow requires bespoke verifier libraries, bespoke revocation infrastructure, bespoke debugging tooling, and bespoke incident-response runbooks. Cloud-platform organizations have spent the last ten years building world-class operational machinery for X.509 attestation. They will not throw it away for a cryptographic property no compliance regime currently demands.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The four reasons compound. The broker model gives a single audit point, a database-delete revocation primitive, an SDK that ships in every major language, and a debugging story the on-call engineer can walk through at 3 a.m. DAA gives mathematical privacy and requires every one of those operational properties to be rebuilt from scratch. Cloud platforms have, repeatedly and consistently, picked the architecture whose operational properties are easier to ship -- not because they do not understand the cryptographic alternative, but because the cryptographic alternative would require them to discard the operational machinery they already have. This is the structural reason DAA has stayed in firmware on a billion chips and out of production attestation flows on all of them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the broker calculus is this durable, is there any future world in which DAA wins? Two, and both are research-stage with decade-long horizons.&lt;/p&gt;
&lt;h2&gt;10. Theoretical Limits and Open Problems&lt;/h2&gt;
&lt;p&gt;What can DAA never do? Where does the next decade of research go? Three open problems organize the active research community in 2026.&lt;/p&gt;
&lt;h3&gt;10.1 What DAA cannot do&lt;/h3&gt;
&lt;p&gt;The first honest statement is the negative one. A correctly implemented DAA scheme does not prevent a &lt;em&gt;compromised TPM&lt;/em&gt; from signing for the cohort it belongs to. The EK certificate attestation must be honest at manufacture time; if a TPM&apos;s secret membership value &lt;code&gt;f&lt;/code&gt; leaks to an attacker (through fault injection, through side-channel extraction, through a firmware backdoor), the attacker can produce ECDAA signatures indistinguishable from legitimate ones until the TPM&apos;s &lt;code&gt;f&lt;/code&gt; is added to a revocation list. The same constraint applies to every group-signature scheme.&lt;/p&gt;
&lt;p&gt;A second hard limit is per-basename linkability. The user-controlled-linkability property gives a TPM the choice of linkable or unlinkable signing -- but once a verifier has seen the pseudonym &lt;code&gt;N_V = ζ^f mod Γ&lt;/code&gt; for a particular &lt;code&gt;(TPM, bsn)&lt;/code&gt; pair, the linkage for that basename is permanent. A misbehaving TPM that wants its history with a particular relying party forgotten cannot, by signing under a different basename, retroactively unlink past sessions.&lt;/p&gt;
&lt;p&gt;A third limit is rogue-key scalability. The TPM 2.0 ECDAA scheme detects rogue keys by checking each signature against a list of compromised-&lt;code&gt;f&lt;/code&gt; values the verifier maintains. For small lists this is cheap. For very large lists -- imagine a deployment where 1% of the chip population leaks &lt;code&gt;f&lt;/code&gt; to attackers and the verifier must check every signature against ten million revoked values -- the constant factor matters. EPID&apos;s Sig-RL mechanism uses signature-based revocation that scales better; the TPM 2.0 ECDAA scheme does not include it.&lt;/p&gt;
&lt;h3&gt;10.2 The One-TPM-to-Bind-Them-All fix&lt;/h3&gt;
&lt;p&gt;In 2017 a team consisting of Jan Camenisch, Liqun Chen, Manu Drijvers, Anja Lehmann, David Novick, and Rainer Urian published &quot;One TPM to Bind Them All: Fixing TPM 2.0 for Provably Secure Anonymous Attestation&quot; at IEEE S&amp;amp;P 2017 [@one-tpm-2017]. The paper demonstrated a Diffie-Hellman-oracle attack against the TPM 2.0 ECDAA interface as shipped: a malicious host could query the TPM in a way that gave the host a DH-oracle relative to the TPM&apos;s secret &lt;code&gt;f&lt;/code&gt;, effectively breaking the unlinkability property. The proposed fix had been published the previous year by Camenisch, Drijvers, and Lehmann at TRUST 2016 [@cdl-2016] [@cdl-2016-eprint]; library implementations of DAA published from 2017 onward incorporate the fix.The CDL16 fix is library-level, not silicon-level. The TPM 2.0 ECDAA command surface in the chip remains as shipped; the &lt;em&gt;software&lt;/em&gt; that drives it must use the corrected protocol sequence to avoid presenting the host-controlled DH oracle. As of late 2025, the TCG normative TPM 2.0 Library Specification text has not been amended to require the corrected sequence. Implementations of DAA on top of TPM 2.0 -- the FIDO ECDAA v2.0 library, the Camenisch-Drijvers-Lehmann reference code, modern academic ECDAA implementations -- follow CDL16. Implementations written against the bare TPM 2.0 Library Specification without reading CDL16 are vulnerable.&lt;/p&gt;
&lt;h3&gt;10.3 Post-quantum DAA&lt;/h3&gt;
&lt;p&gt;Shor&apos;s algorithm is fatal to DAA. Every classical DAA construction -- BCC 2004, BCL 2008, CPS 2010, CDL 2016 -- relies on the hardness of discrete logarithms in elliptic-curve groups, the hardness of strong-RSA factoring, or both. A cryptographically relevant quantum computer breaks all of them. &lt;a href=&quot;https://paragmali.com/blog/post-quantum-cryptography-on-windows-the-thirty-year-migrati/&quot; rel=&quot;noopener&quot;&gt;Post-quantum&lt;/a&gt; DAA is therefore active research, with no production deployment as of 2026. Three candidate families are being actively explored:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Symmetric-primitive DAA.&lt;/strong&gt; Dan Boneh, Saba Eskandarian, and Ben Fisch presented &quot;Post-quantum EPID Signatures from Symmetric Primitives&quot; at CT-RSA 2019 [@bef-2019], building a post-quantum group signature from one-way functions and Merkle trees. The construction has classical post-quantum security guarantees but pays a steep size cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lattice-based DAA.&lt;/strong&gt; Rachid El Bansarkhani and Ali El Kaafarani published &quot;Direct Anonymous Attestation from Lattices&quot; as IACR ePrint 2017/1022 [@bk-2017-eprint], the earliest such proposal in the literature. The state-of-the-art lattice DAA construction is the 2024 Collaborative Segregated NIZK (&quot;CoSNIZK&quot;) work by Liqun Chen, Patrick Hough, and Nada El Kassem [@cosnizk-2024], achieving signatures of approximately 38 kilobytes -- an order of magnitude smaller than the earliest lattice proposals but still two orders of magnitude larger than CPS 2010 ECDAA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hash-based DAA.&lt;/strong&gt; Liqun Chen, Changyu Dong, Nada El Kassem, Christopher Newton, and Yalan Wang published &quot;Hash-Based Direct Anonymous Attestation&quot; at PQCrypto 2023 [@hashdaa-2023], building DAA from SPHINCS+-style stateless hash-based signatures. Size and speed remain unfavorable for TPM 2.0 firmware budgets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The blocker for any of these reaching production TPM firmware is not academic. The TPM 2.0 normative algorithm set does not include lattice primitives. A post-quantum DAA in TPM 2.0 would require introducing &lt;code&gt;TPM_ALG_DILITHIUM&lt;/code&gt;, &lt;code&gt;TPM_ALG_FALCON&lt;/code&gt;, &lt;code&gt;TPM_ALG_KYBER&lt;/code&gt;, or some equivalent into the spec, mandating support in the PC Client Platform TPM Profile, and rolling out across the OEM TPM-vendor base. That is, at minimum, a three-to-five-year standards effort that the TCG has not, as of late 2025, publicly committed to. CoSNIZK at 38 kilobytes is also two to three times larger than the largest signature any deployed TPM 2.0 firmware budgets for; the TPM-side compute time at quantum-safe parameter sets is currently measured in seconds rather than tens of milliseconds.&lt;/p&gt;
&lt;h3&gt;10.4 DAA for confidential computing&lt;/h3&gt;
&lt;p&gt;The other future-world thread is confidential computing -- the family of CPU-anchored isolated-execution primitives (Intel SGX, Intel TDX, AMD SEV-SNP, ARM CCA) that need their own attestation surfaces. Intel SGX attestation initially used EPID and has since migrated to DCAP, a vendor-CA broker similar in shape to Microsoft Azure Attestation. AMD SEV-SNP and Intel TDX use vendor-rooted PKI from the start.&lt;/p&gt;
&lt;p&gt;Whether DAA-style group-signature schemes are appropriate for VM-level attestation -- where cohorts are small (per-region TDX hosts in a given hyperscaler datacenter), where the verifier is often a small set of well-known cloud-platform endpoints, and where traffic-analysis leakage between confidential VMs and Privacy-CA-like services is itself a threat -- is an open architectural question. The 2026 default is &quot;vendor-CA broker&quot;; the academic community continues to argue that cryptographic DAA would be a better match for the threat model. Production has not, so far, agreed.&lt;/p&gt;
&lt;p&gt;A note on Java Card DAA prototypes. A small number of academic implementations of DAA on Java Card secure elements appeared between 2014 and 2017 -- Camenisch and others published smartcard-class implementations as proofs of concept. None reached production deployment. The reasons appear to be the same operational-economics asymmetry that limits TPM 2.0 ECDAA adoption: Java Card environments lack the relying-party verifier libraries that would consume the output. This is inference; no Java Card vendor has, to public knowledge, published a &quot;we evaluated DAA and chose not to ship it&quot; statement.&lt;/p&gt;
&lt;p&gt;These are the open problems for researchers. What about the rest of us, on Monday morning?&lt;/p&gt;
&lt;h2&gt;11. Practical Guide and Frequently Asked Questions&lt;/h2&gt;
&lt;p&gt;Five roles, one Monday morning. Where does this leave you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For a Windows platform engineer.&lt;/strong&gt; The minimum viable Windows DAA API surface is approximately a &lt;code&gt;BCryptCreateDaaContext&lt;/code&gt;, &lt;code&gt;BCryptDaaJoin&lt;/code&gt;, &lt;code&gt;BCryptDaaSign&lt;/code&gt;, and &lt;code&gt;BCryptDaaVerify&lt;/code&gt; set, plus an &lt;code&gt;NCryptDaaKeyHandle&lt;/code&gt; for key-storage-provider lifecycle, plus a Web Authentication API surface that consumes ECDAA attestation. Shipping all of that costs a Hello-sized engineering investment. If Pluton&apos;s published surface ever advertises ECDAA, an OEM-side integration becomes possible. Today the answer is that DAA is not available through any supported Windows API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For an attestation-provider product engineer.&lt;/strong&gt; Pick a Privacy-CA broker architecture for production. The comparison table below makes the trade-offs explicit. Cryptographic DAA does not pay for the architectural switch unless the relying-party privacy threat is specifically the broker itself -- a threat model that, in 2026, no shipping production attestation product publicly assumes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For a FIDO authenticator vendor.&lt;/strong&gt; ECDAA attestation is not a viable production choice in 2026. The path to it becoming viable runs through verifier libraries in Chromium, Firefox, and Safari; relying-party SDK support across Auth0, Okta, Microsoft Entra, and Google Identity Platform; and a non-deprecated WebAuthn Level N specification that re-adds the format. None of those preconditions are visibly in progress.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For an academic zero-knowledge-proof researcher.&lt;/strong&gt; Four open problems map onto production needs: post-quantum DAA at TPM-firmware-shippable signature sizes (the current state-of-the-art at 38 kilobytes is too large), threshold-issuer DAA (no single party can issue a credential), confidential-computing DAA (for small-cohort VM attestation), and IoT DAA (for milliwatt-class energy budgets). Each is publishable; none yet has a deployment path.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For a privacy-tech advocate or policymaker.&lt;/strong&gt; The framing that helps Microsoft, Google, and AWS engineering teams hear the request is &quot;the broker can be compelled by a subpoena; the math cannot.&quot; The framing that does not help is &quot;your cryptography is worse than the academic alternative.&quot; The first is a threat-model conversation that engineering organizations can engage with; the second is a technology conversation they have already had and decided.&lt;/p&gt;
&lt;h3&gt;Comparison: four production architectures for attested privacy&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Privacy-CA broker&lt;/th&gt;
&lt;th&gt;TPM 2.0 ECDAA&lt;/th&gt;
&lt;th&gt;EPID 2.0&lt;/th&gt;
&lt;th&gt;Vendor-CA (Apple, AWS Nitro, Google)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Trust assumption&lt;/td&gt;
&lt;td&gt;Operational (CA promises not to log)&lt;/td&gt;
&lt;td&gt;Cryptographic (issuer cannot link)&lt;/td&gt;
&lt;td&gt;Cryptographic (issuer cannot link)&lt;/td&gt;
&lt;td&gt;Operational (vendor CA promises not to log)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anonymity from verifier?&lt;/td&gt;
&lt;td&gt;If CA does not log&lt;/td&gt;
&lt;td&gt;Yes (per-basename)&lt;/td&gt;
&lt;td&gt;Yes (per-basename)&lt;/td&gt;
&lt;td&gt;If vendor does not log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPM-side sign time&lt;/td&gt;
&lt;td&gt;Milliseconds (AIK signing)&lt;/td&gt;
&lt;td&gt;Tens of milliseconds&lt;/td&gt;
&lt;td&gt;Tens of milliseconds&lt;/td&gt;
&lt;td&gt;N/A (signing on vendor silicon)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signature size&lt;/td&gt;
&lt;td&gt;Hundreds of bytes (AIK)&lt;/td&gt;
&lt;td&gt;Hundreds of bytes&lt;/td&gt;
&lt;td&gt;Hundreds of bytes&lt;/td&gt;
&lt;td&gt;Hundreds of bytes (X.509 over signed JWT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revocation&lt;/td&gt;
&lt;td&gt;CA database delete&lt;/td&gt;
&lt;td&gt;Private-key list (TPM 2.0)&lt;/td&gt;
&lt;td&gt;Sig-RL (signature-based)&lt;/td&gt;
&lt;td&gt;Vendor revocation list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementer complexity&lt;/td&gt;
&lt;td&gt;Low (X.509 PKI everywhere)&lt;/td&gt;
&lt;td&gt;High (BN-P256 pairing libraries)&lt;/td&gt;
&lt;td&gt;High (vendor SDK required)&lt;/td&gt;
&lt;td&gt;Low (vendor SDK ships it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standardization&lt;/td&gt;
&lt;td&gt;TCG (2003)&lt;/td&gt;
&lt;td&gt;TPM 2.0 + ISO 20008-2 Mech 4&lt;/td&gt;
&lt;td&gt;ISO 20008-2 Mech 4&lt;/td&gt;
&lt;td&gt;Vendor-proprietary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best suited for&lt;/td&gt;
&lt;td&gt;Cloud attestation at hyperscaler scale&lt;/td&gt;
&lt;td&gt;Hardware-anchored attestation where broker is the threat&lt;/td&gt;
&lt;td&gt;Intel-deployed enclave attestation&lt;/td&gt;
&lt;td&gt;Vendor-platform attestation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 deployment scale&lt;/td&gt;
&lt;td&gt;Billions of attestations per day&lt;/td&gt;
&lt;td&gt;Essentially zero production verifiers&lt;/td&gt;
&lt;td&gt;2.4B+ EPID keys per RSAC 2016&lt;/td&gt;
&lt;td&gt;Billions of attestations per day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The &quot;essentially zero production verifiers&quot; entry for TPM 2.0 ECDAA is the deployment story this article exists to explain. The cryptography is in firmware on hundreds of millions of devices; the verifier side, in 2026, is research-grade libraries and the FIDO ECDAA-Verify reference code. No production cloud-platform SDK ships an ECDAA verifier.&lt;/p&gt;

Four things, in order. First, Pluton&apos;s published surface advertises `TPM_ALG_ECDAA` and an Issuer key-management story (a Microsoft-operated DAA Issuer for Windows devices, with documented enrollment and revocation flows). Second, a Cryptography Next Generation API surface (`BCryptDaaSign`, `NCryptDaaKey*`) that exposes the TPM2_Commit / TPM2_Sign sequence behind a single managed-language call. Third, a Web Authentication API extension that surfaces ECDAA attestation as a first-class statement format the same way the `tpm` format is today. Fourth, an Azure Attestation policy mode that consumes ECDAA signatures and produces JWT outputs downstream Microsoft services already understand. None of these are technically blocking; all four require a multi-year roadmap commitment that, as of late 2025, Microsoft has not publicly made. This is a thought experiment about technical feasibility, not a forecast about Microsoft strategy.
&lt;p&gt;The companion piece to this article is the &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM in Windows&lt;/a&gt; article, which walks the broader TPM 2.0 command surface ECDAA sits inside.&lt;/p&gt;


It depends on what the laptop ships. The TPM 2.0 Library Specification names `TPM_ALG_ECDAA`. The TCG PC Client Platform TPM Profile made the algorithm optional in v1.04 (February 2020) and has carried that designation through v1.07 RC1 (December 2025), so a conformant Windows-class platform is allowed to omit it. Many discrete TPM 2.0 modules (Infineon, STMicroelectronics, Nuvoton) do implement the algorithm; Microsoft Pluton&apos;s published documentation does not advertise it. The honest answer is &quot;look at your specific TPM vendor&apos;s algorithm capability table&quot; -- and that even if your TPM does support the algorithm, Windows ships no API to use it [@tpm-library-spec] [@tcg-ptp] [@pluton] [@wiki-daa].


Microsoft has not published an explicit rationale. Four inferable reasons are visible from the architecture: (1) operational simplicity -- a hosted CA is easier to debug than a per-relying-party DAA verifier; (2) revocation economics -- a CA can revoke an AIK by deleting a certificate, while DAA revocation requires a private-key list distributed to every verifier; (3) a missing relying-party verifier-library stack; (4) no Windows API surface for ECDAA. All four are inferences. The shipped architecture is the Privacy-CA-shaped flow documented at the Microsoft Learn attestation page [@azure-attestation].


WebAuthn Level 1 (March 2019) registered ECDAA as an attestation *type* (Basic, Self, AttCA, ECDAA, None) carried inside the `packed` and `tpm` attestation statement formats. The Level 1 specification text contains 63 references to &quot;ecdaa.&quot; WebAuthn Level 2 (April 2021) removed the type entirely; an independent grep of the Level 2 Recommendation HTML returns zero occurrences of &quot;ecdaa.&quot; The Yubico migration guide for its WebAuthn server library states verbatim that &quot;this attestation type was removed from WebAuthn Level 2&quot; and that &quot;ECDAA support has not been implemented in this library.&quot; The format has not been resurrected as of 2026 [@webauthn-1] [@webauthn-2] [@yubico-migration].


EPID is a DAA variant with one cryptographic addition: signature-based revocation (Sig-RL), which lets a verifier prove that a candidate signature was not produced by the same signer as any signature on a revocation list. The TPM 2.0 ECDAA scheme is the Chen-Page-Smart 2010 construction; EPID 2.0 is essentially the same construction with Sig-RL added. Intel positions EPID separately because of its production deployment (2.4 billion-plus keys shipped per Intel&apos;s RSAC 2016 disclosure, used for SGX attestation, Widevine, and several Intel chipsets), its specific licensing structure (royalty-free under Intel&apos;s contribution to ISO/IEC 20008 / 20009), and its open-source SDK that Intel maintained until archiving in 2023 [@brickell-li-epid-2007] [@brickell-li-tdsc-2012] [@wiki-epid] [@epid-sdk].


Active research, no production deployment as of 2026. The leading constructions are lattice-based (CoSNIZK 2024 at approximately 38 kilobytes per signature [@cosnizk-2024]), hash-based (the 2023 PQCrypto paper from SPHINCS+ [@hashdaa-2023]), and symmetric-primitive-based (Boneh-Eskandarian-Fisch CT-RSA 2019 [@bef-2019]). The barriers to shipping any of them in a TPM are fundamental: TPM 2.0 firmware does not implement lattice primitives, signature sizes at 30+ kilobytes are incompatible with current attestation-latency budgets, and no relying-party verifier library exists. A post-quantum DAA TPM is a 2030s project at the earliest.


No. The Stage 0a focus-premise audit of this article demoted that framing as not supported by evidence. The accurate claim is &quot;standardized in the TPM 2.0 Library Specification (2014); optional in the TCG PC Client Platform TPM Profile since February 2020; present on many discrete TPMs (vendor documentation confirms); absent from Microsoft Pluton&apos;s published algorithm surface; supported by no Windows API.&quot; That hedged statement is the one the article carries from its first 200 words through to this FAQ [@tpm-library-spec] [@tcg-ptp] [@pluton].

&lt;p&gt;The cryptography is finished. The standardization is finished. The hardware is in the field. What is missing is the social machinery -- the verifier libraries, the SDK presence, the operational tooling, the incident-response runbooks, the regulator demand -- that turns cryptography into deployment. Direct Anonymous Attestation is the cleanest example in platform security of a primitive that won every standardization fight and lost every deployment one. The lesson is not that the cryptography is wrong. The lesson is that cryptography is necessary but never sufficient. Production systems are social systems whose mathematical components, however elegant, must compete with operational alternatives whose properties are easier to ship.&lt;/p&gt;
&lt;p&gt;The companion pieces in this series are &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;The TPM in Windows&lt;/a&gt; (the cryptographic primitive plumbing TPM 2.0 ECDAA sits inside) and the Microsoft Pluton continuation article (Pluton&apos;s published capability surface and the negative claim this article rests its §9 hedge on). The Measured Boot piece -- forthcoming -- walks the data that a hypothetical DAA quote would attest. If those three articles arrive together, the picture of Windows attestation as a &lt;em&gt;system&lt;/em&gt; rather than a primitive becomes complete.&lt;/p&gt;
</content:encoded><category>tpm</category><category>attestation</category><category>zero-knowledge-proofs</category><category>cryptography</category><category>windows-security</category><category>pluton</category><category>webauthn</category><category>fido</category><author>noreply@paragmali.com (Parag Mali)</author></item></channel></rss>