<?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.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-rescorla-tigress-http-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="TDCH">Transferring Digital Credentials with HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-rescorla-tigress-http-00"/>
    <author fullname="Eric Rescorla">
      <organization>Windy Hill Systems, LLC</organization>
      <address>
        <email>ekr@rtfm.com</email>
      </address>
    </author>
    <author fullname="Brad Lassey">
      <organization>Google</organization>
      <address>
        <email>lassey@google.com</email>
      </address>
    </author>
    <date year="2023" month="September" day="22"/>
    <area>Applications and Real-Time</area>
    <workgroup>Transfer dIGital cREdentialS Securely</workgroup>
    <abstract>
      <?line 37?>

<t>There are many systems in which people use "digital credentials" to
control real-world systems, such as digital car keys, digital hotel
room keys, etc. In these settings, it is common for one person to want
to transfer their credentials to another, e.g., to share your hotel
key. It is desirable to be able to initiate this transfer with a
single message (e.g., SMS) which kicks off the transfer on the
receiver side. However, in many cases the credential transfer itself
cannot be completed over these channels, e.g., because it is too large
or because it requires multiple round trips. However, the endpoints
cannot speak directly to each other and may not even be online at the
same time. This draft defines a mechanism for providing an appropriate
asynchronous channel using HTTP as a dropbox.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ekr.github.io/draft-rescorla-tigress-http/draft-rescorla-tigress-http.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-rescorla-tigress-http/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Transfer dIGital cREdentialS Securely Working Group mailing list (<eref target="mailto:tigress@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/tigress/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/tigress/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ekr/draft-rescorla-tigress-http"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>DISCLAIMER: This draft is work-in-progress and has not yet seen significant (or
really any) security analysis. It should not be used as a basis for building
production systems.</t>
      <t>There are many systems in which people use "digital credentials" to
control real-world systems, such as digital car keys, digital hotel
room keys, etc. Generally these are proprietary system-specific
credentials are embedded in and used by a (potentially proprietary)
mobile app.  In these settings, it is common for one person to want to
transfer their credentials to another, e.g., to share your hotel key
with a family member.</t>
      <t>Although the credentials and transfer mechanisms are often proprietary
they share a common workflow in which:</t>
      <ol spacing="normal" type="1"><li>The Sender initiates the transfer from their app and sends
an invitation message over a preexisting channel such as
SMS or e-mail.</li>
        <li>Bob receives the invitation message from Alice and hands
it to his app (ideally this would happen automatically,
e.g., by some URL handler).</li>
        <li>Bob uses the invitation message to contact Alice to complete
the transfer. This may require multiple round trips between
Alice and Bob. In addition, Alice or Bob may need to contact
some external server, but this is out of scope for this
protocol.</li>
      </ol>
      <t>The preexisting channel may not be suitable for completing the
transfer, for instance because it has insufficient bandwidth.  or
because it requires manual intervention by the users. In addition,
the participants may not be online simultaneously, so a
"store-and-forward" channel is required. <xref target="I-D.ietf-tigress-requirements"/>
describes the requirements in more detail. This document specifies
how to build such a channel using a standard HTTP <xref target="RFC9110"/> server.</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?>

</section>
    <section anchor="overview-of-operation">
      <name>Overview of Operation</name>
      <t><xref target="fig-overview"/> provides a broad overview of the message flow:</t>
      <figure anchor="fig-overview">
        <name>Overview of Operation</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="488" viewBox="0 0 488 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 128,64 L 480,64" fill="none" stroke="black"/>
              <path d="M 120,80 L 248,80" fill="none" stroke="black"/>
              <path d="M 248,96 L 408,96" fill="none" stroke="black"/>
              <path d="M 248,112 L 384,112" fill="none" stroke="black"/>
              <path d="M 248,128 L 368,128" fill="none" stroke="black"/>
              <path d="M 80,144 L 248,144" fill="none" stroke="black"/>
              <path d="M 8,160 L 208,160" fill="none" stroke="black"/>
              <path d="M 120,176 L 248,176" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="488,64 476,58.4 476,69.6" fill="black" transform="rotate(0,480,64)"/>
              <polygon class="arrowhead" points="256,176 244,170.4 244,181.6" fill="black" transform="rotate(0,248,176)"/>
              <polygon class="arrowhead" points="256,144 244,138.4 244,149.6" fill="black" transform="rotate(0,248,144)"/>
              <polygon class="arrowhead" points="256,128 244,122.4 244,133.6" fill="black" transform="rotate(180,248,128)"/>
              <polygon class="arrowhead" points="256,112 244,106.4 244,117.6" fill="black" transform="rotate(180,248,112)"/>
              <polygon class="arrowhead" points="256,96 244,90.4 244,101.6" fill="black" transform="rotate(180,248,96)"/>
              <polygon class="arrowhead" points="256,80 244,74.4 244,85.6" fill="black" transform="rotate(0,248,80)"/>
              <polygon class="arrowhead" points="16,160 4,154.4 4,165.6" fill="black" transform="rotate(180,8,160)"/>
              <g class="text">
                <text x="24" y="36">Alice</text>
                <text x="228" y="36">HTTP</text>
                <text x="276" y="36">Server</text>
                <text x="472" y="36">Bob</text>
                <text x="44" y="68">Initiating</text>
                <text x="104" y="68">(R)</text>
                <text x="16" y="84">PUT</text>
                <text x="52" y="84">&lt;L0&gt;</text>
                <text x="92" y="84">MSG0</text>
                <text x="432" y="100">GET</text>
                <text x="468" y="100">&lt;L0&gt;</text>
                <text x="420" y="116">DELETE</text>
                <text x="468" y="116">&lt;L0&gt;</text>
                <text x="392" y="132">PUT</text>
                <text x="428" y="132">&lt;L1&gt;</text>
                <text x="468" y="132">MSG1</text>
                <text x="16" y="148">GET</text>
                <text x="52" y="148">&lt;L1&gt;</text>
                <text x="236" y="164">MSG1</text>
                <text x="28" y="180">DELETE</text>
                <text x="84" y="180">&lt;MSG1&gt;</text>
                <text x="248" y="196">...</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
Alice                     HTTP Server                    Bob

Initiating (R) -------------------------------------------->
PUT <L0> MSG0 ---------------->
                              <-------------------- GET <L0>
                              <----------------- DELETE <L0>
                              <--------------- PUT <L1> MSG1
GET <L1> --------------------->
<------------------------- MSG1
DELETE <MSG1> ---------------->
                             ...
]]></artwork>
        </artset>
      </figure>
      <t>In order to initiate the transfer, Alice generates a random secret
