<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.13 -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pauly-dprive-oblivious-doh-07" category="exp" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.2.1 -->
  <front>
    <title abbrev="Oblivious DoH">Oblivious DNS Over HTTPS</title>
    <seriesInfo name="Internet-Draft" value="draft-pauly-dprive-oblivious-doh-07"/>
    <author initials="E." surname="Kinnear" fullname="Eric Kinnear">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>ekinnear@apple.com</email>
      </address>
    </author>
    <author initials="P." surname="McManus" fullname="Patrick McManus">
      <organization>Fastly</organization>
      <address>
        <email>mcmanus@ducksong.com</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="T." surname="Verma" fullname="Tanya Verma">
      <organization>Cloudflare</organization>
      <address>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>vermatanyax@gmail.com</email>
      </address>
    </author>
    <author initials="C.A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2021" month="September" day="02"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes an extension to DNS Over HTTPS (DoH) that allows hiding
client IP addresses via proxying encrypted DNS transactions. This improves privacy of
DNS operations by not allowing any one server entity to be aware of both the client IP
address and the content of DNS queries and answers.</t>
      <t>This experimental extension is developed outside the IETF and is published here to
guide implementation, ensure interoperability among implementations, and enable
wide-scale experimentation.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>DNS Over HTTPS (DoH) <xref target="RFC8484" format="default"/> defines a mechanism to allow DNS messages to be
transmitted in encrypted HTTP messages. This provides improved confidentiality and authentication
for DNS interactions in various circumstances.</t>
      <t>While DoH can prevent eavesdroppers from directly reading the contents of DNS exchanges,
clients cannot send DNS queries and receive answers from servers without revealing
their local IP address, and thus information about the identity or location of the client.</t>
      <t>Proposals such as Oblivious DNS (<xref target="I-D.annee-dprive-oblivious-dns" format="default"/>) increase privacy
by ensuring no single DNS server is aware of both the client IP address and the message
contents.</t>
      <t>This document defines Oblivious DoH, an experimental extension to DoH that permits proxied
resolution, in which DNS messages are encrypted so that no DoH server can independently read
both the client IP address and the DNS message contents.</t>
      <t>This mechanism is intended to be used as one mechanism for resolving privacy-sensitive
content in the broader context of DNS privacy.</t>
      <t>This experimental extension is developed outside the IETF and is published here to
guide implementation, ensure interoperability among implementations, and enable
wide-scale experimentation.</t>
      <section anchor="specification-of-requirements" numbered="true" toc="default">
        <name>Specification of Requirements</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP&nbsp;14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="terminology" numbered="true" toc="default">
      <name>Terminology</name>
      <t>This document defines the following terms:</t>
      <dl newline="false" spacing="normal">
        <dt>Oblivious Server:</dt>
        <dd>
  A DoH server that acts as either an Oblivious Proxy or Oblivious Target.</dd>
        <dt>Oblivious Proxy:</dt>
        <dd>
  An Oblivious Server that proxies encrypted DNS queries and responses between a client and an
Oblivious Target.</dd>
        <dt>Oblivious Target:</dt>
        <dd>
  An Oblivious Server that receives and decrypts encrypted client DNS queries from an Oblivious Proxy,
and returns encrypted DNS responses via that same Proxy. In order to provide DNS responses, the Target
can be a DNS resolver, be co-located with a resolver, or forward to a resolver.</dd>
      </dl>
      <t>Throughout the rest of this document, we use the terms Proxy and Target to refer to an Oblivious
Proxy and Oblivious Target, respectively.</t>
    </section>
    <section anchor="deployment-requirements" numbered="true" toc="default">
      <name>Deployment Requirements</name>
      <t>Oblivious DoH requires, at a minimum:</t>
      <ul spacing="normal">
        <li>Two Oblivious Servers, where one can act as a Proxy, and the other can act as a Target.</li>
        <li>Public keys for encrypting DNS queries that are passed from a client through a Proxy
to a Target (<xref target="publickey" format="default"/>). These keys guarantee that only the intended Target can
decrypt client queries.</li>
      </ul>
      <t>The mechanism for discovering and provisioning the DoH URI Templates and public keys
is out of scope of this document.</t>
    </section>
    <section anchor="http-exchange" numbered="true" toc="default">
      <name>HTTP Exchange</name>
      <t>Unlike direct resolution, oblivious hostname resolution over DoH involves three parties:</t>
      <ol spacing="normal" type="1"><li>The Client, which generates queries.</li>
        <li>The Proxy, which receives encrypted queries from the client and passes them on to a Target.</li>
        <li>The Target, which receives proxied queries from the client via the Proxy and produces proxied
answers.</li>
      </ol>
      <figure anchor="fig-doh-exchange">
        <name>Obvlivious DoH Exchange</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
     --- [ Request encrypted with target public key ] -->
+---------+             +-----------+             +-----------+
| Client  +-------------> Oblivious +-------------> Oblivious |
|         <-------------+   Proxy   <-------------+  Target   |
+---------+             +-----------+             +-----------+
    <-- [   Response encrypted with symmetric key   ] ---
]]></artwork>
      </figure>
      <section anchor="oblivious-request" numbered="true" toc="default">
        <name>HTTP Request</name>
        <t>Oblivious DoH queries are created by the Client, and sent to the Proxy
as an HTTP request using the POST method. Requests to the Proxy indicate
which DoH server to use as a Target by specifying two variables: "targethost",
which indicates the host name of the Target server, and "targetpath", which
indicates the path on which the Target's DoH server is running. See
<xref target="request-example" format="default"/> for an example request.</t>
        <t>Oblivious DoH messages have no cache value since both requests and responses are
