<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-thomson-webpush-hpke-00" category="std" consensus="true" submissionType="IETF" obsoletes="8291" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title>WebPush Encryption using HPKE</title>
    <seriesInfo name="Internet-Draft" value="draft-thomson-webpush-hpke-00"/>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <date year="2026" month="July" day="24"/>
    <area>Applications and Real-Time</area>
    <workgroup>Web-Based Push Notifications</workgroup>
    <keyword>spam</keyword>
    <keyword>transdimensional annoyance</keyword>
    <abstract>
      <?line 55?>

<t>This document defines how to use Hybrid Public Key Encryption (HPKE)
with Web Push.</t>
      <t>This document obsoletes RFC 8291.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://martinthomson.github.io/webpush-hpke/draft-thomson-webpush-hpke.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-thomson-webpush-hpke/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web-Based Push Notifications Working Group mailing list (<eref target="mailto:webpush@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/webpush/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/webpush/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/martinthomson/webpush-hpke"/>.</t>
    </note>
  </front>
  <middle>
    <?line 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Message Encryption for Web Push <xref target="RFC8291"/>
defines a hybrid encryption system
that depends on elliptic curve cryptography.
This system is known to be vulnerable to compromise
in the event that a cryptographically-relevant quantum computer (CRQC)
is created.
The risk of this resulting in the compromise of Web Push encryption
will be increasingly likely as time passes <xref target="PQC-GUIDE"/>.</t>
      <t>This document defines a message encryption design
that can integrate a post-quantum KEM.
This design is a generic use
of Hybrid Public Key Encryption (HPKE) <xref target="HPKE"/>
that can use any defined set of algorithms.</t>
      <t>At the same time, the use of HPKE addresses a minor, but inconsequential,
vulnerability in the design of <xref target="RFC8291"/>
that would allow an application to construct a single ciphertext
that two parties would successfully authenticate
and decrypt to different plaintexts.
This attack is described in <xref target="proteus"/>.</t>
      <t>This document obsoletes RFC 8291 <xref target="RFC8291"/>.</t>
      <t>This document is one of a pair.
Its companion, <xref target="WEBPUSH-SYM"/> is an alternative to this approach.
<xref target="WEBPUSH-SYM"/> describes how to encode messages
using symmetric cryptography.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="using-hpke-in-web-push">
      <name>Using HPKE in Web Push</name>
      <t>Web Push <xref target="WEBPUSH"/> provides a messaging capability