value R. She then does the following:</t>
      <ol spacing="normal" type="1"><li>Sends R and the address of the HTTP server to Bob over the
preexisting channel.</li>
        <li>Generates the first protocol message MSG0 and stores it in
a location on the HTTP server (L0) pseudorandomly generated from
R.</li>
      </ol>
      <t>When Bob receives the initiating message, he uses R to determine L0,
retrieves it from the server, and then deletes it. In order to send a
message (MSG1) to Alice, Bob stores it at a new pseudorandom location
L1 (again, based on R). Alice retrieves it and then deletes it. Any
further message exchanges proceed in the same fashion.</t>
    </section>
    <section anchor="architectural-model">
      <name>Architectural Model</name>
      <t>The overall system has the following architecture:</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="144" width="400" viewBox="0 0 400 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,128" fill="none" stroke="black"/>
            <path d="M 392,32 L 392,128" fill="none" stroke="black"/>
            <path d="M 8,32 L 392,32" fill="none" stroke="black"/>
            <path d="M 8,64 L 392,64" fill="none" stroke="black"/>
            <path d="M 8,96 L 392,96" fill="none" stroke="black"/>
            <path d="M 8,128 L 392,128" fill="none" stroke="black"/>
            <g class="text">
              <text x="76" y="52">Credential</text>
              <text x="156" y="52">Exchange</text>
              <text x="228" y="52">Protocol</text>
              <text x="320" y="52">(proprietary)</text>
              <text x="80" y="84">Protected</text>
              <text x="152" y="84">Message</text>
              <text x="212" y="84">Format</text>
              <text x="276" y="84">(Section</text>
              <text x="336" y="84">TODO)</text>
              <text x="116" y="116">HTTP</text>
              <text x="168" y="116">Binding</text>
              <text x="236" y="116">(Section</text>
              <text x="296" y="116">TODO)</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+-----------------------------------------------+
