<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 4.0.5) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-vasylenko-e2ee-http-00" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="E2EE HTTP">End-to-End Encryption for HTTP APIs Using X25519 and AES-GCM</title>

    <author initials="V." surname="Vasylenko" fullname="Vitaliy Vasylenko">
      <organization></organization>
      <address>
        <email>ietf@vitalvas.com</email>
      </address>
    </author>

    <date year="2026" month="June" day="04"/>

    <area>Security</area>
    
    <keyword>end-to-end encryption</keyword> <keyword>X25519</keyword> <keyword>AES-GCM</keyword> <keyword>HKDF</keyword> <keyword>HTTP API</keyword>

    <abstract>


<?line 60?>

<t>This document specifies an application-layer end-to-end encryption (E2EE)
scheme for HTTP APIs. The scheme uses X25519 Elliptic Curve Diffie-Hellman
(ECDH) for key agreement, HKDF-SHA256 for key derivation, and AES-GCM
(with 128-, 192-, or 256-bit keys) for authenticated encryption of
request and response payloads. Server public keys are discovered through
a Well-Known URI and authenticated either by TLS or by a stronger
out-of-band trust mechanism, depending on the deployment threat model.
The scheme is designed to provide confidentiality and integrity of
payloads independent of, and in addition to, transport-layer security
such as TLS. It provides replay protection and key rotation.</t>



    </abstract>



  </front>

  <middle>


<?line 73?>

<section anchor="introduction"><name>Introduction</name>

<t>Transport Layer Security (TLS) <xref target="RFC8446"/> protects HTTP <xref target="RFC9110"/>
traffic between two endpoints that share a direct connection. In many
modern deployments, however, request and response payloads traverse
intermediaries such as reverse proxies, load balancers, content delivery
networks, and API gateways. Each intermediary terminates TLS and observes
plaintext, which expands the attack surface and weakens the
confidentiality guarantee provided to end users.</t>

<t>This document specifies a payload-level end-to-end encryption (E2EE)
scheme for HTTP APIs. The scheme protects the request and response
payload between the originating client and the terminating application
server. Intermediaries that handle the HTTP message can route, log
metadata, and apply policy. They cannot read or modify the protected
payload when clients authenticate the server key set according to the
deployment threat model described in <xref target="security"/>.</t>

<t>The scheme combines:</t>

<t><list style="symbols">
  <t>X25519 <xref target="RFC7748"/> for Elliptic Curve Diffie-Hellman (ECDH) key
agreement.</t>
  <t>HKDF with SHA-256 <xref target="RFC5869"/> for deriving symmetric keys from the
shared secret.</t>
  <t>AES-GCM <xref target="NIST-SP-800-38D"/> with 128-, 192-, or 256-bit keys for
authenticated encryption of payloads.</t>
  <t>A Well-Known URI <xref target="RFC8615"/> for publishing the server's static or
rotating public key set.</t>
</list></t>

<t>The scheme does not replace TLS; it is intended to be deployed on top of
TLS so that transport metadata such as the Host header and request path
remain protected on the wire.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

<t>This document uses the following terms:</t>

<dl>
  <dt>Client:</dt>
  <dd>
    <t>The party that initiates an HTTP request and that owns an ephemeral
X25519 key pair for the duration of a session.</t>
  </dd>
  <dt>Server:</dt>
  <dd>
    <t>The party that terminates the HTTP request, owns one or more X25519
key pairs whose public components are published, and processes the
decrypted payload.</t>
  </dd>
  <dt>Encryption Key (EK):</dt>
  <dd>
    <t>A direction-specific symmetric key of 128, 192, or 256 bits derived
from the X25519 shared secret using HKDF-SHA256 and used as the
AES-GCM key. The length is determined by the negotiated AEAD
identifier (see <xref target="aead-ids"/>).</t>
  </dd>
  <dt>AEAD Identifier (AEAD):</dt>
  <dd>
    <t>A short string naming the AES-GCM variant in use. One of
<spanx style="verb">"AES-128-GCM"</spanx>, <spanx style="verb">"AES-192-GCM"</spanx>, or <spanx style="verb">"AES-256-GCM"</spanx>.</t>
  </dd>
  <dt>Key Identifier (KID):</dt>
  <dd>
    <t>A short, opaque label that identifies one public key in the server's
published key set.</t>
  </dd>
  <dt>Fingerprint:</dt>
  <dd>
    <t>A base64url-encoded prefix of the SHA-256 hash of a public key,
intended for human-readable verification.</t>
  </dd>
</dl>

</section>
<section anchor="protocol-overview"><name>Protocol Overview</name>

<t>The protocol has three phases: key discovery, key agreement, and
authenticated message exchange.</t>

<figure title="E2EE HTTP message flow"><artwork><![CDATA[
+---------+                                    +---------+
| Client  |                                    | Server  |
+----+----+                                    +----+----+
     |                                              |
     |  GET /.well-known/encryption-keys            |
     |--------------------------------------------->|
     |                                              |
     |  200 OK { keys: [ ... ] }                   |
     |<---------------------------------------------|
     |                                              |
     | generate ephemeral (csk, cpk)                |
     | shared = X25519(csk, server_public_key)      |
     | EK_req, EK_res = HKDF-SHA256(...)            |
     |                                              |
     |  POST /api/v1/resource                       |
     |  E2EE-Session: "<kid>";                     |
     |              aead="AES-256-GCM";            |
     |              epk=:<32B base64>:; ts=<int>;  |
     |              nid="<uuid>"                   |
     |  Content-Type: application/e2ee              |
     |  Body: nonce || ciphertext || tag            |
     |--------------------------------------------->|
     |                                              |
     |                       shared = X25519(...)  |
     |                       EK_req, EK_res = ...   |
     |                       decrypt, process       |
     |                                              |
     |  200 OK                                      |
     |  E2EE-Session: "<kid>";                     |
     |              aead="AES-256-GCM"; ts=<int>   |
     |  Content-Type: application/e2ee              |
     |  Body: nonce || ciphertext || tag            |
     |<---------------------------------------------|
     |                                              |
]]></artwork></figure>

</section>
<section anchor="key-discovery"><name>Key Discovery</name>

<section anchor="well-known-uri"><name>Well-Known URI</name>

<t>A server that supports this scheme <bcp14>MUST</bcp14> publish its public key set at the
Well-Known URI <xref target="RFC8615"/>:</t>

<figure><artwork><![CDATA[
/.well-known/encryption-keys
]]></artwork></figure>

<t>The resource <bcp14>MUST</bcp14> be served over HTTPS and <bcp14>MUST</bcp14> be retrievable with an
HTTP GET request. The response <bcp14>MUST</bcp14> have media type <spanx style="verb">application/json</spanx>.</t>

</section>
<section anchor="key-set-document"><name>Key Set Document</name>

<t>The response body is a JSON object with the following members:</t>

<dl>
  <dt>issuer:</dt>
  <dd>
    <t>A string identifying the server origin. The value <bcp14>MUST</bcp14> be an HTTPS
origin and <bcp14>MUST</bcp14> match the origin from which the key set was retrieved
unless the client has explicit out-of-band configuration allowing
another issuer. <bcp14>REQUIRED</bcp14>.</t>
  </dd>
  <dt>keys:</dt>
  <dd>
    <t>A JSON array of one or more key objects, ordered from most-preferred
to least-preferred. <bcp14>REQUIRED</bcp14>.</t>
  </dd>
</dl>

<t>Each key object has the following members:</t>

<dl>
  <dt>kid:</dt>
  <dd>
    <t>A short opaque string identifying this key within the set. <bcp14>REQUIRED</bcp14>.
KIDs <bcp14>MUST</bcp14> be unique within a single key set. The value <bcp14>MUST</bcp14> contain
between 1 and 128 characters and <bcp14>MUST</bcp14> match the regular expression
<spanx style="verb">^[A-Za-z0-9._~-]+$</spanx>. KID comparison is case-sensitive.</t>
  </dd>
  <dt>alg:</dt>
  <dd>
    <t>The key agreement algorithm. <bcp14>MUST</bcp14> be the string <spanx style="verb">"X25519"</spanx> for this
version of the protocol. <bcp14>REQUIRED</bcp14>.</t>
  </dd>
  <dt>aeads:</dt>
  <dd>
    <t>A non-empty JSON array of AEAD Identifier strings (see <xref target="aead-ids"/>)
that the server is willing to accept under this key, in order of
server preference. <bcp14>REQUIRED</bcp14>.</t>
  </dd>
  <dt>public_key:</dt>
  <dd>
    <t>The 32-byte X25519 public key, base64url-encoded <xref target="RFC4648"/> without
padding. <bcp14>REQUIRED</bcp14>.</t>
  </dd>
  <dt>fingerprint:</dt>
  <dd>
    <t>The base64url-encoded <xref target="RFC4648"/> first 16 bytes of the SHA-256 hash
of the raw 32-byte public key. <bcp14>RECOMMENDED</bcp14>.</t>
  </dd>
  <dt>not_before:</dt>
  <dd>
    <t>An RFC 3339 <xref target="RFC3339"/> <spanx style="verb">date-time</spanx> value before which the key <bcp14>MUST
NOT</bcp14> be used. <bcp14>OPTIONAL</bcp14>.</t>
  </dd>
  <dt>not_after:</dt>
  <dd>
    <t>An RFC 3339 <xref target="RFC3339"/> <spanx style="verb">date-time</spanx> value after which the key <bcp14>MUST
NOT</bcp14> be used. <bcp14>REQUIRED</bcp14>.</t>
  </dd>
  <dt>max_skew:</dt>
  <dd>
    <t>A non-negative integer specifying the maximum acceptable absolute