that allows applications to send small messages
to user agents via a push service.
The push service enables efficient message delivery,
even when user agents have constrained connectivity.</t>
      <t>Typical interactions for Web Push are shown in <xref target="f-overview"/>.</t>
      <figure anchor="f-overview">
        <name>Web Push Overview</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="472" viewBox="0 0 472 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 40,72 L 40,176" fill="none" stroke="black"/>
              <path d="M 40,208 L 40,272" fill="none" stroke="black"/>
              <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
              <path d="M 168,32 L 168,64" fill="none" stroke="black"/>
              <path d="M 224,72 L 224,128" fill="none" stroke="black"/>
              <path d="M 224,208 L 224,272" fill="none" stroke="black"/>
              <path d="M 288,32 L 288,64" fill="none" stroke="black"/>
              <path d="M 352,32 L 352,64" fill="none" stroke="black"/>
              <path d="M 408,72 L 408,176" fill="none" stroke="black"/>
              <path d="M 408,208 L 408,272" fill="none" stroke="black"/>
              <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
              <path d="M 168,32 L 288,32" fill="none" stroke="black"/>
              <path d="M 352,32 L 464,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
              <path d="M 168,64 L 288,64" fill="none" stroke="black"/>
              <path d="M 352,64 L 464,64" fill="none" stroke="black"/>
              <path d="M 48,110 L 216,110" fill="none" stroke="black"/>
              <path d="M 48,114 L 216,114" fill="none" stroke="black"/>
              <path d="M 48,160 L 400,160" fill="none" stroke="black"/>
              <path d="M 8,192 Q 10,188.8 12,192 Q 14,195.2 16,192 Q 18,188.8 20,192 Q 22,195.2 24,192 Q 26,188.8 28,192 Q 30,195.2 32,192 Q 34,188.8 36,192 Q 38,195.2 40,192 Q 42,188.8 44,192 Q 46,195.2 48,192 Q 50,188.8 52,192 Q 54,195.2 56,192 Q 58,188.8 60,192 Q 62,195.2 64,192 Q 66,188.8 68,192 Q 70,195.2 72,192 Q 74,188.8 76,192 Q 78,195.2 80,192 Q 82,188.8 84,192 Q 86,195.2 88,192 Q 90,188.8 92,192 Q 94,195.2 96,192 Q 98,188.8 100,192 Q 102,195.2 104,192 Q 106,188.8 108,192 Q 110,195.2 112,192 Q 114,188.8 116,192 Q 118,195.2 120,192 Q 122,188.8 124,192 Q 126,195.2 128,192 Q 130,188.8 132,192 Q 134,195.2 136,192 Q 138,188.8 140,192 Q 142,195.2 144,192 Q 146,188.8 148,192 Q 150,195.2 152,192 Q 154,188.8 156,192 Q 158,195.2 160,192 Q 162,188.8 164,192 Q 166,195.2 168,192 Q 170,188.8 172,192 Q 174,195.2 176,192 Q 178,188.8 180,192 Q 182,195.2 184,192 " fill="none" stroke="black"/>
              <path d="M 264,192 Q 266,188.8 268,192 Q 270,195.2 272,192 Q 274,188.8 276,192 Q 278,195.2 280,192 Q 282,188.8 284,192 Q 286,195.2 288,192 Q 290,188.8 292,192 Q 294,195.2 296,192 Q 298,188.8 300,192 Q 302,195.2 304,192 Q 306,188.8 308,192 Q 310,195.2 312,192 Q 314,188.8 316,192 Q 318,195.2 320,192 Q 322,188.8 324,192 Q 326,195.2 328,192 Q 330,188.8 332,192 Q 334,195.2 336,192 Q 338,188.8 340,192 Q 342,195.2 344,192 Q 346,188.8 348,192 Q 350,195.2 352,192 Q 354,188.8 356,192 Q 358,195.2 360,192 Q 362,188.8 364,192 Q 366,195.2 368,192 Q 370,188.8 372,192 Q 374,195.2 376,192 Q 378,188.8 380,192 Q 382,195.2 384,192 Q 386,188.8 388,192 Q 390,195.2 392,192 Q 394,188.8 396,192 Q 398,195.2 400,192 Q 402,188.8 404,192 Q 406,195.2 408,192 Q 410,188.8 412,192 Q 414,195.2 416,192 Q 418,188.8 420,192 Q 422,195.2 424,192 Q 426,188.8 428,192 Q 430,195.2 432,192 Q 434,188.8 436,192 Q 438,195.2 440,192 " fill="none" stroke="black"/>
              <path d="M 232,240 L 400,240" fill="none" stroke="black"/>
              <path d="M 48,256 L 216,256" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
              <polygon class="arrowhead" points="240,240 228,234.4 228,245.6" fill="black" transform="rotate(180,232,240)"/>
              <polygon class="arrowhead" points="224,112 212,106.4 212,117.6" fill="black" transform="rotate(0,216,112)"/>
              <polygon class="arrowhead" points="56,256 44,250.4 44,261.6" fill="black" transform="rotate(180,48,256)"/>
              <polygon class="arrowhead" points="56,112 44,106.4 44,117.6" fill="black" transform="rotate(180,48,112)"/>
              <g class="text">
                <text x="36" y="52">UA</text>
                <text x="196" y="52">Push</text>
                <text x="248" y="52">Service</text>
                <text x="408" y="52">Application</text>
                <text x="128" y="100">Setup</text>
                <text x="160" y="148">Provide</text>
                <text x="244" y="148">Subscription</text>
                <text x="224" y="180">|</text>
                <text x="224" y="196">(Later)</text>
                <text x="284" y="228">Push</text>
                <text x="336" y="228">Message</text>
                <text x="92" y="244">Push</text>
                <text x="144" y="244">Message</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
    +-------+           +--------------+       +-------------+
    |  UA   |           | Push Service |       | Application |
    +-------+           +--------------+       +-------------+
        |                      |                      |
        |        Setup         |                      |
        |<====================>|                      |
        |                      |                      |
        |           Provide Subscription              |
        |-------------------------------------------->|
        |                      |                      |
    ~~~~~~~~~~~~~~~~~~~~~~~ (Later) ~~~~~~~~~~~~~~~~~~~~~~~
        |                      |                      |
        |                      |     Push Message     |
        |    Push Message      |<---------------------|
        |<---------------------|                      |
        |                      |                      |
]]></artwork>
        </artset>
      </figure>
      <t>Encryption of push messages ensures that the push service