encrypted using ephemeral key material. Clients SHOULD indicate this using
the "Cache-Control" header with "no-cache" and "no-store" specified <xref target="RFC7234" format="default"/>.</t>
        <t>Clients MUST set the HTTP Content-Type header to "application/oblivious-dns-message"
to indicate that this request is an Oblivious DoH query intended for proxying. Clients
also SHOULD set this same value for the HTTP Accept header.</t>
        <t>Proxies must check that client requests are correctly encoded, and MUST return a
4xx (Client Error) if the check fails, along with the Proxy-Status response header
with an "error" parameter of type "http_request_error" <xref target="I-D.ietf-httpbis-proxy-status" format="default"/>.
A correctly encoded request has the HTTP Content-Type header "application/oblivious-dns-message",
and HTTP method POST. If the proxy does not operate as a target, then the request
must additionally contain "targethost" and "targetpath" variables.</t>
        <t>Upon receiving a request that contains a "application/oblivious-dns-message" Content-Type,
the DoH server looks for the "targethost" and "targetpath" variables. If the variables are not
present, then it is the target of the query, and it can decrypt the query (<xref target="encryption" format="default"/>).
If the variables are present, then the DoH server is acting as a Proxy.
If it is a proxy, it is expected to send the request on to the Target
using the URI template constructed as "https://targethost/targetpath".</t>
        <t>Note that "targethost" MAY contain a port. Proxies MAY choose to not forward
connections to non-standard ports. In such cases, proxies MUST return a 4xx (Client Error)
response to the client request, along with Proxy-Status response header with an "error"
parameter of type "http_request_error".</t>
        <t>If the proxy cannot establish a connection to "targethost", it MUST return a 502 (Bad Gateway)
response to the client request, along with Proxy-Status response header with an "error" parameter
whose type indicates the reason. For example, if DNS resolution fails, the error type might be
"dns_timeout", whereas if the TLS connection failed the error type might be "tls_protocol_error".
Proxies SHOULD choose an error type that best captures the connection failure.</t>
      </section>
      <section anchor="request-example" numbered="true" toc="default">
        <name>HTTP Request Example</name>
        <t>The following example shows how a client requests that a Proxy, "dnsproxy.example.net",
forwards an encrypted message to "dnstarget.example.net". The URI template for the
Proxy is "https://dnsproxy.example.net/dns-query{?targethost,targetpath}". The URI template for
the Target is "https://dnstarget.example.net/dns-query".</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
:method = POST
:scheme = https
:authority = dnsproxy.example.net
:path = /dns-query?targethost=dnstarget.example.net&targetpath=/dns-query
accept = application/oblivious-dns-message
cache-control = no-cache, no-store
content-type = application/oblivious-dns-message
content-length = 106

<Bytes containing the encrypted payload for an Oblivious DNS query>
]]></artwork>
        <t>The Proxy then sends the following request on to the Target:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
:method = POST
:scheme = https
:authority = dnstarget.example.net
:path = /dns-query
accept = application/oblivious-dns-message
cache-control = no-cache, no-store
content-type = application/oblivious-dns-message
content-length = 106

<Bytes containing the encrypted payload for an Oblivious DNS query>
]]></artwork>
      </section>
      <section anchor="oblivious-response" numbered="true" toc="default">
        <name>HTTP Response</name>
        <t>The response to an Oblivious DoH query is generated by the Target. It MUST set the
Content-Type HTTP header to "application/oblivious-dns-message" for all successful responses.
The body of the response contains an encrypted DNS message; see <xref target="encryption" format="default"/>.</t>
        <t>The response from a Target MUST set the Content-Type HTTP header to "application/oblivious-dns-message" which
MUST be forwarded by the Proxy to the Client. A Client MUST only consider a response which contains the
Content-Type header in the response before processing the payload. A response without the appropriate header MUST be
treated as an error and be handled appropriately. All other aspects of the HTTP response and error handling are
inherited from standard DoH.</t>
        <t>Proxies MUST forward any Target responses with 2xx, 4xx, or 5xx response codes unmodified to the client.
Target responses with 1xx response codes MUST NOT be forwarded to the client.
If a proxy receives a successful response from a target without the "application/oblivious-dns-message"
HTTP Content-Type header, it MUST return a 502 (Bad Gateway) response to the client request, along with
Proxy-Status response header with an "error" parameter of type "http_protocol_error".</t>
        <t>Requests that cannot be processed by the target result in 4xx (Client Error) responses. If the target
and client keys do not match, it is an authorization failure (HTTP status code 401; see Section 3.1
of <xref target="RFC7235" format="default"/>). Otherwise, if the client's request is invalid, such as in the case of decryption
failure, wrong message type, or deserialization failure, this is a bad request (HTTP status code 400;
see Section 6.5.1 of <xref target="RFC7231" format="default"/>).</t>
        <t>Even in case of DNS responses indicating failure, such as SERVFAIL or NXDOMAIN, a successful HTTP response
with a 2xx status code is used as long as the DNS response is valid. This is similar to how DoH <xref target="RFC8484" format="default"/>
handles HTTP response codes.</t>
        <t>In case of server error, the usual HTTP status code 500 (see Section 6.6.1 of <xref target="RFC7231" format="default"/>) applies.</t>
      </section>
      <section anchor="http-response-example" numbered="true" toc="default">
        <name>HTTP Response Example</name>
        <t>The following example shows a 2xx (Successful) response that can be sent from a Target to
