<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jms-mole-protocols-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="MOLE Protocols">MOLE Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-jms-mole-protocols-01"/>
    <author fullname="Samuel Schlesinger">
      <organization>Google LLC</organization>
      <address>
        <email>sgschlesinger@gmail.com</email>
      </address>
    </author>
    <author fullname="Dennis Jackson">
      <organization>Mozilla</organization>
      <address>
        <email>ietf@dennis-jackson.uk</email>
      </address>
    </author>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <keyword>moderation</keyword>
    <keyword>endorsement</keyword>
    <keyword>unlinkability</keyword>
    <keyword>privacy</keyword>
    <abstract>
      <?line 59?>

<t>This document defines protocols that instantiate the MOLE architecture: two
endorsement protocols, by which a Client proves to a Moderator that it holds
an Endorsement from a trusted Anchor without revealing which one, and two
credential protocols, by which a Moderator issues, verifies, and updates
per-Client state without being able to link presentations. It also
establishes the registries that identify these protocols.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://moderation-of-unlinkable-endorsements.github.io/internet-drafts/draft-jms-mole-protocols.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jms-mole-protocols/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/Moderation-of-unLinkable-Endorsements/internet-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 69?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MOLE architecture <xref target="ARCHITECTURE"/> defines three roles. Clients obtain
Endorsements from Anchors, redeem them at Moderators in exchange for
Credentials, and present those Credentials to Moderators to access
resources. The architecture states the required properties of Endorsements
and Credentials but does not say how to build them. This document does.</t>
      <t>It defines two endorsement protocols and two credential protocols. Each is
identified by a type value from a registry established in this document
(<xref target="iana"/>). This document defines the messages and their processing rules.</t>
      <t>TODO: the protocols below reflect our current understanding of how MOLE
may work, and showcase agility. They are not final. Some may be removed,
others added.</t>
      <t>An Endorsement establishes eligibility for Credential issuance under the
Moderator's policy. It does not directly authorize resource access. A fresh
Credential acceptance authorizes one attempt of the protected operation
within the deployment's replay protection scope, not successful execution.
EC-ACT binds the presentation to its Challenge, whose contents determine the
operation binding. Reverse flow provides bearer authorization under a
configured token Challenge, without binding the replacement request to the
holder of the presented token.</t>
      <t>An accepted presentation either replaces the Credential or ends its chain.
A missing response leaves that decision unknown. Presentation recovery
returns the recorded decision, not another authorization. These properties depend on
the construction and replay scope below. <xref target="ARCHITECTURE"/> describes the
trust relationships, anonymity sets, configuration consistency, and side
channels. Cryptographic issuer hiding and unlinkability do not remove those
deployment dependencies.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Binary payloads and hash inputs use TLS presentation language (<xref section="3" sectionFormat="of" target="TLS13"/>). <tt>opaque x&lt;V&gt;</tt> is a vector whose length prefix
is the variable-length integer of <xref section="16" sectionFormat="of" target="QUIC"/>, in its shortest
encoding. A recipient <bcp14>MUST</bcp14> reject a non-shortest length or trailing bytes.
All constants are in network byte order.</t>
      <t>This document uses the following terms:</t>
      <dl>
        <dt>Endorsement:</dt>
        <dd>
          <t>A cryptographic object granted by an Anchor to a Client (<xref target="ARCHITECTURE"/>).</t>
        </dd>
        <dt>Grant:</dt>
        <dd>
          <t>An Anchor gives a Client an Endorsement.</t>
        </dd>
        <dt>Redeem:</dt>
        <dd>
          <t>A Client proves possession of an Endorsement to a Moderator. The endorsement
protocol defines the redemption scope and consequences of reuse. A Client
<bcp14>SHOULD NOT</bcp14> redeem the same Endorsement at a second Moderator because reuse
can make its activity linkable.</t>
        </dd>
        <dt>Issue:</dt>
        <dd>
          <t>A Moderator gives a Client a Credential in return for a redemption.</t>
        </dd>
        <dt>Present:</dt>
        <dd>
          <t>A Client shows a Credential to a Moderator. Each Credential can be accepted
once within the Moderator's configured replay protection scope, with or
without replacement.</t>
        </dd>
        <dt>Update:</dt>
        <dd>
          <t>The Moderator's adjustment to a presented Credential, returned in the
same exchange.</t>
        </dd>
        <dt>Finalize:</dt>
        <dd>
          <t>The Client-local step that turns a protocol response into a stored
Endorsement or Credential.</t>
        </dd>
      </dl>
    </section>
    <section anchor="common">
      <name>Common Requirements</name>
      <section anchor="message-types">
        <name>Message Types</name>
        <t>Endorsement and credential types are <tt>uint16</tt> values assigned in <xref target="iana"/>.
HTTP carries them in parameter suffixes or grant media-type parameters, not
inside payload wrappers. A Client ignores an unknown Challenge. An unknown request
or response is rejected. A Moderator treats an unknown optional presentation
as absent and rejects an unknown required presentation. Moderator Challenge
material is never sent to an Anchor by the Client.</t>
        <t>The value 0x0000 is reserved in both registries and <bcp14>MUST NOT</bcp14> appear on the
wire. Endorsement type 0x0001 means that no Endorsement is required.</t>
        <t>A Moderator Challenge has no payload wrapper. The HTTP challenge parameter
identifies the endorsement or credential type, and the
decoded payload is the type-specific Challenge. Hashes cover those decoded
octets, never HTTP parameter names, quoting, or base64url text.</t>
      </section>
      <section anchor="greasing">
        <name>Greasing</name>
        <t>In order to prevent Moderators from becoming incompatible with future
credential types, Clients <bcp14>SHOULD</bcp14> send presentations whose selected type is a
random value from the reserved greased values (<xref target="iana-grease"/>), with some
non-trivial probability. The body of a greased presentation is random bytes. A
Moderator handles it as if no Credential were presented.</t>
        <t>The greased values follow the pattern 0x?A?A, spread uniformly across the
registry space. Moderators <bcp14>MUST</bcp14> handle them exactly as any other unknown type
and <bcp14>MUST NOT</bcp14> special-case the reserved list. A Moderator that enumerates
greased values defeats their purpose and will still receive unknown types it
did not enumerate.</t>
        <t>Additionally, when a credential is not required, Clients <bcp14>SHOULD</bcp14> randomly
choose not to send a presentation with some non-trivial probability. This
helps ensure that Moderators maintain their behavior for handling Clients
without credentials, rather than relying on a presentation always being
present.</t>
      </section>
      <section anchor="challenges-and-contexts">
        <name>Challenges and Contexts</name>
        <t>A Moderator Challenge is a message sent by a Moderator to a Client. It selects
the operation and carries any type-specific input chosen by the Moderator.
A Moderator Challenge, or a value derived from it, <bcp14>MUST NOT</bcp14> be sent to an
Anchor. Clients enforce this separation in their grant requests. It does
not prevent a colluding Moderator from disclosing its own Challenge.</t>
        <t>A Context is a protocol-specific cryptographic input. A protocol defines how
the Client and Moderator derive the same Context from authenticated
configuration, the operation, and, when required, the Moderator Challenge. A
Context can include the complete Moderator Challenge, a digest of it, or
selected fields. Moderator Challenge and Context are therefore not
interchangeable terms.</t>
        <t>Each credential protocol defines the contents of its type-specific
Challenge. Endorsement protocols use the common Challenge in
<xref target="challenge-binding"/>. For a new operation, a Moderator <bcp14>MUST</bcp14> be able to
verify, from retained state or by recomputing the Challenge, that a response
uses a Challenge it issued and that remains valid. A credential protocol can return an already accepted result after its
Challenge expires, without authorizing a new operation
(<xref target="ec-act-missing-refund"/>).</t>
      </section>
    </section>
    <section anchor="endorsement-protocols">
      <name>Endorsement Protocols</name>
      <t>An endorsement protocol has two parts. First, before contacting a Moderator,
the Client runs one or more
request/response exchanges with an Anchor and finalizes the result into an
Endorsement. This is the grant. Second, the Client redeems the Endorsement
at a Moderator, proving it came from an Anchor in the Moderator's accepted
set without revealing which one. Redemption happens inside the Redeem &amp;
Issue flow (<xref target="credential-protocols"/>).</t>
      <figure anchor="fig-endorsement-flow">
        <name>Endorsement grant and redemption</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="408" viewBox="0 0 408 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 40,64 L 40,128" fill="none" stroke="black"/>
              <path d="M 40,160 L 40,272" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 240,176 L 240,208" fill="none" stroke="black"/>
              <path d="M 248,32 L 248,64" fill="none" stroke="black"/>
              <path d="M 272,96 L 272,112" fill="none" stroke="black"/>
              <path d="M 280,64 L 280,80" fill="none" stroke="black"/>
              <path d="M 280,128 L 280,144" fill="none" stroke="black"/>
              <path d="M 288,208 L 288,272" fill="none" stroke="black"/>
              <path d="M 320,32 L 320,64" fill="none" stroke="black"/>
              <path d="M 336,176 L 336,208" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 248,32 L 320,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
              <path d="M 248,64 L 320,64" fill="none" stroke="black"/>
              <path d="M 40,96 L 80,96" fill="none" stroke="black"/>
              <path d="M 208,96 L 264,96" fill="none" stroke="black"/>
              <path d="M 48,112 L 80,112" fill="none" stroke="black"/>
              <path d="M 216,112 L 264,112" fill="none" stroke="black"/>
              <path d="M 240,176 L 336,176" fill="none" stroke="black"/>
              <path d="M 240,208 L 336,208" fill="none" stroke="black"/>
              <path d="M 48,240 L 112,240" fill="none" stroke="black"/>
              <path d="M 208,240 L 288,240" fill="none" stroke="black"/>
              <path d="M 40,256 L 104,256" fill="none" stroke="black"/>
              <path d="M 208,256 L 280,256" fill="none" stroke="black"/>
              <path d="M 264,112 C 272.83064,112 280,119.16936 280,128" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="288,256 276,250.4 276,261.6" fill="black" transform="rotate(0,280,256)"/>
              <polygon class="arrowhead" points="272,96 260,90.4 260,101.6" fill="black" transform="rotate(0,264,96)"/>
              <polygon class="arrowhead" points="56,240 44,234.4 44,245.6" fill="black" transform="rotate(180,48,240)"/>
              <polygon class="arrowhead" points="56,112 44,106.4 44,117.6" fill="black" transform="rotate(180,48,112)"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="284" y="52">Anchor</text>
                <text x="112" y="100">grant</text>
                <text x="168" y="100">request</text>
                <text x="296" y="100">\</text>
                <text x="112" y="116">grant</text>
                <text x="172" y="116">response</text>
                <text x="296" y="116">|</text>
                <text x="328" y="116">one</text>
                <text x="356" y="116">or</text>
                <text x="388" y="116">more</text>
                <text x="152" y="132">...</text>
                <text x="304" y="132">/</text>
                <text x="360" y="132">exchanges</text>
                <text x="36" y="148">Finalize</text>
                <text x="288" y="196">Moderator</text>
                <text x="160" y="244">Challenge</text>
                <text x="156" y="260">Redemption</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+                    +--------+
| Client |                    | Anchor |
+---+----+                    +---+----+
    |                             |
    +----- grant request ------->|  \
    |<---- grant response -------+  |  one or more
    |            ...              |  /  exchanges
Finalize                          |
    |
    |                        +-----------+
    |                        | Moderator |
    |                        +-----+-----+
    |                              |
    |<-------- Challenge ----------+
    +-------- Redemption --------->|
    |                              |
]]></artwork>
        </artset>
      </figure>
      <t>The endorsement type determines how many exchanges are needed and the message
at each step.</t>
      <t>Every endorsement protocol defines a <tt>Redemption</tt> structure, sent with the
issuance request in Redeem &amp; Issue (<xref target="credential-protocols"/>).</t>
      <section anchor="challenge-binding">
        <name>Redemption Challenge Binding</name>
        <t>The Moderator Challenge for a redemption is:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque redemption_context[32];
} RedemptionChallenge;
]]></sourcecode>
        <t>The structure fields are:</t>
        <ul spacing="normal">
          <li>
            <t><tt>redemption_context</tt> scopes the redemption. The Moderator constructs it
and the Client uses it as received. It <bcp14>MUST</bcp14> distinguish the Moderator and
the policy it issues under, and <bcp14>SHOULD</bcp14> distinguish a time window.</t>
          </li>
        </ul>
        <t>The Client does not send the challenge back. The Moderator either keeps the
challenges it sends or recomputes <tt>redemption_context</tt> when a request
arrives, for instance as an authenticated encoding of its origin, policy,
and time window, trying adjacent windows.</t>
        <t>Endorsement protocols compute the following value when creating or verifying
a redemption:</t>
        <artwork><![CDATA[
challenge_digest = SHA-256(moderator_challenge)
]]></artwork>
        <t>The values are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>moderator_challenge</tt> is the encoded <tt>RedemptionChallenge</tt>, as decoded