is unable to read or alter the messages it handles.</t>
      <t>Web Push uses a hybrid encryption mode that combines
a key-encapsulation mechanism (KEM)
and pre-shared key (PSK)
with authenticated encryption with additional data (AEAD) encryption.
This document describes how this can be provided by <xref target="HPKE"/>.</t>
      <t>The overall encryption design is composed from two parts:</t>
      <ol spacing="normal" type="1"><li>
          <t>A user agent key configuration,
where the user agent provides the information
necessary to construct a message it will accept.
This is provided by the user agent to the application
during the establishment of a Web Push subscription.
Details of the format of this key configuration
are provided in <xref target="config"/>.</t>
        </li>
        <li>
          <t>A message protection format,
used to encode push messages.
This format is defined in <xref target="message"/>.</t>
        </li>
      </ol>
    </section>
    <section anchor="config">
      <name>User Agent Key Configuration</name>
      <t>In order for an application server to send a push message using HPKE,
it requires knowledge of:</t>
      <ul spacing="normal">
        <li>
          <t>the HPKE algorithms that the user agent accepts,</t>
        </li>
        <li>
          <t>the PSK the user agent has chosen, and</t>
        </li>
        <li>
          <t>the KEM public key (or keys) the user agent holds secret keys for.</t>
        </li>
      </ul>
      <t>This information is formatted into a key configuration,
similar in shape to that used in
the Encrypted Client Hello (ECH) <tt>HpkeKeyConfig</tt> (<xref section="4" sectionFormat="of" target="ECH"/>)
or the Oblivious HTTP key configuration (<xref section="3" sectionFormat="of" target="OHTTP"/>).</t>
      <t><xref target="f-config"/> shows the format of the key configuration,
using the format described in <xref section="1.3" sectionFormat="of" target="QUIC"/>.</t>
      <figure anchor="f-config">
        <name>Configuration Format</name>
        <sourcecode type="artwork"><![CDATA[
Key Config {
  Key Config Item With Length (..) ...,
}

Key Config Item With Length {
  Key Config Item Length (16),
  Key Config Item (..),
}

Key Config Item {
  Key Identifier (8),
  PSK (128),
  HPKE KEM ID (16),
  HPKE Public Key (Npk * 8),
  HPKE Symmetric Algorithms Length (16) = 4..65532,
  HPKE Symmetric Algorithms (32) ...,
}

HPKE Symmetric Algorithms {
  HPKE KDF ID (16),
  HPKE AEAD ID (16),
}
]]></sourcecode>
      </figure>
      <t>The format consists of one or more Key Config Items,
each prefixed with a 16 bit length, in network byte order.</t>
      <t>Each Key Config Item contains:</t>
      <dl>
        <dt>Key Identifier:</dt>
        <dd>
          <t>An 8 bit value that will be used in protected messages
to identify the user agent's PSK and KEM secret key.</t>
        </dd>
        <dt>PSK:</dt>
        <dd>
          <t>A 16 byte sequence of bytes of the pre-shared key.</t>
        </dd>
        <dt>HPKE KEM ID:</dt>
        <dd>
          <t>A 16 bit value that identifies the Key Encapsulation Method (KEM)
used for the identified key
as defined in <xref section="7.1" sectionFormat="of" target="HPKE"/>
or <eref target="https://www.iana.org/assignments/hpke/hpke.xhtml#hpke-kem-ids">the HPKE KDF IANA registry</eref>.</t>
        </dd>
        <dt>HPKE Public Key:</dt>
        <dd>
          <t>The public key used by the user agent.
