<?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-http-transport-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 HTTP Transport">MOLE HTTP Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-jms-mole-http-transport-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 48?>

<t>MOLE targets browser deployments, so Clients, Anchors, and Moderators need
an HTTP transport for the protocol flows defined by the architecture.</t>
      <t>This document defines the <tt>Mole</tt> HTTP authentication scheme, which carries
challenges and presentations for the endorsement and credential flows, and
the headers used to return credential material. The grant exchanges with
the Anchor are defined per protocol in <xref target="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-http-transport.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-jms-mole-http-transport/"/>.
      </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 59?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="PROTOCOLS"/> defines the MOLE messages. This document carries them over
HTTP. Challenges and presentations use the <tt>Mole</tt> authentication scheme
<xref target="HTTP"/>. Credential material returns in the <tt>Mole-Credential</tt> response
header. Grant exchanges with an Anchor are defined in <xref target="PROTOCOLS"/>.</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>Payload encodings and abstract operations are defined by <xref target="PROTOCOLS"/>.
Header payloads use canonical unpadded base64url (<xref target="BASE64"/>). HTTP carries
type-specific payloads directly, without outer type or length wrappers.</t>
    </section>
    <section anchor="http-authentication-scheme">
      <name>The Mole Authentication Scheme</name>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="448" viewBox="0 0 448 224" 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,112" fill="none" stroke="black"/>
            <path d="M 40,144 L 40,208" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
            <path d="M 344,32 L 344,64" fill="none" stroke="black"/>
            <path d="M 392,64 L 392,208" fill="none" stroke="black"/>
            <path d="M 440,32 L 440,64" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 344,32 L 440,32" fill="none" stroke="black"/>
            <path d="M 8,64 L 80,64" fill="none" stroke="black"/>
            <path d="M 344,64 L 440,64" fill="none" stroke="black"/>
            <path d="M 48,96 L 72,96" fill="none" stroke="black"/>
            <path d="M 376,96 L 392,96" fill="none" stroke="black"/>
            <path d="M 40,160 L 64,160" fill="none" stroke="black"/>
            <path d="M 368,160 L 384,160" fill="none" stroke="black"/>
            <path d="M 48,192 L 144,192" fill="none" stroke="black"/>
            <path d="M 376,192 L 392,192" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="392,160 380,154.4 380,165.6" fill="black" transform="rotate(0,384,160)"/>
            <polygon class="arrowhead" points="56,192 44,186.4 44,197.6" fill="black" transform="rotate(180,48,192)"/>
            <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="392" y="52">Moderator</text>
              <text x="152" y="100">WWW-Authenticate:</text>
              <text x="244" y="100">Mole</text>
              <text x="316" y="100">challenge-T=</text>
              <text x="32" y="132">(Redeem</text>
              <text x="72" y="132">&amp;</text>
              <text x="108" y="132">Issue,</text>
              <text x="148" y="132">if</text>
              <text x="192" y="132">needed)</text>
              <text x="132" y="164">Authorization:</text>
              <text x="212" y="164">Mole</text>
              <text x="296" y="164">presentation-T=</text>
              <text x="220" y="196">Mole-Credential:</text>
              <text x="328" y="196">update-T=</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+--------+                                +-----------+
| Client |                                | Moderator |
+---+----+                                +-----+-----+
    |                                           |
    |<--- WWW-Authenticate: Mole challenge-T= --+
    |                                           |
(Redeem & Issue, if needed)                     |
    |                                           |
    +--- Authorization: Mole presentation-T= -->|
    |                                           |
    |<------------ Mole-Credential: update-T= --+
    |                                           |
]]></artwork>
      </artset>
      <t>Payload parameter names end in <tt>-T</tt>, where <tt>T</tt> is a registered endorsement or
credential type from <xref target="PROTOCOLS"/>, written as exactly four lowercase
hexadecimal digits. For example, EC-IHAT (endorsement type 0x0002) is
challenged with <tt>redeem-0002</tt>, and EC-ACT (credential type 0x0001) is presented
with <tt>presentation-0001</tt>. Recipients also accept uppercase digits, since
parameter names are case-insensitive (<xref section="11.2" sectionFormat="of" target="HTTP"/>). Type 0x0000
is invalid.</t>
      <t>Each <tt>Mole</tt> challenge has exactly one payload parameter:</t>
      <table>
        <name>Challenge parameters</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Registry</th>
            <th align="left">Decoded payload</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>endorse-T</tt></td>
            <td align="left">Endorsement</td>
            <td align="left">Anchor context, empty for the types here</td>
          </tr>
          <tr>
            <td align="left">
              <tt>redeem-T</tt></td>
            <td align="left">Endorsement</td>
            <td align="left">
              <tt>RedemptionChallenge</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>challenge-T</tt></td>
            <td align="left">Credential</td>
            <td align="left">Type-specific <tt>Challenge</tt></td>
          </tr>
        </tbody>
      </table>
      <t>A server offers a choice using separate <tt>Mole</tt> challenges. The Client ignores