from the Moderator Challenge payload (<xref target="common"/>). It is not required to
contain an origin.</t>
          </li>
          <li>
            <t><tt>challenge_digest</tt> is the 32-octet SHA-256 digest of
<tt>moderator_challenge</tt>. It is not computed over a base64url or other textual
encoding. SHA-256 is defined in <xref target="SHA2"/>.</t>
          </li>
        </ul>
        <t><tt>challenge_digest</tt> enters the Fiat-Shamir transcript in both EC-IHAT and
Longfellow, but is not a Longfellow circuit public input. A redemption created
for one <tt>RedemptionChallenge</tt> does not verify under another, so a Moderator
that accepts only the <tt>redemption_context</tt> it constructs rejects a
redemption made under another Moderator's challenge. This does not stop a
Moderator that relays another Moderator's challenge to the Client.</t>
        <t>The <tt>Challenge</tt> algorithm and <tt>ChallengeMessage</tt> in EC-IHAT issuance are
defined by <xref target="EC-IHAT"/> and are unrelated to a <tt>RedemptionChallenge</tt>.</t>
      </section>
      <section anchor="abstract-endorsement-api">
        <name>Abstract Endorsement API</name>
        <t>Each endorsement protocol defines these abstract operations:</t>
        <artwork><![CDATA[
RedeemRequest(endorsement, moderator_challenge, configuration)
  -> redemption | INVALID
FinalizeRedeem(redemption, moderator_challenge, configuration)
  -> replay_protection_ids | INVALID
]]></artwork>
        <t><tt>RedeemRequest</tt> runs at the Client. <tt>FinalizeRedeem</tt> runs at the Moderator,
verifies the redemption and Challenge binding, and returns a possibly empty
set of <tt>replay_protection_ids</tt> or <tt>INVALID</tt>. Both operations derive
<tt>challenge_digest</tt> from <tt>moderator_challenge</tt> as specified above. The
Moderator <bcp14>MUST</bcp14> atomically insert every returned identifier in the protocol's
configured replay protection scope, each only if absent. If any is already
present, the Moderator <bcp14>MUST</bcp14> treat the result as <tt>INVALID</tt> and <bcp14>MUST NOT</bcp14> issue
a Credential for the accompanying <tt>IssuanceRequest</tt>. There is no global
replay protection service. The Moderator <bcp14>MUST</bcp14> retain an identifier while the
Endorsement it came from can still verify, independently of credential key or
context rotation.</t>
      </section>
      <section anchor="no-endorsement-required">
        <name>No Endorsement Required</name>
        <t>Endorsement type 0x0001 indicates that the Moderator does not require an
Endorsement under its policy. It has no grant. The <tt>endorsement</tt> input and
<tt>Redemption</tt> are both the distinguished empty value. <tt>RedeemRequest</tt> returns
that empty value. <tt>FinalizeRedeem</tt> returns the empty set when the
Moderator's policy permits issuance without an Endorsement, and <tt>INVALID</tt>
otherwise. How often a Client can obtain a Credential this way is up to
Moderator policy, for instance rate limiting.</t>
      </section>
      <section anchor="ec-ihat">
        <name>EC-IHAT</name>
        <t>Endorsement type: 0x0002.</t>
        <t>This protocol uses EC-IHAT <xref target="EC-IHAT"/>, a pairing-free Issuer-Hiding
Anonymous Token (IHAT). The cryptographic operations, primitive types, and
message encodings are defined there.</t>
        <section anchor="configuration">
          <name>Configuration</name>
          <t>The Client needs, from Anchor configuration (<xref target="key-rotation"/>):</t>
          <dl>
            <dt>EC-IHAT Ciphersuite</dt>
            <dd>
              <t>A ciphersuite identifier defined by <xref target="EC-IHAT"/>. It determines
<tt>Element</tt>, <tt>Scalar</tt>, and all cryptographic encodings.</t>
            </dd>
            <dt>Anchor Public Key</dt>
            <dd>
              <t><tt>pkA</tt>, an <tt>Element</tt>, as generated in <xref target="EC-IHAT"/>. An Anchor has one
key per grant endpoint.</t>
            </dd>
            <dt>Issuance Context</dt>
            <dd>
              <t><tt>ctx_iss</tt>, the issuance epoch the Anchor currently issues under. It is an
opaque byte string. Endorsements are valid for that epoch, see
<xref target="key-rotation"/>.</t>
            </dd>
            <dt>Redemption Context</dt>
            <dd>
              <t><tt>ctx_red</tt>, the ASCII string <tt>"MOLE-EC-IHAT-ctx_red-v1"</tt>, without a
terminating NUL byte. This fixed, domain-separated value is the same for all
Moderators. This is the cryptographic redemption Context defined by
<xref target="EC-IHAT"/>, not a Moderator Challenge. A specific redemption operation
is bound separately by <tt>challenge_digest</tt>.</t>
            </dd>
          </dl>
        </section>
        <section anchor="grant">
          <name>Grant</name>
          <t>A grant issues a batch of one or more Endorsements under the same <tt>pkA</tt> and
<tt>ctx_iss</tt>. It takes two HTTP exchanges and four messages. Each Endorsement in
the batch is the output of its own EC-IHAT issuance session (<xref target="EC-IHAT"/>); the
batch carries the messages of all its sessions together, and a single
<tt>session_id</tt> correlates them:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint16 count;
} GrantRequest;

struct {
  opaque session_id[32];
  CommitMessage commitments<V>;
} GrantCommitments;

struct {
  opaque session_id[32];
  ChallengeMessage challenges<V>;
} GrantChallenges;

struct {
  ResponseMessage responses<V>;
} GrantResponses;
]]></sourcecode>
          <t><tt>CommitMessage</tt>, <tt>ChallengeMessage</tt>, <tt>ResponseMessage</tt>, and the Endorsement
encoding are defined by <xref target="EC-IHAT"/>. The <tt>i</tt>-th entry of <tt>GrantChallenges</tt>
answers the <tt>i</tt>-th entry of <tt>GrantCommitments</tt>, and the <tt>i</tt>-th entry of
<tt>GrantResponses</tt> answers the <tt>i</tt>-th entry of <tt>GrantChallenges</tt>.</t>
          <t>The grant proceeds as follows. The Anchor speaks first, as specified by
<xref target="EC-IHAT"/>:</t>
          <ol spacing="normal" type="1"><li>
              <t>The Client sends a grant POST with a <tt>GrantRequest</tt>, in which <tt>count</tt>,
at least 1, is the number of Endorsements it asks for. The Anchor
rejects a <tt>count</tt> of zero. It chooses a number <tt>n</tt> of Endorsements to grant
under its policy, with <tt>1 &lt;= n &lt;= count</tt>, and rejects the request if it
grants none. It runs <tt>Commit(ctx_iss)</tt> <tt>n</tt> times, stores the <tt>n</tt> returned
states together under a fresh <tt>session_id</tt>, and returns a
<tt>GrantCommitments</tt> carrying <tt>session_id</tt> and the <tt>n</tt> commitments in order.</t>
            </li>
            <li>
              <t>The Client rejects a <tt>GrantCommitments</tt> with more than <tt>count</tt>
commitments. For each commitment it runs
<tt>Challenge(pkA, ctx_iss, ctx_red, commitment)</tt>, and it stores the returned
states in order. It sends a <tt>GrantChallenges</tt> carrying the opaque
<tt>session_id</tt> and the returned issuance challenges in the same order.
The Anchor atomically claims and consumes that identifier before reading
the single-use states. Only the instance that wins the claim proceeds. It
rejects the request if the number of challenges differs from the number
of states. Otherwise it runs <tt>Respond(skA, state, challenge)</tt> for each
pair and returns the responses in a <tt>GrantResponses</tt>. If any <tt>Respond</tt>
fails, the Anchor discards every state of the batch and returns no
response. Tombstones are retained through session expiry. All later
requests for the identifier fail without invoking <tt>Respond</tt>.</t>
            </li>
            <li>
              <t>The Client rejects a <tt>GrantResponses</tt> whose number of responses differs
from the number of challenges it sent. It runs
<tt>Finalize(pkA, state, response)</tt> for each pair as specified by
<xref target="EC-IHAT"/>. If <tt>Finalize</tt> fails for any session, the grant fails: the
Client <bcp14>MUST</bcp14> discard the state of every session in the batch and every
Endorsement finalized from it, and <bcp14>MUST NOT</bcp14> retry with that state. If the
second response is lost, the Client starts a fresh grant.</t>
            </li>
          </ol>
          <t>The Anchor <bcp14>MUST</bcp14> generate <tt>session_id</tt> with a cryptographically secure random
number generator, so that a Client cannot guess, and so collide with,
another Client's batch, and <bcp14>MUST NOT</bcp14> have two open batches with the same
<tt>session_id</tt>. A <tt>GrantChallenges</tt> whose <tt>session_id</tt> does not name an open batch
is rejected.</t>
          <t>Batching does not change the cryptographic guarantees. The sessions of a
batch are concurrent sessions in the sense of <xref target="EC-IHAT"/>, whose one-more
unforgeability holds under concurrency: a Client that completes a batch of
<tt>n</tt> sessions obtains at most <tt>n</tt> Endorsements. Each session is blinded
independently, so the Anchor cannot link an Endorsement to the batch that
produced it, nor to its position in that batch. The Anchor does learn <tt>count</tt>
and <tt>n</tt>. An Anchor counts every granted session against the Client's budget
(<xref target="ARCHITECTURE"/>).</t>
          <t>The Anchor learns neither <tt>nf</tt> nor the final Endorsement. Under the statistical
blindness claim in <xref target="EC-IHAT"/>, its protocol transcript does not let it
recognize the Endorsement when it is later redeemed. Timing, network, and
configuration metadata are outside that claim.</t>
        </section>
        <section anchor="redemption">
          <name>Redemption</name>
          <t>The type-specific <tt>Redemption</tt> payload is the encoding of <tt>Redemption</tt> in
<xref target="EC-IHAT"/>. <tt>RedeemRequest</tt> derives <tt>challenge_digest</tt> as in
<xref target="challenge-binding"/> and calls
<tt>Redeem(anchor_set, index, endorsement, ctx_iss, ctx_red, challenge_digest)</tt>.
The Client uses the Moderator's accepted Anchor set for the <tt>ctx_iss</tt> its
Endorsement was issued under (<xref target="key-rotation"/>). <tt>index</tt> is the position of
the entry whose key equals the issuing <tt>pkA</tt>. The Client fails if no set has
that <tt>ctx_iss</tt> or the set omits its Anchor.</t>
          <t>The <tt>Redemption</tt> does not carry <tt>ctx_iss</tt>. <tt>FinalizeRedeem</tt> checks that the
Moderator Challenge is accepted. Then, for each accepted Anchor set until one
succeeds, it decodes the payload against that set, since the decoding depends
on its size, and calls
<tt>VerifyRedemption(anchor_set, redemption, ctx_iss, ctx_red, challenge_digest)</tt>.
It returns <tt>{nf}</tt>, scoped to the matching <tt>ctx_iss</tt> in the Moderator's store,
or <tt>INVALID</tt> if decoding or verification fails under every set.
The common replay protection rules apply before Credential issuance. The
same <tt>nf</tt> is exposed on repeated redemptions, including across Moderators;
the scheme does not enforce global single use.</t>
        </section>
      </section>
      <section anchor="longfellow">
        <name>Longfellow</name>
        <t>Endorsement type: 0x0003.</t>
        <t>Where EC-IHAT requires Anchors to run new cryptography, this protocol
preserves backward compatibility with credentials Clients may hold, such as
mdocs. The Client proves in zero knowledge, using the scheme of <xref target="LONGFELLOW"/>,
that it holds a valid credential from one of an accepted set of issuers, without
revealing which issuer or any credential attribute. An experimental circuit is
described in <xref target="HIDDEN-ISSUER-CIRCUIT"/>.</t>
        <t>There is no grant exchange in this protocol. The Client obtains its
credential from the Anchor out of band, through whatever legacy issuance
that credential uses, before contacting a Moderator. A compressed circuit
artifact containing the two Longfellow circuits is likewise distributed out
of band and identified by its hash.</t>
        <section anchor="configuration-1">
          <name>Configuration</name>
          <t>The Client needs, from Moderator configuration (<xref target="key-rotation"/>):</t>
          <dl>
            <dt>Circuit Artifact Identifier</dt>
            <dd>
              <t><tt>circuit_artifact_id</tt>, the SHA-256 hash of the compressed circuit artifact
both parties use.</t>
            </dd>
            <dt>Circuit Manifest</dt>
            <dd>
              <t>An out-of-band manifest that names the artifact version, the two circuit
identifiers, and all proof parameters needed to interpret and verify it.</t>
            </dd>
            <dt>Accepted Issuer Set</dt>
            <dd>
              <t>the credential-issuer certificates the Moderator accepts, in a fixed
published order.</t>
            </dd>
            <dt>Epoch</dt>
            <dd>
              <t>the validity window redemptions must fall in.</t>
            </dd>
            <dt>Moderator Origin</dt>
            <dd>
              <t>the canonical origin of the Moderator. Its source is trusted configuration.