The length of the public key is <tt>Npk</tt>,
which is determined by the choice of HPKE KEM
as defined in <xref section="4" sectionFormat="of" target="HPKE"/>.
(As a result, knowledge of the KEM is necessary
to process subsequent fields.)</t>
        </dd>
        <dt>HPKE Symmetric Algorithms Length:</dt>
        <dd>
          <t>A 16 bit integer in network byte order that encodes the length, in bytes,
of the HPKE Symmetric Algorithms field that follows.</t>
        </dd>
        <dt>HPKE Symmetric Algorithms:</dt>
        <dd>
          <t>One or more pairs of identifiers for the different combinations
of HPKE KDF and AEAD
that the user agent supports:</t>
          <dl>
            <dt>HPKE KDF ID:</dt>
            <dd>
              <t>A 16 bit HPKE KDF identifier as defined in <xref section="7.2" sectionFormat="of" target="HPKE"/>
or <eref target="https://www.iana.org/assignments/hpke/hpke.xhtml#hpke-kdf-ids">the HPKE KDF IANA registry</eref>.</t>
            </dd>
            <dt>HPKE AEAD ID:</dt>
            <dd>
              <t>A 16 bit HPKE AEAD identifier as defined in <xref section="7.3" sectionFormat="of" target="HPKE"/>
or <eref target="https://www.iana.org/assignments/hpke/hpke.xhtml#hpke-aead-ids">the HPKE AEAD IANA registry</eref>.</t>
            </dd>
          </dl>
        </dd>
      </dl>
    </section>
    <section anchor="message">
      <name>HPKE-Encrypted Push Message Format</name>
      <t>The format of push messages when using HPKE is illustrated in <xref target="f-message"/>.</t>
      <figure anchor="f-message">
        <name>HPKE-Protected Push Message Format</name>
        <sourcecode type="artwork"><![CDATA[
HPKE-Protected Push Message {
  Key Identifier (8),
  HPKE KEM ID (16),
  HPKE KDF ID (16),
  HPKE AEAD ID (16),
  Encapsulated KEM Shared Secret (8 * Nenc),
  HPKE-Protected Message Contents (..),
}
]]></sourcecode>
      </figure>
      <t>This format is identical to that in <xref section="4.1" sectionFormat="of" target="OHTTP"/>
and it uses a similar construction
following the guidance of <xref section="4.6" sectionFormat="of" target="OHTTP"/>,
differing only in that it includes a pre-shared key.
Processes for the application server that sends messages
are included in <xref target="encrypt"/>;
processes for the user agent that receives messages
are included in <xref target="decrypt"/>.</t>
      <section anchor="encrypt">
        <name>Push Message Application Server Processing</name>
        <t>Applications encapsulate a push message, <tt>msg</tt>,
using values from the key configuration:</t>
        <ul spacing="normal">
          <li>
            <t>the key identifier from the configuration, <tt>key_id</tt>,
with the corresponding KEM identified by <tt>kem_id</tt>,</t>
          </li>
          <li>
            <t>the pre-shared key from the configuration, <tt>psk</tt>,</t>
          </li>
          <li>
            <t>the public key from the configuration, <tt>pkR</tt>, and</t>
          </li>
          <li>
            <t>a combination of KDF, identified by <tt>kdf_id</tt>,
and AEAD, identified by <tt>aead_id</tt>,
that the application selects from those in the key configuration.</t>
          </li>
        </ul>
        <t>The application then constructs an encrypted push message, <tt>push_message</tt>,
from the plaintext of the message, <tt>msg</tt>, as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Construct a message header, <tt>hdr</tt>, by concatenating the values of <tt>key_id</tt>,
<tt>kem_id</tt>, <tt>kdf_id</tt>, and <tt>aead_id</tt>, as one 8-bit integer and three 16-bit
integers, respectively, each in network byte order.</t>
          </li>
          <li>
            <t>Build <tt>info</tt> by concatenating the ASCII-encoded string "webpush message",
a zero byte,
and the header.</t>
          </li>
          <li>
            <t>Create a sending HPKE context by invoking <tt>SetupPSKS()</tt>