|   Credential Exchange Protocol (proprietary)  |
+-----------------------------------------------+
|    Protected Message Format (Section TODO)    |
+-----------------------------------------------+
|           HTTP Binding (Section TODO)         |
+-----------------------------------------------+
]]></artwork>
      </artset>
      <t>The lowest level of operation is a binding to HTTP specifying
how to use an HTTP server as a store-and-forward channel,
specified in <xref target="http-binding"/>. That channel is then used to carry
encrypted messages in the format defined in <xref target="message-format"/>.
Those messages contain an opaque payload that is used by
the relevant proprietary credential exchange protocol.</t>
    </section>
    <section anchor="initiating-message">
      <name>Initiating Message</name>
      <t>The initiating message needs to contain at least the following three
values:</t>
      <ul spacing="normal">
        <li>A URI template. This <bcp14>MUST</bcp14> contain a single variable, named
"tigress_location". [[TODO: Need to flesh this out some more.]]
This template <bcp14>MUST</bcp14> be for an HTTPS URI.</li>
        <li>A secret value R generated with a cryptographically secure
PRNG <xref target="RFC4086"/> and containing at least 256 bits of
entropy.</li>
        <li>The AEAD algorithm defined using TLS 1.3 cipher suites
<xref section="8.4" sectionFormat="of" target="RFC8446"/>.</li>
      </ul>
      <t>In practice, it will probably contain other information such
as the type of credential to be transferred and perhaps some
human-readable context. These values are out of topic for
this specification.</t>
      <t>The initiating message <bcp14>SHOULD</bcp14> be delivered over a secure
channel but this protocol provides limited security even
when that does not happen (see <xref target="security-considerations"/>).</t>
    </section>
    <section anchor="http-binding">
      <name>HTTP Binding</name>
      <t>The basic concept of the HTTP binding is very simple. In order for
endpoint A to send a message to endpoint B, A does a PUT to a resource
in a predefined secret location. B then does a GET to retrieve the
resource and a DELETE to remove it. Receivers <bcp14>MUST</bcp14> delete
messages immediately after they have retrieved them.</t>
      <t>[[OPEN ISSUE: Polling is bad, so we're going to need some kind
of notification mechanism, but this document doesn't specify
that.]]</t>
      <t>HTTP requests <bcp14>MUST</bcp14> not contain information from other context (e.g.,
browser cookies). [[OPEN ISSUE: Can it contain other authentication
information, for instance for attestation.]]</t>
      <t>The URL for message i is generated as follows, using the
HKDF-Expand-Label function from TLS 1.3 <xref target="RFC8446"/>.</t>
      <artwork><![CDATA[
    U_i = HKDF-Expand-Label(R, "Location",
                            Transcript, 256)
]]></artwork>
      <t>[[OPEN ISSUE: This construction puts some secret information
(the nonces from the previous messages) in the transcript.
Maybe we should instead do a combiner?]]</t>
      <t>Where "Transcript" is the concatenation of the plaintext of all
previous messages and HKDF-Expand-Label uses the hash from the
defined cipher suite.</t>
      <t>The URL is then generated by subsituting the URL-safe base64 encoding
<xref target="RFC4648"/> for the "tigress_location" variable in the URL template.</t>
      <t>[[OPEN ISSUE: What is the media type of the message?]]</t>
      <t>HTTP servers used for this protocol <bcp14>MUST NOT</bcp14> allow enumeration of
resources that match the URL template.</t>
      <t>This protocol operates in a lock-step "ping-pong" fashion.
Each endpoint can send exactly one message and then must
wait for the other side to reply before sending another.
The sender of the credential speaks first.</t>
    </section>
    <section anchor="message-format">
      <name>Message Format</name>
      <t>All messages are encrypted using the AEAD algorithm specified by the
cipher suite, formatted as an O-HTTP "Encapsulated Response" <xref section="4.2" sectionFormat="of" target="I-D.ietf-ohai-ohttp"/>). The "nonce" <bcp14>MUST</bcp14> be pseudorandomly generated.</t>
      <t>The encryption key is generated as follows:</t>
      <artwork><![CDATA[
    K_i = HKDF-Expand-Label(R, "Key",
                            Transcript, 256)
]]></artwork>
      <t>The plaintext of the message is as follows (using TLS syntax):</t>
      <artwork><![CDATA[
struct {
  opaque random<0..255>;
  uint16 message_id;
  opaque message<0..2^32-1>;
} TigressPlaintext;
]]></artwork>
      <t>These fields have the following values:</t>
      <dl>
        <dt>random</dt>
        <dd>
          <t>A cryptographically random field. The first message in each direction