It <bcp14>MUST NOT</bcp14> be derived from a client-controlled HTTP <tt>Host</tt> value.</t>
            </dd>
            <dt>Verification Time</dt>
            <dd>
              <t><tt>verification_time</tt>, a Moderator-selected time within the current epoch.</t>
            </dd>
          </dl>
        </section>
        <section anchor="redemption-1">
          <name>Redemption</name>
          <t>The Client evaluates the two circuits over its credential to produce a proof
and a nullifier. The nullifier is derived, inside the circuit, from a
credential-bound secret, the canonical Moderator origin, and the current
epoch. One credential therefore yields exactly one valid nullifier per
Moderator origin and epoch.</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque circuit_artifact_id[32];
  opaque nullifier<V>;
  opaque proof<V>;
} Redemption;
]]></sourcecode>
          <t>The structure fields are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>circuit_artifact_id</tt> is the SHA-256 digest of the configured circuit
artifact.</t>
            </li>
            <li>
              <t><tt>nullifier</tt> is the circuit-produced replay protection identifier.</t>
            </li>
            <li>
              <t><tt>proof</tt> is the encoded Longfellow proof.</t>
            </li>
          </ul>
          <t>The circuit public inputs are the accepted issuer set, epoch, canonical
Moderator origin, <tt>verification_time</tt>, and nullifier. The proof establishes
<tt>validFrom &lt;= verification_time &lt;= validUntil</tt>. <tt>challenge_digest</tt>
(<xref target="challenge-binding"/>) is bound into the Longfellow Fiat-Shamir transcript.
It is not a circuit public input.</t>
          <t>Longfellow implements the common API in <xref target="endorsement-protocols"/>.
<tt>RedeemRequest</tt> checks that the artifact and manifest match configuration,
evaluates the circuits, and returns the encoded <tt>Redemption</tt> above.
<tt>FinalizeRedeem</tt> checks the artifact identifier, verifies the proof and its
transcript binding, and checks that the configured epoch and
<tt>verification_time</tt> remain current. It returns <tt>{nullifier}</tt>, or <tt>INVALID</tt>
on any failure. Both operations derive <tt>challenge_digest</tt> from
<tt>moderator_challenge</tt>. The common caller performs the
atomic replay protection check.</t>
        </section>
        <section anchor="differences-from-ec-ihat">
          <name>Differences from EC-IHAT</name>
          <t>Longfellow does not inherently require an Anchor to change its issuance
protocol. Scarcity then depends on the legacy credential's own issuance limits
and on whether it contains a credential-bound Client secret suitable for
nullifier derivation. An Anchor that participates in MOLE can control scarcity
and arrange for such a secret to be committed during issuance. Some existing
credential formats may already provide a suitable Client-contributed or
device-bound secret. The one-nullifier-per-origin-and-epoch rule lets the
Moderator prevent repeat redemption within its replay protection scope. The
legacy credential remains usable at other Moderator origins and in later
epochs. This does not limit how many credentials a Client can obtain.</t>
          <ul empty="true">
            <li>
              <t><strong>Editor note.</strong> This protocol is blocked on normative circuit definitions,
public-input encodings and ordering, transcript binding, artifact lifecycle
and size limits, and test vectors.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="credential-protocols">
      <name>Credential Protocols</name>
      <t>A credential protocol has two parts. In Redeem &amp; Issue, the Client redeems an
Endorsement and receives a Credential from the Moderator. In Presentation and
Update, the Client shows the Credential and receives an update in the same
exchange.</t>
      <figure anchor="fig-credential-flow">
        <name>Redeem &amp; Issue, then presentation and update</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="488" viewBox="0 0 488 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 40,64 L 40,128" fill="none" stroke="black"/>
              <path d="M 40,176 L 40,240" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 320,32 L 320,64" fill="none" stroke="black"/>
              <path d="M 368,64 L 368,128" fill="none" stroke="black"/>
              <path d="M 368,160 L 368,240" fill="none" stroke="black"/>
              <path d="M 416,32 L 416,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 320,32 L 416,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
              <path d="M 320,64 L 416,64" fill="none" stroke="black"/>
              <path d="M 48,96 L 112,96" fill="none" stroke="black"/>
              <path d="M 288,96 L 368,96" fill="none" stroke="black"/>
              <path d="M 40,112 L 64,112" fill="none" stroke="black"/>
              <path d="M 312,112 L 360,112" fill="none" stroke="black"/>
              <path d="M 48,128 L 128,128" fill="none" stroke="black"/>
              <path d="M 280,128 L 368,128" fill="none" stroke="black"/>
              <path d="M 48,208 L 160,208" fill="none" stroke="black"/>
              <path d="M 256,208 L 368,208" fill="none" stroke="black"/>
              <path d="M 40,224 L 104,224" fill="none" stroke="black"/>
              <path d="M 296,224 L 360,224" fill="none" stroke="black"/>
              <path d="M 48,240 L 160,240" fill="none" stroke="black"/>
              <path d="M 240,240 L 368,240" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="368,224 356,218.4 356,229.6" fill="black" transform="rotate(0,360,224)"/>
              <polygon class="arrowhead" points="368,112 356,106.4 356,117.6" fill="black" transform="rotate(0,360,112)"/>
              <polygon class="arrowhead" points="56,240 44,234.4 44,245.6" fill="black" transform="rotate(180,48,240)"/>
              <polygon class="arrowhead" points="56,208 44,202.4 44,213.6" fill="black" transform="rotate(180,48,208)"/>
              <polygon class="arrowhead" points="56,128 44,122.4 44,133.6" fill="black" transform="rotate(180,48,128)"/>
              <polygon class="arrowhead" points="56,96 44,90.4 44,101.6" fill="black" transform="rotate(180,48,96)"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="368" y="52">Moderator</text>
                <text x="200" y="100">RedemptionChallenge</text>
                <text x="116" y="116">Redemption</text>
                <text x="168" y="116">+</text>
                <text x="240" y="116">IssuanceRequest</text>
                <text x="404" y="116">HTTP</text>
                <text x="456" y="116">request</text>
                <text x="204" y="132">IssuanceResponse</text>
                <text x="36" y="148">Finalize</text>
                <text x="360" y="148">|</text>
                <text x="40" y="164">|</text>
                <text x="32" y="180">.</text>
                <text x="48" y="180">.</text>
                <text x="208" y="212">Challenge</text>
                <text x="200" y="228">PresentationAndUpdate</text>
                <text x="200" y="244">Update?</text>
                <text x="36" y="260">Finalize</text>
                <text x="360" y="260">|</text>
                <text x="40" y="276">|</text>
                <text x="368" y="276">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+                             +-----------+
| Client |                             | Moderator |
+---+----+                             +-----+-----+
    |                                        |
    |<-------- RedemptionChallenge ----------+
    +--- Redemption + IssuanceRequest ------>|  HTTP request
    |<---------- IssuanceResponse -----------+
Finalize                                    |
    |                                        |
   ...                                       |
    |                                        |
    |<-------------- Challenge --------------+
    +-------- PresentationAndUpdate -------->|
    |<-------------- Update? ----------------+
Finalize                                    |
    |                                        |
]]></artwork>
        </artset>
      </figure>
      <t>Redeem &amp; Issue carries a redemption and an issuance request. The Moderator
runs the endorsement protocol's <tt>FinalizeRedeem</tt> before accepting issuance.
Presentation carries <tt>PresentationAndUpdate</tt> and returns <tt>Update</tt> or a recorded
<tt>NoUpdate</tt> decision.</t>
      <t><tt>CredentialRequest</tt> names the pair of Redeem &amp; Issue payloads: the
endorsement type and its <tt>Redemption</tt>, and the credential type and its
<tt>IssuanceRequest</tt>. HTTP carries them as two typed parameters.</t>
      <t><tt>CredentialResponse</tt> below means the selected credential type and its encoded
<tt>IssuanceResponse</tt>. HTTP carries the type in its response
parameter suffix. The Client <bcp14>MUST</bcp14> reject a type that differs from its request.</t>
      <t>All credential protocols define the same four payloads:</t>
      <dl>
        <dt>IssuanceRequest</dt>
        <dd>
          <t>A Client-generated request for a new Credential.</t>
        </dd>
        <dt>IssuanceResponse</dt>
        <dd>
          <t>The Moderator's response to <tt>IssuanceRequest</tt>.</t>
        </dd>
        <dt>PresentationAndUpdate</dt>
        <dd>
          <t>A presentation of a Credential and any request needed to replace or update
it.</t>
        </dd>
        <dt>Update</dt>
        <dd>
          <t>The Moderator's response to <tt>PresentationAndUpdate</tt>, when the Client remains
eligible for a Credential.</t>
        </dd>
      </dl>
      <section anchor="abstract-credential-api">
        <name>Abstract Credential API</name>
        <t>Each credential protocol defines these abstract operations:</t>
        <artwork><![CDATA[
CreateIssuanceRequest(moderator_challenge, configuration)
  -> (issuance_state, issuance_request) | INVALID
IssueCredential(issuance_request, moderator_challenge, policy, configuration)
  -> issuance_response | INVALID
FinalizeIssuance(issuance_state, issuance_response, configuration)
  -> credential | INVALID

CreatePresentationAndUpdate(credential, credential_challenge, configuration)
  -> (presentation_state, presentation_and_update) | INVALID
ProcessPresentation(
    presentation_and_update, credential_challenge, policy, configuration)
  -> INVALID
   | ACCEPTED_NO_UPDATE(fresh)
   | ACCEPTED_WITH_UPDATE(update, fresh)
FinalizeUpdate(presentation_state, update, configuration)
  -> credential | INVALID
]]></artwork>
        <t><tt>CreateIssuanceRequest</tt>, <tt>FinalizeIssuance</tt>, <tt>CreatePresentationAndUpdate</tt>, and
<tt>FinalizeUpdate</tt> run at the Client. <tt>IssueCredential</tt> and <tt>ProcessPresentation</tt>
run at the Moderator. State values are local and are not sent on the wire.
<tt>ACCEPTED_NO_UPDATE</tt> means that the presentation succeeded but the Credential
was consumed without replacement. <tt>ACCEPTED_WITH_UPDATE</tt> carries the encoded
<tt>Update</tt> that the Client finalizes into its replacement Credential by calling
<tt>FinalizeUpdate</tt>. The Client does not call <tt>FinalizeUpdate</tt> for
<tt>ACCEPTED_NO_UPDATE</tt>. A complete protocol specification defines its Context
derivation, replay protection, and retry behavior. The Moderator completes that
replay protection before returning an accepted result. <tt>fresh</tt> is true when
this call recorded the result, and false when it returns a result already
recorded for a retry. Only a fresh result authorizes one attempt of the
protected operation within the replay protection scope. It does not establish
that the operation completed. <tt>ACCEPTED_NO_UPDATE</tt> ends this Credential's
chain, not other Credentials the Client may hold. A missing response or an
unavailable recovery result does not establish <tt>ACCEPTED_NO_UPDATE</tt>.</t>
        <table>
          <name>Presentation and recovery outcomes within a replay scope</name>
          <thead>
            <tr>
              <th align="left">Presentation outcome</th>
              <th align="left">Credential result</th>
              <th align="left">Protected operation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Rejected before acceptance</td>
              <td align="left">No committed replacement decision</td>
              <td align="left">Not attempted</td>
            </tr>
            <tr>
              <td align="left">Acceptance uncertain</td>
              <td align="left">Client cannot infer consumption or replacement</td>
              <td align="left">Not attempted unless this request's acceptance is confirmed</td>
            </tr>
            <tr>
              <td align="left">Fresh acceptance, response lost or server crashes</td>
              <td align="left">Recorded update or <tt>NoUpdate</tt> is fixed</td>
              <td align="left">May not have started or completed</td>
            </tr>
            <tr>
              <td align="left">Byte-identical duplicate with retained result</td>
              <td align="left">Return the recorded result</td>
              <td align="left">No additional attempt</td>
            </tr>
            <tr>
              <td align="left">Same Credential, conflicting presentation</td>
              <td align="left">Reject without changing the record</td>
              <td align="left">No additional attempt</td>
            </tr>
            <tr>
              <td align="left">Recovery result unavailable</td>
              <td align="left">No conclusion about the recorded decision</td>
              <td align="left">No additional attempt</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="credential-ec-act">
        <name>EC-ACT</name>
        <t>Credential type: 0x0001.</t>
        <t>An EC-ACT Credential, specified in <xref target="EC-ACT"/>, carries a hidden <em>balance</em> <tt>c</tt>, a