(<xref section="5.1.2" sectionFormat="of" target="HPKE"/>)
with the public key of the receiver <tt>pkR</tt>,
<tt>info</tt> as constructed,
the pre-shared key <tt>psk</tt>,
a single byte pre-shared key identifier containing a single <tt>key_id</tt>.
This yields the context <tt>sctxt</tt> and an encapsulation key <tt>enc</tt>.</t>
          </li>
          <li>
            <t>Encrypt <tt>msg</tt> by invoking the <tt>Seal()</tt> method on <tt>sctxt</tt>
(<xref section="5.2" sectionFormat="of" target="HPKE"/>)
with empty associated data <tt>aad</tt>,
yielding ciphertext <tt>ct</tt>.</t>
          </li>
          <li>
            <t>Concatenate the values of <tt>hdr</tt>, <tt>enc</tt>, and <tt>ct</tt>,
yielding an encrypted push message <tt>push_message</tt>.</t>
          </li>
        </ol>
        <t>Note that <tt>enc</tt> is of fixed-length, so there is no ambiguity in parsing this
structure.</t>
        <t>In pseudocode, this procedure is as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
hdr = concat(encode(1, key_id),
             encode(2, kem_id),
             encode(2, kdf_id),
             encode(2, aead_id))
info = concat(encode_str("webpush message"),
              encode(1, 0),
              hdr)
enc, sctxt = SetupPSKS(pkR, info, psk, [key_id])
ct = sctxt.Seal("", msg)
push_message = concat(hdr, enc, ct)
]]></sourcecode>
      </section>
      <section anchor="decrypt">
        <name>Push Message Receiver Processing</name>
        <t>An user agent decrypts a push message by reversing this process.
To decapsulate the encrypted push message, <tt>push_message</tt>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Parses <tt>push_message</tt>
into <tt>key_id</tt>, <tt>kem_id</tt>, <tt>kdf_id</tt>, <tt>aead_id</tt>, <tt>enc</tt>, and <tt>ct</tt>
(indicated using the function <tt>parse()</tt> in pseudocode).
The user agent is then able to find
the HPKE private key, <tt>skR</tt>,
and pre-shared key, <tt>psk</tt>.  </t>
            <t>
a. If <tt>key_id</tt> does not identify a key matching the type of <tt>kem_id</tt>,
   the user agent discards the message.  </t>
            <t>
b. If <tt>kdf_id</tt> and <tt>aead_id</tt> identify a combination of KDF and AEAD
   that the user agent is unwilling to use with <tt>skR</tt>,
   the user agent discards the message.</t>
          </li>
          <li>
            <t>Build <tt>info</tt> by concatenating the ASCII-encoded string "message/bhttp
request", a zero byte, <tt>key_id</tt> as an 8-bit integer, plus <tt>kem_id</tt>, <tt>kdf_id</tt>,
and <tt>aead_id</tt> as three 16-bit integers.</t>
          </li>
          <li>
            <t>Create a receiving HPKE context, <tt>rctxt</tt>, by invoking <tt>SetupPSKR()</tt>
(<xref section="5.1.2" sectionFormat="of" target="HPKE"/>)
with <tt>enc</tt>, <tt>skR</tt>, <tt>info</tt>, <tt>psk</tt>,
and a one byte pre-shared key ID containing <tt>key_id</tt>.</t>
          </li>
          <li>
            <t>Decrypt <tt>ct</tt> by invoking the <tt>Open()</tt> method on <tt>rctxt</tt>
(<xref section="5.2" sectionFormat="of" target="HPKE"/>),
with an empty associated data <tt>aad</tt>,
yielding <tt>msg</tt> or an error on failure.
If an error is returned, the user agent discards the message.</t>
          </li>
        </ol>
        <t>In pseudocode, this procedure is as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
key_id, kem_id, kdf_id, aead_id, enc, ct = parse(enc_request)
info = concat(encode_str("message/bhttp request"),
              encode(1, 0),
              encode(1, key_id),
              encode(2, kem_id),
              encode(2, kdf_id),
              encode(2, aead_id))