a client via a Proxy.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
:status = 200
content-type = application/oblivious-dns-message
content-length = 154

<Bytes containing the encrypted payload for an Oblivious DNS response>
]]></artwork>
      </section>
      <section anchor="http-metadata" numbered="true" toc="default">
        <name>HTTP Metadata</name>
        <t>Proxies forward requests and responses between clients and targets as specified in <xref target="oblivious-request" format="default"/>.
Metadata sent with these messages may inadvertently weaken or remove Oblivious DoH privacy properties.
Proxies MUST NOT send any client-identifying information about clients to targets, such as
"Forwarded" HTTP headers <xref target="RFC7239" format="default"/>. Additionally, clients MUST NOT include any private state in
requests to proxies, such as HTTP cookies. See <xref target="authentication" format="default"/> for related discussion about
client authentication information.</t>
      </section>
    </section>
    <section anchor="publickey" numbered="true" toc="default">
      <name>Configuration and Public Key Format</name>
      <t>In order to use a DoH server as a Target, the client must know a public key to use
for encrypting its queries. The mechanism for discovering this configuration is
out of scope of this document.</t>
      <t>Servers SHOULD rotate public keys regularly. It is RECOMMENDED that servers rotate keys
every day. Shorter rotation windows reduce the anonymity set of clients that might use
the public key, whereas longer rotation windows widen the timeframe of possible compromise.</t>
      <t>An Oblivious DNS public key configuration is a structure encoded, using TLS-style
encoding <xref target="RFC8446" format="default"/>, as follows:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
   uint16 kem_id;
   uint16 kdf_id;
   uint16 aead_id;
   opaque public_key<1..2^16-1>;
} ObliviousDoHConfigContents;

struct {
   uint16 version;
   uint16 length;
   select (ObliviousDoHConfig.version) {
      case 0x0001: ObliviousDoHConfigContents contents;
   }
} ObliviousDoHConfig;

ObliviousDoHConfig ObliviousDoHConfigs<1..2^16-1>;
]]></artwork>
      <t>The <tt>ObliviousDoHConfigs</tt> structure contains one or more <tt>ObliviousDoHConfig</tt> structures in decreasing order of
preference. This allows a server to support multiple versions of Oblivious DoH and multiple sets of Oblivious DoH
parameters.</t>
      <t>An <tt>ObliviousDoHConfig</tt> contains a versioned representation of an Oblivious DoH configuration,
with the following fields.</t>
      <dl newline="false" spacing="normal">
        <dt>version</dt>
        <dd>
  The version of Oblivious DoH for which this configuration is used. Clients MUST ignore any
<tt>ObliviousDoHConfig</tt> structure with a version they do not support. The version of Oblivious DoH
specified in this document is <tt>0x0001</tt>.</dd>
        <dt>length</dt>
        <dd>
  The length, in bytes, of the next field.</dd>
        <dt>contents</dt>
        <dd>
  An opaque byte string whose contents depend on the version. For this
specification, the contents are an <tt>ObliviousDoHConfigContents</tt> structure.</dd>
      </dl>
      <t>An <tt>ObliviousDoHConfigContents</tt> contains the information needed to encrypt a message under
<tt>ObliviousDoHConfigContents.public_key</tt> such that only the owner of the corresponding private
key can decrypt the message. The values for <tt>ObliviousDoHConfigContents.kem_id</tt>,
<tt>ObliviousDoHConfigContents.kdf_id</tt>, and <tt>ObliviousDoHConfigContents.aead_id</tt>
are described in <xref target="I-D.irtf-cfrg-hpke" format="default"/> Section 7. The fields in this structure
are as follows:</t>
      <dl newline="false" spacing="normal">
        <dt>kem_id</dt>
        <dd>
  The HPKE KEM identifier corresponding to <tt>public_key</tt>. Clients MUST ignore any
<tt>ObliviousDoHConfig</tt> structure with a key using a KEM they do not support.</dd>
        <dt>kdf_id</dt>
        <dd>
  The HPKE KDF identifier corresponding to <tt>public_key</tt>. Clients MUST ignore any
<tt>ObliviousDoHConfig</tt> structure with a key using a KDF they do not support.</dd>
        <dt>aead_id</dt>
        <dd>
  The HPKE AEAD identifier corresponding to <tt>public_key</tt>. Clients MUST ignore any
<tt>ObliviousDoHConfig</tt> structure with a key using an AEAD they do not support.</dd>
        <dt>public_key</dt>
        <dd>
  The HPKE public key used by the client to encrypt Oblivious DoH queries.</dd>
      </dl>
    </section>
    <section anchor="encryption" numbered="true" toc="default">
      <name>Protocol Encoding</name>
      <section anchor="message-format" numbered="true" toc="default">
        <name>Message Format</name>
        <t>There are two types of Oblivious DoH messages: Queries (0x01) and Responses (0x02).
Both messages carry the following information:</t>
        <ol spacing="normal" type="1"><li>A DNS message, which is either a Query or Response, depending on context.</li>
          <li>Padding of arbitrary length which MUST contain all zeros.</li>
        </ol>
        <t>They are encoded using the following structure:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
   opaque dns_message<1..2^16-1>;
   opaque padding<0..2^16-1>;
} ObliviousDoHMessagePlaintext;
]]></artwork>
        <t>Both Query and Response messages use the <tt>ObliviousDoHMessagePlaintext</tt> format.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
ObliviousDoHMessagePlaintext ObliviousDoHQuery;
ObliviousDoHMessagePlaintext ObliviousDoHResponse;
]]></artwork>
        <t>An encrypted <tt>ObliviousDoHMessagePlaintext</tt> is carried in a <tt>ObliviousDoHMessage</tt>