unknown types and chooses a supported configuration. A <tt>redeem-T</tt> challenge
selects the endorsement type. The Client selects the credential type from the
same Moderator's configuration, independently of the endorsement type.</t>
      <t>A <tt>Mole</tt> credential in <tt>Authorization</tt> selects one operation:</t>
      <table>
        <name>Authorization parameters</name>
        <thead>
          <tr>
            <th align="left">Parameters</th>
            <th align="left">Decoded payloads</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>redeem-E</tt>, <tt>credential-request-C</tt></td>
            <td align="left">
              <tt>Redemption</tt>, <tt>IssuanceRequest</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>presentation-T</tt></td>
            <td align="left">
              <tt>PresentationAndUpdate</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>recovery-T</tt></td>
            <td align="left">Recovery handle</td>
          </tr>
        </tbody>
      </table>
      <t><tt>E</tt> uses the endorsement registry. <tt>C</tt>, presentation, and recovery use the
credential registry. Only Redeem &amp; Issue has two payload
parameters. It requires exactly one of each, in either order. Type 0001's
empty redemption is carried as <tt>redeem-0001=""</tt>.</t>
      <t>Parameters use auth-param syntax (<xref section="11.2" sectionFormat="of" target="HTTP"/>). Values can be
tokens or quoted-strings. Senders quote empty values. Recipients unescape
quoted-strings before decoding. Multiple challenges in one field follow
<xref section="11.6.1" sectionFormat="of" target="HTTP"/>. These rules apply to each challenge separately.
Unknown parameters, including <tt>realm</tt>, are ignored. A name beginning with one
of the operation prefixes above but lacking exactly four hexadecimal digits
is malformed, not an unknown extension. A recipient <bcp14>MUST</bcp14> reject duplicate
parameter names, mixed operations, and missing or extra payload parameters,
including payloads of unknown types. It <bcp14>MUST</bcp14> reject noncanonical base64url and,
for known types, trailing bytes or malformed content. Clients ignore malformed
challenges and may use another one.</t>
      <t>An unknown presentation type is treated as absent when authentication is
optional and rejected when required, as specified by <xref target="PROTOCOLS"/>. Other
requests of unknown type are rejected. Unknown types never select a known
payload decoder. Greased types follow these same rules.</t>
    </section>
    <section anchor="mole-credential">
      <name>The Mole-Credential Field</name>
      <t><tt>Mole-Credential</tt> returns credential material to the Client. Its value is
one parameter, with the syntax above:</t>
      <table>
        <name>Mole-Credential parameters</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Decoded payload</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>response-T</tt></td>
            <td align="left">
              <tt>IssuanceResponse</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>update-T</tt></td>
            <td align="left">
              <tt>Update</tt>, or empty for recorded <tt>NoUpdate</tt></td>
          </tr>
        </tbody>
      </table>
      <t><tt>T</tt> uses the credential registry and <bcp14>MUST</bcp14> match the pending exchange. The
field contains exactly one parameter and <bcp14>MUST NOT</bcp14> be repeated. An empty
<tt>update-T=""</tt> means the Moderator consumed the Credential without replacement.
A nonempty value carries the type's <tt>Update</tt>. Registered credential protocols
<bcp14>MUST</bcp14> define nonempty Update encodings. A missing <tt>Mole-Credential</tt> field carries
no such decision. A Client <bcp14>MUST</bcp14> process <tt>Mole-Credential</tt> whatever the response
status. The credential result does not establish whether the protected
operation completed. Recovery returns this result without another operation
attempt.</t>
      <t>A server sending <tt>Mole-Credential</tt> <bcp14>MUST</bcp14> also send <tt>Cache-Control: no-store</tt>.
A server answering cross-origin requests <bcp14>MUST</bcp14> list <tt>WWW-Authenticate</tt> and
<tt>Mole-Credential</tt> in <tt>Access-Control-Expose-Headers</tt>.</t>
    </section>
    <section anchor="configuration">
      <name>Configuration</name>
      <t>The Anchor and Moderator configurations are defined in <xref target="PROTOCOLS"/>. A Client