<bcp14>MUST</bcp14> have a random value of at least 16 octets. Subsequent messages
<bcp14>MAY</bcp14> contain random values of at any length.</t>
        </dd>
        <dt>message_id</dt>
        <dd>
          <t>The sequence number of the message, starting from 0 and incrementing
with each message in the exchange. This space is shared and so in practice
even numbers are from the credential sender and odd numbers from the receiver.
[[OPEN ISSUE: Do we need this? It's basically a double check because the
system guarantees uniqueness.]]</t>
        </dd>
        <dt>message</dt>
        <dd>
          <t>The proprietary credential exchange message.</t>
        </dd>
      </dl>
      <t>Upon receiving a message, an endpoint <bcp14>MUST</bcp14> first deprotect it using the
correct key and algorithm. If AEAD deprotection fails, it <bcp14>MUST</bcp14> signal
an error and abort the protocol run.</t>
      <t>Endpoints <bcp14>MUST</bcp14> check that the message_id has the expected value and
that the random values are of the right length must signal an error
and abort the protocol run if they are incorrect.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The protocol is intended to guarantee the following properties:</t>
      <ol spacing="normal" type="1"><li>In order to determine the location of a message, an entity
must know both R and the plaintext of every previous
message.</li>
        <li>In order to decrypt a message, an entity must know both R
and the plaintext of every previous message.</li>
      </ol>
      <t>If R is delivered over a secure channel, then an attacker should not
be able to read any message or inject a new one. Because the HTTP
server sees messages when they are stored it can delete them or
replace them with an invalid message, but because it does not have R
it cannot generate a new valid message or replay an old one. The
result of this attack is to cause the credential exchange to fail.
An attacker other than the server does not know the location of the
resource and therefore cannot even store bogus values. If the</t>
      <t>An attacker who learns R prior to the protocol exchange can simply
impersonate the receiver. This is why R should be sent over
a secure channel. If it is necessary to send R over an insecure
channel then some other mechanism is required to prevent this
attack. [[OPEN ISSUE: this is not great, but it seems to be the
assumed setting based on list discussion.]]</t>
      <t>An attacker who learns R after the receiver has retrieved and
and deleted the first message will not have the random value
from MSG0 and therefore will not be able to determine either
the location and encryption key for MSG1, so cannot forge their
own message to the sender or any future message. Note that
an attacker who learns R after the receiver has retrieved MSG0
but before they have deleted it and replied can race the receiver
to respond. If they win the race, then they will be able to
complete the protocol exchange with the sender and the receiver
will be locked out. This is why it is important for the receiver
to delete MSG0 immediately upon retrieval.</t>
      <t>The reason for including the transcript of all previous
messages in the next key and URL is that it straightforwardly
includes the random values which each side must send in their
first message. It also serves to bind each message to those
that came before it, though this does not have a straightforward
security rationale. Note that if any message is lost, then
the entire exchange fails and so the HTTP server is assumed
to be reliable. This is one reason why the delete is explicit
rather than a side effect, thus avoiding issues where the
retrieval of a message fails but the server thinks it succeeded
and deletes the message.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC9110">
          <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="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>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. 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="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC8446">
          <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="RFC4648">
          <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>
        <reference anchor="I-D.ietf-ohai-ohttp">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="25" month="August" year="2023"/>
            <abstract>
              <t>   This document describes Oblivious HTTP, a protocol for forwarding
   encrypted HTTP messages.  Oblivious HTTP allows a client to make
   multiple requests to an origin server without that server being able
   to link those requests to the client or to identify the requests as
   having come from the same client, while placing only limited trust in
   the nodes used to forward the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ohai-ohttp-10"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.ietf-tigress-requirements">
          <front>
            <title>Transfer Digital Credentials Securely - Requirements</title>
            <author fullname="Dmitry Vinokurov" initials="D." surname="Vinokurov">
              <organization>Apple Inc</organization>
            </author>
            <author fullname="Casey Astiz" initials="C." surname="Astiz">
              <organization>Apple Inc</organization>
            </author>
            <author fullname="Alex Pelletier" initials="A." surname="Pelletier">
              <organization>Apple Inc</organization>
            </author>
            <author fullname="Yogesh Karandikar" initials="Y." surname="Karandikar">
              <organization>Apple Inc</organization>
            </author>
            <author fullname="Bradford Lassey" initials="B." surname="Lassey">
              <organization>Alphabet Inc</organization>
            </author>
            <date day="9" month="August" year="2023"/>
            <abstract>
              <t>   This document describes the use cases necessitating the secure
   transfer of Digital Credentials, residing in a Digital Wallet,
   between two devices and defines general assumptions, requirements and
   the scope for possible solutions to this problem.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tigress-requirements-00"/>
        </reference>
      </references>
    </references>
    <?line 353?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Chris Wood and Martin Thomson for helpful discussions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81a7XIbN5b9j6fAMj8izYi05TjejJLYkSXZVkWyvZJcrlQq