message, encoded as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
   uint8  message_type;
   opaque key_id<0..2^16-1>;
   opaque encrypted_message<1..2^16-1>;
} ObliviousDoHMessage;
]]></artwork>
        <t>The <tt>ObliviousDoHMessage</tt> structure contains the following fields:</t>
        <dl newline="false" spacing="normal">
          <dt>message_type</dt>
          <dd>
  A one-byte identifier for the type of message. Query messages use <tt>message_type</tt> 0x01, and Response
messages use <tt>message_type</tt> 0x02.</dd>
          <dt>key_id</dt>
          <dd>
  The identifier of the corresponding <tt>ObliviousDoHConfigContents</tt> key. This is computed as
<tt>Expand(Extract("", config), "odoh key id", Nh)</tt>, where <tt>config</tt> is the ObliviousDoHConfigContents structure
and <tt>Extract</tt>, <tt>Expand</tt>, and <tt>Nh</tt> are as specified by the HPKE cipher suite KDF corresponding to
<tt>config.kdf_id</tt>.</dd>
          <dt>encrypted_message</dt>
          <dd>
  An encrypted message for the Oblivious Target (for Query messages) or client (for Response messages).
Implementations MAY enforce limits on the size of this field depending on the size of plaintext DNS
messages. (DNS queries, for example, will not reach the size limit of 2^16-1 in practice.)</dd>
        </dl>
        <t>The contents of <tt>ObliviousDoHMessage.encrypted_message</tt> depend on <tt>ObliviousDoHMessage.message_type</tt>.
In particular, <tt>ObliviousDoHMessage.encrypted_message</tt> is an encryption of a <tt>ObliviousDoHQuery</tt>
if the message is a Query, and <tt>ObliviousDoHResponse</tt> if the message is a Response.</t>
      </section>
      <section anchor="encryption-and-decryption-routines" numbered="true" toc="default">
        <name>Encryption and Decryption Routines</name>
        <t>Clients use the following utility functions for encrypting a Query and decrypting
a Response as described in <xref target="odoh-client" format="default"/>.</t>
        <t>encrypt_query_body: Encrypt an Oblivious DoH query.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
def encrypt_query_body(pkR, key_id, Q_plain):
  enc, context = SetupBaseS(pkR, "odoh query")
  aad = 0x01 || len(key_id) || key_id
  ct = context.Seal(aad, Q_plain)
  Q_encrypted = enc || ct
  return Q_encrypted
]]></artwork>
        <t>decrypt_response_body: Decrypt an Oblivious DoH response.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
def decrypt_response_body(context, Q_plain, R_encrypted, response_nonce):
  aead_key, aead_nonce = derive_secrets(context, Q_plain, response_nonce)
  aad = 0x02 || len(response_nonce) || response_nonce
  R_plain, error = Open(key, nonce, aad, R_encrypted)
  return R_plain, error
]]></artwork>
        <t>The <tt>derive_secrets</tt> function is described below.</t>
        <t>Targets use the following utility functions in processing queries and producing
responses as described in <xref target="odoh-target" format="default"/>.</t>
        <t>setup_query_context: Set up an HPKE context used for decrypting an Oblivious DoH query.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
def setup_query_context(skR, key_id, Q_encrypted):
  enc || ct = Q_encrypted
  context = SetupBaseR(enc, skR, "odoh query")
  return context
]]></artwork>
        <t>decrypt_query_body: Decrypt an Oblivious DoH query.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
def decrypt_query_body(context, key_id, Q_encrypted):
  aad = 0x01 || len(key_id) || key_id
  enc || ct = Q_encrypted
  Q_plain, error = context.Open(aad, ct)
  return Q_plain, error
]]></artwork>
        <t>derive_secrets: Derive keying material used for encrypting an Oblivious DoH response.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
def derive_secrets(context, Q_plain, response_nonce):
  secret = context.Export("odoh response", Nk)
  salt = Q_plain || len(response_nonce) || response_nonce
  prk = Extract(salt, secret)
  key = Expand(odoh_prk, "odoh key", Nk)
  nonce = Expand(odoh_prk, "odoh nonce", Nn)
  return key, nonce
]]></artwork>
        <t>The <tt>random(N)</tt> function returns <tt>N</tt> cryptographically secure random bytes
from a good source of entropy <xref target="RFC4086" format="default"/>. The <tt>max(A, B)</tt> function returns
<tt>A</tt> if <tt>A &gt; B</tt>, and <tt>B</tt> otherwise.</t>
        <t>encrypt_response_body: Encrypt an Oblivious DoH response.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
def encrypt_response_body(R_plain, aead_key, aead_nonce, response_nonce):
  aad = 0x02 || len(response_nonce) || response_nonce
  R_encrypted = Seal(aead_key, aead_nonce, aad, R_plain)
  return R_encrypted
]]></artwork>
      </section>
    </section>
    <section anchor="odoh-client" numbered="true" toc="default">
      <name>Oblivious Client Behavior</name>
      <t>Let <tt>M</tt> be a DNS message (query) a client wishes to protect with Oblivious DoH.
When sending an Oblivious DoH Query for resolving <tt>M</tt> to an Oblivious Target with
<tt>ObliviousDoHConfigContents</tt> <tt>config</tt>, a client does the following:</t>
      <ol spacing="normal" type="1"><li>Create an <tt>ObliviousDoHQuery</tt> structure, carrying the message M and padding, to produce Q_plain.</li>
        <li>Deserialize <tt>config.public_key</tt> to produce a public key pkR of type <tt>config.kem_id</tt>.</li>
        <li>Compute the encrypted message as <tt>Q_encrypted = encrypt_query_body(pkR, key_id, Q_plain)</tt>,