number of credits. The Moderator issues a Credential with an initial
balance of its choosing. A presentation spends a public <tt>spend_amount</tt> (<tt>s</tt>),
proving that the balance covers it, and may accept a top-up of at most
<tt>max_top_up</tt> (<tt>a</tt>) that the challenge offers. In the same exchange the Moderator issues a <em>refund</em>
message with a <tt>return_amount</tt> (<tt>t</tt>) of its choosing, with <tt>0 &lt;= t &lt;= s + a</tt>.
The Client finalizes this message into a fresh Credential with balance
<tt>c - s + t</tt>. The presentation reveals <tt>s</tt>, <tt>a</tt>, and a single-use nullifier;
the balance is hidden beyond the public amounts and predicates
(<xref target="privacy-ec-act"/>).</t>
        <t>A Credential is invalid once spent, and its replacement exists only once the
Moderator has answered, so one Credential supports one presentation in flight
at a time. This gives the Moderator:</t>
        <dl>
          <dt>Concurrency control:</dt>
          <dd>
            <t>Copies of a Credential yield at most one fresh acceptance across all servers
accepting the same key and credential context. Every copy presents the same
nullifier.</t>
          </dd>
          <dt>Dynamic revocation:</dt>
          <dd>
            <t>The Moderator ends a Credential chain, and its remaining balance, by
declining to refund, without waiting for the Credential to expire.</t>
          </dd>
          <dt>Per-session adjustment:</dt>
          <dd>
            <t>A balance changes only through <tt>s</tt>, <tt>a</tt>, and <tt>t</tt>, each of which can follow
the Moderator's assessment of the request, subject to <xref target="privacy-ec-act"/>.</t>
          </dd>
        </dl>
        <t>The abstract credential API maps onto <xref target="EC-ACT"/> as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Abstract operation</th>
              <th align="left">EC-ACT</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>CreateIssuanceRequest</tt></td>
              <td align="left">
                <tt>IssueRequest</tt>, with key selection (<xref target="ec-act-issue"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>IssueCredential</tt></td>
              <td align="left">
                <tt>IssueResponse</tt> (<xref target="ec-act-issue"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>FinalizeIssuance</tt></td>
              <td align="left">
                <tt>FinalizeIssue</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>CreatePresentationAndUpdate</tt></td>
              <td align="left">
                <tt>ProveSpend</tt> (<xref target="ec-act-spend"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>ProcessPresentation</tt></td>
              <td align="left">
                <tt>VerifySpend</tt> and <tt>IssueRefund</tt> (<xref target="ec-act-spend"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>FinalizeUpdate</tt></td>
              <td align="left">
                <tt>FinalizeRefund</tt></td>
            </tr>
          </tbody>
        </table>
        <t>The Client's <tt>presentation_state</tt> is the <tt>ClientSpendState</tt> of <xref target="EC-ACT"/>, the
<tt>pkM</tt>, <tt>credential_context</tt>, <tt>L</tt>, and Moderator identity and endpoint stored
with the spent Credential, and the <tt>PresentationAndUpdate</tt> octets with the
HTTP request information needed to resend them to their original
destination (<xref target="ec-act-missing-refund"/>). <tt>ProcessPresentation</tt> returns
<tt>ACCEPTED_WITH_UPDATE</tt> with a refund, and <tt>ACCEPTED_NO_UPDATE</tt> when the
Moderator declines to refund. For a retry answered from a record
(<xref target="ec-act-missing-refund"/>), it returns the recorded result with <tt>fresh</tt> false.</t>
        <section anchor="ec-act-configuration">
          <name>Configuration</name>
          <t>The Moderator publishes, in its configuration (<xref target="key-rotation"/>):</t>
          <dl>
            <dt>Public Key</dt>
            <dd>
              <t><tt>pkM</tt>, encoded with <tt>SerializeElement</tt>. Its identifier is
<tt>key_id = SHA-256(SerializeElement(pkM))</tt>, and <tt>truncated_key_id</tt> is the
last byte of <tt>key_id</tt>.</t>
            </dd>
            <dt>Ciphersuite</dt>
            <dd>
              <t>The EC-ACT ciphersuite identifier; <xref target="EC-ACT"/> defines <tt>P256-SHA256</tt>.</t>
            </dd>
            <dt>Balance Width</dt>
            <dd>
              <t><tt>L</tt>, fixed for the lifetime of the key and credential context (<xref target="EC-ACT"/>).
Balances and amounts are integers in <tt>[0, 2^L)</tt>. For example, <tt>L = 8</tt>
permits values from 0 to 255.</t>
            </dd>
            <dt>Credential Context</dt>
            <dd>
              <t><tt>credential_context</tt>, an opaque byte string of at most <tt>2^16 - 2</tt> bytes
that names the epoch or policy that Credentials under the key are valid
for.</t>
            </dd>
            <dt>Result Retention Period</dt>
            <dd>
              <t>The recovery interval after acceptance of a presentation. Recovery ends
earlier if its key or credential context is retired
(<xref target="ec-act-missing-refund"/>).</t>
            </dd>
          </dl>
          <t>The credential context of <xref target="EC-ACT"/> is</t>
          <artwork><![CDATA[
ctx_cred = credential_context || I2OSP(L, 1)
]]></artwork>
          <t>which includes <tt>L</tt> as <xref target="EC-ACT"/> recommends. A Moderator expires every
outstanding Credential under a key by retiring its <tt>credential_context</tt>,
without changing the key. A refund is issued under the context of the spent
Credential, so balances do not carry over to a new context. Moderators can
accept old and new credential contexts during a transition period to ensure
a seamless transition across clients. Dropping support for an old credential
context also drops support for clients which have not discovered the new
credential context.
Clients obtain Credentials under the new context through Redeem &amp; Issue;
this document does not specify balance migration.</t>
          <t>A Moderator <bcp14>MAY</bcp14> have several active keys, for instance during a rotation. It
<bcp14>MUST</bcp14> ensure that no two active keys share a <tt>truncated_key_id</tt>, <bcp14>SHOULD NOT</bcp14>
give a new key the <tt>truncated_key_id</tt> of a recently retired one, and <bcp14>SHOULD</bcp14>
keep the number of active keys small (<xref target="privacy-ec-act"/>).</t>
        </section>
        <section anchor="ec-act-issue">
          <name>Redeem &amp; Issue</name>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint8 truncated_key_id;
  opaque credential_context<V>;
  IssueRequestMessage request;
} IssuanceRequest;

struct {
  IssueResponseMessage response;
} IssuanceResponse;
]]></sourcecode>
          <t><tt>IssueRequestMessage</tt> and <tt>IssueResponseMessage</tt> are defined in <xref target="EC-ACT"/>.</t>
          <t>The Client runs <tt>IssueRequest()</tt>, keeps the returned state, and sends the
request with the truncated identifier of the key and the
<tt>credential_context</tt> it holds in its configuration.</t>
          <t>The Moderator processes a <tt>CredentialRequest</tt> in this order:</t>
          <ol spacing="normal" type="1"><li>
              <t>It selects the active key whose <tt>truncated_key_id</tt> matches, and checks
that <tt>credential_context</tt> is the context it issues under for that key.
It rejects the request if either check fails.</t>
            </li>
            <li>
              <t>It checks that <tt>request</tt> deserializes and that its proof verifies, as
<tt>IssueResponse</tt> does, and rejects the request otherwise.</t>
            </li>
            <li>
              <t>It validates the accompanying redemption with <tt>FinalizeRedeem</tt>
(<xref target="endorsement-protocols"/>).</t>
            </li>
            <li>
              <t>It chooses the initial balance <tt>c</tt> under its policy and runs
<tt>IssueResponse(skM, ctx_cred, c, request)</tt>. It then records the
<tt>replay_protection_ids</tt> returned by <tt>FinalizeRedeem</tt>. Recording is atomic
and fails if any identifier is already recorded. If any step fails, or
it is unknown whether the identifiers were recorded, no response is
released.</t>
            </li>
            <li>
              <t>It returns the result in a <tt>CredentialResponse</tt>.</t>
            </li>
          </ol>
          <t>A request rejected before recording does not cost the Client its
Endorsement. A response lost after recording cannot be recovered, and the
Client needs a new Endorsement.</t>
          <t>The Client runs <tt>FinalizeIssue(pkM, ctx_cred, state, response)</tt> and stores
the resulting Credential with <tt>pkM</tt>, <tt>credential_context</tt>, <tt>L</tt>, the
identity of the Moderator, and its configured Redeem &amp; Issue endpoint.
If finalization fails, the Client <bcp14>MUST</bcp14> discard the state, <bcp14>SHOULD</bcp14> refresh
its configuration, and <bcp14>MAY</bcp14> run Redeem &amp; Issue again.</t>
        </section>
        <section anchor="ec-act-present">
          <name>Presentation and Update</name>
          <t>The EC-ACT <tt>Challenge</tt> names the amounts, the context the Moderator accepts,
and the scope of the authorization it asks for:</t>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  uint64 spend_amount;
  uint64 max_top_up;
  opaque credential_context<V>;
  opaque request_context<V>;
} Challenge;
]]></sourcecode>
          <t><tt>spend_amount</tt> is the Predicate of <xref target="ARCHITECTURE"/>: a
presentation succeeds only if the balance is at least <tt>spend_amount</tt>.
<tt>max_top_up</tt> is the largest top-up the Moderator offers in this presentation,
<tt>0</tt> if none. A challenge with <tt>s = a = 0</tt> asks for a refresh, which replaces the nullifier
and leaves the balance unchanged, since <tt>t &lt;= s + a = 0</tt>. A Moderator that
wants to lower balances challenges with <tt>s &gt; 0</tt> and returns <tt>t &lt; s</tt>; one that
wants to raise them offers <tt>a &gt; 0</tt>. <tt>credential_context</tt> repeats the
configured value, so that a Client can tell that its Credential has expired
without refetching the configuration. It is the challenge field that
partitions cached Credentials.</t>
          <section anchor="ec-act-challenge-binding">
            <name>Challenge Binding</name>
            <t>The spend context of <xref target="EC-ACT"/> is</t>
            <artwork><![CDATA[
ctx_spend = SHA-256(credential_challenge)
]]></artwork>
            <t>where <tt>credential_challenge</tt> is the encoded EC-ACT <tt>Challenge</tt>, as decoded
from the Moderator Challenge payload (<xref target="common"/>). The Client hashes those
octets, not their base64url encoding. This digest is separate from the redemption digest
of <xref target="challenge-binding"/>.</t>
            <t>The presentation does not carry the challenge. The Moderator determines the
challenge a presentation answers from its policy and the request it is
authorizing, and selects one of two profiles by what it puts in
<tt>request_context</tt>:</t>
            <dl>
              <dt>Policy-scoped:</dt>
              <dd>
                <t><tt>request_context</tt> is empty. Every challenge with the same <tt>s</tt>, <tt>a</tt>, and
<tt>credential_context</tt> then has the same octets and the same digest, and a
presentation is a one-use bearer authorization for those values: the
Moderator accepts it once, against whichever request carries it
(<xref target="security-ec-act"/>).</t>
              </dd>
              <dt>Request-bound:</dt>
              <dd>
                <t><tt>request_context</tt> is non-empty and identifies the request, session, or
time window the presentation is for. The Moderator <bcp14>MUST</bcp14> accept a
presentation only under a value it issued for the request being
authorized. The value <bcp14>MAY</bcp14> be stateless, for instance an
authenticated encoding of the origin, the method and target, a session
identifier, or a time window, which the Moderator recomputes from the
request. The binding is only as specific as what the value encodes; to
bind one operation, it <bcp14>MUST</bcp14> distinguish every request field that affects
authorization, including the request body where relevant.</t>
              </dd>
            </dl>
            <t>When several challenges could apply to a request, for instance for adjacent
time windows or for two credential contexts during a rollover, the Moderator
runs steps 2 and 3 of <xref target="ec-act-spend"/> for each until one succeeds. The two
profiles differ only in the challenge octets. The cryptographic operations,
the message formats, and the nullifier rules are the same.</t>
          </section>
          <section anchor="ec-act-spend">
            <name>Spending and Refunds</name>
            <t>A Client that holds no Usable Credential (<xref target="ec-act-client-state"/>) for this
Moderator under the challenged <tt>credential_context</tt>, or whose Credential
<tt>ProveSpend</tt> would reject for the challenged <tt>spend_amount</tt> and <tt>max_top_up</tt>,
does not present.
It runs Redeem &amp; Issue, first obtaining an Endorsement if the Moderator
requires one (<xref target="endorsement-protocols"/>).</t>
            <t>Otherwise the Client computes <tt>ctx_spend</tt>, runs
<tt>ProveSpend(credential, ctx_cred, s, a, ctx_spend)</tt>, stores the returned
state and the presentation as <xref target="ec-act-client-state"/> requires, and sends:</t>
            <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque key_id[32];
  SpendMessage spend;
} PresentationAndUpdate;

struct {
  RefundMessage refund;
} Update;
]]></sourcecode>
            <t><tt>SpendMessage</tt> and <tt>RefundMessage</tt> are defined in <xref target="EC-ACT"/>. The full <tt>key_id</tt>
is sent: the Moderator issued the Credential and knows its key, so the
identifier tells it nothing more.</t>
            <t>The Moderator processes a presentation as follows. Steps 1 and 2 read public