mwK7QRKjZncPgJbM1TjPss8yTzbnXnx0k6KTivfPuqYmYncDuLgf5557gfF4
LLzxlT6QoyurajfT1pp6Lo/N3HhVySOrS117oyonb41fyFdXV29HQk2nVt/Q
oOOjVyNRKK/njV0dSFPPGiHKpqjVEpOWVs382GpXNLZSY2/m+NuNF96344cP
heumS+OcaWq/avH56cnVCym/kFitweSmLnWraxJgtCdHujS+sRCFfpwePsd/
Gou/Lq5ejETdLafaHogSohyIoqmdrl3nDqS3nRYQ9SuhrFaY9bBtKwOJsaqT
qi7lhVbV+Mos9UjcNvZ6bpuuHehDlqcvWRfFxUnUxaW81EVndbUaiRtdd1hR
yj85Tsqw59F7rEkqf0nj6flSmQrPo7J+MNrPJo2d0ytliwVekf7cwYMH9CU9
Mjd6kj57QA8eTG1z6/SDOMcDGguDLropRutr++B3DEPfVtCi84OVMGYSJpiY
5vdG/967ycIvq5EQqvOLBraSYywl5ayrquAuJ9YUMEcYyu+wIVWb/2FrHcj3
8IiVfGWqSl6unNdLtyfPzo74Sx3VBkl/sH62nBTNcnR/iedWlfJMOadXWxZ4
2TTzSq/NV/G3P8z5TZhU1I1dYsQN7C7I4/tfYjweSzV13qrCC3G10FbDahpG
rVfSBaERJfJ2YYqFbHXTVlp2TstRGUOu6ENuJH1DvuxtU0lLbgoHrco0z550
HSZRTuaxysprvcKb9GTReF0J2zTL+EL7YiJPa+kXGqs67T2cD8+Nl8ZJ7G/Z
1BJbkk2tIZ91+OkbeatqL/Bfn7wb440dCktfqbrBc4tVJvPJHj1xC9r9quls
FAVSYH1erNTOWDWFAvDhFHqKf5raYEaPvxf4Kq/I+KOEg7z4bgmvUnMtd8JS
l+eXu1Gp16a4drKZzUjGfnjDexZWFxq2stKZUk/kq+ZW35DEsAnbqFBOOx7Z
762fxHinqxkAr8ZOSWYoDBb0upTNTdAKtFos8F5XLulhqgtFNg469k2DALNz
LaDlwSur/9EZBItcdpU35BdABOCTt6Z1A0lJNqBi25jauySKa7W6htWxPV+t
SItaQRdsDka5pVpJ+hBz1CR4U1cGFlaeteIQHNIDAyfyipTOUQwDzfANUBLa
pj0Zt2TXaG1zY0oCLVVL1eJna8lgQrlVXSxsUzedS1qAd9OXlDjIVRXmbtpp
82ESgmVpyhIhJ76AU8LPy66gUEQkHZ9eHp0dnp6fXBwMZcIfhNJjU4+xLoML
72+BuWl/Kw1laOzRmXltZkD62sudxgqKH2gGNt7FB4Bh4+mXqlbOOHZJt2g6
RFe0LKxSBoGnCl/wxqedqWjfos2SpmCc/P+N9pe61pY3H9yTJAw2017ZJOgY
LlSQwsQwqOlbjdRaltAGdkKqZs1MoTy502JB/hKTD6bcFctmarBXOMdEfibc
kDr+r3BDahABOORMLQ3EXNJ2LMx1WCENdfPFRrAHd8oLZ88Pumhm2PBwqwKj
V3FdlTZEHjqrmttse6SGfQotDQYAQmMzxrl1kJpZmC7sFapjSUBkSkcpCbFm
6hvYmd0u4R/DjoJEWn8wjrSbAy/6C40FPBJZ0mPKahMW5nkzlREMgxBbJmdx
DkGXdIyxKIoh40gKSpJyB0ga3Yujk4JogRdQFFJ9Q8mxoPd7NDQiIlTWAHLe
XZzxrJW2u71Ynfu0SFiXYgTpNQrGDwII0/xDdUYwI+iL4LoVWxHt/haQQcP7
zUIQTpSqBO+EBHvxHdRIMjKeagRCLxCN513pD15bIAtsZxmyp50PysH/Gvzd
zCRITqvZ8+kFDYVT+aZoqoAkWy2aQBzw5DpohhImTREVQJ8Smqf97/FLUzuv
akg+yDWElnjezRDvBn4PjKvLW1P6xYQ4kdiallTdYU/IOrSrmq0yZUwhg1m3
ri2KC9kqC9ubFtHshsLH5OMMmUPVGukC7gHlIb+PHFi+HkOeMaS/VbYc5f1D
fVGcciLv7p6djo+Z+GaaGd8uIZ77+FGAYRTWTKM3DV9yvsc6yHGeQiKmmKbo
6LWMWKidWCCKiZ4Q8seI2shsSpJ+Swgaktzd3X9cvDj62/7+w48fowfApEhw
R00d9RYw5pjSK2vLBZMDrAg6SidH5+8ur6jOof/K12/474uT/3p3enFyTH9f
vjo8O8t/iPjF5as3786O+7/6kUdvzs9PXh+HwXgq1x6J0fnhT3hDUo3evL06
ffP68GxEOvJraiGQC1yNvQAu6jlJZkVzjnh+9PZf/7v/OCri0f7+36CI8OOb
/f98jB+3C12H1eAJq/iTgFQQbCjLmaaiDNdSXkO+gL8iPd/WknIs1PmXn0kz
vxzI76ZFu//4aXxAG157mHS29pB1dv/JvcFBiVsebVkma3Pt+Yam1+U9/Gnt
d9L74OF3zzhOxvvfPHsq2IfewJtujL4lCHmDfKkCW7q7m5n5uIkvoeFA0Zi7
oRZUgZ6mgRQMGeKRppCdfvvtN6mUu5mLgHLb/rF3X7JDb3sNVBTiNOQ1ioud
i105/hP/noq3767kd2cPn8rzy5cP7419KrZKlf99t21S+fIkzPmnB8vjk7OT
q5PPGSzDRvZ5I/siiIBfn9j2VsHDRDw+CUI/7k/yB8JNJhMyrrg7kF8MfURy
3+f70VaHGn0kSyIREFVZr8j67JoS4pzppWdfw6sSlAH8GtAgblTVaXkxkZcL
HloDSSIWz5oKjgc3CcyIWJGTF4F64TXSCDP76KzseQFKSRzKv6ncCpnzXqoM
ZOJlFo3XNNb5nGZzBLCzMdOixOOYmjIXULJqQqMoFo9rcuycPdyVrdNd2YRd
A8iSKkpmTjTHBQR5TzvfQrdypERJ9mRIpaQI7BKZSdslxf/Zwz2UL+Aq+ibI
l2hiJhhRb1CwJiJEH3E6zhYkFonkmqtm8qVdesE23GPx+v2jKlRgN7dr+8va
EGf7ckfNlQFoozai2reWF7uT6A9rkm4V7LBeiVlnuTZNEukPZLk5voCBCh0y
CW+RStOZcgusHPLoIbW8PArdDlWNPG8wdcif5BOUNkJBwyRnzde4fxZH6jXQ
++snQ3D7v7+Kf8K4fXdUnkTx5dvkXjvDekjKf37mGjwhJIZCzqOqXnDDSe5c
6lCBXr05frNLn372GvEfu/dzU3Npf396+blrEP6wgWAGjRCs4B0VxXaTAIeY
HTJVXBpuGSKNWdiKCu5Iw4iTog4axiGX6Pc4Y8KBPZGoHDvU3R33nuNCHz8S
74MqB/ySnZUrXCL2yqLC03VhVy1ZIDqrS74ZWn+xTxIXiN+MwzssgZ03Tvdj
uVrgUhr7V//oiCavKsrRnmSBDLHAFoG0QltUDQ8r9kFrKsXNsHzgZkpGl+g2
wQL3UYerGJfLGBKMLKSc3wgevwDMBkx3CJ6/yEOUb6cSkdZSvzhSaGZheSYZ
u3U3yhqqVvYktWFLIGPqb/+aUGU0kT//TL52IF/HumpWabcIFJSqJq6tiLRP
fvkFM/ByafWw7jSUQ9FDLkm+SZA0ZCQZM9IAqGNzgC3czK1qF6FYDT0iSi9v
L16/jPT18cNvnoBcEajFLTKqJH09+voJfNhT2sI4TZ2cdsUCkOoPTw6PwWrn
jcWSy+w0oYi4OruU+5OvJIolQkWq7jRVhXd3KQy/mTymkGEW/fjxE3IsytEt
dZoZwoG2t9QahyNMoetVtkJoAuZGNfWsUMeIiI50DEETD9udTPFTnrdE8bFj
xCqqesdmEIsO5SDKLVVyEUpLoerlFofTQc2xYRLKXd+0piDjCDZn6jWxOJNP
umZk21Mq0yrq2qY+q0rmSZGbK+yc3jMDrszSkKVz049aoIJqjhBwzEmoMI09
ix2nNfSePh/TYRImCkCFqpIaFV+sYWWQn9qEBWmi0K1fYy4J1yAehF9R3Yty
fZCgSS+ppQtnzfl62PXI75+DeAWhFRNNaoQBJlzT2UILjrqWbBncKzp+irKJ
fD5gYorpMSZIOTu2yMNcbHWVeDB/tYT2OYVfxDZ6DPiQ3UWPj0tEOTFG6rjO
fKBqK2j4pucHTAyWUObPKH1OXsvTy8t3JwfyLQAnKmuqSm4K3Oov4UnzJuYG
brswGFxDsQKahvWyN/Udu0HfJVewtO36y1TgE8QqT3Ai2FDUIUCCipsin0gx
NIweZl8hqKLfx1MIEY7d6HFzbbTbJUgb7u2Ienh+IzDpOIwCL5KrwUob/RuG
Nk8nc8GUJDY5HjXR6F1yFkO66xFOuQjiKKMD2JCRX/14/GJ88qGlnHmmpgih
WVcX/f4SIMW6PSHOb5TLiQe8+9XI7+W9WXYu9uToLEH63u/WJnxSWljT+j2C
zt0w+YY7MMpTCHobG+5t5wMIJd8eaEzsUNDVFIOuZ8kIhxtDRxLJP3dTAvdZ
hIk4VysAza1O5wCkd+AbXCY0dhHF2j4jpb/nRv+ol38UmQNHP5Rex6ohYAAS
lAluggfILeKePBxp9y2S+6Bgsou8HZFCe5grJr0rJBLTewB1W7upM75LLUL6
cOzUjFFLP3kMdCkahrKY6J48/gaJLrQn9ZZknTN60iStnKnAphHfR2ITGg8A
hpx1Bq2IZzkMA7OLPCi1SHtkT40e0iVooa4R2jZpPKOXC+gOvygW2yS8Wpsz
MNHA7Ljuux7D+q0ctVDKuG3q+agvQk7oaC3jcYGgZrjWHxQfvtFRRorFXP8s
O+fFraLiLSo1RD+lloCtLYZO9YyakjRdOF7jjyZsWxdODqLSBumaz/5cKG85
N60XCnTSUQ1cjU50MqPNgLBJT3raHHq8Yuhte5H5RniBAt6M2XKjE/h/67qK
/e5Cu5ZuYox6GiMeTx4xjcmt22ahDP4PtJxSKzOlEQfwKHO6T1XZ0enjbsj+
1EH9BPgdDMDrx98Brx/16vNw62oz1IdtNqpvsihypyd9boVc8GE3SCcCysk7
rB9rg7Dr7x5OJo++/vrpt3jRYYX9J2nmX035bf91fMif//dXj8b7GPFRXoXo
fZuE+zZXZI66IroC/+fUvE74M9UPMogD8I77PDk2B3iaYL7QZ8k7r8NRdDib
Jhdgs/J6uWEUeDnBY+LS2GGDqte7ibwEdlFirvOkTpwf/pTT6HAOFyehA9hK
13O/gJP0qhIHMoQSTYeUGq4NbRhrjxr6lqGSMTd0hwy8jM8OCCW5auBtDbbJ
B/OxHIvVkGtVwcbnA8LAox310zJvF3wgH+QIwZnT1jDEQ+xzx7ws8+f503Sr
YbIBvMdEnuI5FeR5Jk/9ly4w1XAajuzWMYFf6OI6nxDxlYDQRJl3Cvr1Gprt
akNqw4aZesSdR5X+UXkav56Iu4Op/SjEOyBDFDscomTlA00ytrKrBH8qdRs6
IcSgeh5TNJb8iiOf+WpCMNDrWQC1PJLJjTJVOH/muemWgKoErWltEzSspo31
kTjE9GA7qlJO0q2LWOWyzjjLDLwHXpY7T/pDG1o3wb8xucifr3ttOFsOL8x8
4aPzctqIQsokpPi0kNLMAtOm+eCxQTmhJXCZ6p+jtYImnTbGSeiQEuauy1CC
Z/NvYAOZWyNGGB/213uNfePSc8+nyGxo08oe4hDU8i6vayTzKRLeoA+8hqea
i6dEnnhccirxaFMEBqqtC95bLRyu/+GCg9XgWRfhBtPWqjQ3n0Lqp0sy3qvi
mtJnvmMiBjeeqI5myMqn+kT7/05+HfqwoBSo3Pro5LpSxA6Yo+DM+T0WttEH
uDFWctGhUhOW6y7JV2Kw3SL+Do0QvmOgKlP2iqMianAePCiXgeAXIkxND1LW
jTKvTUM74uVW3PeqyrClq1BudlVMmJQmWVXhopTsN7wNU6hFxPcZDgcaDrQK
YVYPOuS91Gz3Tb+8V/XSHIGKxb0xSrMy4TRzOEOIWwYZGr0mwu2ioSxma+rk
AxUb9sm1WM17YPZI/YCVwP/zBZh00JJBPeQSuluxWGHG6ENTpoSeXU9suh4L
Fi7Z1JgGNrCr3Fe4iO5Kxt7oo7DDcnHVxPZ8uvg1OHuniSgqaHW+vRB2vlnt
phsP7BtwcR98yfAFraVLbaYF3Rtz4PBluh/UnypUhpDfuKLja8Kcdz6p6dxo
yJpjIO77DYS/ZN0QBuXgUCh5KTfQsnNvwrTgfJvPi3onycMGMd2joDb0pVhz
Ohq/wVupLqBjGW55RLfDs7kOF4IEnX4P+kF+UBJYBo9ZR+caGabk64YdCRWA
+myV0WZFQADead/GSUqMhzwU3FQtkD/bCCp5UsEYR8VAmSJmBaXVUcPUvfQZ
tliZvSJFut3ziQBi3BooIyF5XjvNR0UdeVXn1wMqRAmCDwmVGu2pPhsKH4GT
TT/sbXWBxbC2VLq5A1d38VYbUnDVlanE6rsNsRPQJ7PNk4WaUlDiNLmqVyF6
MA9xhHjUQcjBy6RrLmvEIlw9ZKrKpWYgFLpO52twrLUQ4JuQdAE/IGeIUkPe
OmS77H+N04HOFHREFx3EeLJlvFfHnbdhulCbwovclQ10RFVDxyU6M0yLmK9q
nA/ewgFFKcH2tDvQu0SzN49suQhjpBEBeyzyN7lZ7xBUu0f7kW/QDNH2eAk6
V5nCeBREfZJRQa96NkO6JsmQHNRNY2LH1wUjaJt6q9FX1uhQFDu0K3POgv7q
az5FdV1BR6J6CF+pm5I4CR36HL4+3MLuhv3PcE02fKmYEdPNVb6JOwU+8PFq
QTmy0uWcb0qBsIdyQ5ffj2bwDE23A66w9Wt2jqOFxQLvmyZUN+dcOUGfzTIF
wUJX7ayrBjiONf8NXEKgKXsyAAA=

-->

</rfc>