where <tt>key_id</tt> is as computed in <xref target="encryption" format="default"/>. Note also that <tt>len(key_id)</tt> outputs the length of <tt>key_id</tt>
as a two-byte unsigned integer.</li>
        <li>Output a ObliviousDoHMessage message <tt>Q</tt> where <tt>Q.message_type = 0x01</tt>, <tt>Q.key_id</tt> carries <tt>key_id</tt>,
and <tt>Q.encrypted_message = Q_encrypted</tt>.</li>
      </ol>
      <t>The client then sends <tt>Q</tt> to the Proxy according to <xref target="oblivious-request" format="default"/>.
Once the client receives a response <tt>R</tt>, encrypted as specified in <xref target="odoh-target" format="default"/>,
it uses <tt>decrypt_response_body</tt> to decrypt <tt>R.encrypted_message</tt> (using <tt>R.key_id</tt> as
a nonce) and produce R_plain. Clients MUST validate <tt>R_plain.padding</tt> (as all zeros)
before using <tt>R_plain.dns_message</tt>.</t>
    </section>
    <section anchor="odoh-target" numbered="true" toc="default">
      <name>Oblivious Target Behavior</name>
      <t>Targets that receive a Query message Q decrypt and process it as follows:</t>
      <ol spacing="normal" type="1"><li>Look up the <tt>ObliviousDoHConfigContents</tt> according to <tt>Q.key_id</tt>. If no such key exists,
the Target MAY discard the query, and if so, it MUST return a 400 (Client Error) response
to the Proxy. Otherwise, let <tt>skR</tt> be the private key corresponding to this public key,
or one chosen for trial decryption.</li>
        <li>Compute <tt>context = setup_query_context(skR, Q.key_id, Q.encrypted_message)</tt>.</li>
        <li>Compute <tt>Q_plain, error = decrypt_query_body(context, Q.key_id, Q.encrypted_message)</tt>.</li>
        <li>If no error was returned, and <tt>Q_plain.padding</tt> is valid (all zeros), resolve
<tt>Q_plain.dns_message</tt> as needed, yielding a DNS message M. Otherwise, if an error
was returned or the padding was invalid, return a 400 (Client Error) response to the Proxy.</li>
        <li>Create an <tt>ObliviousDoHResponseBody</tt> structure, carrying the message <tt>M</tt> and padding,
to produce <tt>R_plain</tt>.</li>
        <li>Create a fresh nonce <tt>response_nonce = random(max(Nn, Nk))</tt>.</li>
        <li>Compute <tt>aead_key, aead_nonce = derive_secrets(context, Q_plain, response_nonce)</tt>.</li>
        <li>Compute <tt>R_encrypted = encrypt_response_body(R_plain, aead_key, aead_nonce, response_nonce)</tt>.
The <tt>key_id</tt> field used for encryption carries <tt>response_nonce</tt> in order for clients to
derive the same secrets. Also, the <tt>Seal</tt> function is that which is associated with the
HPKE AEAD.</li>
        <li>Output a <tt>ObliviousDoHMessage</tt> message <tt>R</tt> where <tt>R.message_type = 0x02</tt>,
<tt>R.key_id = response_nonce</tt>, and <tt>R.encrypted_message = R_encrypted</tt>.</li>
      </ol>
      <t>The Target then sends <tt>R</tt> in a 2xx (Successful) response to the Proxy; see <xref target="oblivious-response" format="default"/>.
The Proxy forwards the message <tt>R</tt> without modification back to the client as the HTTP response
to the client's original HTTP request. In the event of an error (non 2xx status code), the
Proxy forwards the Target error to the client; see <xref target="oblivious-response" format="default"/>.</t>
    </section>
    <section anchor="compliance" numbered="true" toc="default">
      <name>Compliance Requirements</name>
      <t>Oblivious DoH uses HPKE for public key encryption <xref target="I-D.irtf-cfrg-hpke" format="default"/>.
In the absence of an application profile standard specifying otherwise, a compliant
Oblivious DoH implementation MUST support the following HPKE cipher suite:</t>
      <ul spacing="normal">
        <li>KEM: DHKEM(X25519, HKDF-SHA256) (see <xref target="I-D.irtf-cfrg-hpke" format="default"/>, Section 7.1)</li>
        <li>KDF: HKDF-SHA256 (see <xref target="I-D.irtf-cfrg-hpke" format="default"/>, Section 7.2)</li>
        <li>AEAD: AES-128-GCM (see <xref target="I-D.irtf-cfrg-hpke" format="default"/>, Section 7.3)</li>
      </ul>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>Oblivious DoH aims to keep knowledge of the true query origin and its contents known to only clients.
As a simplified model, consider a case where there exists two clients C1 and C2, one proxy P, and
one target T. Oblivious DoH assumes an extended Dolev-Yao style attacker which can observe all
network activity and can adaptively compromise either P or T, but not C1 or C2. Once compromised,
the attacker has access to all session information and private key material. (This generalizes to
arbitrarily many clients, proxies, and targets, with the constraints that not all targets and proxies
are simultaneously compromised, and at least two clients are left uncompromised.) The attacker is
prohibited from sending client identifying information, such as IP addresses, to targets. (This would
allow the attacker to trivially link a query to the corresponding client.)</t>
      <t>In this model, both C1 and C2 send an Oblivious DoH queries Q1 and Q2, respectively, through P to T,