difference, in seconds, between the request <spanx style="verb">ts</spanx> parameter and the
server clock. This value bounds the timestamp check in addition to
the key validity window and determines the minimum replay-cache
retention period (see <xref target="security"/>). <bcp14>REQUIRED</bcp14>.</t>
  </dd>
</dl>

<t>Clients <bcp14>MUST</bcp14> treat a key object that is missing a required member, has a
member of the wrong JSON type, or contains an invalid <spanx style="verb">public_key</spanx>,
<spanx style="verb">not_before</spanx>, <spanx style="verb">not_after</spanx>, or <spanx style="verb">max_skew</spanx> value as unusable. Clients
<bcp14>MUST</bcp14> treat a key set containing duplicate <spanx style="verb">kid</spanx> values as invalid.</t>

<t>Example:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "issuer": "https://api.example.com",
  "keys": [
    {
      "kid": "2026-06",
      "alg": "X25519",
      "aeads": ["AES-256-GCM", "AES-128-GCM"],
      "public_key": "B6N8vBQgk8i3VdwbEOhstCY3StFqqFPtC9_AsrhtHHw",
      "fingerprint": "qqj_9wO1CyKX9PbhNQj3JA",
      "not_before": "2026-06-09T00:00:00Z",
      "not_after":  "2026-07-09T00:00:00Z",
      "max_skew": 300
    }
  ]
}
]]></sourcecode></figure>

</section>
<section anchor="caching"><name>Caching</name>

<t>Responses <bcp14>SHOULD</bcp14> include a <spanx style="verb">Cache-Control</spanx> header. Clients <bcp14>MAY</bcp14> cache the
key set for up to the duration indicated, but <bcp14>MUST</bcp14> refresh the key set
before using a key whose <spanx style="verb">not_after</spanx> is in the past, and <bcp14>SHOULD</bcp14> refresh
on receipt of a <spanx style="verb">key_unknown</spanx> error (see <xref target="errors"/>).</t>

</section>
<section anchor="out-of-band-trust"><name>Out-of-Band Trust</name>

<t>The integrity of the key set ultimately depends on the integrity of the
channel used to retrieve it. Clients <bcp14>MUST</bcp14> verify the TLS server
certificate of the server hosting the Well-Known URI per <xref target="RFC8446"/> and
<xref target="RFC9325"/>. Clients <bcp14>MUST</bcp14> also verify that the <spanx style="verb">issuer</spanx> value in the key
set matches the HTTPS origin used to retrieve it, unless an out-of-band
configuration explicitly authorizes a different issuer.</t>

<t>If the deployment threat model includes TLS-terminating intermediaries
that are not trusted with plaintext payloads, TLS authentication of the
Well-Known URI is not sufficient to authenticate the encryption keys:
such an intermediary could substitute its own key set. In that threat
model, clients <bcp14>MUST</bcp14> authenticate the key set independently of the TLS
connection by using either a pinned key fingerprint or a verified HTTP
Message Signature whose signing key was distributed out of band; see
<xref target="security"/>.</t>

<t>Servers <bcp14>SHOULD</bcp14> additionally protect the key set response with HTTP
Message Signatures <xref target="RFC9421"/>, signed under a long-lived signing key
distributed out of band, and <bcp14>SHOULD</bcp14> include a <spanx style="verb">Content-Digest</spanx> field
<xref target="RFC9530"/> over the key set body so that the signature covers a
content hash rather than the raw bytes. Clients that have a pinned
signing key <bcp14>MUST</bcp14> reject any key set response whose signature is missing
or invalid.</t>

</section>
</section>
<section anchor="aead-ids"><name>AEAD Identifiers</name>

<t>This document defines three AEAD Identifiers, all based on AES-GCM
<xref target="NIST-SP-800-38D"/>:</t>

<texttable>
      <ttcol align='left'>AEAD Identifier</ttcol>
      <ttcol align='right'>Key length</ttcol>
      <ttcol align='right'>Nonce length</ttcol>
      <ttcol align='right'>Tag length</ttcol>
      <c><spanx style="verb">AES-128-GCM</spanx></c>
      <c>16 octets</c>
      <c>12 octets</c>
      <c>16 octets</c>
      <c><spanx style="verb">AES-192-GCM</spanx></c>
      <c>24 octets</c>
      <c>12 octets</c>
      <c>16 octets</c>
      <c><spanx style="verb">AES-256-GCM</spanx></c>
      <c>32 octets</c>
      <c>12 octets</c>
      <c>16 octets</c>
</texttable>

<t>All three variants share the same nonce and tag length and differ only
in key length. Implementations <bcp14>MUST</bcp14> support <spanx style="verb">AES-128-GCM</spanx> and
<spanx style="verb">AES-256-GCM</spanx>. Support for <spanx style="verb">AES-192-GCM</spanx> is <bcp14>OPTIONAL</bcp14>.</t>

<t>The client selects one AEAD Identifier from the server's <spanx style="verb">aeads</spanx> list
for each session and signals it in the request (see <xref target="headers"/>). The
server <bcp14>MUST</bcp14> reject any request whose AEAD Identifier is not advertised
in the current key set entry for the chosen <spanx style="verb">kid</spanx>.</t>

</section>
<section anchor="key-agreement-and-derivation"><name>Key Agreement and Derivation</name>

<section anchor="sessions"><name>Ephemeral Client Keys and Sessions</name>

<t>A <em>session</em> is a contiguous sequence of requests sent by one client
under a single X25519 key pair <spanx style="verb">(csk, cpk)</spanx>. The client public key
<spanx style="verb">cpk</spanx> is sent on the wire as the <spanx style="verb">epk</spanx> parameter of the <spanx style="verb">E2EE-Session</spanx>
field.</t>

<t>Clients <bcp14>MUST</bcp14> generate <spanx style="verb">(csk, cpk)</spanx> using a cryptographically secure
random number generator. The default session scope is a single
request: clients <bcp14>SHOULD</bcp14> generate a fresh key pair for every request
unless they explicitly opt into a broader scope as described below.</t>

<t>A client <bcp14>MAY</bcp14> reuse one <spanx style="verb">(csk, cpk)</spanx> across multiple requests
provided that all of the following hold:</t>

<t><list style="symbols">
  <t>The reuse is confined to a single logical client instance (one
process, one user, one device).</t>
  <t>The key pair is not persisted to non-volatile storage and is
destroyed on process exit, user logout, or after a deployment-
defined inactivity timeout, whichever comes first.</t>
  <t>The deployment-defined session lifetime does not exceed the
shortest <spanx style="verb">not_after</spanx> of any server key it references.</t>
  <t>The client maintains its own <spanx style="verb">nid</spanx> uniqueness within the session
(see <xref target="security"/>).</t>
</list></t>

<t>Clients <bcp14>MUST NOT</bcp14> reuse <spanx style="verb">(csk, cpk)</spanx> across processes, after restart,
across users on a shared device, or after any event that would
invalidate the client's secure-random state (for example, virtual
machine snapshot restore).</t>

<t>Each unique value of <spanx style="verb">epk</spanx> observed by a server defines, together
with the server <spanx style="verb">kid</spanx>, the scope of replay-cache state for that
client (see <xref target="security"/>). Per-request session scope therefore
minimises both the lifetime of the client private key and the
amount of replay-cache state retained for any one client.</t>

</section>
<section anchor="shared-secret"><name>Shared Secret</name>

<t>The shared secret is computed as:</t>

<figure><artwork><![CDATA[
Z = X25519(csk, server_public_key)
]]></artwork></figure>

<t>per Section 5 of <xref target="RFC7748"/>. Implementations <bcp14>MUST</bcp14> check that <spanx style="verb">Z</spanx> is not
the all-zero value and abort if it is.</t>

</section>
<section anchor="encryption-key-derivation"><name>Encryption Key Derivation</name>

<t>The request encryption key (<spanx style="verb">EK_req</spanx>) and response encryption key
(<spanx style="verb">EK_res</spanx>) are derived from <spanx style="verb">Z</spanx> using HKDF-SHA256 <xref target="RFC5869"/>:</t>