state and the nullifier store, step 3 ends by atomically recording the
result, and step 4 follows.</t>
            <ol spacing="normal" type="1"><li>
                <t>It checks that <tt>key_id</tt> names an active key, then looks up
<tt>(key_id, spend.k)</tt> in the nullifier store. If a record exists, the
Moderator answers from it only if it holds the SHA-256 digest of the
received <tt>PresentationAndUpdate</tt> octets, its result is still retained,
and its credential context is still accepted for that key
(<xref target="ec-act-missing-refund"/>). The challenge may have expired. A record that
fails any of these checks causes the presentation to be rejected. Only
an unrecorded nullifier proceeds to step 2.</t>
              </li>
              <li>
                <t>It determines the challenge (<xref target="ec-act-challenge-binding"/>), and checks
that its <tt>credential_context</tt> is accepted for that key and that
<tt>spend.s</tt> and <tt>spend.a</tt> equal its <tt>spend_amount</tt> and <tt>max_top_up</tt>. It rejects
the presentation if any check fails.</t>
              </li>
              <li>
                <t>It runs <tt>VerifySpend(skM, ctx_cred, ctx_spend, spend)</tt>, decides under its
policy whether to refund and, if so, the return amount <tt>t</tt>, and runs
<tt>IssueRefund(skM, ctx_cred, spend, t)</tt> if it refunds. It then records the
<em>result</em> under <tt>(key_id, spend.k)</tt>: the digest of the presentation
octets, <tt>ctx_cred</tt>, and the decision, either <tt>Refund(t)</tt> with
the octets of the <tt>RefundMessage</tt>, or <tt>NoUpdate</tt>. Recording is atomic and
<bcp14>MUST</bcp14> fail if a result is already recorded under that nullifier or if the
key or context is no longer accepted, so of two racing presentations at
most one is recorded. If any step fails, or it is unknown whether the
result was recorded, no refund is released. The Moderator <bcp14>MUST NOT</bcp14>
attempt the protected operation unless this request's result was
successfully recorded.</t>
              </li>
              <li>
                <t>It attempts the protected operation. Its HTTP response carries the
recorded credential result as an <tt>Update</tt>: the refund, or, for
<tt>NoUpdate</tt>, an absent update, which leaves the Client without a
replacement. The Moderator <bcp14>MUST</bcp14> include this result even when the
protected operation fails.</t>
              </li>
            </ol>
            <t>Spending credits authorizes one attempt of the protected operation. A
failure after step 3 can charge the Client without completing step 4; a
retry recovers the result but does not authorize another attempt. Reliable
execution needs application-specific recovery, for example a durable outbox
written with the step 3 record and a worker that retries the operation
idempotently under the presentation digest. This document does not specify
that recovery.</t>
            <t>The Client runs <tt>FinalizeRefund(pkM, ctx_cred, state, refund)</tt> and stores
the resulting Credential in place of the spent one, with the same <tt>pkM</tt>,
<tt>credential_context</tt>, and <tt>L</tt>. If the refund does not verify, the Client
discards it and proceeds as in <xref target="ec-act-missing-refund"/>.</t>
          </section>
        </section>
        <section anchor="ec-act-client-state">
          <name>Client State</name>
          <t>An EC-ACT Credential goes through the following states:</t>
          <figure anchor="fig-ec-act-states">
            <name>EC-ACT Credential states</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="456" viewBox="0 0 456 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                  <path d="M 8,128 L 8,160" fill="none" stroke="black"/>
                  <path d="M 8,224 L 8,256" fill="none" stroke="black"/>
                  <path d="M 48,64 L 48,120" fill="none" stroke="black"/>
                  <path d="M 48,160 L 48,216" fill="none" stroke="black"/>
                  <path d="M 96,32 L 96,64" fill="none" stroke="black"/>
                  <path d="M 96,128 L 96,160" fill="none" stroke="black"/>
                  <path d="M 96,224 L 96,256" fill="none" stroke="black"/>
                  <path d="M 8,32 L 96,32" fill="none" stroke="black"/>
                  <path d="M 8,64 L 96,64" fill="none" stroke="black"/>
                  <path d="M 8,128 L 96,128" fill="none" stroke="black"/>
                  <path d="M 8,160 L 96,160" fill="none" stroke="black"/>
                  <path d="M 8,224 L 96,224" fill="none" stroke="black"/>
                  <path d="M 8,256 L 96,256" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="56,216 44,210.4 44,221.6" fill="black" transform="rotate(90,48,216)"/>
                  <polygon class="arrowhead" points="56,120 44,114.4 44,125.6" fill="black" transform="rotate(90,48,120)"/>
                  <g class="text">
                    <text x="52" y="52">Usable</text>
                    <text x="144" y="52">balance</text>
                    <text x="184" y="52">c</text>
                    <text x="148" y="100">ProveSpend(credential,</text>
                    <text x="280" y="100">ctx_cred,</text>
                    <text x="332" y="100">s,</text>
                    <text x="356" y="100">a,</text>
                    <text x="412" y="100">ctx_spend)</text>
                    <text x="48" y="148">Spent</text>
                    <text x="148" y="148">awaiting</text>
                    <text x="216" y="148">refund;</text>
                    <text x="264" y="148">the</text>
                    <text x="324" y="148">Credential</text>
                    <text x="380" y="148">is</text>
                    <text x="424" y="148">invalid</text>
                    <text x="136" y="196">FinalizeRefund(pkM,</text>
                    <text x="256" y="196">ctx_cred,</text>
                    <text x="324" y="196">state,</text>
                    <text x="384" y="196">refund)</text>
                    <text x="52" y="244">Usable</text>
                    <text x="144" y="244">balance</text>
                    <text x="184" y="244">c</text>
                    <text x="200" y="244">-</text>
                    <text x="216" y="244">s</text>
                    <text x="232" y="244">+</text>
                    <text x="252" y="244">t,</text>
                    <text x="276" y="244">in</text>
                    <text x="300" y="244">[c</text>
                    <text x="320" y="244">-</text>
                    <text x="340" y="244">s,</text>
                    <text x="360" y="244">c</text>
                    <text x="376" y="244">+</text>
                    <text x="396" y="244">a]</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
   +----------+
   |  Usable  |  balance c
   +----+-----+
        |
        | ProveSpend(credential, ctx_cred, s, a, ctx_spend)
        v
   +----------+
   |  Spent   |  awaiting refund; the Credential is invalid
   +----+-----+
        |
        | FinalizeRefund(pkM, ctx_cred, state, refund)
        v
   +----------+
   |  Usable  |  balance c - s + t, in [c - s, c + a]
   +----------+
]]></artwork>
            </artset>
          </figure>
          <dl>
            <dt>Usable:</dt>
            <dd>
              <t>The Client holds a Credential with balance <tt>c</tt>, together with <tt>pkM</tt>,
<tt>credential_context</tt>, and <tt>L</tt>, and may present it as <xref target="ec-act-spend"/>
describes.</t>
            </dd>
            <dt>Spent:</dt>
            <dd>
              <t>The Client has run <tt>ProveSpend</tt>, and the Credential is invalid whether or
not the presentation is sent or answered (<xref target="EC-ACT"/>). Besides the spend state
that <xref target="EC-ACT"/> requires it to store, the Client <bcp14>MUST</bcp14> durably store the
presentation octets and the HTTP request needed to resend them before
the presentation leaves it.</t>
            </dd>
          </dl>
          <t>A valid refund returns the Client to Usable. A Credential chain is therefore
serialized: one presentation at a time, each waiting for the Moderator's
answer to the previous one. When a Client learns that a key or credential
context has been retired, it <bcp14>MUST</bcp14> discard the Credentials and pending spend
states under that key or context. It obtains a Credential under the current
configuration through Redeem &amp; Issue.</t>
        </section>
        <section anchor="ec-act-missing-refund">
          <name>Lost Refunds</name>
          <t>A presentation may be sent and its response lost, or the Moderator may fail
between recording the result in step 3 of <xref target="ec-act-spend"/> and returning it. The
Client cannot then finalize, and the spent Credential cannot be reused.</t>
          <t>A Moderator <bcp14>MUST</bcp14> keep each result until the earlier of the end of its
published result retention period (<xref target="ec-act-configuration"/>), counted from
the recording in step 3, and retirement of the key or credential context.
It <bcp14>MUST</bcp14> delete the result when this interval ends. A Client missing an
<tt>Update</tt> <bcp14>MAY</bcp14> resend the byte-identical <tt>PresentationAndUpdate</tt> during the
interval. Step 1 of <xref target="ec-act-spend"/> checks the record and the continued
acceptance of its key and credential context before returning a result.
Recovery remains available after the presentation's challenge expires:</t>
          <ul spacing="normal">
            <li>
              <t>For a recorded <tt>Refund(t)</tt>, the Moderator returns the refund it stored.</t>
            </li>
            <li>
              <t>For a recorded <tt>NoUpdate</tt>, the Moderator returns an absent update.</t>
            </li>
          </ul>
          <t>The recovery handle is
<tt>key_id || SerializeScalar(spend.k) || SHA-256(PresentationAndUpdate)</tt>.</t>
          <t>The Moderator <bcp14>MUST NOT</bcp14> authorize another operation for a recorded nullifier,
and <bcp14>MUST NOT</bcp14> change a recorded decision.</t>
          <t>Once recovery ends, a retry is rejected, and the Client <bcp14>MUST</bcp14> discard the
spend state. To continue, it runs Redeem &amp; Issue. The Moderator <bcp14>MUST</bcp14> retain
the nullifier after deleting its result for as long as the key and
credential context are accepted (<xref target="key-rotation"/>).</t>
        </section>
        <section anchor="ec-act-limitations">
          <name>Limitations</name>
          <t>A <tt>SpendMessage</tt> grows linearly in <tt>L</tt> (<xref target="EC-ACT"/>). With P-256 and <tt>L = 32</tt>,
it is at most 4,531 bytes (about 4.5 KB) when <tt>s + a &gt; 0</tt>, including when
both amounts are nonzero, and 468 bytes for a refresh (<tt>s = a = 0</tt>). These
sizes exclude the 32-byte <tt>key_id</tt> added by <tt>PresentationAndUpdate</tt> and are
before base64url encoding in the <tt>Authorization</tt> header. Deployments with
tight header limits should choose <tt>L</tt> accordingly.</t>
        </section>
      </section>
      <section anchor="credential-reverse">
        <name>Privacy Pass with a Reverse Flow</name>
        <t>Credential type: 0x0002.</t>
        <t>The Credential is a single Privacy Pass token. The Moderator's configuration
names one issuance token type and key, used by Redeem &amp; Issue and by updates,
and the token types and keys it accepts for presentation. The accepted set
includes the issuance one, and can include others, for instance a key being
rotated out. Presentation consumes the token. The update, if granted, is a
fresh token issued through <xref target="REVERSE-FLOW"/>, with redemption in place of
attestation.</t>
        <section anchor="redeem-issue">
          <name>Redeem &amp; Issue</name>
          <t><tt>IssuanceRequest</tt> is a <tt>TokenRequest</tt> and <tt>IssuanceResponse</tt> is a
<tt>TokenResponse</tt>, both as defined for the configured token type in
<xref target="PRIVACYPASS-PROTOCOLS"/>. That token type's finalization operation produces
the Credential. These messages implement <tt>CreateIssuanceRequest</tt>,
<tt>IssueCredential</tt>, and <tt>FinalizeIssuance</tt>.</t>
        </section>
        <section anchor="presentation-and-update">
          <name>Presentation and Update</name>
          <sourcecode type="tls-presentation"><![CDATA[
struct {
  opaque token<V>;
  opaque token_request<V>;  /* TokenRequest */
} PresentationAndUpdate;

struct {
  opaque token_response<V>; /* TokenResponse */
} Update;
]]></sourcecode>
          <t>The structure fields are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>token</tt> is the presented Privacy Pass <tt>Token</tt>.</t>
            </li>
            <li>
              <t><tt>token_request</tt> is the encoded replacement <tt>TokenRequest</tt>.</t>
            </li>
            <li>
              <t><tt>token_response</tt> is the encoded replacement <tt>TokenResponse</tt>.</t>
            </li>
          </ul>
          <t>These structures implement <tt>CreatePresentationAndUpdate</tt>, <tt>ProcessPresentation</tt>,
and <tt>FinalizeUpdate</tt>.</t>
          <t>The <tt>token</tt> field carries a <tt>Token</tt> as defined in <xref target="PRIVACYPASS-AUTH"/>.
Each configured token key has its own <tt>TokenChallenge</tt> (<xref target="key-rotation"/>).
A token is verified against the <tt>TokenChallenge</tt> of the key it was issued
under. Initial issuance and replacements use the <tt>TokenChallenge</tt> of the
issuance key.</t>
          <t>The type-specific Challenge is the issuance key's <tt>TokenChallenge</tt>. A
Client <bcp14>MUST</bcp14> reject a Challenge that differs from it. The Client presents a token issued under
any accepted key, and builds <tt>token_request</tt> under the issuance key.</t>
          <t><tt>TokenChallenge</tt> is fixed when the token is issued, before the operation in