and T provides answers A1 and A2. The attacker aims to link C1 to (Q1, A1) and C2 to (Q2, A2), respectively.
The attacker succeeds if this linkability is possible without any additional interaction. (For example,
if T is compromised, it may return a DNS answer corresponding to an entity it controls, and then observe
the subsequent connection from a client, learning its identity in the process. Such attacks are out of
scope for this model.)</t>
      <t>Oblivious DoH security prevents such linkability. Informally, this means:</t>
      <ol spacing="normal" type="1"><li>Queries and answers are known only to clients and targets in possession of the corresponding
response key and HPKE keying material. In particular, proxies know the origin and destination
of an oblivious query, yet do not know the plaintext query. Likewise, targets know only the oblivious
query origin, i.e., the proxy, and the plaintext query. Only the client knows both the plaintext
query contents and destination.</li>
        <li>Target resolvers cannot link queries from the same client in the absence of unique per-client
keys.</li>
      </ol>
      <t>Traffic analysis mitigations are outside the scope of this document. In particular, this document
does not recommend padding lengths for ObliviousDoHQuery and ObliviousDoHResponse messages.
Implementations SHOULD follow the guidance for choosing padding length in <xref target="RFC8467" format="default"/>.</t>
      <t>Oblivious DoH security does not depend on proxy and target indistinguishability. Specifically, an
on-path attacker could determine whether a connection a specific endpoint is used for oblivious or
direct DoH queries. However, this has no effect on confidentiality goals listed above.</t>
      <section anchor="denial-of-service" numbered="true" toc="default">
        <name>Denial of Service</name>
        <t>Malicious clients (or proxies) may send bogus Oblivious DoH queries to targets as a Denial-of-Service
(DoS) attack. Target servers may throttle processing requests if such an event occurs. Additionally,
since Targets provide explicit errors upon decryption failure, i.e., if ciphertext decryption fails
or if the plaintext DNS message is malformed, Proxies may throttle specific clients in response to
these errors.</t>
        <t>Malicious Targets or Proxies may send bogus answers in response to Oblivious DoH queries. Response
decryption failure is a signal that either the proxy or target is misbehaving. Clients can choose to
stop using one or both of these servers in the event of such failure. However, as above, malicious
Targets and Proxies are out of scope for the threat model.</t>
      </section>
      <section anchor="proxy-policies" numbered="true" toc="default">
        <name>Proxy Policies</name>
        <t>Proxies are free to enforce any forwarding policy they desire for clients. For example, they may only
forward requests to known or otherwise trusted targets.</t>
      </section>
      <section anchor="authentication" numbered="true" toc="default">
        <name>Authentication</name>
        <t>Depending on the deployment scenario, Proxies and Targets MAY require authentication before use.
Regardless of the authentication mechanism in place, Proxies MUST NOT reveal any client
authentication information to Targets. This is required so targets cannot uniquely identify
individual clients.</t>
        <t>Note that if Targets require Proxies to authenticate at the HTTP- or application-layer before use,
this SHOULD be done before attempting to forward any client query to the Target. This will allow
Proxies to distinguish 401 Unauthorized response codes due to authentication failure from
401 Unauthorized response codes due to client key mismatch; see <xref target="oblivious-response" format="default"/>.</t>
      </section>
      <section anchor="general-proxy-services" numbered="true" toc="default">
        <name>General Proxy Services</name>
        <t>Using DoH over anonymizing proxy services such as Tor would also achieve the desired goal of separating
query origins from their contents. However, there are several reasons why such systems are undesirable
in comparison Oblivious DoH:</t>
        <ol spacing="normal" type="1"><li>Tor is also meant as a generic connection-level anonymity system, and thus seems overly complex
and costly for the purpose of proxying individual DoH queries. In contrast, Oblivious DoH is a
lightweight extension to standard DoH, implemented as an application-layer proxy, that can be enabled
as a default mode for users which need increased privacy.</li>
          <li>As a one-hop proxy, Oblivious DoH encourages connection-less proxies to mitigate client query correlation
with few round-trips. In contrast, multi-hop systems such as Tor often run secure connections (TLS) end-to-end,
which means that DoH servers could track queries over the same connection. Using a fresh DoH connection
per query would incur a non-negligible penalty in connection setup time.</li>
        </ol>
      </section>
    </section>
    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="oblivious-doh-message-media-type" numbered="true" toc="default">
        <name>Oblivious DoH Message Media Type</name>
        <t>This document registers a new media type, "application/oblivious-dns-message".</t>
        <t>Type name: application</t>
        <t>Subtype name: oblivious-dns-message</t>
        <t>Required parameters: N/A</t>
        <t>Optional parameters: N/A</t>
        <t>Encoding considerations: This is a binary format, containing encrypted DNS
requests and responses, as defined in this document.</t>
        <t>Security considerations: See this document. The content is an encrypted DNS
message, and not executable code.</t>
        <t>Interoperability considerations: This document specifies format of
conforming messages and the interpretation thereof.</t>
        <t>Published specification: This document.</t>
        <t>Applications that use this media type: This media type is intended
to be used by clients wishing to hide their DNS queries when
using DNS over HTTPS.</t>
        <t>Additional information: N/A</t>
        <t>Person and email address to contact for further information: See