<figure><artwork><![CDATA[
PRK = HKDF-Extract(salt = cpk || server_public_key, IKM = Z)
EK_req = HKDF-Expand(PRK,
                     info = "e2ee/v1:req " || issuer || " "
                            || aead || " " || kid,
                     L    = Nk)
EK_res = HKDF-Expand(PRK,
                     info = "e2ee/v1:res " || issuer || " "
                            || aead || " " || kid,
                     L    = Nk)
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t><spanx style="verb">||</spanx> denotes octet-string concatenation,</t>
  <t><spanx style="verb">cpk</spanx> is the raw 32-byte client public key,</t>
  <t><spanx style="verb">server_public_key</spanx> is the raw 32-byte server public key,</t>
  <t><spanx style="verb">issuer</spanx> is the UTF-8 encoding of the key set <spanx style="verb">issuer</spanx> value,</t>
  <t><spanx style="verb">aead</spanx> is the UTF-8 encoding of the selected AEAD Identifier
(<spanx style="verb">"AES-128-GCM"</spanx>, <spanx style="verb">"AES-192-GCM"</spanx>, or <spanx style="verb">"AES-256-GCM"</spanx>),</t>
  <t><spanx style="verb">kid</spanx> is the UTF-8 encoding of the Key Identifier used,</t>
  <t><spanx style="verb">Nk</spanx> is the key length in octets implied by <spanx style="verb">aead</spanx> (16, 24, or 32).</t>
</list></t>

<t>Binding <spanx style="verb">issuer</spanx>, <spanx style="verb">aead</spanx>, <spanx style="verb">kid</spanx>, and both public keys into the HKDF
inputs binds the derived keys to the specific key agreement transcript
and prevents cross-origin, cross-protocol, cross-key, cross-direction,
or cross-algorithm confusion. Deriving separate request and response
keys prevents an AES-GCM nonce collision in one direction from colliding
with a nonce in the other direction.</t>

</section>
</section>
<section anchor="message-format"><name>Message Format</name>

<section anchor="media-type"><name>Media Type</name>

<t>Protected payloads <bcp14>MUST</bcp14> be sent with the media type <spanx style="verb">application/e2ee</spanx>.
The media type identifies the ciphertext envelope defined by this
document; the plaintext media type, when needed, is carried in the
<spanx style="verb">cty</spanx> parameter of the <spanx style="verb">E2EE-Session</spanx> field (see <xref target="cty"/>).</t>

</section>
<section anchor="wire-format"><name>Wire Format</name>

<t>The body of a protected request or response is the concatenation:</t>

<figure><artwork><![CDATA[
body = nonce || ciphertext || tag
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t><spanx style="verb">nonce</spanx> is 12 octets, generated with a cryptographically secure random
number generator for every message. Nonces <bcp14>MUST NOT</bcp14> be reused with the
same direction-specific EK.</t>
  <t><spanx style="verb">ciphertext</spanx> is the AES-GCM encryption of the inner plaintext using
<spanx style="verb">EK_req</spanx> for requests or <spanx style="verb">EK_res</spanx> for responses and <spanx style="verb">nonce</spanx>, with
additional authenticated data (AAD) as defined in <xref target="aad"/>. The
AES-GCM key length is determined by the selected AEAD Identifier
(see <xref target="aead-ids"/>).</t>
  <t><spanx style="verb">tag</spanx> is the 16-octet AES-GCM authentication tag.</t>
</list></t>

<t>Recipients <bcp14>MUST</bcp14> reject a protected body shorter than 28 octets
(12-octet nonce plus 16-octet tag) as <spanx style="verb">malformed</spanx>.</t>

</section>
<section anchor="interaction-with-content-digest"><name>Interaction with Content-Digest</name>

<t>The AES-GCM tag already provides end-to-end integrity for the
ciphertext, so a <spanx style="verb">Content-Digest</spanx> field <xref target="RFC9530"/> is not required
for integrity. Senders <bcp14>MAY</bcp14> include <spanx style="verb">Content-Digest</spanx> over the raw
ciphertext body for caching, deduplication, or intermediary
integrity checks; in that case the digest <bcp14>MUST</bcp14> be computed over the
exact serialized body (<spanx style="verb">nonce || ciphertext || tag</spanx>). Recipients <bcp14>MUST
NOT</bcp14> treat a present <spanx style="verb">Content-Digest</spanx> as a substitute for AES-GCM tag
verification, and <bcp14>MUST NOT</bcp14> compute or expose a digest over the
decrypted plaintext.</t>

</section>
<section anchor="aad"><name>Additional Authenticated Data</name>

<t>The AAD passed to AES-GCM binds only the cryptographic transcript of
the message. HTTP semantics such as method, target URI, status code,
and selected headers are out of scope for AAD and are bound, when
needed, by HTTP Message Signatures <xref target="RFC9421"/> (see
<xref target="http-binding"/>).</t>

<t>For AAD construction, an <spanx style="verb">E2EE-Session</spanx> field value <bcp14>MUST</bcp14> first be parsed
as a Structured Field Item and then serialized using the deterministic
serialization algorithm for Structured Fields <xref target="RFC9651"/>. The
serialized field value does not include the field name, colon, or
surrounding whitespace. Recipients <bcp14>MUST NOT</bcp14> use the raw field bytes
as received from an HTTP/1.1 connection, because equivalent field values
can have different wire serializations and HTTP/2 and HTTP/3 do not
preserve an HTTP/1.1 header-field line.</t>

<t>For requests, the AAD <bcp14>MUST</bcp14> be the ASCII concatenation:</t>

<figure><artwork><![CDATA[
AAD = "e2ee/v1:req" || " " || encryption-field
]]></artwork></figure>

<t>For responses, the AAD <bcp14>MUST</bcp14> be the ASCII concatenation:</t>

<figure><artwork><![CDATA[
AAD = "e2ee/v1:res" || " " || req-encryption-field
                        || " " || res-encryption-field
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t><spanx style="verb">encryption-field</spanx> is the deterministic serialization of the
request's parsed <spanx style="verb">E2EE-Session</spanx> Structured Field value (see
<xref target="headers"/>),</t>
  <t><spanx style="verb">req-encryption-field</spanx> is the same value as <spanx style="verb">encryption-field</spanx> for
the request that produced this response,</t>
  <t><spanx style="verb">res-encryption-field</spanx> is the deterministic serialization of the
response's own parsed <spanx style="verb">E2EE-Session</spanx> field value.</t>
</list></t>

<t>The leading <spanx style="verb">"e2ee/v1:req"</spanx> / <spanx style="verb">"e2ee/v1:res"</spanx> strings
combine a protocol-version tag with a domain-separation tag. They
prevent a request ciphertext from being accepted as a response (or
vice versa) and isolate this protocol from any other use of
AES-GCM under the same key.</t>

<t>Including both <spanx style="verb">E2EE-Session</spanx> fields in the response AAD authenticates
<spanx style="verb">kid</spanx>, <spanx style="verb">aead</spanx>, <spanx style="verb">epk</spanx>, <spanx style="verb">ts</spanx>, and <spanx style="verb">nid</spanx> from both directions jointly
with the ciphertext, prevents an intermediary from altering any of
them, and prevents response substitution across different requests.</t>

</section>
<section anchor="http-binding"><name>Binding HTTP Semantics</name>

<t>This specification does not bind HTTP semantics (method, target URI,
status code, request or response headers) into the AES-GCM AAD.
Doing so would conflict with the routine behaviour of
TLS-terminating intermediaries that legitimately rewrite request
targets, normalize paths, or add tracing parameters.</t>

<t>Deployments that require an end-to-end binding of HTTP semantics
<bcp14>SHOULD</bcp14> apply HTTP Message Signatures <xref target="RFC9421"/> to requests and
responses, alongside the encryption defined by this document. The
covered-components list <bcp14>SHOULD</bcp14> include at least:</t>

<t><list style="symbols">
  <t>For requests: <spanx style="verb">@method</spanx>, <spanx style="verb">@target-uri</spanx>, the <spanx style="verb">E2EE-Session</spanx> field,
and a <spanx style="verb">Content-Digest</spanx> field <xref target="RFC9530"/> computed over the
ciphertext body.</t>
  <t>For responses: <spanx style="verb">@status</spanx>, the <spanx style="verb">E2EE-Session</spanx> field, and a
<spanx style="verb">Content-Digest</spanx> field over the ciphertext body.</t>
</list></t>

<t>Because <spanx style="verb">Content-Digest</spanx> covers the ciphertext (which already
contains the AES-GCM tag), an RFC 9421 signature over those
components transitively covers the encrypted payload. The signature
key and <spanx style="verb">keyid</spanx> are independent of the X25519 key set defined here
and are managed per <xref target="RFC9421"/>.</t>

<t>A deployment that omits HTTP Message Signatures relies on this
protocol's confidentiality and integrity guarantees only at the
payload layer, and on TLS and application-level checks for HTTP
semantics. This is appropriate when the application cannot be
confused by a redirected ciphertext (for example, when each endpoint
parses a distinct payload schema and rejects unknown shapes).</t>

</section>
</section>
<section anchor="headers"><name>The E2EE-Session Field</name>

<t>All E2EE control metadata is carried in a single HTTP field named
<spanx style="verb">E2EE-Session</spanx>. The field is a Structured Field <xref target="RFC9651"/> whose value
is an Item: a String identifying the server key (<spanx style="verb">kid</spanx>), with named
parameters carrying the remaining metadata.</t>

<section anchor="syntax"><name>Syntax</name>

<t>In the ABNF of <xref target="RFC9651"/>, the field value is an <spanx style="verb">sf-item</spanx>:</t>

<figure><artwork><![CDATA[
E2EE-Session = sf-item
]]></artwork></figure>

<t>The Item value is a String holding the <spanx style="verb">kid</spanx>. The following parameters
are defined:</t>

<texttable>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Request</ttcol>
      <ttcol align='left'>Response</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c>aead</c>
      <c>String</c>
      <c>required</c>
      <c>required</c>
      <c>AEAD Identifier (see <xref target="aead-ids"/>).</c>
      <c>epk</c>
      <c>Byte Sequence</c>
      <c>required</c>
      <c>prohibited</c>
      <c>Client ephemeral X25519 public key.</c>
      <c>ts</c>
      <c>Integer</c>
      <c>required</c>
      <c>required</c>
      <c>Seconds since Unix epoch.</c>
      <c>nid</c>
      <c>String</c>
      <c>required</c>
      <c>required</c>
      <c>Per-message replay identifier (e.g. UUID).</c>
      <c>cty</c>
      <c>String</c>
      <c>optional</c>
      <c>optional</c>
      <c>Media type of the inner plaintext (see <xref target="cty"/>).</c>
</texttable>

<t><spanx style="verb">epk</spanx> is the raw 32-octet X25519 public key carried as a Structured
Fields Byte Sequence (RFC 9651 base64, sf-binary, delimited by <spanx style="verb">:</spanx>),
not base64url. Servers <bcp14>MUST</bcp14> reject any value whose decoded length is
not 32 octets.</t>

<t><spanx style="verb">ts</spanx> <bcp14>MUST</bcp14> be a non-negative Integer.</t>

<t><spanx style="verb">nid</spanx> <bcp14>MUST</bcp14> contain between 1 and 128 characters and <bcp14>MUST</bcp14> match the
regular expression <spanx style="verb">^[A-Za-z0-9._~-]+$</spanx>. <spanx style="verb">nid</spanx> comparison is
case-sensitive.</t>

<t><spanx style="verb">cty</spanx> is <bcp14>OPTIONAL</bcp14> and, when present, <bcp14>MUST</bcp14> be the media type of the
inner plaintext (see <xref target="cty"/>).</t>

<t>Parameters defined by future revisions of this specification or by
extensions <bcp14>MUST</bcp14> use distinct names. Recipients <bcp14>MUST</bcp14> ignore unknown
parameters semantically, but unknown parameters remain part of the
deterministic serialization that is authenticated as AAD. A field value
that contains the same parameter name more than once <bcp14>MUST</bcp14> be rejected as
<spanx style="verb">malformed</spanx>; this check <bcp14>MUST</bcp14> occur before deterministic serialization.
Implementations whose Structured Fields parser cannot report duplicate
parameters <bcp14>MUST</bcp14> use a parser that can for this field.</t>

</section>
<section anchor="cty"><name>Inner Content Type</name>

<t>The plaintext recovered after AES-GCM decryption is opaque to this
specification. To allow recipients to dispatch on its format without
a separate inner header, senders <bcp14>MAY</bcp14> include a <spanx style="verb">cty</spanx> parameter on
the <spanx style="verb">E2EE-Session</spanx> field carrying the inner plaintext's media type as
a String, for example <spanx style="verb">cty="application/json"</spanx> or
<spanx style="verb">cty="application/cbor"</spanx>.</t>

<t>The value <bcp14>MUST</bcp14> be a valid media type per Section 8.3 of <xref target="RFC9110"/>.
Media-type parameters (for example, <spanx style="verb">charset=utf-8</spanx>) <bcp14>MAY</bcp14> be present
in <spanx style="verb">cty</spanx>. Recipients <bcp14>SHOULD</bcp14> treat the absence of <spanx style="verb">cty</spanx> as
"unspecified" and rely on out-of-band knowledge of the endpoint to
interpret the plaintext.</t>

<t>Because <spanx style="verb">cty</spanx> is a parameter of the <spanx style="verb">E2EE-Session</spanx> field, it is
covered by the AES-GCM AAD (see <xref target="aad"/>), so an intermediary cannot
alter the advertised inner media type without invalidating the tag.</t>

<t>The outer HTTP <spanx style="verb">Content-Type</spanx> field, when present, <bcp14>MUST</bcp14> remain
<spanx style="verb">application/e2ee</spanx> (or another media type defined for the ciphertext
envelope); <spanx style="verb">cty</spanx> does not replace it. Recipients that receive both an
outer <spanx style="verb">Content-Type</spanx> of <spanx style="verb">application/e2ee</spanx> and an inner <spanx style="verb">cty</spanx> <bcp14>MUST</bcp14> use
<spanx style="verb">cty</spanx> only for the decrypted plaintext.</t>

</section>
<section anchor="example"><name>Example</name>

<figure><artwork><![CDATA[
E2EE-Session: "2026-06"; \
            aead="AES-256-GCM"; \
            epk=:rUOL+uMfbAk9YdQzklXqeYCSyfrdB7l4J/Swrp3ufBw=:; \
            ts=1781006400; \
            nid="3b1c1c2e-2b6a-4a0d-9b6c-2a9f1b6a0e21"; \
            cty="application/json"
]]></artwork></figure>

<t>(Line folding shown for readability; the field is a single Structured
Field value. AAD construction uses deterministic Structured Fields
serialization, not these presentation line breaks.)</t>

</section>
<section anchor="use-in-requests-and-responses"><name>Use in Requests and Responses</name>

<t>Every request that carries an encrypted payload <bcp14>MUST</bcp14> include exactly
one <spanx style="verb">E2EE-Session</spanx> field with all required parameters. A response that
carries an encrypted payload <bcp14>MUST</bcp14> include an <spanx style="verb">E2EE-Session</spanx> field whose
<spanx style="verb">kid</spanx> Item value and <spanx style="verb">aead</spanx> parameter echo the request. The <spanx style="verb">epk</spanx>
parameter <bcp14>MUST</bcp14> be omitted from responses; the server reuses the
client's ephemeral public key from the request. The <spanx style="verb">ts</spanx> parameter on
a response <bcp14>MUST</bcp14> reflect the server's current time. A response <bcp14>MUST</bcp14> echo
the request's <spanx style="verb">nid</spanx> so that clients can correlate responses and detect
duplicate or substituted responses.</t>

<t>Clients <bcp14>MUST</bcp14> verify that the <spanx style="verb">kid</spanx> Item value and the <spanx style="verb">aead</spanx> and <spanx style="verb">nid</spanx>
parameters of the response <spanx style="verb">E2EE-Session</spanx> field match the values they
sent in the corresponding request, and <bcp14>MUST</bcp14> discard the response
without decrypting it on mismatch. A mismatch indicates either an
in-path attacker or a misconfigured intermediary serving a cached or
cross-routed response. Because the request's <spanx style="verb">E2EE-Session</spanx> field is
included in the response AAD (see <xref target="aad"/>), a mismatch is also
detectable as an AES-GCM tag failure during decryption; the
pre-decryption check is <bcp14>RECOMMENDED</bcp14> to avoid spending a decryption
attempt on an obviously wrong response.</t>

</section>
<section anchor="validation-order"><name>Validation Order</name>

<t>Recipients <bcp14>MUST</bcp14> validate the <spanx style="verb">E2EE-Session</spanx> field before any other
protocol step.</t>

<t>For requests, servers <bcp14>MUST</bcp14> validate in the following order:</t>

<t><list style="numbers" type="1">
  <t>Parse as a Structured Fields Item; reject as <spanx style="verb">malformed</spanx> on
failure.</t>
  <t>Check that the Item value is a String, that all required request
parameters are present, that no parameter prohibited in requests by
<xref target="headers"/> is present, that no parameter name appears more than once,
and that all known parameters have the types defined in <xref target="headers"/>;
reject as <spanx style="verb">malformed</spanx> on failure.</t>
  <t>If <spanx style="verb">cty</spanx> is present, validate it as a media type per Section 8.3 of
<xref target="RFC9110"/>; reject as <spanx style="verb">malformed</spanx> on failure.</t>
  <t>Resolve <spanx style="verb">kid</spanx> against the current key set; reject as <spanx style="verb">key_unknown</spanx>
or <spanx style="verb">key_expired</spanx>.</t>
  <t>Check <spanx style="verb">aead</spanx> against the <spanx style="verb">aeads</spanx> list for that <spanx style="verb">kid</spanx>; reject as
<spanx style="verb">aead_unsupported</spanx>.</t>
  <t>Decode and length-check <spanx style="verb">epk</spanx>; reject as <spanx style="verb">malformed</spanx>.</t>
  <t>Check the protected body length; reject as <spanx style="verb">malformed</spanx> if it is
shorter than 28 octets.</t>
  <t>Check <spanx style="verb">ts</spanx> against the selected key's <spanx style="verb">not_before</spanx>/<spanx style="verb">not_after</spanx>
validity window and <spanx style="verb">max_skew</spanx>; reject as <spanx style="verb">timestamp_skew</spanx> if outside
the window.</t>
  <t>Check <spanx style="verb">nid</spanx> against the replay cache; reject as <spanx style="verb">replay_detected</spanx>
on hit, but do not insert the <spanx style="verb">nid</spanx> yet.</t>
  <t>Derive <spanx style="verb">EK_req</spanx> and attempt AES-GCM decryption; reject as
   <spanx style="verb">decrypt_failed</spanx> on tag failure.</t>
  <t>After successful authentication and before invoking application
   processing, insert the <spanx style="verb">nid</spanx> into the replay cache atomically.</t>
</list></t>

<t>For responses, clients <bcp14>MUST</bcp14> validate in the following order:</t>

<t><list style="numbers" type="1">
  <t>Parse as a Structured Fields Item; reject the response on failure.</t>
  <t>Check that the Item value is a String, that all required response
parameters are present, that <spanx style="verb">epk</spanx> is absent, that no parameter name
appears more than once, and that all parameters known to this
specification have the types defined in <xref target="headers"/>; reject the
response on failure.</t>
  <t>If <spanx style="verb">cty</spanx> is present, validate it as a media type per Section 8.3 of
<xref target="RFC9110"/>; reject the response on failure.</t>
  <t>Check that <spanx style="verb">kid</spanx>, <spanx style="verb">aead</spanx>, and <spanx style="verb">nid</spanx> match the request.</t>
  <t>Check the protected body length; reject the response if it is
shorter than 28 octets.</t>
  <t>Check that <spanx style="verb">ts</spanx> is a non-negative Integer and is acceptable under
local response freshness policy.</t>
  <t>Derive <spanx style="verb">EK_res</spanx> and attempt AES-GCM decryption; reject the response
on tag failure.</t>
</list></t>

</section>
</section>
<section anchor="errors"><name>Error Handling</name>

<t>When a request cannot be processed due to a protocol error, the server
<bcp14>MUST</bcp14> respond with an HTTP error status and a Problem Details object
<xref target="RFC9457"/> serialized as <spanx style="verb">application/problem+json</spanx>. The <spanx style="verb">type</spanx>
member <bcp14>MUST</bcp14> be a URI of the form:</t>

<figure><artwork><![CDATA[
urn:ietf:params:e2ee:error:<code>
]]></artwork></figure>

<t>where <spanx style="verb">&lt;code&gt;</spanx> is one of the codes defined below. The <spanx style="verb">status</spanx> member
<bcp14>MUST</bcp14> equal the HTTP status code of the response. The <spanx style="verb">title</spanx> member
<bcp14>SHOULD</bcp14> be a short, fixed human-readable summary of the code. The
<spanx style="verb">detail</spanx> member, if present, <bcp14>SHOULD</bcp14> describe the specific occurrence
subject to the constraints in <xref target="plaintext-errors"/>.</t>

<t>Example:</t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type":   "urn:ietf:params:e2ee:error:key_unknown",
  "title":  "Key identifier is not recognized",
  "status": 400
}
]]></sourcecode></figure>

<t>The following codes are defined:</t>

<dl>
  <dt>key_unknown:</dt>
  <dd>
    <t>HTTP 400. The <spanx style="verb">kid</spanx> Item value does not match any current key.</t>
  </dd>
  <dt>key_expired:</dt>
  <dd>
    <t>HTTP 400. The referenced key is outside its <spanx style="verb">not_before</spanx>/<spanx style="verb">not_after</spanx>
window.</t>
  </dd>
  <dt>aead_unsupported:</dt>
  <dd>
    <t>HTTP 400. The <spanx style="verb">aead</spanx> parameter is not advertised for the referenced
<spanx style="verb">kid</spanx>, or is not recognized by the server.</t>
  </dd>
  <dt>decrypt_failed:</dt>
  <dd>
    <t>HTTP 400. AES-GCM authentication failed.</t>
  </dd>
  <dt>timestamp_skew:</dt>
  <dd>
    <t>HTTP 400. The <spanx style="verb">ts</spanx> parameter is outside the acceptable window (see
<xref target="security"/>).</t>
  </dd>
  <dt>replay_detected:</dt>
  <dd>
    <t>HTTP 425. The server has already processed a message with this <spanx style="verb">nid</spanx>
within the replay window. The 425 (Too Early) status <xref target="RFC8470"/>
is reused here to signal that the server is unwilling to process a
request that may be a replay.</t>
  </dd>
  <dt>malformed:</dt>
  <dd>
    <t>HTTP 400. The <spanx style="verb">E2EE-Session</spanx> field is missing, not parseable as a
Structured Field Item, missing a required parameter, or has a
parameter of the wrong type or length, or the protected body is too
short to contain a nonce and tag.</t>
  </dd>
</dl>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document requests IANA actions in the following registries.</t>

<section anchor="well-known-uri-1"><name>Well-Known URI</name>

<t>IANA is requested to register the URI suffix <spanx style="verb">encryption-keys</spanx> in the
"Well-Known URIs" registry established by <xref target="RFC8615"/>, with this document
as the reference.</t>

<dl>
  <dt>URI suffix:</dt>
  <dd>
    <t>encryption-keys</t>
  </dd>
  <dt>Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Status:</dt>
  <dd>
    <t>permanent</t>
  </dd>
  <dt>Specification document:</dt>
  <dd>
    <t>This document.</t>
  </dd>
  <dt>Related information:</dt>
  <dd>
    <t>This resource returns a JSON key set used by the protocol defined in
this document.</t>
  </dd>
</dl>

</section>
<section anchor="media-type-1"><name>Media Type</name>

<t>IANA is requested to register the media type <spanx style="verb">application/e2ee</spanx> in the
"Media Types" registry, with this document as the reference and per the
procedures in <xref target="RFC6838"/>.</t>

<dl>
  <dt>Type name:</dt>
  <dd>
    <t>application</t>
  </dd>
  <dt>Subtype name:</dt>
  <dd>
    <t>e2ee</t>
  </dd>
  <dt>Required parameters:</dt>
  <dd>
    <t>N/A</t>
  </dd>
  <dt>Optional parameters:</dt>
  <dd>
    <t>N/A</t>
  </dd>
  <dt>Encoding considerations:</dt>
  <dd>
    <t>binary</t>
  </dd>
  <dt>Security considerations:</dt>
  <dd>
    <t>See <xref target="security"/>.</t>
  </dd>
  <dt>Interoperability considerations:</dt>
  <dd>
    <t>Implementations need to parse the <spanx style="verb">E2EE-Session</spanx> Structured Field and
process the binary <spanx style="verb">nonce || ciphertext || tag</spanx> envelope defined by
this document. Interoperability depends on agreement on the selected
AEAD Identifier, the key set entry referenced by <spanx style="verb">kid</spanx>, and the AAD
construction rules in <xref target="aad"/>.</t>
  </dd>
  <dt>Published specification:</dt>
  <dd>
    <t>This document.</t>
  </dd>
  <dt>Applications that use this media type:</dt>
  <dd>
    <t>HTTP APIs that use the encrypted payload envelope defined by this
document.</t>
  </dd>
  <dt>Fragment identifier considerations:</dt>
  <dd>
    <t>N/A</t>
  </dd>
  <dt>Additional information:</dt>
  <dd>
    <t>Deprecated alias names for this type: N/A
Magic number(s): N/A
File extension(s): N/A
Macintosh file type code(s): N/A</t>
  </dd>
  <dt>Person and email address to contact for further information:</dt>
  <dd>
    <t>See the Authors' Addresses section.</t>
  </dd>
  <dt>Intended usage:</dt>
  <dd>
    <t>LIMITED USE</t>
  </dd>
  <dt>Restrictions on usage:</dt>
  <dd>
    <t>This media type is intended for HTTP request and response payloads that
use the encrypted envelope defined by this document. It is not a
general-purpose stored file format.</t>
  </dd>
  <dt>Author:</dt>
  <dd>
    <t>See the Authors' Addresses section.</t>
  </dd>
  <dt>Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
</dl>

</section>
<section anchor="http-field-names"><name>HTTP Field Names</name>

<t>IANA is requested to register the following entry in the "Hypertext
Transfer Protocol (HTTP) Field Name Registry":</t>

<t><list style="symbols">
  <t>Field name: <spanx style="verb">E2EE-Session</spanx></t>
  <t>Status: permanent</t>
  <t>Structured Type: Item</t>
  <t>Reference: This document</t>
</list></t>

</section>
<section anchor="problem-type-urn-parameter-identifier"><name>Problem Type URN Parameter Identifier</name>

<t>IANA is requested to add the following entry to the "IETF URN
Sub-namespace for Registered Protocol Parameter Identifiers" registry:</t>

<t><list style="symbols">
  <t>Registered Parameter Identifier: <spanx style="verb">e2ee</spanx></t>
  <t>Reference: This document</t>
  <t>IANA Registry Reference: E2EE Error Codes registry, created by this
document</t>
</list></t>

<t>The registration policy for this registry is IETF Review <xref target="RFC8126"/>,
as specified for the <spanx style="verb">urn:ietf:params</spanx> namespace by <xref target="RFC3553"/>.</t>

<t>The template required by <xref target="RFC3553"/> is:</t>

<dl>
  <dt>Registry name:</dt>
  <dd>
    <t>e2ee</t>
  </dd>
  <dt>Specification:</dt>
  <dd>
    <t>This document.</t>
  </dd>
  <dt>Repository:</dt>
  <dd>
    <t>The E2EE Error Codes registry created by this document.</t>
  </dd>
  <dt>Index value:</dt>
  <dd>
    <t>A problem type URI has the form <spanx style="verb">urn:ietf:params:e2ee:error:&lt;code&gt;</spanx>,
where <spanx style="verb">&lt;code&gt;</spanx> is a lowercase ASCII error code registered in the E2EE
Error Codes registry. No transformation or canonicalization is applied.
Comparison is by exact string match.</t>
  </dd>
</dl>

</section>
<section anchor="e2ee-error-codes"><name>E2EE Error Codes</name>

<t>IANA is requested to create the "E2EE Error Codes" registry. The
registration policy is Specification Required <xref target="RFC8126"/>.</t>

<t>Error codes are ASCII strings that <bcp14>MUST</bcp14> contain between 1 and 64
characters and <bcp14>MUST</bcp14> match the regular expression
<spanx style="verb">^[a-z][a-z0-9_]{0,63}$</spanx>. New registrations <bcp14>MUST</bcp14> provide:</t>

<t><list style="symbols">
  <t>Error code</t>
  <t>HTTP status code</t>
  <t>Description</t>
  <t>Reference</t>
</list></t>

<t>The initial contents of the registry are:</t>

<texttable>
      <ttcol align='left'>Error code</ttcol>
      <ttcol align='left'>HTTP status</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>key_unknown</c>
      <c>400</c>
      <c>Key identifier is not recognized.</c>
      <c>This document</c>
      <c>key_expired</c>
      <c>400</c>
      <c>Key identifier is outside its validity.</c>
      <c>This document</c>
      <c>aead_unsupported</c>
      <c>400</c>
      <c>AEAD identifier is not supported.</c>
      <c>This document</c>
      <c>decrypt_failed</c>
      <c>400</c>
      <c>AEAD authentication failed.</c>
      <c>This document</c>
      <c>timestamp_skew</c>
      <c>400</c>
      <c>Timestamp is outside the accepted window.</c>
      <c>This document</c>
      <c>replay_detected</c>
      <c>425</c>
      <c>Replay identifier was already observed.</c>
      <c>This document</c>
      <c>malformed</c>
      <c>400</c>
      <c>Protocol metadata or body is malformed.</c>
      <c>This document</c>
</texttable>

</section>
</section>
<section anchor="security"><name>Security Considerations</name>

<section anchor="threat-model"><name>Threat Model</name>

<t>This scheme is designed to protect the confidentiality and integrity of
request and response payloads against:</t>

<t><list style="symbols">
  <t>Intermediaries that terminate TLS (reverse proxies, CDNs, API
gateways), and</t>
  <t>Passive observers of any plaintext channel between the TLS
terminator and the application backend.</t>
</list></t>

<t>It is not designed to protect HTTP metadata (method, path, headers other
than the protected body, response status) or to defeat traffic analysis.
It does not authenticate the client by itself. Client authentication
<bcp14>MAY</bcp14> be layered on top using the protected payload (for example, bearer
tokens carried inside the ciphertext) or, preferably, by signing the
request with HTTP Message Signatures <xref target="RFC9421"/>; in the latter case
the signature input <bcp14>MUST</bcp14> include the <spanx style="verb">E2EE-Session</spanx> field and the
<spanx style="verb">Content-Digest</spanx> field over the ciphertext body so that the signature
also binds the AAD and ciphertext.</t>

</section>
<section anchor="transport-layer-security"><name>Transport Layer Security</name>

<t>This scheme <bcp14>MUST</bcp14> be used over TLS <xref target="RFC8446"/> configured per current
best practice <xref target="RFC9325"/>. TLS protects request metadata, the Well-Known
key set retrieval, and provides server authentication.</t>

</section>
<section anchor="server-authentication-and-key-trust"><name>Server Authentication and Key Trust</name>

<t>When the TLS endpoint that serves the Well-Known URI is also the
application endpoint trusted with plaintext payloads, the server's
identity is authenticated by the TLS certificate of that host and by the
<spanx style="verb">issuer</spanx> value in the key set.</t>

<t>When TLS-terminating intermediaries are present and are not trusted with
plaintext payloads, TLS authentication alone does not authenticate the
encryption keys end to end. In that deployment, clients <bcp14>MUST</bcp14> verify the
<spanx style="verb">fingerprint</spanx> of any key they use against a value obtained out of band
(for example, distributed with the client software) or <bcp14>MUST</bcp14> verify a
signature over the key set using a signing key distributed out of band.
Mobile and desktop client implementations are <bcp14>RECOMMENDED</bcp14> to pin at
least one fingerprint or signing key.</t>

<t>Where stronger guarantees are required, servers <bcp14>SHOULD</bcp14> sign the key
set with HTTP Message Signatures <xref target="RFC9421"/> and cover the body with
a <spanx style="verb">Content-Digest</spanx> field <xref target="RFC9530"/>. The signing key is necessarily
distributed out of band; clients that pin the signing key obtain key
authenticity that is independent of the Web PKI used by TLS.</t>

</section>
<section anchor="forward-secrecy"><name>Forward Secrecy</name>

<t>The client's key pair is ephemeral, but the server's published key is
static for the lifetime of its key set entry. The scheme therefore
provides forward secrecy only with respect to client-side compromise.
Compromise of a server private key allows decryption of all sessions
that used it.</t>

<t>Operators <bcp14>SHOULD</bcp14> rotate server keys frequently and use short
<spanx style="verb">not_after</spanx> windows. Implementations of this specification <bcp14>SHOULD</bcp14>
publish at least two overlapping keys in the key set to enable
seamless rotation.</t>

<t>A future revision of this protocol <bcp14>MAY</bcp14> define a mode in which the
server returns a fresh ephemeral public key on first contact, providing
full perfect forward secrecy at the cost of an additional round trip.</t>

</section>
<section anchor="replay-protection"><name>Replay Protection</name>

<t>Servers <bcp14>MUST</bcp14> validate the <spanx style="verb">ts</spanx> parameter against the key validity
window for the referenced <spanx style="verb">kid</spanx>: any <spanx style="verb">ts</spanx> before <spanx style="verb">not_before</spanx>, when
present, or after <spanx style="verb">not_after</spanx> <bcp14>MUST</bcp14> be rejected (<spanx style="verb">timestamp_skew</spanx>).
Servers <bcp14>MUST</bcp14> also reject any <spanx style="verb">ts</spanx> whose absolute difference from the
server clock exceeds the key set entry's <spanx style="verb">max_skew</spanx> value
(<spanx style="verb">timestamp_skew</spanx>).</t>

<t>Servers <bcp14>SHOULD</bcp14> publish a <spanx style="verb">max_skew</spanx> value no larger than the maximum
retry interval they are willing to support; a value of 300 seconds is
<bcp14>RECOMMENDED</bcp14> unless the deployment has stricter clock synchronization or
longer retry requirements.</t>

<t>Clients <bcp14>MUST</bcp14> read <spanx style="verb">max_skew</spanx> from the selected key set entry and account
for it when scheduling retries. A retry sent with a fresh <spanx style="verb">nid</spanx> after
the original request's timestamp has aged beyond <spanx style="verb">max_skew</spanx> is expected
to fail timestamp validation.</t>

<t>Servers <bcp14>MUST</bcp14> maintain a cache of recently seen <spanx style="verb">nid</spanx> values, keyed
by <spanx style="verb">(kid, epk)</spanx>, for at least <spanx style="verb">max_skew</spanx> plus a small tolerance for
processing latency and clock granularity. A repeated <spanx style="verb">nid</spanx> <bcp14>MUST</bcp14> result
in <spanx style="verb">replay_detected</spanx>.
Clients <bcp14>MUST</bcp14> generate a fresh, unpredictable <spanx style="verb">nid</spanx> for every
request; a version 4 UUID or any 128-bit value drawn from a
cryptographically secure random number generator is sufficient.</t>

<t>Servers <bcp14>MUST NOT</bcp14> insert a <spanx style="verb">nid</spanx> into the replay cache until the
request has been authenticated successfully by AES-GCM. Inserting a
<spanx style="verb">nid</spanx> before tag verification would allow an attacker to poison the
replay cache with unauthenticated requests. Servers <bcp14>MUST</bcp14> insert the
<spanx style="verb">nid</spanx> atomically after successful authentication and before application
side effects occur; if another request with the same <spanx style="verb">(kid, epk, nid)</spanx>
wins that atomic insertion, the later request <bcp14>MUST</bcp14> fail with
<spanx style="verb">replay_detected</spanx>.</t>

<t>The <spanx style="verb">nid</spanx> parameter is an anti-replay identifier and is not an
application idempotency key. The two have opposite behavior on a cache
hit: a duplicate <spanx style="verb">nid</spanx> <bcp14>MUST</bcp14> cause the server to reject the request,
whereas a duplicate application idempotency key is normally expected to
cause the server to return the stored response of the original request.
Applications that require both fault-tolerant retries and end-to-end
replay protection <bcp14>MUST</bcp14> use distinct values for the two purposes. An
application idempotency key, if used, <bcp14>SHOULD</bcp14> be carried inside the
encrypted payload so that the application sees it but intermediaries do
not, and so that it is bound to the request by the AES-GCM tag.</t>

<t>The 12-byte AES-GCM nonce is independently random per message and <bcp14>MUST
NOT</bcp14> be reused under the same direction-specific EK.</t>

</section>
<section anchor="plaintext-errors"><name>Plaintext Error Responses</name>

<t>Error responses defined in <xref target="errors"/> are sent as Problem Details
<xref target="RFC9457"/> in plaintext and are therefore visible to any
TLS-terminating intermediary. Error responses do not carry encrypted
application payloads and do not require an <spanx style="verb">E2EE-Session</spanx> field; some
errors occur before the request <spanx style="verb">E2EE-Session</spanx> field can be parsed safely.</t>

<t>Operators <bcp14>MUST</bcp14> treat error metadata as observable to intermediaries.
In particular:</t>

<t><list style="symbols">
  <t>The <spanx style="verb">detail</spanx> and <spanx style="verb">instance</spanx> members of the Problem Details object
<bcp14>MUST NOT</bcp14> contain user identifiers, request contents, stack traces,
or any value derived from the decrypted plaintext.</t>
  <t>The <spanx style="verb">title</spanx> member <bcp14>SHOULD</bcp14> be a fixed string per error code and
<bcp14>MUST NOT</bcp14> vary with request content.</t>
  <t>Extension members defined by future revisions or by deployments
<bcp14>MUST</bcp14> be subject to the same constraints.</t>
  <t>Error <spanx style="verb">type</spanx> URIs <bcp14>SHOULD</bcp14> be chosen from the fixed set in
<xref target="errors"/>; application-specific error information <bcp14>SHOULD</bcp14> instead
be returned as an encrypted payload with an appropriate HTTP
status.</t>
  <t>The presence of <spanx style="verb">decrypt_failed</spanx> or <spanx style="verb">replay_detected</spanx> reveals to
an observer that an attack or a stale retry occurred; this is
considered acceptable as it aids defenders more than attackers.</t>
</list></t>

<t>Successful responses <bcp14>MUST</bcp14> carry their application payload encrypted
under this specification; servers <bcp14>MUST NOT</bcp14> fall back to a plaintext
success response when the request was encrypted.</t>

</section>
<section anchor="key-rotation"><name>Key Rotation</name>

<t>Each request carries a <spanx style="verb">kid</spanx>, allowing the server to retain the private
keys associated with all currently valid <spanx style="verb">kid</spanx>s and decrypt requests
that arrive during a rotation. Clients <bcp14>MUST</bcp14> refresh the key set when
the cached entry has expired, when no key remains within its validity
window, or on <spanx style="verb">key_unknown</spanx>.</t>

</section>
<section anchor="algorithm-agility"><name>Algorithm Agility</name>

<t>This document specifies one key agreement algorithm (X25519), one
key-derivation function (HKDF-SHA256), and three AEAD variants
(AES-128/192/256-GCM). Servers <bcp14>MAY</bcp14> publish keys with <spanx style="verb">alg</spanx> values or
list <spanx style="verb">aeads</spanx> entries defined by future specifications; clients that do
not recognize an <spanx style="verb">alg</spanx> <bcp14>MUST</bcp14> ignore the key, and clients that do not
recognize any of the <spanx style="verb">aeads</spanx> entries for a key <bcp14>MUST</bcp14> treat the key as
unusable.</t>

<t>AES-128-GCM and AES-256-GCM are mandatory to implement; AES-192-GCM is
<bcp14>OPTIONAL</bcp14> because the 192-bit variant is rarely accelerated in hardware
and provides no security advantage over AES-128-GCM in this setting.
Implementations <bcp14>SHOULD</bcp14> prefer AES-256-GCM by default. AES-128-GCM is
acceptable when interoperability or constrained-device performance
takes precedence. Implementations <bcp14>MUST</bcp14> reject any single plaintext that
exceeds the AES-GCM per-invocation input limit (approximately
2^39 - 256 bits per <xref target="NIST-SP-800-38D"/>). Deployments that reuse a
client session across multiple requests <bcp14>SHOULD</bcp14> also enforce a maximum
number of messages per direction-specific EK; with randomly generated
96-bit nonces, 2^32 messages under one direction-specific EK is an upper
bound and is far above typical API usage.</t>

</section>
<section anchor="side-channels-and-implementation"><name>Side Channels and Implementation</name>

<t>X25519 implementations <bcp14>MUST</bcp14> be constant-time per <xref target="RFC7748"/>. AES-GCM
implementations <bcp14>SHOULD</bcp14> use hardware acceleration where available to
reduce the risk of cache-timing leaks. HKDF and base64url
implementations <bcp14>MUST</bcp14> validate input lengths to avoid out-of-bounds
reads.</t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>Decryption is comparatively cheap, but X25519 scalar multiplication is
not free. Servers <bcp14>SHOULD</bcp14> rate-limit requests bearing unknown or
expired <spanx style="verb">kid</spanx>s, and <bcp14>SHOULD</bcp14> reject malformed bodies before performing
key agreement.</t>

</section>
<section anchor="comparison-with-transport-layer-solutions"><name>Comparison with Transport-Layer Solutions</name>

<t>This scheme is complementary to, and not a replacement for, alternatives
such as mTLS or QUIC <xref target="RFC9000"/>. It is specifically targeted at
deployments where TLS-terminating intermediaries are part of the
application architecture and removing them is not feasible.</t>

</section>
</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>This protocol improves payload confidentiality from the perspective of
TLS-terminating intermediaries, but it does not hide HTTP metadata.
Intermediaries can still observe the client and server endpoints, request
timing, request method, target URI, status code, message sizes, and all
unprotected HTTP fields. Applications that carry privacy-sensitive values
in URIs or unprotected headers will still expose those values.</t>

<t>The <spanx style="verb">E2EE-Session</spanx> field is also visible to intermediaries. Its <spanx style="verb">kid</spanx>,
<spanx style="verb">aead</spanx>, <spanx style="verb">ts</spanx>, <spanx style="verb">nid</spanx>, <spanx style="verb">epk</spanx>, and <spanx style="verb">cty</spanx> parameters can reveal deployment
state, timing, retry behavior, client session scope, and the media type
of the inner plaintext. Clients that need to reduce linkability <bcp14>SHOULD</bcp14>
use the default per-request client key scope and generate fresh <spanx style="verb">nid</spanx>
values for every request.</t>

<t>Plaintext error responses expose protocol failure information, as
described in <xref target="plaintext-errors"/>. Deployments <bcp14>SHOULD</bcp14> avoid putting
user-specific or content-derived information in error details and <bcp14>SHOULD</bcp14>
carry application-specific error information inside encrypted response
payloads when feasible.</t>

<t>These considerations are intended to supplement the privacy guidance in
<xref target="RFC6973"/>.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC7748">
  <front>
    <title>Elliptic Curves for Security</title>
    <author fullname="A. Langley" initials="A." surname="Langley"/>
    <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
    <author fullname="S. Turner" initials="S." surname="Turner"/>
    <date month="January" year="2016"/>
    <abstract>
      <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7748"/>
  <seriesInfo name="DOI" value="10.17487/RFC7748"/>
</reference>
<reference anchor="RFC5869">
  <front>
    <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
    <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
    <author fullname="P. Eronen" initials="P." surname="Eronen"/>
    <date month="May" year="2010"/>
    <abstract>
      <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5869"/>
  <seriesInfo name="DOI" value="10.17487/RFC5869"/>
</reference>
<reference anchor="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</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="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="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="RFC3339">
  <front>
    <title>Date and Time on the Internet: Timestamps</title>
    <author fullname="G. Klyne" initials="G." surname="Klyne"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2002"/>
    <abstract>
      <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3339"/>
  <seriesInfo name="DOI" value="10.17487/RFC3339"/>
</reference>
<reference anchor="RFC9457">
  <front>
    <title>Problem Details for HTTP APIs</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="E. Wilde" initials="E." surname="Wilde"/>
    <author fullname="S. Dalal" initials="S." surname="Dalal"/>
    <date month="July" year="2023"/>
    <abstract>
      <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
      <t>This document obsoletes RFC 7807.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9457"/>
  <seriesInfo name="DOI" value="10.17487/RFC9457"/>
</reference>
<reference anchor="RFC9651">
  <front>
    <title>Structured Field Values for HTTP</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
    <date month="September" year="2024"/>
    <abstract>
      <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
      <t>This document obsoletes RFC 8941.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9651"/>
  <seriesInfo name="DOI" value="10.17487/RFC9651"/>
</reference>
<reference anchor="RFC9325">
  <front>
    <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
    <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
    <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
    <author fullname="T. Fossati" initials="T." surname="Fossati"/>
    <date month="November" year="2022"/>
    <abstract>
      <t>Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) are used to protect data exchanged over a wide range of application protocols and can also form the basis for secure transport protocols. Over the years, the industry has witnessed several serious attacks on TLS and DTLS, including attacks on the most commonly used cipher suites and their modes of operation. This document provides the latest recommendations for ensuring the security of deployed services that use TLS and DTLS. These recommendations are applicable to the majority of use cases.</t>
      <t>RFC 7525, an earlier version of the TLS recommendations, was published when the industry was transitioning to TLS 1.2. Years later, this transition is largely complete, and TLS 1.3 is widely available. This document updates the guidance given the new environment and obsoletes RFC 7525. In addition, this document updates RFCs 5288 and 6066 in view of recent attacks.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="195"/>
  <seriesInfo name="RFC" value="9325"/>
  <seriesInfo name="DOI" value="10.17487/RFC9325"/>
</reference>
<reference anchor="RFC6838">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>
<reference anchor="RFC8470">
  <front>
    <title>Using Early Data in HTTP</title>
    <author fullname="M. Thomson" initials="M." surname="Thomson"/>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="W. Tarreau" initials="W." surname="Tarreau"/>
    <date month="September" year="2018"/>
    <abstract>
      <t>Using TLS early data creates an exposure to the possibility of a replay attack. This document defines mechanisms that allow clients to communicate with servers about HTTP requests that are sent in early data. Techniques are described that use these mechanisms to mitigate the risk of replay.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8470"/>
  <seriesInfo name="DOI" value="10.17487/RFC8470"/>
</reference>
<reference anchor="RFC9421">
  <front>
    <title>HTTP Message Signatures</title>
    <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
    <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
    <author fullname="M. Sporny" initials="M." surname="Sporny"/>
    <date month="February" year="2024"/>
    <abstract>
      <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9421"/>
  <seriesInfo name="DOI" value="10.17487/RFC9421"/>
</reference>
<reference anchor="RFC9530">
  <front>
    <title>Digest Fields</title>
    <author fullname="R. Polli" initials="R." surname="Polli"/>
    <author fullname="L. Pardue" initials="L." surname="Pardue"/>
    <date month="February" year="2024"/>
    <abstract>
      <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
      <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9530"/>
  <seriesInfo name="DOI" value="10.17487/RFC9530"/>
</reference>
<reference anchor="RFC3553">
  <front>
    <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
    <author fullname="M. Mealling" initials="M." surname="Mealling"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <author fullname="T. Hardie" initials="T." surname="Hardie"/>
    <author fullname="G. Klyne" initials="G." surname="Klyne"/>
    <date month="June" year="2003"/>
    <abstract>
      <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. 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="73"/>
  <seriesInfo name="RFC" value="3553"/>
  <seriesInfo name="DOI" value="10.17487/RFC3553"/>
</reference>
<reference anchor="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</reference>

<reference anchor="NIST-SP-800-38D" >
  <front>
    <title>Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2007"/>
  </front>
  <seriesInfo name="NIST" value="Special Publication 800-38D"/>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC6973">
  <front>
    <title>Privacy Considerations for Internet Protocols</title>
    <author fullname="A. Cooper" initials="A." surname="Cooper"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <author fullname="B. Aboba" initials="B." surname="Aboba"/>
    <author fullname="J. Peterson" initials="J." surname="Peterson"/>
    <author fullname="J. Morris" initials="J." surname="Morris"/>
    <author fullname="M. Hansen" initials="M." surname="Hansen"/>
    <author fullname="R. Smith" initials="R." surname="Smith"/>
    <date month="July" year="2013"/>
    <abstract>
      <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6973"/>
  <seriesInfo name="DOI" value="10.17487/RFC6973"/>
</reference>
<reference anchor="RFC9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</reference>

<reference anchor="VASYLENKO-BLOG" target="https://blog.vitalvas.com/post/2025/07/27/e2e-encryption-api-x25519-aes/">
  <front>
    <title>End-to-End Encryption for APIs: X25519 and AES</title>
    <author initials="V." surname="Vasylenko" fullname="Vitaliy Vasylenko">
      <organization></organization>
    </author>
    <date year="2025" month="July" day="27"/>
  </front>
</reference>


    </references>

</references>


<?line 1147?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>The protocol described in this document derives from an informal
blog-post implementation of end-to-end encryption for HTTP APIs using
X25519 and AES-GCM <xref target="VASYLENKO-BLOG"/>. This document formalizes the
wire format, generalizes the cipher to AES-128/192/256-GCM with
explicit negotiation, specifies additional authenticated data and
replay protection, and defines key rotation semantics.</t>

</section>
<section numbered="false" anchor="worked-example"><name>Worked Example</name>

<t>This appendix shows one complete request/response pair using
deterministic inputs. All values are hexadecimal unless noted; lines
of the form <spanx style="verb">=</spanx> are byte-identical to what an interoperable
implementation would compute. The inputs (private keys, AES-GCM
nonces) are fixed so the example is reproducible; production code
<bcp14>MUST NOT</bcp14> reuse these values.</t>

<section numbered="false" anchor="inputs"><name>Inputs</name>

<figure><artwork><![CDATA[
server private (ssk) =
    0102030405060708090a0b0c0d0e0f10
    1112131415161718191a1b1c1d1e1f20
server public  (spk) =
    07a37cbc142093c8b755dc1b10e86cb4
    26374ad16aa853ed0bdfc0b2b86d1c7c

client private (csk) =
    a1a2a3a4a5a6a7a8a9aaabacadaeafb0
    b1b2b3b4b5b6b7b8b9babbbcbdbebfc0
client public  (cpk) =
    ad438bfae31f6c093d61d4339255ea79
    8092c9fadd07b97827f4b0ae9dee7c1c

kid  = "2026-06"
aead = "AES-256-GCM"
issuer = "https://api.example.com"
ts   = 1781006400
nid  = "3b1c1c2e-2b6a-4a0d-9b6c-2a9f1b6a0e21"
cty  = "application/json"
]]></artwork></figure>

</section>
<section numbered="false" anchor="key-agreement-and-derivation-1"><name>Key Agreement and Derivation</name>

<figure><artwork><![CDATA[
Z   = X25519(csk, spk)
    = 1eadf045f970f3619aa3a82d3ce461d6
      8ee42839f0563ff052d8db20bf927d29

salt = cpk || spk    (64 octets)
info_req = "e2ee/v1:req https://api.example.com AES-256-GCM 2026-06"
info_res = "e2ee/v1:res https://api.example.com AES-256-GCM 2026-06"

EK_req = HKDF-SHA256(Z, salt, info_req, 32)
       = 88927bb69c7fce5a26b88ccf3b8638c5
         e876080eae5349c7a014787e80382f81

EK_res = HKDF-SHA256(Z, salt, info_res, 32)
       = 2784f1a637499c327e97ad56a0a199b9
         50680c41e57597cea41a220233304a8b
]]></artwork></figure>

</section>
<section numbered="false" anchor="request"><name>Request</name>

<t>The serialized <spanx style="verb">E2EE-Session</spanx> field (single logical line):</t>

<figure><artwork><![CDATA[
E2EE-Session: "2026-06"; aead="AES-256-GCM";
            epk=:rUOL+uMfbAk9YdQzklXqeYCSyfrdB7l4J/Swrp3ufBw=:;
            ts=1781006400;
            nid="3b1c1c2e-2b6a-4a0d-9b6c-2a9f1b6a0e21";
            cty="application/json"
]]></artwork></figure>

<t>The AAD is the ASCII string below, using deterministic Structured
Fields serialization of the <spanx style="verb">E2EE-Session</spanx> field value:</t>

<figure><artwork><![CDATA[
e2ee/v1:req "2026-06"; aead="AES-256-GCM"; epk=:...:; \
ts=1781006400; nid="3b1c1c2e-2b6a-4a0d-9b6c-2a9f1b6a0e21"; \
cty="application/json"
]]></artwork></figure>

<t>(The <spanx style="verb">:...:</spanx> here stands for the full sf-binary form shown above and is
shortened only for readability; the actual AAD contains the full
deterministic serialization.)</t>

<figure><artwork><![CDATA[
plaintext = {"op":"transfer","amount":1000,"to":"acct-42"}

nonce     = deadbeef0000000000000001
ciphertext =
    a6b3551bec16e7866943502146d893b2
    baa8bc6a4ef76712f7e4febcb576c821
    41551464b46eb0f096750ed69020
tag       =
    4cc3c77e4c463d111f81bf6cf83f08d5
]]></artwork></figure>

<t>The HTTP request body is <spanx style="verb">nonce || ciphertext || tag</spanx>, base64-encoded
here for compactness:</t>

<figure><artwork><![CDATA[
body (base64) =
    3q2+7wAAAAAAAAABprNVG+wW54ZpQ1AhRtiTsrqovGpO92cS
    9+T+vLV2yCFBVRRktG6w8JZ1DtaQIEzDx35MRj0RH4G/bPg/CNU=
]]></artwork></figure>

</section>
<section numbered="false" anchor="response"><name>Response</name>

<t>The response uses a fresh nonce and a new <spanx style="verb">ts</spanx>, echoes <spanx style="verb">kid</spanx>, <spanx style="verb">aead</spanx>,
and <spanx style="verb">nid</spanx>, and omits <spanx style="verb">epk</spanx>:</t>

<figure><artwork><![CDATA[
E2EE-Session: "2026-06"; aead="AES-256-GCM";
            ts=1781006401;
            nid="3b1c1c2e-2b6a-4a0d-9b6c-2a9f1b6a0e21";
            cty="application/json"
]]></artwork></figure>

<t>AAD (the request's deterministic field serialization followed by the
response's deterministic field serialization):</t>

<figure><artwork><![CDATA[
e2ee/v1:res <request-encryption-field> <response-encryption-field>

plaintext = {"status":"ok","txid":"a1b2c3"}

nonce     = feedface0000000000000002
ciphertext =
    f111c0a217756b5f967108e32ce392d6
    2f4de9380b2267c53b81cc4679bc59
tag       =
    5b64d39058d1bb23e2cec5f9c69880e1

body (base64) =
    /u36zgAAAAAAAAAC8RHAohd1a1+WcQjjLOOS1i9N6TgLImfFO4H
    MRnm8WVtk05BY0bsj4s7F+caYgOE=
]]></artwork></figure>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA8V96XrbRpbo/3oKXOV+X6QJSXORKEqOMyPLcqL2GktOJumb
CQtgUUIMEgwASmZs97PMs9wnu2erBSApOZOZvv7661AkUMupU2df2u22qtIq
M8fRztl80q7yNvwnOpsnxWpRpfk8muZF9N3l5evo5PV5Gb0t0/lV9O/9g4Pe
UaThyZOzi/a3py92lI7jwtzgMP2zM3pjR03yZK5nMPak0NOqfaPLVWbm7/K2
6RvTvq6qRbvbVYmuzFVerI4j836hymU8S8sSpq5WC3j1/OzyqUoXxXFUFcuy
6ne7R92+0oXRx9GFSZZFWq3UO7O6zYvJsYqidmR4H/Af+Gj3Qb/wuumjrJs+
f/fsyVP+IPtUqqxgc7/qLJ/DElamVIv0OPp7lSetqMyLqjDTEj6tZvjhF6X0
srrOC5i+DeNEUTovj6MfOtEPdsP0LYPih7TSWbpq/GZmOs2Oo9RU03+7wScA
Vp0knyk1z4uZrtIbg5t78/T08HB/JB8PRsMj+Tga9g7k4/7QPXDU63XtA/v7
Q/k4GAzsa0f7B4f24/CgZz8O+naw4WgwciMcdt1rfffswcB+Ozg4GNhne32a
7eX5xWX74nV71O22B6Mnx7RXi29vDGxwBsekHaI9zvLkXXSaLq5NEb3IJ6aM
8mn0amEKeuY4+haOJC0fnObLeSWPRLtwjnuEjN++ODndoTncgdC/dpQXV8fR
SxpEZ9H5vIRFLCuDo1/gUetiUtIQlya5nudZfrWid2FtsFRAukP6szRFauAK
THM7NO4QEHFhkhQGfr2MszTh/cielcLH62c4PDq0kDrqdgl+P5xc/PT87OWz
V+3Hz199WwfU9ouJd/K4cR03A+Au5LOb7B+0u4ftPm+10sWVqY4jvKXl8YMH
McCkE6Lmg0VeVg/wrQfdwwf9wwdwqdv+wrX1Im2/p5W1tSkfKNVutyMdl1Wh
k0qpy+u0jIBALAEDqqhEAE4BtrCLSC8WFortTK/gnDde6WgXSc2eKpNrMzN1
QtWJLq9NJL8sSxhXgHSWZSm8nUSny+LGRE/SKcza/s5k2UzP1e7Z6ZPv9mgo
ICmRviqMwfW1iEa0L7476R8M3c8TwIYbWmYrpIVq9zatrqNef9RuRb2jPvw/
vAAvtuO0whdLngGPCMbGnZravvKpKszvS1NWNGxhykU+L0200Kss1xPY3IWB
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
MYJYKcIAAA==

-->

</rfc>