which it is presented. It <bcp14>MUST</bcp14> be the same for every Client using a given
configuration, and <bcp14>MUST NOT</bcp14> contain a per-Client or per-request value.
The Client checks agreement with its configuration, not consistency across
Clients (<xref target="privacy-considerations"/>).
<tt>Token.challenge_digest</tt> is SHA-256 over the encoded <tt>TokenChallenge</tt>. It is
distinct from the endorsement <tt>challenge_digest</tt> of <xref target="challenge-binding"/>.</t>
          <t>The Moderator processes a presentation as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>It looks up <tt>(token.token_key_id, token.nonce)</tt> in its record store. If a
record exists, it returns the recorded result with <tt>fresh</tt> false, only
if the record holds the SHA-256 digest of the received
<tt>PresentationAndUpdate</tt> octets and is still retained. Otherwise it rejects the presentation. Only an unrecorded
nonce proceeds to step 2.</t>
            </li>
            <li>
              <t>It verifies the token as specified by <xref target="PRIVACYPASS-AUTH"/> against the
accepted key matching <tt>token.token_type</tt> and <tt>token.token_key_id</tt>, and
that key's <tt>TokenChallenge</tt>, including <tt>Token.challenge_digest</tt>. It
rejects the presentation if verification fails.</t>
            </li>
            <li>
              <t>It decides under its policy whether to issue an update and, if so, runs
the issuance of the configured issuance token type on <tt>token_request</tt>.</t>
            </li>
            <li>
              <t>It atomically records under <tt>(token.token_key_id, token.nonce)</tt> the
digest of the <tt>PresentationAndUpdate</tt> octets and the result: the
<tt>Update</tt>, or no update. Recording <bcp14>MUST</bcp14> fail if a record exists. If any
step fails, or it is unknown whether the result was recorded, no update is
released and the protected operation <bcp14>MUST NOT</bcp14> be attempted.</t>
            </li>
            <li>
              <t>It returns the recorded result with <tt>fresh</tt> true and attempts the
protected operation.</t>
            </li>
          </ol>
        </section>
        <section anchor="retry-after-a-lost-response">
          <name>Retry after a lost response</name>
          <t>A Client that receives no response <bcp14>MAY</bcp14> retry the byte-identical
<tt>PresentationAndUpdate</tt> only to recover from that loss. The Moderator
retains each result for the <tt>result-retention</tt> period in its configuration,
then keeps the nonce without the result while the token key is
accepted. It <bcp14>MUST NOT</bcp14> issue a second Credential for a recorded nonce. The
Client <bcp14>MUST NOT</bcp14> combine the same presented Credential with a different update
request. These requirements are the retry semantics of <xref target="REVERSE-FLOW"/>.</t>
          <t>If concurrent presentations race to record the nonce, only the winner returns
<tt>fresh</tt> true. A loser returns the retained result with <tt>fresh</tt> false only if
the recorded presentation digest matches. Otherwise it rejects the request.
Once the result expires, the retained nonce still prevents another acceptance.</t>
          <t>The recovery handle is
<tt>token.token_key_id || token.nonce || SHA-256(PresentationAndUpdate)</tt>.</t>
        </section>
        <section anchor="limitations">
          <name>Limitations</name>
          <t>The presented token is a bearer credential. Its verification does not prove
that the replacement <tt>token_request</tt> belongs to the same holder. A holder
can therefore supply another party's replacement request. Replay protection
limits acceptance of the presented token within its scope. It does not
prevent this transfer or establish that a Client holds only one token.
The fixed <tt>TokenChallenge</tt> also does not bind presentation to a particular
HTTP request.</t>
          <t>TODO: define a device binding mechanism, issuing tokens bound to a Client
key so that presentation requires proof of possession. This would restore
the binding between update and presented credential. Open problem.</t>
        </section>
      </section>
    </section>
    <section anchor="key-rotation">
      <name>Key Rotation and Discovery</name>
      <t>Each Anchor and Moderator publishes a configuration, which a Client fetches
over an authenticated channel. For example, a Moderator accepting EC-IHAT
Endorsements from two Anchors and issuing EC-ACT Credentials publishes, in JSON
with byte strings truncated:</t>
      <sourcecode type="json"><![CDATA[
{
  "issuance-uri": "https://moderator.example/mole/issue",
  "endorsements": [
    {
      "endorsement-type": 2,
      "ciphersuite": "P256-SHA256",
      "issuance-epoch": "MjAyNi0xMA",
      "anchor-set": ["A8mT...", "Ao3L..."]
    }
  ],
  "credential-keys": [
    {
      "credential-type": 1,
      "credential-key": "AjRx...",
      "ciphersuite": "P256-SHA256",
      "balance-width": 8,
      "credential-context": "bW9kZXJhdG9yLXYx",
      "result-retention": 300
    }
  ]
}
]]></sourcecode>
      <t>Configurations are described in CDDL <xref target="CDDL"/>:</t>
      <sourcecode type="cddl"><![CDATA[
moderator-configuration = {
  "issuance-uri": tstr,
  "endorsements": [+ $endorsement],
  "credential-keys": [+ $credential-key],
  * tstr => any
}

$anchor-configuration /= {
  "grant-uri": tstr,
  "endorsement-type": 2,            ; EC-IHAT
  "ciphersuite": tstr,
  "anchor-key": bstr,               ; SerializeElement(pkA)
  "issuance-epoch": bstr,           ; ctx_iss
  * tstr => any
}

$endorsement /= {
  "endorsement-type": 1,            ; No Endorsement Required
  * tstr => any
}

$endorsement /= {
  "endorsement-type": 2,            ; EC-IHAT
  "ciphersuite": tstr,
  "issuance-epoch": bstr,           ; ctx_iss
  "anchor-set": [+ bstr],           ; SerializeElement(pkA), in order
  * tstr => any
}

$credential-key /= {
  "credential-type": 1,             ; EC-ACT
  "credential-key": bstr,           ; SerializeElement(pkM)
  "ciphersuite": tstr,
  "balance-width": 1..64,           ; L
  "credential-context": bstr .size (0..65534),
  "result-retention": uint,         ; seconds
  * tstr => any
}

$credential-key /= {
  "credential-type": 2,             ; Privacy Pass Reverse Flow
  "token-type": uint .size 2,
  "token-key": bstr,
  "token-challenge": bstr,          ; encoded TokenChallenge
  "issuance": bool,                 ; the issuance key, exactly one
  "result-retention": uint,         ; seconds
  * tstr => any
}
]]></sourcecode>
      <t><tt>grant-uri</tt> and <tt>issuance-uri</tt> are absolute HTTPS URIs without userinfo or
fragments. Other protocols,
such as <xref target="longfellow"/>, add entries to the sockets. A Client ignores unknown
members and skips entries of unknown types.</t>
      <t><tt>endorsements</tt> lists the endorsement types the Moderator accepts. A
EC-IHAT entry is one accepted Anchor set, with the <tt>ctx_iss</tt> shared by all
its Anchors. A Moderator accepting several epochs publishes one entry per
epoch. Order within <tt>anchor-set</tt> matters: EC-IHAT proof branches match
Anchors by position.</t>
      <t>EC-ACT nullifiers <bcp14>MUST</bcp14> remain recorded while their credential context is
accepted for their key. A Moderator that publishes different configurations
to different Clients partitions them (<xref target="ARCHITECTURE"/>).</t>
      <t>The serialization, for instance JSON or CBOR, is to be defined with the
configuration's authentication and consistency checks. In JSON, <tt>bstr</tt>
values are unpadded base64url strings.</t>
      <t>TODO: define how a Client discovers the configuration URI, and the
configuration media type, together with the serialization.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>TODO. Follow <xref target="ARCHITECTURE"/> and cover:</t>
      <ol spacing="normal" type="1"><li>
          <t>Anonymity-set partitioning by protocol type, keys, contexts, epochs,
accepted-set contents and order, and public amounts. Cryptographic issuer
hiding and unlinkability do not remove these distinctions.</t>
        </li>
        <li>
          <t>Configuration consistency: authenticated delivery does not prevent split
views. Local Client checks do not establish consistency across Clients.</t>
        </li>
        <li>
          <t>Anchor set verification: counting keys does not establish that they
represent distinct, active Anchors. Fabricated entries do not add Clients
to the anonymity set.</t>
        </li>
        <li>
          <t>Epoch width versus anonymity-set size.</t>
        </li>
        <li>
          <t>Amount tagging: conformance requirements do not prevent a malicious
Moderator from choosing identifying amounts. State Client checks,
external consistency assumptions, and residual attacks.</t>
        </li>
      </ol>
      <t>During redemption of an Endorsement, the Client uses the accepted Anchor Set
from the Moderator's authenticated configuration. If the Client does not have
an Endorsement issued by one of the Anchors in the Anchor Set, it must either
abort the redemption flow or pause it until it can obtain a suitable
Endorsement. The Client must take care to ensure its actions in this case do not
inadvertently reveal the issuing Anchor of an accepted Endorsement. For example,
if the Client initiates two concurrent redemption flows, the Moderator can
select Anchor Sets that differ by just one Anchor. If one flow aborts but the
other does not, then the Moderator immediately learns the Anchor of the accepted
Endorsement.</t>
      <section anchor="privacy-ec-act">
        <name>EC-ACT</name>
        <t>An EC-ACT presentation reveals <tt>s</tt>, <tt>a</tt>, and a fresh nullifier, and, because
the proof verifies, the key and credential context of the Credential. Its
Update reveals <tt>t</tt>. The unlinkability of <xref target="EC-ACT"/> holds among the Clients
that share the key, the context, and the amounts, so each of these
partitions Clients:</t>
        <dl>
          <dt>Keys and contexts:</dt>
          <dd>
            <t>The truncated key identifier shortens the encoding, but it still selects
one active key, and every active key splits the Clients holding
Credentials under it. <xref target="EC-ACT"/> requires the credential context to be coarse: a
per-Client or per-session context makes presentations linkable without
breaking any cryptographic property.</t>
          </dd>
          <dt>Amounts:</dt>
          <dd>
            <t>The initial balance, <tt>s</tt>, <tt>a</tt>, and <tt>t</tt> <bcp14>MUST NOT</bcp14> vary per Client under a
policy, since a Moderator could recognize a Client by the values it
uses. A Moderator <bcp14>SHOULD</bcp14> draw them from a small set of values fixed by
policy, so that a value reveals no more than the policy decision it
encodes. A Client whose balance plus <tt>a</tt> reaches <tt>2^L</tt> cannot present,
which sets it apart. A Moderator <bcp14>SHOULD</bcp14> choose <tt>L</tt> so that the largest
balance its policy lets Clients reach, plus the largest <tt>a</tt> it offers, is
below <tt>2^L</tt>.</t>
          </dd>
          <dt>Balance inference:</dt>
          <dd>
            <t>A presentation succeeds only if the balance covers <tt>s</tt>. A Moderator that
challenges a Client repeatedly with amounts of its choosing can bound the
balance, and in the end recover it and use it to link presentations
(<xref target="ARCHITECTURE"/>). The serialized chain of <xref target="ec-act-client-state"/> limits
such probing to one presentation per round trip. Clients <bcp14>SHOULD</bcp14> limit the
number of presentations they make in one context, as <xref target="ARCHITECTURE"/>
recommends.</t>
          </dd>
          <dt>Timing:</dt>
          <dd>
            <t>The refund arrives in the same exchange as the presentation, so a Client
that presents it in another context at once is likely the one that just
received it. <xref target="ARCHITECTURE"/> keeps a Credential used in one context
locked to that context for a period of time; this applies to the refund
that replaces it.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>All exchanges defined in this document <bcp14>MUST</bcp14> be carried over HTTPS.</t>
      <t>TODO. The list to cover:</t>
      <ol spacing="normal" type="1"><li>
          <t>Anchor key compromise: an attacker with an Anchor key in an accepted set
can mint Endorsements freely. Blast radius and rotation response.</t>
        </li>
        <li>
          <t>Timing and error side channels during verification, especially
distinguishing "bad proof" from "spent nullifier".</t>
        </li>
      </ol>
      <t>Replay protection scope is deployment-selected and can differ for Endorsement
redemption and Credential presentation. Atomic checks within that scope
prevent repeated acceptance. Except for EC-ACT's shared-store requirement below,
this document does not require global uniqueness or a particular storage
architecture. Independent scopes can accept the same Endorsement or Credential
again. For EC-ACT, all servers accepting the same key and credential context <bcp14>MUST</bcp14>
share one atomic nullifier store; independent stores need disjoint keys or
contexts. Otherwise a Client can fork a balance across stores, which breaks
the credit conservation of <xref target="EC-ACT"/>.
An EC-IHAT redemption exposes the same nullifier in each scope, making
cross-scope reuse linkable if records are compared. Proof rerandomization does
not hide that reuse.</t>
      <t>Replay markers and recoverable presentation results have different lifetimes.