Authors' Addresses section</t>
        <t>Intended usage: COMMON</t>
        <t>Restrictions on usage: N/A</t>
        <t>Author: Tommy Pauly <eref target="mailto:tpauly@apple.com">tpauly@apple.com</eref></t>
        <t>Change controller: Tommy Pauly <eref target="mailto:tpauly@apple.com">tpauly@apple.com</eref></t>
        <t>Provisional registration? (standards tree only): No</t>
      </section>
    </section>
    <section anchor="acknowledgments" numbered="true" toc="default">
      <name>Acknowledgments</name>
      <t>This work is inspired by Oblivious DNS <xref target="I-D.annee-dprive-oblivious-dns" format="default"/>. Thanks to all of the
authors of that document. Thanks to
Nafeez Ahamed,
Elliot Briggs,
Marwan Fayed,
Frederic Jacobs,
Tommy Jensen,
Jonathan Hoyland,
Paul Schmitt,
Brian Swander,
Erik Nygren, and
Peter Wu
for the feedback and input.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC8484" target="https://www.rfc-editor.org/info/rfc8484">
          <front>
            <title>DNS Queries over HTTPS (DoH)</title>
            <author initials="P." surname="Hoffman" fullname="P. Hoffman">
              <organization/>
            </author>
            <author initials="P." surname="McManus" fullname="P. McManus">
              <organization/>
            </author>
            <date year="2018" month="October"/>
            <abstract>
              <t>This document defines a protocol for sending DNS queries and getting DNS responses over HTTPS.  Each DNS query-response pair is mapped into an HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8484"/>
          <seriesInfo name="DOI" value="10.17487/RFC8484"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997" month="March"/>
            <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" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization/>
            </author>
            <date year="2017" month="May"/>
            <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="RFC7234" target="https://www.rfc-editor.org/info/rfc7234">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Caching</title>
            <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor">
              <organization/>
            </author>
            <author initials="M." surname="Nottingham" fullname="M. Nottingham" role="editor">
              <organization/>
            </author>
            <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor">
              <organization/>
            </author>
            <date year="2014" month="June"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7234"/>
          <seriesInfo name="DOI" value="10.17487/RFC7234"/>
        </reference>
        <reference anchor="I-D.ietf-httpbis-proxy-status" target="https://www.ietf.org/archive/id/draft-ietf-httpbis-proxy-status-06.txt">
          <front>
            <title>The Proxy-Status HTTP Response Header Field</title>
            <author fullname="Mark Nottingham">
              <organization>Fastly</organization>
            </author>
            <author fullname="Piotr Sikora">
              <organization>Google</organization>
            </author>
            <date month="August" day="16" year="2021"/>
            <abstract>
              <t>   This document defines the Proxy-Status HTTP field to convey the
   details of intermediary response handling, including generated
   errors.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-proxy-status-06"/>
        </reference>
        <reference anchor="RFC7235" target="https://www.rfc-editor.org/info/rfc7235">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Authentication</title>
            <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor">
              <organization/>
            </author>
            <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor">
              <organization/>
            </author>
            <date year="2014" month="June"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypermedia information systems.  This document defines the HTTP Authentication framework.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7235"/>
          <seriesInfo name="DOI" value="10.17487/RFC7235"/>
        </reference>
        <reference anchor="RFC7231" target="https://www.rfc-editor.org/info/rfc7231">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
            <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor">
              <organization/>
            </author>
            <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor">
              <organization/>
            </author>
            <date year="2014" month="June"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7231"/>
          <seriesInfo name="DOI" value="10.17487/RFC7231"/>
        </reference>
        <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization/>
            </author>
            <date year="2018" month="August"/>
            <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="I-D.irtf-cfrg-hpke" target="https://www.ietf.org/archive/id/draft-irtf-cfrg-hpke-12.txt">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard L. Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Karthik Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp">
              <organization>Inria</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date month="September" day="2" year="2021"/>
            <abstract>
              <t>   This document describes a scheme for hybrid public-key encryption
   (HPKE).  This scheme provides a variant of public-key encryption of
   arbitrary-sized plaintexts for a recipient public key.  It also
   includes three authenticated variants, including one which
   authenticates possession of a pre-shared key, and two optional ones
   which authenticate possession of a KEM private key.  HPKE works for
   any combination of an asymmetric key encapsulation mechanism (KEM),
   key derivation function (KDF), and authenticated encryption with
   additional data (AEAD) encryption function.  Some authenticated
   variants may not be supported by all KEMs.  We provide instantiations
   of the scheme using widely used and efficient primitives, such as
   Elliptic Curve Diffie-Hellman key agreement, HKDF, and SHA2.

   This document is a product of the Crypto Forum Research Group (CFRG)
   in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hpke-12"/>
        </reference>
        <reference anchor="RFC4086" target="https://www.rfc-editor.org/info/rfc4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author initials="D." surname="Eastlake 3rd" fullname="D. Eastlake 3rd">
              <organization/>
            </author>
            <author initials="J." surname="Schiller" fullname="J. Schiller">
              <organization/>
            </author>
            <author initials="S." surname="Crocker" fullname="S. Crocker">
              <organization/>
            </author>
            <date year="2005" month="June"/>
            <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="RFC8467" target="https://www.rfc-editor.org/info/rfc8467">
          <front>
            <title>Padding Policies for Extension Mechanisms for DNS (EDNS(0))</title>
            <author initials="A." surname="Mayrhofer" fullname="A. Mayrhofer">
              <organization/>
            </author>
            <date year="2018" month="October"/>
            <abstract>
              <t>RFC 7830 specifies the "Padding" option for Extension Mechanisms for DNS (EDNS(0)) but does not specify the actual padding length for specific applications.  This memo lists the possible options ("padding policies"), discusses the implications of each option, and provides a recommended (experimental) option.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8467"/>
          <seriesInfo name="DOI" value="10.17487/RFC8467"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.annee-dprive-oblivious-dns" target="https://www.ietf.org/archive/id/draft-annee-dprive-oblivious-dns-00.txt">
          <front>
            <title>Oblivious DNS - Strong Privacy for DNS Queries</title>
            <author fullname="Annie Edmundson">
              <organization>Princeton University</organization>
            </author>
            <author fullname="Paul Schmitt">
              <organization>Princeton University</organization>
            </author>
            <author fullname="Nick Feamster">
              <organization>Princeton University</organization>
            </author>
            <author fullname="Allison Mankin">
              <organization>Salesforce</organization>
            </author>
            <date month="July" day="2" year="2018"/>
            <abstract>
              <t>   Recognizing the privacy vulnerabilities associated with DNS queries,
   a number of standards have been developed and services deployed that
   that encrypt a user's DNS queries to the recursive resolver and thus
   obscure them from some network observers and from the user's Internet
   service provider.  However, these systems merely transfer trust to a
   third party.  We argue that no single party should be able to
   associate DNS queries with a client IP address that issues those
   queries.  To this end, this document specifies Oblivious DNS (ODNS),
   which introduces an additional layer of obfuscation between clients
   and their queries.  To accomplish this, ODNS uses its own
   authoritative namespace; the authoritative servers for the ODNS
   namespace act as recursive resolvers for the DNS queries that they
   receive, but they never see the IP addresses for the clients that
   initiated these queries.  The ODNS experimental protocol is
   compatible with existing DNS infrastructure.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-annee-dprive-oblivious-dns-00"/>
        </reference>
        <reference anchor="RFC7239" target="https://www.rfc-editor.org/info/rfc7239">
          <front>
            <title>Forwarded HTTP Extension</title>
            <author initials="A." surname="Petersson" fullname="A. Petersson">
              <organization/>
            </author>
            <author initials="M." surname="Nilsson" fullname="M. Nilsson">
              <organization/>
            </author>
            <date year="2014" month="June"/>
            <abstract>
              <t>This document defines an HTTP extension header field that allows proxy components to disclose information lost in the proxying process, for example, the originating IP address of a request or IP address of the proxy on the user-agent-facing interface.  In a path of proxying components, this makes it possible to arrange it so that each subsequent component will have access to, for example, all IP addresses used in the chain of proxied HTTP requests.</t>
              <t>This document also specifies guidelines for a proxy administrator to anonymize the origin of a request.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7239"/>
          <seriesInfo name="DOI" value="10.17487/RFC7239"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAMj9MGEAA919e3MbyZHn//Up6qiIMxkLYEhamgdnNDZFUpY8elAktbOO