stores each Credential with the Moderator and Redeem &amp; Issue endpoint it
came from. A Client that keeps a presentation for recovery also keeps the
HTTP request that carried it.</t>
    </section>
    <section anchor="exchanges">
      <name>Exchanges</name>
      <section anchor="grant">
        <name>Grant</name>
        <artwork><![CDATA[
WWW-Authenticate: Mole endorse-0002=""
]]></artwork>
        <t>The grant endpoint comes from Anchor configuration. The Client sends a POST
with the type-specific grant message as its body. The media type is
<tt>application/mole-endorsement-request</tt> with a required <tt>type</tt> parameter using
the same four-digit hexadecimal encoding. The response uses
<tt>application/mole-endorsement-response</tt> with the same type. There is no outer <tt>EndorsementRequest</tt> or
<tt>EndorsementResponse</tt> wrapper. The first EC-IHAT request carries a
<tt>GrantRequest</tt> naming the number of Endorsements the Client asks for
(<xref target="PROTOCOLS"/>):</t>
        <artwork><![CDATA[
Content-Type: application/mole-endorsement-request; type=0002
]]></artwork>
        <t>The criteria for granting are the Anchor's.</t>
        <t>The Anchor returns 200 (OK) with the response media type only when it produced
a complete grant response. A Client <bcp14>MUST</bcp14> reject a non-success status, an
unexpected media type, a response whose type differs from its request, trailing
bytes, or malformed type-specific content. Clients <bcp14>MUST NOT</bcp14> automatically
redirect a grant POST carrying protocol state.</t>
      </section>
      <section anchor="redeem-issue">
        <name>Redeem &amp; Issue</name>
        <t>The Moderator challenges with the endorsement type:</t>
        <artwork><![CDATA[
WWW-Authenticate: Mole redeem-0002="<redemption-challenge>"
]]></artwork>
        <t>The Client answers with a <tt>POST</tt> to the Redeem &amp; Issue endpoint from
configuration, whichever resource sent the challenge:</t>
        <artwork><![CDATA[
Authorization: Mole redeem-0002="<redemption>",
                    credential-request-0001="<issuance-request>"
]]></artwork>
        <t>On success the Moderator answers <tt>200</tt> with:</t>
        <artwork><![CDATA[
Mole-Credential: response-0001="<issuance-response>"
]]></artwork>
      </section>
      <section anchor="presentation">
        <name>Presentation</name>
        <t>The Moderator challenges with the credential type:</t>
        <artwork><![CDATA[
WWW-Authenticate: Mole challenge-0001="<ec-act-challenge>"
]]></artwork>
        <t>A challenge in a <tt>401</tt> response means the resource requires a presentation.
A challenge in a <tt>200</tt> response means a presentation is optional, for
instance to raise a limit. Clients then apply the greasing rules of
<xref target="PROTOCOLS"/>.</t>
        <t>The Client repeats the protected request with:</t>
        <artwork><![CDATA[
Authorization: Mole presentation-0001="<presentation-and-update>"
]]></artwork>
        <t>The Moderator runs <tt>ProcessPresentation</tt>. Every response to an accepted
presentation, fresh or not, <bcp14>MUST</bcp14> carry the recorded update, including when
the protected operation fails with a <tt>4xx</tt> or <tt>5xx</tt> status:</t>
        <artwork><![CDATA[
Mole-Credential: update-0001="<update>"
]]></artwork>
        <t>For a fresh result the Moderator attempts the protected operation and
returns its status. For a result that is not fresh, it <bcp14>MUST</bcp14> return <tt>409</tt>
(<xref section="15.5.10" sectionFormat="of" target="HTTP"/>) and <bcp14>MUST NOT</bcp14> attempt the protected operation.
A rejected presentation <bcp14>MUST NOT</bcp14> carry <tt>Mole-Credential</tt>.</t>
        <t>A Client that receives no <tt>Mole-Credential</tt> after sending a presentation
keeps its pending state and <bcp14>MAY</bcp14> recover (<xref target="recovery"/>).</t>
        <t>Each credential type <bcp14>MUST</bcp14> define the challenge fields that partition cached
Credentials, or state that its Credentials are not cacheable.</t>
      </section>
      <section anchor="recovery">
        <name>Recovery</name>
        <t>Instead of resending a presentation, a Client <bcp14>MAY</bcp14> send a <tt>POST</tt> with empty