rctxt = SetupBaseR(enc, skR, info, psk, [key_id])
msg, error = rctxt.Open("", ct)
]]></sourcecode>
      </section>
    </section>
    <section anchor="algorithms">
      <name>Mandatory Algorithms</name>
      <t>All implementations of this specification <bcp14>MUST</bcp14> implement
the following algorithms:</t>
      <ul spacing="normal">
        <li>
          <t>the MLKEM768-X25519 KEM (0x647a) <xref section="8.2" sectionFormat="of" target="HPKE-PQ"/></t>
        </li>
        <li>
          <t>the TurboSHAKE128 KDF (0x0012) <xref section="5" sectionFormat="of" target="HPKE-PQ"/></t>
        </li>
        <li>
          <t>the AES-GCM AEAD (0x0001) <xref section="7.3" sectionFormat="of" target="HPKE"/></t>
        </li>
      </ul>
    </section>
    <section anchor="upgrading-from-rfc-8291">
      <name>Upgrading from RFC 8291</name>
      <t>The encryption scheme in <xref target="RFC8291"/> identifies itself
through the use of the encrypted "aes128gcm" content coding <xref target="RFC8188"/>.
Though it is possible to use this message encryption system
and the "aes128gcm" content coding at the same time,
this is not generally necessary.
A user agent can therefore use the absence of the encrypted content coding
to indicate the use of this scheme.</t>
      <t>This document defines a media type
for HPKE-protected push messages; see <xref target="iana"/>.
This media type <bcp14>MAY</bcp14> be omitted if the "aes128gcm" content coding is not present.</t>
      <t>Unlike RFC 8291, no native padding facility is provided by this encryption format;
see <xref target="security"/> for details.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>A Web Push user agent relies to some degree on two values
remaining confidential to protect it from unwanted messages:</t>
      <ul spacing="normal">
        <li>
          <t>the URL at which push messages are delivered,
knowledge of which is necessary
for messages to reach the user agent at all, and</t>
        </li>
        <li>
          <t>the pre-shared key that is used to authenticate the sender,
which is the primary defense.</t>
        </li>
      </ul>
      <t>Knowledge of these values,
along with the other parameters in the key configuration,
allows an attacker to send any message it chooses
to the user agent.</t>
      <t>Like the design in RFC 8291 (see <xref section="7" sectionFormat="of" target="RFC8291"/>),
this mechanism cannot obscure the presence, timing, and size of messages
from the push service.
Though communication with the push service is protected by TLS,
without additional traffic analysis protection,
network observers might also be able to observe these attributes of messages.</t>
      <t>Padding of the payload of messages can be used
to obscure the precise size of the message,
but no facility is provided in this document for padding messages.
This differs from the RFC 8291 design,
which was able to use the padding provided by the <xref target="RFC8188"/> encoding.</t>
      <t>This document exercises the options described in <xref target="RFC8192"/>
for replacing the encryption scheme.
Any replacement of this encryption scheme can use those same techniques.</t>
      <section anchor="dos">
        <name>Handling Denial of Service</name>
        <t>A user agent that receives multiple unwanted messages,
including messages that are discarded,
might be the target of a denial of service attack.
Such an attack might seek to drain batteries
by activating the device radio
or by creating messages that cannot be decrypted.</t>
        <t>A user agent can disable the associated subscription
if they receive too many unwanted or invalid messages.</t>
      </section>
      <section anchor="proteus">
        <name>Multi-Target Ciphertexts in RFC 8291</name>
        <t>RFC 8291 <xref target="RFC8192"/> is vulnerable to an attack
where a malicious application can construct a single ciphertext
that will be decrypted successfully
(that is, the AEAD tag is accepted)
by multiple recipients,
each of whom can receive a different plaintext.</t>
        <t>This format is also vulnerable to this attack.It is possible to apply the techniques from <xref target="CDJZ"/>
to achieve this outcome with only modest amounts of computation.</t>
        <t>This attack has no practical consequence,
as it requires that the attacker have information
that would allow it to send any message
without any need to a share a ciphertext.</t>
      </section>
      <section anchor="sec-media">
        <name>Media Type Security</name>
        <t>Push messages contain arbitrary content chosen by an application server.