jT2h0CgAHWx0Y/tBEiPLn+U+y32yy1e9GiCH9uyFL3YibEnd1VVZWfn4ZVZW
YTgcqjZvC3ukd95Pivwmr7pGn7671O9vbK1fXV2dX+4oM5nU9uZIRy2qV2pa
ZaVZwpfT2sza4cp0xXo4XdX5jR1WruVwWi2G+9+oqWntkcrg/+dVvT7S9m6l
VL6qj3Rbd017uL//3f6hurbr26qeHunXZWvr0rbDU+xbqaY15fSTKaoSxlvb
Rq3yI/3vbZUNdFPVbW1nDfxtvcS//IdSpmsXVX2ktB7C/7TOy+ZIn430T3lZ
WlPTM6b9rM6z5HFVz4/08WpVWCAiG9GzBgawLcy/tPLq3NTX+mezptdZ3sKM
TrqVrdu8rAb6xBT5rKrL3Ojvnu0fPOVWVVe2OPWPZd7aqb5sgRmNrmb6eGmB
CkOt7NLkBbDnmkn6o8HhRlm1TOdyPtJvs7em7JpoLuemhX6ukzc0nZemaYt1
3P8yW2KTP0677LqpyvnmCFcj6K+Tr7j/q2q5XEdP//9gVUuCdx+jYBr/auul
iadhyrWJntI0Toqqm84KU9tkGgf7BzDt27KxJZIRzeHSlPplbcosb7Lq76f6
BodvkZK7P87x0SbpJyN9PNI/V9U0Iv5kUedNW60WoJ3x23/KJDJz+8eFNau8
nE/ythmBwio1HA61mcDYJoN/XS3yRoOl6Ja2bPXUNlmdT6BDGNjetbZs8qrU
bdUzOXoXDMyebhem1aYoqttGL/IpDKOyIseOXp9rM53WtmmgrxsQnlVd3a2h
gbZlVq9XSDp2CVSUDRACozQjTcTkS2h7A5+hpTLZGuamsGkFMmmooZ6sdVnJ
yNgnLJMGy6MbWyOJQABwD6meWG1ugd3In0nVLoBiqz2JSkiE76f8pgKzBq+g
NY74nx1w1PJrIPPW1s1IOAbmEd4hz0wRMQp5aW9sAbROddW1TT611PPrs6uX
1A+0WHVgfJsFtAAhgdeVmnfYDiZeWOoSZzmAaTQdvM/R1NLkJ3mB8zJLMAi9
1mBdsXdbmklh1S10N2wyA9odEYrtRrz+y3w6hXbqCRryugIrgy+V2rrKnz//
j4uXJ98+/fbply8wvVleIk/00mYLU+bNEhlNS0FMWwJDzRxaEPsVLfAyb3HB
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
OuovC3MAAA==

-->

</rfc>