A Moderator <bcp14>MUST</bcp14> retain a marker while the corresponding Endorsement or
Credential remains acceptable in its scope, even after its recovery result
expires. Deleting the result ends recovery. Deleting the marker permits replay. After deleting a
marker on retirement, the Moderator <bcp14>MUST NOT</bcp14> accept the retired configuration
again.</t>
      <section anchor="security-ec-act">
        <name>EC-ACT</name>
        <dl>
          <dt>Nullifier store:</dt>
          <dd>
            <t>Step 3 of <xref target="ec-act-spend"/> is the atomic recording that <xref target="EC-ACT"/> requires.
The store <bcp14>MUST</bcp14> be durable: a Moderator that loses it re-admits every
Credential spent under a context for as long as that context is
accepted. Nullifiers <bcp14>MAY</bcp14> be partitioned by key and context and discarded
once the context is no longer accepted (<xref target="security-considerations"/>).</t>
          </dd>
          <dt>Amounts:</dt>
          <dd>
            <t>Step 2 of <xref target="ec-act-spend"/> requires <tt>spend.s</tt> and <tt>spend.a</tt> to equal the
challenge's <tt>spend_amount</tt> and <tt>max_top_up</tt>. Accepting another <tt>s</tt> would let
the Client choose its charge, and accepting a larger <tt>a</tt> would let it choose
how far its balance may rise. <xref target="EC-ACT"/> gives the range checks that credit
conservation needs.</t>
          </dd>
          <dt>Credential sharing:</dt>
          <dd>
            <t>Copies of one Credential yield at most one fresh acceptance across all
servers accepting the same key and credential context. Byte-identical retries
recover the retained result.
Conflicting spends are rejected. Both expose the same nullifier and are
linkable to the first presentation (<xref target="EC-ACT"/>).</t>
          </dd>
          <dt>Recorded results:</dt>
          <dd>
            <t>A recorded result is returned only for a byte-identical presentation and
never authorizes another operation. A party that replays an observed
presentation receives a refund it cannot finalize without the spend
state. A recorded <tt>NoUpdate</tt> stays <tt>NoUpdate</tt>; answering a retry with a
refund would undo the Moderator's revocation.</t>
          </dd>
          <dt>Dynamic revocation:</dt>
          <dd>
            <t>A Moderator that records <tt>NoUpdate</tt> ends that Credential chain, and the
Client loses its remaining balance with no cryptographic recourse.
Clients therefore trust Moderators to refund honest presentations; a
Moderator that withholds refunds indiscriminately costs its Clients their
Endorsements. Client Vendors can limit their Clients' use of such a
Moderator.</t>
          </dd>
          <dt>Presentation scope:</dt>
          <dd>
            <t>Under the policy-scoped profile of <xref target="ec-act-challenge-binding"/>, a party
that sees a presentation before the Moderator does, such as an
intermediary terminating TLS for the Moderator, can attach it to another
request under the same policy. The nullifier check ensures that only one use
is accepted within the replay scope, not which. Deployments that need a
presentation tied to one request use the request-bound profile.</t>
          </dd>
          <dt>Verification cost:</dt>
          <dd>
            <t>An unrecorded nullifier passes step 1 of <xref target="ec-act-spend"/>, so a forged
presentation costs the Moderator a full <tt>VerifySpend</tt>, whose cost is
linear in <tt>L</tt>. Mitigations are rate limiting applied before verification,
which identifies Clients no more than the transport already does, and a
small <tt>L</tt>.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document sketches two candidate registries under a future "MOLE"
group. The values below are candidate values for discussion in this -00
draft and are not stable assignments.</t>
      <t>New registrations use Specification Required as defined by <xref target="IANA"/>. A
specification <bcp14>MUST</bcp14> define the structures and abstract operations required by
the relevant common API, including canonical encodings and maximum sizes. An
endorsement registration <bcp14>MUST</bcp14> provide issuer hiding where applicable, define
its replay protection behavior, and state how a Challenge affects its cryptographic
Context. A credential registration <bcp14>MUST</bcp14> define <tt>IssuanceRequest</tt>,
<tt>IssuanceResponse</tt>, <tt>PresentationAndUpdate</tt>, <tt>Update</tt>, finalization, retry
behavior, and Challenge-to-Context derivation. Type-specific Update encodings
<bcp14>MUST</bcp14> be nonempty so HTTP can represent <tt>NoUpdate</tt> as an empty payload.</t>
      <section anchor="mole-endorsement-types">
        <name>MOLE Endorsement Types</name>
        <table anchor="endorsement-types">
          <name>Candidate MOLE Endorsement Type Values</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">Reserved</td>
              <td align="left">this document</td>
            </tr>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">No Endorsement Required</td>
              <td align="left">
                <xref target="no-endorsement-required"/></td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">EC-IHAT</td>
              <td align="left">
                <xref target="ec-ihat"/></td>
            </tr>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">Longfellow</td>
              <td align="left">
                <xref target="longfellow"/></td>
            </tr>
            <tr>
              <td align="left">0xFF00 - 0xFFFF</td>
              <td align="left">Reserved for testing</td>
              <td align="left">this document</td>
            </tr>
          </tbody>
        </table>
        <t>The registration template contains:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The two-byte endorsement type.</t>
          </li>
          <li>
            <t>Name: A short name for the protocol.</t>
          </li>
          <li>
            <t>Exchanges: The number of request/response exchanges with the Anchor, or
"none" if the grant is out of band.</t>
          </li>
          <li>
            <t>Publicly Verifiable: Whether the Endorsement can be verified without
Anchor secret key material.</t>
          </li>
          <li>
            <t>Reference: Where the protocol is defined.</t>
          </li>
        </ul>
        <t>The following initial registrations are candidates only.</t>
        <section anchor="iana-ec-ihat">
          <name>EC-IHAT</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0002</t>
            </li>
            <li>
              <t>Name: EC-IHAT</t>
            </li>
            <li>
              <t>Exchanges: 2</t>
            </li>
            <li>
              <t>Publicly Verifiable: Yes</t>
            </li>
            <li>
              <t>Reference: <xref target="ec-ihat"/></t>
            </li>
          </ul>
        </section>
        <section anchor="iana-longfellow">
          <name>Longfellow</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0003</t>
            </li>
            <li>
              <t>Name: Longfellow</t>
            </li>
            <li>
              <t>Exchanges: none (out of band)</t>
            </li>
            <li>
              <t>Publicly Verifiable: Yes</t>
            </li>
            <li>
              <t>Reference: <xref target="longfellow"/></t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="mole-credential-types">
        <name>MOLE Credential Types</name>
        <t>One MOLE credential type identifies the issuance, presentation, and update
payloads defined by a credential protocol.</t>
        <table anchor="credential-types">
          <name>Candidate MOLE Credential Type Values</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">Reserved</td>
              <td align="left">this document</td>
            </tr>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">EC-ACT</td>
              <td align="left">
                <xref target="credential-ec-act"/></td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">Privacy Pass Reverse Flow</td>
              <td align="left">
                <xref target="credential-reverse"/></td>
            </tr>
            <tr>
              <td align="left">0x0A0A, 0x1A1A, ..., 0xFAFA</td>
              <td align="left">Reserved for greasing</td>
              <td align="left">
                <xref target="greasing"/></td>
            </tr>
            <tr>
              <td align="left">0xFF00 - 0xFFFF</td>
              <td align="left">Reserved for testing</td>
              <td align="left">this document</td>
            </tr>
          </tbody>
        </table>
        <t>The registration template contains:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The two-byte credential type.</t>
          </li>
          <li>
            <t>Name: A short name for the protocol.</t>
          </li>
          <li>
            <t>Bound Update: Whether updates provably apply to the presented
credential.</t>
          </li>
          <li>
            <t>Reference: Where the protocol is defined.</t>
          </li>
        </ul>
        <section anchor="iana-ec-act">
          <name>EC-ACT</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0001</t>
            </li>
            <li>
              <t>Name: EC-ACT</t>
            </li>
            <li>
              <t>Bound Update: Yes</t>
            </li>
            <li>
              <t>Reference: <xref target="credential-ec-act"/></t>
            </li>
          </ul>
        </section>
        <section anchor="iana-reverse">
          <name>Privacy Pass Reverse Flow</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0002</t>
            </li>
            <li>
              <t>Name: Privacy Pass Reverse Flow</t>
            </li>
            <li>
              <t>Bound Update: No</t>
            </li>
            <li>
              <t>Reference: <xref target="credential-reverse"/></t>
            </li>
          </ul>
        </section>
        <section anchor="iana-grease">
          <name>Greased Values</name>
          <ul spacing="normal">
            <li>
              <t>Value: 0x0A0A, 0x1A1A, 0x2A2A, 0x3A3A, 0x4A4A, 0x5A5A, 0x6A6A, 0x7A7A,
0x8A8A, 0x9A9A, 0xAAAA, 0xBABA, 0xCACA, 0xDADA, 0xEAEA, 0xFAFA</t>
            </li>
            <li>
              <t>Name: RESERVED</t>
            </li>
            <li>
              <t>Bound Update: N/A</t>
            </li>
            <li>
              <t>Reference: <xref target="greasing"/></t>
            </li>
          </ul>
          <t>These values <bcp14>MUST NOT</bcp14> be assigned. Message bodies carrying them contain
random bytes (<xref target="greasing"/>).</t>
        </section>
      </section>
      <section anchor="media-types">
        <name>Media Types</name>
        <table anchor="media-types-table">
          <name>MOLE Media Types</name>
          <thead>
            <tr>
              <th align="left">Media Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">application/mole-endorsement-request</td>
              <td align="left">
                <xref target="endorsement-protocols"/></td>
            </tr>
            <tr>
              <td align="left">application/mole-endorsement-response</td>
              <td align="left">
                <xref target="endorsement-protocols"/></td>
            </tr>
          </tbody>
        </table>
        <t>Both media types require a <tt>type</tt> parameter containing the four-digit
hexadecimal endorsement type value (<xref target="iana"/>). Bodies
are the type-specific binary grant messages. Duplicate or mismatched type
parameters are rejected. Neither type has optional parameters defined here.</t>
        <ul empty="true">
          <li>
            <t><strong>Editor note.</strong> The final registry names and expert-review instructions