content to the Redeem &amp; Issue endpoint it stored with the Credential:</t>
        <artwork><![CDATA[
Authorization: Mole recovery-0001="<recovery-handle>"
]]></artwork>
        <t>The recovery handle is defined by the credential type in <xref target="PROTOCOLS"/>. The
Moderator treats it as the byte-identical presentation and uses no other
Client identifier. It <bcp14>MUST NOT</bcp14> verify a proof or attempt the protected
operation. If a result is still retained, it answers <tt>200</tt> with the recorded
<tt>update-T</tt>, including the empty value for a recorded <tt>NoUpdate</tt>. Otherwise it
answers <tt>404</tt> without <tt>Mole-Credential</tt>, whether or not a record exists.</t>
      </section>
      <section anchor="status-codes">
        <name>Status Codes</name>
        <table anchor="tab-status">
          <name>Mole responses</name>
          <thead>
            <tr>
              <th align="left">Outcome</th>
              <th align="left">Status</th>
              <th align="left">Mole-Credential</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Malformed request</td>
              <td align="left">
                <tt>400</tt></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">Missing, expired, or invalid authentication</td>
              <td align="left">
                <tt>401</tt></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">Rejected by policy before acceptance</td>
              <td align="left">
                <tt>403</tt></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">Credential issued</td>
              <td align="left">
                <tt>200</tt></td>
              <td align="left">
                <tt>response-T</tt></td>
            </tr>
            <tr>
              <td align="left">Fresh accepted presentation</td>
              <td align="left">protected operation's status</td>
              <td align="left">
                <tt>update-T</tt></td>
            </tr>
            <tr>
              <td align="left">Duplicate presentation with retained result sent to the protected resource</td>
              <td align="left">
                <tt>409</tt></td>
              <td align="left">
                <tt>update-T</tt></td>
            </tr>
            <tr>
              <td align="left">Recovery, result retained</td>
              <td align="left">
                <tt>200</tt></td>
              <td align="left">
                <tt>update-T</tt></td>
            </tr>
            <tr>
              <td align="left">Recovery, result unavailable</td>
              <td align="left">
                <tt>404</tt></td>
              <td align="left">none</td>
            </tr>
          </tbody>
        </table>
        <t>The Moderator <bcp14>MUST</bcp14> use these rules for every credential type. A <tt>401</tt>
response <bcp14>MUST</bcp14> carry a <tt>Mole</tt> challenge for the required exchange. A <tt>403</tt>
returned by the protected operation after a fresh acceptance is that
operation's status, and carries the update.</t>
        <t>A Client <bcp14>MUST NOT</bcp14> infer chain termination from any status without the
recorded empty update.</t>
      </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>Header size limits: request and response field limits a deployment must
provision for the payloads it offers, and the status returned before
acceptance when a payload does not fit. A Moderator must not consume an
Endorsement, or record <tt>NoUpdate</tt>, because a response would be too large.</t>
        </li>
        <li>
          <t>Challenge caching and reuse: when a Client may reuse a cached challenge
(same Moderator, type, key and context, scope), and that reuse never
permits reuse of a spent Credential or Endorsement.</t>
        </li>
        <li>
          <t>Request binding: this document defines no canonical HTTP request
serialization. EC-ACT <tt>request_context</tt> must cover what the Moderator
authorizes, including the body. Reverse flow has no request binding.</t>
        </li>
        <li>
          <t>Recovery: what recovery reveals and its lack of Client authentication
beyond the handle.</t>
        </li>
        <li>
          <t>Grant and issuance recovery: a lost grant or issuance response currently
costs the Client its session or Endorsement. Whether to add recovery for
these exchanges, and how to authenticate a lookup by session ID or
nullifier, is open.</t>
        </li>
      </ol>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="authentication-scheme">
        <name>Authentication Scheme</name>
        <t>This document registers the <tt>Mole</tt> authentication scheme, as defined in
<xref target="http-authentication-scheme"/>, in the "HTTP Authentication Schemes"
registry.</t>
      </section>
      <section anchor="http-field-names">
        <name>HTTP Field Names</name>
        <t>This document registers the <tt>Mole-Credential</tt> field name in the
"Hypertext Transfer Protocol (HTTP) Field Name Registry".</t>
        <t>Endorsement and credential type values are registered in <xref target="PROTOCOLS"/>, not