Though the format does not provide explicit signaling for the encapsulated media type,
applications can include arbitrary data.
How data is handled is determined by the application,
which both sends and receives the data.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document registers the "application/webpush-message" content type
to identify a push message that is protected with this scheme,
as defined in <xref target="message"/>.</t>
      <dl spacing="compact">
        <dt>Type name:</dt>
        <dd>
          <t>application</t>
        </dd>
        <dt>Subtype name:</dt>
        <dd>
          <t>webpush-message</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="sec-media"/></t>
        </dd>
        <dt>Interoperability considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Published specification:</dt>
        <dd>
          <t>this specification</t>
        </dd>
        <dt>Applications that use this media type:</dt>
        <dd>
          <t>This type identifies an encrypted web push message.</t>
        </dd>
        <dt>Fragment identifier considerations:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Additional information:</dt>
        <dd>
          <dl spacing="compact">
            <dt>Magic number(s):</dt>
            <dd>N/A</dd>
            <dt>Deprecated alias names for this type:</dt>
            <dd>N/A</dd>
            <dt>File extension(s):</dt>
            <dd>N/A</dd>
            <dt>Macintosh file type code(s):</dt>
            <dd>N/A</dd>
          </dl>
        </dd>
        <dt>Person and email address to contact for further information:</dt>
        <dd>
          <t>see Authors' Addresses section</t>
        </dd>
        <dt>Intended usage:</dt>
        <dd>
          <t>COMMON</t>
        </dd>
        <dt>Restrictions on usage:</dt>
        <dd>
          <t>N/A</t>
        </dd>
        <dt>Author:</dt>
        <dd>
          <t>see Authors' Addresses section</t>
        </dd>
        <dt>Change controller:</dt>
        <dd>
          <t>IETF</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HPKE">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
         </author>
            <author fullname="Karthikeyan Bhargavan" initials="K." surname="Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp" initials="B." surname="Lipp">
              <organization>Rosenpass</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
         </author>
            <date day="6" month="July" year="2026"/>
            <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 a variant that authenticates possession of a pre-shared 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.  This
   document provides instantiations of the scheme using widely used and
   efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH)
   key agreement, HMAC-based key derivation function (HKDF), and SHA-2.

   This document obsoletes RFC 9180.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-hpke-04"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="WEBPUSH">
          <front>
            <title>Generic Event Delivery Using HTTP Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="E. Damaggio" initials="E." surname="Damaggio"/>
            <author fullname="B. Raymor" initials="B." role="editor" surname="Raymor"/>
            <date month="December" year="2016"/>
            <abstract>
              <t>This document describes a simple protocol for the delivery of real- time events to user agents. This scheme uses HTTP/2 server push.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8030"/>
          <seriesInfo name="DOI" value="10.17487/RFC8030"/>
        </reference>
        <reference anchor="HPKE-PQ">
          <front>
            <title>Post-Quantum and Post-Quantum/Traditional Hybrid Algorithms for HPKE</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>Selkie Cryptography</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   Updating key exchange and public-key encryption protocols to resist
   attack by quantum computers is a high priority given the possibility
   of "harvest now, decrypt later" attacks.  Hybrid Public Key
   Encryption (HPKE) is a widely-used public key encryption scheme based
   on combining a Key Encapsulation Mechanism (KEM), a Key Derivation
   Function (KDF), and an Authenticated Encryption with Associated Data
   (AEAD) scheme.  In this document, we define KEM algorithms for HPKE
   based on both post-quantum KEMs and hybrid constructions of post-
   quantum KEMs with traditional KEMs, as well as a KDF based on SHA-3
   that is suitable for use with these KEMs.  When used with these
   algorithms, HPKE is resilient with respect to attacks by a quantum
   computer.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-pq-05"/>
        </reference>
        <reference anchor="RFC8188">
          <front>
            <title>Encrypted Content-Encoding for HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>This memo introduces a content coding for HTTP that allows message payloads to be encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8188"/>
          <seriesInfo name="DOI" value="10.17487/RFC8188"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="WEBPUSH-SYM">
          <front>
            <title>WebPush Encryption using Symmetric Ciphers</title>
            <author initials="M." surname="Thomson" fullname="Martin Thomson">
              <organization/>
            </author>
            <date year="2026" month="July" day="24"/>
          </front>
        </reference>
        <reference anchor="CDJZ">
          <front>
            <title>Automated Analysis of Protocols that use Authenticated Encryption: How Subtle AEAD Differences can impact Protocol Security</title>
            <author initials="C." surname="Cremers" fullname="Cas Cremers">
              <organization/>
            </author>
            <author initials="A." surname="Dax" fullname="Alexander Dax">
              <organization/>
            </author>
            <author initials="C." surname="Jacomme" fullname="Charlie Jacomme">
              <organization/>
            </author>
            <author initials="M." surname="Zhao" fullname="Mang Zhao">
              <organization/>
            </author>
            <date year="2023" month="August"/>
          </front>
          <seriesInfo name="USENIX" value="2023"/>
        </reference>
        <reference anchor="RFC8291">
          <front>
            <title>Message Encryption for Web Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="November" year="2017"/>
            <abstract>
              <t>This document describes a message encryption scheme for the Web Push protocol. This scheme provides confidentiality and integrity for messages sent from an application server to a user agent.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8291"/>
          <seriesInfo name="DOI" value="10.17487/RFC8291"/>
        </reference>
        <reference anchor="PQC-GUIDE">
          <front>
            <title>Post-Quantum Cryptography for Engineers</title>
            <author fullname="A. Banerjee" initials="A." surname="Banerjee"/>
            <author fullname="T. Reddy.K" initials="T." surname="Reddy.K"/>
            <author fullname="D. Schoinianakis" initials="D." surname="Schoinianakis"/>
            <author fullname="T. Hollebeek" initials="T." surname="Hollebeek"/>
            <author fullname="M. Ounsworth" initials="M." surname="Ounsworth"/>
            <date month="June" year="2026"/>
            <abstract>
              <t>The advent of a cryptographically relevant quantum computer (CRQC) would render state-of-the-art, traditional public key algorithms deployed today obsolete, as the mathematical assumptions underpinning their security would no longer hold. To address this, protocols and infrastructure must transition to post-quantum algorithms, which are designed to resist both traditional and quantum attacks. This document explains why engineers need to be aware of and understand post-quantum cryptography (PQC), and it details the impact of CRQCs on existing systems and the challenges involved in transitioning to post-quantum algorithms. Unlike previous cryptographic updates, this shift may require significant protocol redesign due to the unique properties of post-quantum algorithms.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9958"/>
          <seriesInfo name="DOI" value="10.17487/RFC9958"/>
        </reference>
        <reference anchor="ECH">
          <front>
            <title>TLS Encrypted Client Hello</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="K. Oku" initials="K." surname="Oku"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="March" year="2026"/>
            <abstract>
              <t>This document describes a mechanism in Transport Layer Security (TLS) for encrypting a message under a server public key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9849"/>
          <seriesInfo name="DOI" value="10.17487/RFC9849"/>
        </reference>
        <reference anchor="OHTTP">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="January" year="2024"/>
            <abstract>
              <t>This document describes Oblivious HTTP, a protocol for forwarding encrypted HTTP messages. Oblivious HTTP allows a client to make multiple requests to an origin server without that server being able to link those requests to the client or to identify the requests as having come from the same client, while placing only limited trust in the nodes used to forward the messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9458"/>
          <seriesInfo name="DOI" value="10.17487/RFC9458"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC8192">
          <front>
            <title>Interface to Network Security Functions (I2NSF): Problem Statement and Use Cases</title>
            <author fullname="S. Hares" initials="S." surname="Hares"/>
            <author fullname="D. Lopez" initials="D." surname="Lopez"/>
            <author fullname="M. Zarny" initials="M." surname="Zarny"/>
            <author fullname="C. Jacquenet" initials="C." surname="Jacquenet"/>
            <author fullname="R. Kumar" initials="R." surname="Kumar"/>
            <author fullname="J. Jeong" initials="J." surname="Jeong"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document sets out the problem statement for Interface to Network Security Functions (I2NSF) and outlines some companion use cases.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8192"/>
          <seriesInfo name="DOI" value="10.17487/RFC8192"/>
        </reference>
      </references>
    </references>
    <?line 587?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