remain to be specified.</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="ARCHITECTURE">
          <front>
            <title>Moderation of unLinkable Endorsements (MOLE) Architecture</title>
            <author fullname="Samuel Schlesinger" initials="S." surname="Schlesinger">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Dennis Jackson" initials="D." surname="Jackson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="November" year="2026"/>
            <abstract>
              <t>   Moderation of unLinkable Endorsements (MOLE) is an architecture that
   lets a party performing access control (a Moderator) bootstrap trust
   in a client from a third party (an Anchor) that already has a trust
   relationship with that client, and then adjust that trust over time
   in response to the client's behaviour, for example by dynamically
   rate-limiting access.

   MOLE targets open deployments, in which independent parties may be
   responsible for access control and for vouching for clients, whilst
   maintaining strong privacy protections for clients.  These
   protections are designed to hold even if participants in the
   ecosystem collude or otherwise misbehave.

   This document specifies the roles, the information flows between
   them, the privacy and security requirements, and deployment
   considerations.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jms-mole-architecture-01"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="EC-ACT">
          <front>
            <title>EC-ACT: Anonymous Credit Tokens</title>
            <author fullname="Samuel Schlesinger" initials="S." surname="Schlesinger">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Jonathan Katz" initials="J." surname="Katz">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A. F." surname="Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="2" month="November" year="2026"/>
            <abstract>
              <t>   This document specifies EC-ACT, a keyed-verification anonymous
   credential scheme with a hidden credit balance.  A Client spends a
   public amount and receives a fresh Credential for the remaining
   balance and a return amount chosen by the Moderator.  The Moderator
   verifies each spend without learning the balance or linking it to
   issuance or to other spends.

   EC-ACT uses a pairing-free BBS-style signature and proofs over linear
   relations.  This document defines its cryptographic operations,
   encodings, and security requirements.  The MOLE protocols use EC-ACT
   as a Credential scheme.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-schlesinger-mole-ec-act-00"/>
        </reference>
        <reference anchor="EC-IHAT">
          <front>
            <title>EC-IHAT: Issuer-Hiding Anonymous Tokens</title>
            <author fullname="Samuel Schlesinger" initials="S." surname="Schlesinger">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Watson Ladd" initials="W." surname="Ladd">
              <organization>Akamai Technologies</organization>
            </author>
            <author fullname="Deep Inder Mohan" initials="D. I." surname="Mohan">
              <organization>Georgia Institute of Technology</organization>
            </author>
            <date day="2" month="November" year="2026"/>
            <abstract>
              <t>   This document specifies EC-IHAT, a cryptographic construction used to
   produce and consume MOLE Endorsements.  An Endorsement is an
   anonymous token that an Anchor issues to a Client, and that the
   Client later redeems at a Moderator without the Anchor being able to
   link the redemption to the issuance.

   This document defines the endorsement issuance protocol, built from a
   pairing-free partially blind signature scheme, together with the
   group, encoding, and context-binding rules that both the Anchor and
   the Client follow.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ladd-mole-ec-ihat-00"/>
        </reference>
        <reference anchor="IANA">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="LONGFELLOW">
          <front>
            <title>Longfellow ZK</title>
            <author fullname="Matteo Frigo" initials="M." surname="Frigo">
              <organization>Google</organization>
            </author>
            <author fullname="abhi shelat" initials="A." surname="shelat">
              <organization>Google</organization>
            </author>
            <date day="23" month="September" year="2026"/>
            <abstract>
              <t>   This document defines an algorithm for generating and verifying a
   succinct non-interactive zero-knowledge argument that for a given
   input x and a circuit C, there exists a witness w, such that C(x,w)
   evaluates to 0.  The technique here combines the MPC-in-the-head
   approach for constructing ZK arguments described in Ligero [ligero]
   with a verifiable computation protocol based on sumcheck for proving
   that C(x,w)=0.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-google-cfrg-libzk-03"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="PRIVACYPASS-AUTH">
          <front>
            <title>The Privacy Pass HTTP Authentication Scheme</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document defines an HTTP authentication scheme for Privacy Pass, a privacy-preserving authentication mechanism used for authorization. The authentication scheme specified in this document can be used by Clients to redeem Privacy Pass tokens with an Origin. It can also be used by Origins to challenge Clients to present Privacy Pass tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9577"/>
          <seriesInfo name="DOI" value="10.17487/RFC9577"/>
        </reference>
        <reference anchor="PRIVACYPASS-PROTOCOLS">
          <front>
            <title>Privacy Pass Issuance Protocols</title>
            <author fullname="S. Celi" initials="S." surname="Celi"/>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="S. Valdez" initials="S." surname="Valdez"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="June" year="2024"/>
            <abstract>
              <t>This document specifies two variants of the two-message issuance protocol for Privacy Pass tokens: one that produces tokens that are privately verifiable using the Issuer Private Key and one that produces tokens that are publicly verifiable using the Issuer Public Key. Instances of "issuance protocol" and "issuance protocols" in the text of this document are used interchangeably to refer to the two variants of the Privacy Pass issuance protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9578"/>
          <seriesInfo name="DOI" value="10.17487/RFC9578"/>
        </reference>
        <reference anchor="REVERSE-FLOW">
          <front>
            <title>Privacy Pass Reverse Flow</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare Inc.</organization>
            </author>
            <date day="4" month="August" year="2026"/>
            <abstract>
              <t>   This document specifies an instantiation of the Privacy Pass
   Architecture (RFC 9576) that allows for a "reverse" flow from the
   Origin to the Client.  It describes a method for an Origin to issue a
   state update to the Client in response to a request in which a token
   is redeemed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-privacypass-reverse-flow-07"/>
        </reference>
        <reference anchor="SHA2">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="TLS13">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HIDDEN-ISSUER-CIRCUIT" target="https://github.com/thibmeu/longfellow-zk/blob/hidden-issuer-poc/lib/circuits/mdoc/HIDDEN_ISSUER.md">
          <front>
            <title>Hidden issuer circuit for longfellow-zk</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 1544?>

<section anchor="example">
      <name>Example</name>
      <t>A Client requests a resource protected by a Moderator that uses credential
type 0x0002 (Privacy Pass Reverse Flow) and accepts endorsement type
0x0002 (EC-IHAT). The Client obtains the Endorsement before contacting that
Moderator.</t>
      <figure anchor="fig-example">
        <name>Complete exchange</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="424" viewBox="0 0 424 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 40,64 L 40,144" fill="none" stroke="black"/>
              <path d="M 40,176 L 40,240" fill="none" stroke="black"/>
              <path d="M 40,272 L 40,352" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 192,32 L 192,64" fill="none" stroke="black"/>
              <path d="M 224,64 L 224,160" fill="none" stroke="black"/>
              <path d="M 264,32 L 264,64" fill="none" stroke="black"/>
              <path d="M 320,32 L 320,64" fill="none" stroke="black"/>
              <path d="M 368,64 L 368,352" fill="none" stroke="black"/>
              <path d="M 416,32 L 416,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 192,32 L 264,32" fill="none" stroke="black"/>
              <path d="M 320,32 L 416,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
              <path d="M 192,64 L 264,64" fill="none" stroke="black"/>
              <path d="M 320,64 L 416,64" fill="none" stroke="black"/>
              <path d="M 40,96 L 56,96" fill="none" stroke="black"/>
              <path d="M 176,96 L 216,96" fill="none" stroke="black"/>
              <path d="M 48,112 L 64,112" fill="none" stroke="black"/>
              <path d="M 40,128 L 56,128" fill="none" stroke="black"/>
              <path d="M 200,128 L 216,128" fill="none" stroke="black"/>
              <path d="M 48,144 L 72,144" fill="none" stroke="black"/>
              <path d="M 208,144 L 224,144" fill="none" stroke="black"/>
              <path d="M 48,176 L 120,176" fill="none" stroke="black"/>
              <path d="M 296,176 L 368,176" fill="none" stroke="black"/>
              <path d="M 40,208 L 360,208" fill="none" stroke="black"/>
              <path d="M 48,224 L 368,224" fill="none" stroke="black"/>
              <path d="M 48,272 L 144,272" fill="none" stroke="black"/>
              <path d="M 280,272 L 368,272" fill="none" stroke="black"/>
              <path d="M 40,304 L 360,304" fill="none" stroke="black"/>
              <path d="M 48,320 L 368,320" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="368,304 356,298.4 356,309.6" fill="black" transform="rotate(0,360,304)"/>
              <polygon class="arrowhead" points="368,208 356,202.4 356,213.6" fill="black" transform="rotate(0,360,208)"/>
              <polygon class="arrowhead" points="224,128 212,122.4 212,133.6" fill="black" transform="rotate(0,216,128)"/>
              <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(0,216,96)"/>
              <polygon class="arrowhead" points="56,320 44,314.4 44,325.6" fill="black" transform="rotate(180,48,320)"/>
              <polygon class="arrowhead" points="56,272 44,266.4 44,277.6" fill="black" transform="rotate(180,48,272)"/>
              <polygon class="arrowhead" points="56,224 44,218.4 44,229.6" fill="black" transform="rotate(180,48,224)"/>
              <polygon class="arrowhead" points="56,176 44,170.4 44,181.6" fill="black" transform="rotate(180,48,176)"/>
              <polygon class="arrowhead" points="56,144 44,138.4 44,149.6" fill="black" transform="rotate(180,48,144)"/>
              <polygon class="arrowhead" points="56,112 44,106.4 44,117.6" fill="black" transform="rotate(180,48,112)"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="228" y="52">Anchor</text>
                <text x="368" y="52">Moderator</text>
                <text x="116" y="100">GrantRequest</text>
                <text x="140" y="116">GrantCommitments</text>
                <text x="216" y="116">-</text>
                <text x="128" y="132">GrantChallenges</text>
                <text x="140" y="148">GrantResponses</text>
                <text x="36" y="164">Finalize</text>
                <text x="208" y="180">RedemptionChallenge</text>
                <text x="108" y="196">Redemption</text>
                <text x="160" y="196">+</text>
                <text x="232" y="196">IssuanceRequest</text>
                <text x="132" y="244">IssuanceResponse</text>
                <text x="36" y="260">Finalize</text>
                <text x="224" y="260">|</text>
                <text x="212" y="276">TokenChallenge</text>
                <text x="152" y="292">PresentationAndUpdate</text>
                <text x="92" y="340">Update</text>
                <text x="224" y="356">|</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+             +--------+      +-----------+
| Client |             | Anchor |      | Moderator |
+---+----+             +---+----+      +-----+-----+
    |                      |                 |
    +-- GrantRequest ----->|                 |
    |<-- GrantCommitments -+                 |
    +-- GrantChallenges -->|                 |
    |<--- GrantResponses --+                 |
Finalize                   |                 |
    |<--------- RedemptionChallenge ---------+
    |   Redemption + IssuanceRequest         |
    +--------------------------------------->|
    |<---------------------------------------+
    |   IssuanceResponse                     |
Finalize                   |                 |
    |<------------ TokenChallenge -----------+
    |   PresentationAndUpdate                |
    +--------------------------------------->|
    |<---------------------------------------+
    |   Update                               |
    |                      |                 |
]]></artwork>
        </artset>
      </figure>
      <t>The grant follows <xref target="ec-ihat"/>. The Client finalizes each <tt>ResponseMessage</tt>
in the <tt>GrantResponses</tt> into an Endorsement. It uses one of them here: it
obtains a <tt>RedemptionChallenge</tt>, computes its digest,
and sends the EC-IHAT <tt>Redemption</tt> with a Privacy Pass <tt>TokenRequest</tt> to
the Redeem &amp; Issue endpoint.</t>
      <t>The Moderator verifies the redemption and atomically records its nullifier
before returning a <tt>TokenResponse</tt>. The Client finalizes it into a Credential.
On a later request, it obtains a Challenge carrying the configured
Privacy Pass <tt>TokenChallenge</tt> and sends <tt>PresentationAndUpdate</tt>.</t>
      <t>A fresh acceptance authorizes one attempt of the protected operation. The
response carries the recorded <tt>Update</tt> for a fresh token, or <tt>NoUpdate</tt> if
the Moderator chose to consume the Credential.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>draft-jms-mole-protocols-01</t>
      <ul spacing="normal">
        <li>
          <t>Move cryptographic constructions to separate EC-IHAT and EC-ACT drafts.
Specify their protocol profiles, including batched EC-IHAT grants.</t>
        </li>
        <li>
          <t>Define endorsement and credential APIs, redemption challenge binding, and
the separation of Moderator Challenges from cryptographic Contexts.</t>
        </li>
        <li>
          <t>Carry type-specific payloads directly and make message encodings independent
of the HTTP transport draft.</t>
        </li>
        <li>
          <t>Define atomic presentation processing, retained updates, and recovery by
handle without repeating the protected operation.</t>
        </li>
        <li>
          <t>Add configuration schemas, key and context lifetimes, and replay state
requirements.</t>
        </li>
        <li>
          <t>Remove Budget Privacy Pass and clarify the privacy and security limitations
of the remaining protocols.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7W9+3obR5Iv+H8+RS11vrUkA9DVbjfldg9MUW3O6Lak7D69
vT1CASiQZQJVmKqCKLakeZZ9ln2yjWtmZFaBkmbO0ffZJIGqvEZGxuUXEePx
2HVlty4Os4MXr54fZ6+buqsX9bo9cPl83hTvBr5Y5F1xXjfXh1lZrWrnlvWi
yjfQxLLJV93490073tTrYrzVV8b3H7h2N9+UbVvWVXe9hWdPjt88c9VuMy+a
Q7eEFg/doq7aomp37WHWNbvCQd+P3GVxfVU3y0OXjbNNvSyavIM28K+iWtZN
W2yKqsM/d9W6rC7zebkuu2v8YNuU7/LFtXtXVDto/VaWnTf1bgsTmlZdOX7W
5LtldlRvNrsK3sj+gl8e4GM8wIOhrzZ5uYavtrv5ulyMc2hnhc38y9WjSd2c
0yN5s7iARy66btse3ru3LtuunfD396bwXfmuaO+9pgbupe3cO3AwyrK72M1x
3f10x/VqvKue0/xgYY/DzNt7ZdUVTVV0Y1r9FltYw3K2nRnEJmlprS2ZNWwn
3PGkrNM27+3b2MlFt1kfOJfvuou6wT2C3rNstVuvmSLO8s2uWGdni4t10ZbV
edHQA7AWeVX+k0Z0mP2lrs/XRfb8+RF9WfAit+dteOtfzvHDyaLe9Pt4WlRV
2Wb/mi8uW6SMXvsv6n+W63VuGy+LbvUvS3px/Du/ONld9tt+c1HO8926y14U
QAqDoz9a17vlap03he2g7sbURycNYOuuqpsNvPUOqDHLpqdHv5y8OT568+vp
MRyH8dNJsspISGVXLLodNX309Onzw+z02dEP3z+4D38fH42nR2/sm2a9uIUC
SGvR8bMnv0yjh9f5cumfKi9yfOxk+nLKXTx4+D38/fzVy788O37+/NVf7Zvn
tF3jxao5H6/L+T9h2bL/69eTI3rzj/fv4+Ben578Nj362+vp2dl4+uubX/i7
7/7wh+S716ev3rw6evX8TB/4AR44Pf7t+PTsePws6XjDezCWg73N23YMHKoA
Ah6v1vUVvHr2y/QhNfX9w0eP4e83z88ePOIpPX78vXPIsMwe/HLy9Onxy/HJ
2dmvx6fjo5PTo19P3hzSPipX/KVcAp1kwLp2RZMtymaxK7sMWsnWdXW+KtbQ
8fiflwf8Ut6cF3Dw9NzJiQKyvYeEABO4F711b76u5/cuqIsxdzHe1gtgGvN7
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

-->

</rfc>