in this document.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="PROTOCOLS">
          <front>
            <title>MoLE Protocols</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="6" month="July" year="2026"/>
            <abstract>
              <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 three 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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jms-mole-protocols-00"/>
        </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="BASE64">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
      </references>
    </references>
    <?line 362?>

<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-http-transport-01</t>
      <ul spacing="normal">
        <li>
          <t>Select protocol types in parameter names and carry type-specific payloads
directly, removing the outer message wrappers.</t>
        </li>
        <li>
          <t>Separate endorsement redemption from credential issuance parameters and
send Redeem &amp; Issue to the configured endpoint.</t>
        </li>
        <li>
          <t>Add recovery by handle and define status codes for fresh presentations,
duplicates, and recovery. Distinguish an empty update from a missing response.</t>
        </li>
        <li>
          <t>Specify parameter validation, canonical base64url, caching, and CORS rules.</t>
        </li>
        <li>
          <t>Support batched EC-IHAT grants and require a media type
parameter identifying the endorsement type.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA51b/3LcRnL+f55isqqKpfMCImXasTeSznskdVIiiQxJxeVK
pQIsMEvCxAJrDEByTcrPkmfJk+Xrnh8YYFeSz6q68y52MNPTP77+umcYRZFo
i7ZUMzl5d/L2WL6+uDiVF01a6XXdtBORLhaNuvnUr1naqsu62cxkUS1rIfI6
q9IVJsubdNlGv6x0tKpLFV217Tpq3XvR3r7Q3WJVaF3UVbtZ44U3xxevRNWt
FqqZiRzTzkRWV1pVutMz2TadEpDiG3GtNrd1k8+EjOSqzlWTtpiDvqkqrxut
Vqpq6WtXlUV1nS6Ksmg39GDdFDdpthE3quow+yMpL5u6W2Nr86otoldN2uXy
sF6tugpvyL/TjxMaZgSc7PpplRYlflp3i7LIohTzLGmaH2+/ievmkoekTXaF
IaQBPXv6tCx0q2Pz+9M5fitulH56yhM8Hc/zdCIgZdFedQuygN9uVC+jrnrL
+4N2j/ud66dF1aqmUm3EJtA0Qwl16jYQYjWaqXQzBTrUsVk4LurxnE8/a934
ql2VEyHSrr2qGzIURJBy2ZWl8Y3zdNWpUp5nV6XSRXWpGh4AhaRV8RuLNZN/
r+vLUsm3bw/5R2U0rS91/9aPl/QwzurV9hpHqqoKLf8tza41ucfW/O/q34qy
TMPJC9Uuf8z5xegX82LcXW/PfXFVLNKubOU7BX/YKf1hWXf5skwbFS5QtxGv
0doJaHZR1c0Kb93AJSXH10yevTr8YX9/D99Pz04uTg5P3p4jQKKjeKT3dVO3
dVaXWggKv2Cev83Pj7874JkOvjv4Xog4joWIokimCw1LZa0QHNBt2lyqVstF
U99q1chcrct6w/afSl1jI4X5PK8yWBMf0iqX1hPxXVZK5SKtDDJ4H5CQRrZX
SjoR5bLEAph+WVQql4sN/0qxUbQqa7tGQT4oFkPqrKP17VjNA5N32G9iFiG/
wu9FxrqWcAj461TeXhXZlczSpimUFtlVWpYKXqJZ4HWjACUtv6G9cIG386is
UTnNnFpxebOCRl6pFDvWstMQvq1loyByFb4A3asGH2K4hwKyIIaluoMYLMMt
QoknMmrExpXXxRpq92oqKnl/763+8SO0wmZbFXleKgFAeVO1TZ13GcOeGAwe
qIzNu1JapxCApAp1a9VEA1eyvoEPk2pjefg5tWHzoTF22gEC0UwQXB5uK8fq
TdM2/UxRPzDBAPgPYF8YjcfA2m1NQrZdityhu0cA9OqGJqcN0JaOaHDB38nh
lERCkZRRNAD2w/nFZGr+K9+f8Oez4//48Obs+Ig+n7+ev33rPwg74vz1yYe3
R/2n/s3Dk3fvjt8fmZfxVA4eicm7+c8TE1CTk9OLNyfv528nRjWhrWiLcLmF
kgzDsEmLzaZa5EpnTbEwO//b4en//e/+ATTwTwj6Z/v7P8AfzJfv9//lAF9u
YS2zWl2VG/sVVtiIdL1WaUOzwPrwjXXRpiV5v5b6qr6t4P4cn3/5L9LMf8/k
80W23j94aR/QhgcPnc4GD1ln20+2XjZK3PFoxzJem4PnI00P5Z3/PPju9B48
fP5XpEMlo/3v//oS0Xeabso6zQEWWZ0j7xg3cjAq67XNpHrgiwC4kS++ZoeW
azOdiaYsreoKAVSCrazTPKcXU62+O+iaUj6+vzcw/vHjk9hAn0M3YiSRXqus
WBZZP2VeNMDScjPlKKk7SNfBY5jAIEFJimxEz21DBm80xweFAEWhnA/D+ZzD
Wd4/4uQ+jPXIxPpHIX7//XeZpvrmUnwd2X9fyy/88yNpsHiwKUY+fOm9hz7t
yAde7+t/YD37/8LM9Mf/PZg3nhMI//TTT1GgJjUzmvO5Jrp4If/cGo/PAIGA
4n+Wb7TukM2KJWdWlT/5nFT/8D5IC2zpugmYUKkGSG+28fLPrsG68v/kCOJn
slsTvf/zuoLP9VG5ThtwMnJy4maaUjrhWBJdJEQJgFsyuUgk8DRFbrkE+caj
fJD560YEeZxjZdnUq2H8YrKmaFtVESiqu5TCDDyiQ1DVt6rJUk5ZdwjxrFhh
mrwAe0bafQVnxePVuoRRjw+jN6/nF/JxuDwvuHe3t7f37Ank7JlLbnJd0rBr
RDQgMfiNeeaHmGYsNs+yT7M4e4KbmUkG9qVRSSzPIOua6R1wH1wvzTK1bmGf
tdmQ3QR4YFFlSoxVTXBHw6KCy7SCuCeB1rlibiL39+Nnsl5KwwcAYRdexj1R
EAe4ScsiBwodp2BullX47curQNM1AHk9NvlMAD1OvVQP2BAZuNng45ECWhO5
si89iAc4o/8fXkysEeApGB+UUPhmyQUK0FbdtVPw93W78bSRdK05J0qeyBpo
xzwJhTXehTo8s0rMSwFo0HsBWXpgRfXwngxevUcxTPX6i4l/3GtET4DJcwki
D0oH3S+Js6bQaV1kChkH6Qs/0vBWbSlcG+pq4bi4RGGCVNNV1xVRALNpZslX
da3ps9RwFZB9qBmaWhaXncmEsZyHSvELCK1K+Ibe4t4092DxcODO2MQPQmPP
fUr4Sg+FAIRWKGawDF4mD1ruXpb05TTRr0QQMoDJxMtEruiT/tAF9bbj6dDz
Amc5Rign/YJRo37tUKNHh8nQbWgYpYQUEXhmxlgHGiI2v3YaPJpX+QcG2sQ5
aUY8f2OGntlvCLIKdcXArwb7HvlWcpwQcdk2YWNDL4a7QuZQOINZbn1XRYSY
2798Qsx0mAsZB9rb2mm0xyE47Bta+dcOvGeIFbC2AqiQE0gFAKRoaLieMCAE
APxKCxPWjVc2AaehWMSvQ+TdfzGZJDGlHW9q2gfRoojlkXqD7d59Fv/+My1h
PyJ9IPOira+BmkTLfu1qxFAEDRC9jOU5OS1W4OcWe2743QFmd6j0wNWVGL6P
uQFUxEQNX43lu65si3VIVLgAIz0tC1XmALYSWUwMRP8u3u+F5+DEfpuupMBf
r6FmlCSk4gCwHbKUm1h8sLDRG4tskZUdiUSaTcsVZTMIapAmJ9SgxAL5L4uq
omGcuiCmsMHrw478a1nckSwLeJVcgOqWaXZNLw2S83ZKpsyDb9QtUflUVjWV
/tKhHNCeUpnBsMbpWnKV06hfoB6Zd+uS2d84IU5RpN/Bc/qKwHg+tzkhGDMB
FA3biUxPRa8bDxzY9AB82dtDSVA79AVEXzdgzamgXBW8O6XWTFHS/ItNq9jt
vBZMnqva2HV7rEn6EeN2yio1cYzVTWxVDKS9HsP4N7ANtbewuildqXwivVIN
Ou4jgALVHI1paYGDNktsiAbbaM9NcWpS5K5yS56QYMLC6pYy2fHczLH8MEhy
laLsafAeWY5/Es5oHFamMaFS7gbxOyaEyEuhFs5MHCuDEitgwfIVB979I+7j
9VBIELujJ2KaJju6TRSFrc+b5CHaQAWrsQqogakJebCFKg6dLQ71GeJk0ojp
z9iM06cm89gmG0fxeYxNQ1MOAE+kKB80tFDyvu4TVZ+Fxgob5aGLIA/tyCSm
S0mxAk1lZtvEBQxAmF4Sg5owCEgRkILHjginU4ufjVoLC/KcNbsyUKIyexJ+
z5Qp5EqllW3D+ZqVjjM6Cjc2WC+zq9UxKTCM02kMUoLADqA/7Nixy4HvOM3G
lvhyZRMoo28Ps+ymNdHPa97u+xoEeQ6rtp3Q6sk2IKoa5A96JWx1cGm5G6+F
pTOl9Y55bq+wKMUXbcR3+zSgorMEdGBOTX32vKaoBFIjlNNFWegrAgNGHtdj
5kAWfYLIaiq52ESe67g44vaandop3yOZm0GkqPagpzgg1Np60PaueNNcRNEY
cCBkRoyoqVeLkreqkZ2BqEncTwYHQeFI02VNrXUEyoW8Jz1i8ZR0WiSTcd8h
4b70thTMWjNSvFs6Or5bg6xHpvmkE9cS7XkyMGjAmz+arqhrr4bN/iHB1p/v
vXqHELxzbcjCyO1HEUKrjcgftLmuC6pHWpERrBL9D7ythTvJa6XWVI8Mso4D
GTY9m8YMI+7JzTSraTOFo31Fyyo6dv1mfHlke9D3j7irb7pe4hO9IFdUUrUO
JDDNiuBEwG0H/klZg2qZvtgMS6hBNVTltL3Tk/ML4dU27AGa6W27n3JjQYc6
db4xMwF2itQlYpEQg7P59ilnoIDKu1Iksa12n3JlQu8nASxyQcnHGpzxiHFF
zLIGvMsBjJHEhTzD9xclcVmlz120kK8XG+YVACPT50yC6tsXS3Ujhs/9nKYN
asRaFg1cwTVonGs40E1Fwj7gJwXho8glicyZNRGM8Bg2yMqwxjWfOYnHgxB5
MjOedGjYV3TBx8x/xDT/yhp4QT7WO1jWFMwJ2PHZHUhCPjzw8fyVjgfh7RDx
2d6efHzy7096PXszBZ7jjw3gXAS6eZfR2Z/HWuuE7tVxTrCsNaUMFCF7cIIw
wE9EWaCeuVsbqtcvOmUHtLLcXtXaWB9k3jQ3OILI161qeqIrmOhOh0x3GDRb
vNfneHDSmk5TwazLDVik6axDFrNFikR2jg0zdnd4R5shIgzIGMHY/SNbSxb0
1WJsAKw9vfYWGHcqZp/FnaBJ+GLyvC9pIz/1ywCMnGNyCnJnajKhbSWOUn4K
iEnjYtRq4bNXzuqwFVAgo2KQ0TkoOu0GdnWfPyX9y8lU7GoC72icmCL9eWEJ
qXvudn1SSedy45xjdJAgBgzOWDm3+tae+m4vZX5wa8H8YScGxg8T0x8y/qjp
9Xnb961EK5nKIrDYbdPPg2KdDvtkcrC3n4Sx7lirN6Pvrgyza7xjLlbgaK5R
TgZYu9puyogIyt2SDvlMPS2opATnWRVBTLZcI5qWA+dRlF0UdaYXUS/F+Mw3
cHDD0/WQJXp0D4z9xSMRq9nBM9CVyLD+MLZ6wzYdNJCcGiocegQY+7FlpFZb
2H5a2QY8MHXYPlvi2xXhGDjq1GAUY4+1lK2jjCRhl4WgWgy33hPkJVCyj/yD
uzvKlDL5lj4YUP5UHNhCx2pkqAA67kitwJZhj8LNsOqxSXq5iNn6WwKtSxDm
ICXt5wRlK0xNwItNKSXZLMM3M+DZPyQi7MZ9G38b7+8FDblhVWcF+5Rc5PC+
EzHwaT+DsckWK+cCImSrsJiiS1/EW7Y5fLpsg0pjGD/CMFhSiytmOeWYncx/
dnyXupCO+lLn0Z6wjDvpYVU4QGpT7GkjLuheW5iaioqaXPTSmuxqRDAmgWTB
z8w+yEb8Jl0wc8nR0nJKi1ZMId4AC1CmkIV4zzsUQGzAUQpsl2stn7fYl00x
bhP7l1IZfIaLk7wH3sDRP5eubC/dxoD/brrpIRo0o0Z7sXUHamyV7UqK2hR9
BHEXjZyAWD5NQDwnKnKTFMqhc5JjcJ+EODJ3xNzxDo+HnZu+rUhODFmL5YbV
XsMQfcR+qtLG68s+MAsK2KLkiz4p7ZIDczvHDqCr750kIXwxCQo6IEuLAFt9
I9vsu6X0gTLRr3awd5D4An8r0qa+h2CQ1c8t1R3f0WRXPWf4QcmcQ4n3jwwa
RdQi0x+pdXbStVTKyQc38mGr1bd99PjO81GXih5I2j1ql1F7hpto70wrZgpx
1qbjWTfuzHTcM32wmTx4/cyBFdxsXaOk2LiDAZNlOOvye98M3gsEZ66a06Bn
RrZh9w+DXzHQu7Q1dL2HXTD6lQN0OewSYq4j11cfTsPe4rzJuZkOgjvM65a0
PBj4317DAc/UTeQnDjb5hVe6Kr1B7iQ0MwsdBPq7n8lHbbqI7CaDXqbP9dy/
HBIFjj57LuZPWcjdFUPHCCH4eJXMLTx9CDhBun2Q7s6tfSHfd0DnxgFsxu1B
aWdm5szksnvgRYXJFGLbyuYAJGxdGuWGOdFDT1GhoiOx6QacalBgW6ZCJV5a
bZznuIimRo5HAwMUfnYErsq6hi5ro7zWhbvurLEw0Km/Thj0r4a37lishfKN
Ic6rxBzOiWKeHJ2YvgE36OCJ7CRIGfuxtBe9dPGbMlxWz3ycmwMNazXTUjVD
oNf+6q1cdbqlwgdmuOH+an+f1p0OAVbN+b7RMfdGjH56W3K80zyBscyRi2/v
+9bqkjj3PHBKksEkb9O3phIdUwVNDkYki5k9Gk+xbpby6VBQudddSQJBVbUs
6c5xLJ4F102ZIXC+ZwXh7ZmT1LoJHTnxD3SfgYlIcLEAcj0eXgeY2u4B3e5k
H3RXOXQGN33ilMZ0jCblMx9WOXke9xPocU25Ta9JgAAYse1ADbH4hprMxsCL
gnnLbORN7mIu0nB/ZBd2IWlpzUc6lmrE7pZPYkf8j91CYixjiB5104cMm81t
OYvS43xqOoJntFlyQDqyouP1qvYeajcQi4O+cz4z6zR9I/1GMb2jy1bQFR29
kqpcW2GQnEighdrU1kkND4rFt+5qL09iS2m/xIzqwBrimH4LZb5+iPUpxHfD
dztohazWw6Yb1w6K/8BkbC/5kzs8QNWVB1cTlkZ9BoU9RhhfuaLTvTrcG9eq
dX3drQk13VpvjqSZperKkgnW1JS9qmJcejN/P9/CJBCNndcvx1fi3Q22waX4
T9yHT0NwQ5H8mXucH6fuQvaEfXKnLHoi/D0NlpiHmnPM93T+/QeE3XGixEf+
ZnUxeY2YbcjJzd8YUT44dc21x7Tek2BBf91rQgXOp6/yM6s29yfssa8/LBtz
bb4PIMa5wP7lxAJeThacZ3QiXKr8kju9yPmmBazyF5MlwkJxgkeGAOy6kSYn
HbJDlfXl7ne++DdT4i9Ia3wq7VuO5vS5qLYuQrrEuxn1PF0CgYv214UbtUKi
sRhheunuKKG/LEyL26tjw5s//voMZ+psSCA5ZvvDW67vpancRmWZ5XOutWhu
aXKhRmvPw0Bd+HqKtmlLWJv+mJtzvjREZfA3DNRO9Bc49PBmUiyP4BfQQkcH
jGk14BSWhfgDUt/kJrWwbjeBCZik24p1xxWNqUt3RoDDk7Nzd10As5lLdRjd
cpZzZxKMhNpKzESOxPGNcmysX99WdxtfRm3devt/K5Fekvg3AAA=

-->

</rfc>
