<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-hpke-hpke-02" category="std" consensus="true" obsoletes="9180" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="HPKE">Hybrid Public Key Encryption</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-hpke-02"/>
    <author initials="R." surname="Barnes" fullname="Richard L. Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author initials="K." surname="Bhargavan" fullname="Karthik Bhargavan">
      <organization>Inria</organization>
      <address>
        <email>karthikeyan.bhargavan@inria.fr</email>
      </address>
    </author>
    <author initials="B." surname="Lipp" fullname="Benjamin Lipp">
      <organization>Inria</organization>
      <address>
        <email>ietf@benjaminlipp.de</email>
      </address>
    </author>
    <author initials="C." surname="Wood" fullname="Christopher A. Wood">
      <organization/>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2025" month="November" day="04"/>
    <workgroup>HPKE</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 234?>

<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 KEM, key derivation function (KDF), and authenticated encryption
with additional data (AEAD) encryption function. We provide 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 SHA2.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/hpkewg/hpke"/>.</t>
    </note>
  </front>
  <middle>
    <?line 246?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Encryption schemes that combine asymmetric and symmetric algorithms have been
specified and practiced since the early days of public key cryptography, e.g.,
<xref target="RFC1421"/>. Combining the two yields the key management advantages of asymmetric
cryptography and the performance benefits of symmetric cryptography. The traditional
combination has been "encrypt the symmetric key with the public key." "Hybrid"
public key encryption (HPKE) schemes, specified here, take a different approach:
"generate the symmetric key and its encapsulation with the public key."
Specifically, encrypted messages convey a shared secret encapsulated with a
public key scheme, along with one or more arbitrary-sized ciphertexts encrypted
using that key. This type of public key encryption has many applications in
practice, including Messaging Layer Security <xref target="RFC9420"/>, TLS Encrypted
ClientHello <xref target="I-D.ietf-tls-esni"/>, and Oblivious HTTP <xref target="RFC9458"/>.</t>
      <t>Currently, there are numerous competing and non-interoperable standards and
variants for hybrid encryption, mostly variants on the Elliptic Curve Integrated Encryption Scheme (ECIES), including ANSI X9.63
(ECIES) <xref target="ANSI"/>, IEEE 1363a <xref target="IEEE1363"/>, ISO/IEC 18033-2 <xref target="ISO"/>, and SECG SEC 1
<xref target="SECG"/>.  See <xref target="MAEA10"/> for a thorough comparison.  All these existing
schemes have problems, e.g., because they rely on outdated primitives, lack
proofs of indistinguishable (adaptive) chosen-ciphertext attack (IND-CCA2) security, or fail to provide test vectors.</t>
      <t>This document defines an HPKE scheme that provides a subset
of the functions provided by the collection of schemes above but
specified with sufficient clarity that they can be interoperably
implemented. The HPKE construction defined herein is secure against (adaptive)
chosen ciphertext attacks (IND-CCA2-secure) under classical assumptions about
the underlying primitives <xref target="HPKEAnalysis"/> <xref target="ABHKLR20"/>. A summary of
these analyses is in <xref target="sec-properties"/>.</t>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
<?line -6?>
      </t>
    </section>
    <section anchor="notation">
      <name>Notation</name>
      <t>The following terms are used throughout this document to describe the
operations, roles, and behaviors of HPKE:</t>
      <ul spacing="normal">
        <li>
          <t><tt>(skX, pkX)</tt>: A key encapsulation mechanism (KEM) key pair used in role X,
where X is one of S, R, or E as sender, recipient, and ephemeral, respectively;
<tt>skX</tt> is the private key and <tt>pkX</tt> is the public key.</t>
        </li>
        <li>
          <t><tt>pk(skX)</tt>: The KEM public key corresponding to the KEM private key <tt>skX</tt>.</t>
        </li>
        <li>
          <t>Sender (S): Role of entity that sends an encrypted message.</t>
        </li>
        <li>
          <t>Recipient (R): Role of entity that receives an encrypted message.</t>
        </li>
        <li>
          <t>Ephemeral (E): Role of a fresh random value meant for one-time use.</t>
        </li>
        <li>
          <t><tt>I2OSP(n, w)</tt>: Convert non-negative integer <tt>n</tt> to a <tt>w</tt>-length,
big-endian byte string, as described in <xref target="RFC8017"/>.</t>
        </li>
        <li>
          <t><tt>OS2IP(x)</tt>: Convert byte string <tt>x</tt> to a non-negative integer, as
described in <xref target="RFC8017"/>, assuming big-endian byte order.</t>
        </li>
        <li>
          <t><tt>concat(x0, ..., xN)</tt>: Concatenation of byte strings.
<tt>concat(0x01, 0x0203, 0x040506) = 0x010203040506</tt>.</t>
        </li>
        <li>
          <t><tt>lengthPrefixed(x)</tt>: The two-byte length of the byte string <tt>x</tt>, concatenated
with <tt>x</tt> itself.  (<tt>lengthPrefixed(x) = concat(I2OSP(len(x), 2), x)</tt>)  It is
an error to call this function with an <tt>x</tt> value that is more than 65535 bytes
long.</t>
        </li>
        <li>
          <t><tt>random(n)</tt>: A pseudorandom byte string of length <tt>n</tt> bytes</t>
        </li>
        <li>
          <t><tt>xor(a,b)</tt>: XOR of byte strings; <tt>xor(0xF0F0, 0x1234) = 0xE2C4</tt>.
It is an error to call this function with two arguments of unequal
length.</t>
        </li>
      </ul>
    </section>
    <section anchor="base-crypto">
      <name>Cryptographic Dependencies</name>
      <t>HPKE variants rely on the following primitives:</t>
      <ul spacing="normal">
        <li>
          <t>A key encapsulation mechanism (KEM):
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>GenerateKeyPair()</tt>: Randomized algorithm to generate a key pair <tt>(skX, pkX)</tt>.</t>
            </li>
            <li>
              <t><tt>DeriveKeyPair(ikm)</tt>: Deterministic algorithm to derive a key pair <tt>(skX,
pkX)</tt> from the byte string <tt>ikm</tt>, where <tt>ikm</tt> is an arbitrary-length byte
string (within the bounds in <xref target="input-limits"/>).  The <tt>ikm</tt> input SHOULD have
at least <tt>Nsk</tt> bytes of entropy.</t>
            </li>
            <li>
              <t><tt>SerializePublicKey(pkX)</tt>: Produce a byte string of length <tt>Npk</tt> encoding the
public key <tt>pkX</tt>.</t>
            </li>
            <li>
              <t><tt>DeserializePublicKey(pkXm)</tt>: Parse a byte string of length <tt>Npk</tt> to recover a
public key. This function can raise a <tt>DeserializeError</tt> error upon <tt>pkXm</tt>
deserialization failure.</t>
            </li>
            <li>
              <t><tt>Encap(pkR)</tt>: Randomized algorithm to generate an ephemeral, fixed-length
shared secret and a fixed-length encapsulation of that secret (also known as
the KEM ciphertext) that can be decapsulated by the holder of the private
key corresponding to <tt>pkR</tt>. This function can raise an <tt>EncapError</tt> on
encapsulation failure.</t>
            </li>
            <li>
              <t><tt>Decap(enc, skR)</tt>: Deterministic algorithm using the private key <tt>skR</tt> to
recover the shared secret) from the encapsulated secret <tt>enc</tt>. This function
can raise a <tt>DecapError</tt> on decapsulation failure.</t>
            </li>
            <li>
              <t><tt>Nsecret</tt>: The length in bytes of a KEM shared secret produced by this KEM.</t>
            </li>
            <li>
              <t><tt>Nenc</tt>: The length in bytes of an encapsulated secret produced by this KEM.</t>
            </li>
            <li>
              <t><tt>Npk</tt>: The length in bytes of an encoded public key for this KEM.</t>
            </li>
            <li>
              <t><tt>Nsk</tt>: The length in bytes of an encoded private key for this KEM.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>A key derivation function (KDF) of one of the two following forms:  </t>
          <ul spacing="normal">
            <li>
              <t>A one-stage KDF:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Derive(ikm, L)</tt>: Derive an <tt>L</tt>-byte value from the input keying material
<tt>ikm</tt>.</t>
                </li>
                <li>
                  <t><tt>Nh</tt> The security strength of the KDF, in bytes.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>A two-stage KDF:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Extract(salt, ikm)</tt>: Extract a pseudorandom key of fixed length <tt>Nh</tt> bytes
from input keying material <tt>ikm</tt> and an optional byte string
<tt>salt</tt>.</t>
                </li>
                <li>
                  <t><tt>Expand(prk, info, L)</tt>: Expand a pseudorandom key <tt>prk</tt> using
optional string <tt>info</tt> into <tt>L</tt> bytes of output keying material.</t>
                </li>
                <li>
                  <t><tt>Nh</tt>: The output size of the <tt>Extract()</tt> function in bytes.</t>
                </li>
              </ul>
            </li>
          </ul>
        </li>
        <li>
          <t>An AEAD encryption algorithm <xref target="RFC5116"/>:
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>Seal(key, nonce, aad, pt)</tt>: Encrypt and authenticate plaintext
<tt>pt</tt> with associated data <tt>aad</tt> using symmetric key <tt>key</tt> and nonce
<tt>nonce</tt>, yielding ciphertext and tag <tt>ct</tt>. This function
 can raise a <tt>MessageLimitReachedError</tt> upon failure.</t>
            </li>
            <li>
              <t><tt>Open(key, nonce, aad, ct)</tt>: Decrypt ciphertext and tag <tt>ct</tt> using
associated data <tt>aad</tt> with symmetric key <tt>key</tt> and nonce <tt>nonce</tt>,
returning plaintext message <tt>pt</tt>. This function can raise an
<tt>OpenError</tt> or <tt>MessageLimitReachedError</tt> upon failure.</t>
            </li>
            <li>
              <t><tt>Nk</tt>: The length in bytes of a key for this algorithm.</t>
            </li>
            <li>
              <t><tt>Nn</tt>: The length in bytes of a nonce for this algorithm.</t>
            </li>
            <li>
              <t><tt>Nt</tt>: The length in bytes of the authentication tag for this algorithm.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>Beyond the above, a KEM MAY also expose the following functions, whose behavior
is detailed in <xref target="serializeprivatekey"/>:</t>
      <ul spacing="normal">
        <li>
          <t><tt>SerializePrivateKey(skX)</tt>: Produce a byte string of length <tt>Nsk</tt> encoding the private
key <tt>skX</tt>.</t>
        </li>
        <li>
          <t><tt>DeserializePrivateKey(skXm)</tt>: Parse a byte string of length <tt>Nsk</tt> to recover a
private key. This function can raise a <tt>DeserializeError</tt> error upon <tt>skXm</tt>
deserialization failure.</t>
        </li>
      </ul>
      <t>A <em>ciphersuite</em> is a triple (KEM, KDF, AEAD) containing a choice of algorithm
for each primitive.</t>
      <t>A set of algorithm identifiers for concrete instantiations of these
primitives is provided in <xref target="ciphersuites"/>.  Algorithm identifier
values are two bytes long.</t>
      <t>The notation <tt>pk(skX)</tt>, depending on its use and the KEM and its
implementation, is either the
computation of the public key using the private key, or just syntax
expressing the retrieval of the public key, assuming it is stored along
with the private key object.</t>
      <t>The following functions are defined to facilitate domain separation of
KDF calls as well as context binding:</t>
      <artwork><![CDATA[
# For use with one-stage KDFs
def LabeledDerive(ikm, label, context, L):
  labeled_ikm = concat(
    ikm,
    "HPKE-v1",
    suite_id,
    lengthPrefixed(label),
    I2OSP(L, 2)
    context,
  )
  return Derive(labeled_ikm, L)
]]></artwork>
      <artwork><![CDATA[
# For use with two-stage KDFs
def LabeledExtract(salt, label, ikm):
  labeled_ikm = concat("HPKE-v1", suite_id, label, ikm)
  return Extract(salt, labeled_ikm)

def LabeledExpand(prk, label, info, L):
  labeled_info = concat(I2OSP(L, 2), "HPKE-v1", suite_id,
                        label, info)
  return Expand(prk, labeled_info, L)
]]></artwork>
      <t>The value of <tt>suite_id</tt> depends on where the KDF is used; it is assumed
implicit from the implementation and not passed as a parameter. If used
inside a KEM algorithm, <tt>suite_id</tt> MUST start with "KEM" and identify
this KEM algorithm; if used in the remainder of HPKE, it MUST start with
"HPKE" and identify the entire ciphersuite in use. See sections <xref target="dhkem"/>
and <xref target="encryption-context"/> for details.</t>
      <t>Certain functions have a different structure depending on whether a one-stage or
two-stage KDF is being used.  For clarity, such functions will be described
twice in this document, once with the suffix <tt>_OneStage</tt> and once with the
suffix <tt>_TwoStage</tt>, representing the versions of the function to be used with a
one-stage or two-stage KDF, respectively.  For example, the <tt>Foo</tt> function would
be invoked by calling <tt>Foo_OneStage</tt> when using a one-stage KDF, and by calling
<tt>Foo_TwoStage</tt> when using a two-stage KDF.</t>
      <section anchor="dhkem">
        <name>DH-Based KEM (DHKEM)</name>
        <t>Suppose we are given a KDF, and a Diffie-Hellman (DH) group providing the
following operations:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DH(skX, pkY)</tt>: Perform a non-interactive Diffie-Hellman exchange using
the private key <tt>skX</tt> and public key <tt>pkY</tt> to produce a Diffie-Hellman shared
secret of length <tt>Ndh</tt>. This function can raise a <tt>ValidationError</tt> as described
in <xref target="validation"/>.</t>
          </li>
          <li>
            <t><tt>Ndh</tt>: The length in bytes of a Diffie-Hellman shared secret produced
by <tt>DH()</tt>.</t>
          </li>
          <li>
            <t><tt>Nsk</tt>: The length in bytes of a Diffie-Hellman private key.</t>
          </li>
        </ul>
        <t>Then we can construct a KEM that implements the interface defined in <xref target="base-crypto"/>
called <tt>DHKEM(Group, KDF)</tt> in the following way, where <tt>Group</tt> denotes the
Diffie-Hellman group and <tt>KDF</tt> denotes the KDF. The function parameters <tt>pkR</tt> and <tt>pkS</tt>
are deserialized public keys, and <tt>enc</tt> is a serialized public key. Since
encapsulated shared secrets are Diffie-Hellman public keys in this KEM algorithm,
we use <tt>SerializePublicKey()</tt> and <tt>DeserializePublicKey()</tt> to encode and decode
them, respectively. <tt>Npk</tt> equals <tt>Nenc</tt>. <tt>GenerateKeyPair()</tt> produces a key pair
for the Diffie-Hellman group in use. <xref target="derive-key-pair"/> contains the
<tt>DeriveKeyPair()</tt> function specification for DHKEMs defined in this document.</t>
        <artwork><![CDATA[
# For use with one-stage KDFs
def ExtractAndExpand_OneStage(dh, kem_context):
  return LabeledDerive(dh, "shared_secret", kem_context, Nsecret)

# For use with two-stage KDFs
def ExtractAndExpand_TwoStage(dh, kem_context):
  eae_prk = LabeledExtract("", "eae_prk", dh)
  shared_secret = LabeledExpand(eae_prk, "shared_secret",
                                kem_context, Nsecret)
  return shared_secret

def Encap(pkR):
  skE, pkE = GenerateKeyPair()
  dh = DH(skE, pkR)
  enc = SerializePublicKey(pkE)

  pkRm = SerializePublicKey(pkR)
  kem_context = concat(enc, pkRm)

  shared_secret = ExtractAndExpand(dh, kem_context)
  return shared_secret, enc

def Decap(enc, skR):
  pkE = DeserializePublicKey(enc)
  dh = DH(skR, pkE)

  pkRm = SerializePublicKey(pk(skR))
  kem_context = concat(enc, pkRm)

  shared_secret = ExtractAndExpand(dh, kem_context)
  return shared_secret
]]></artwork>
        <t>The implicit <tt>suite_id</tt> value used within <tt>LabeledExtract</tt>, <tt>LabeledExpand</tt>, and
<tt>LabeledDerive</tt> is defined as follows, where <tt>kem_id</tt> is defined in <xref target="kem-ids"/>:</t>
        <artwork><![CDATA[
suite_id = concat("KEM", I2OSP(kem_id, 2))
]]></artwork>
        <t>The KDF used in DHKEM can be equal to or different from the KDF used
in the remainder of HPKE, depending on the chosen variant.
Implementations MUST make sure to use the constants (<tt>Nh</tt>) and function
calls (<tt>LabeledExtract</tt>, <tt>LabeledExpand</tt>, and <tt>LabeledDerive</tt>) of the appropriate KDF when
implementing DHKEM. See <xref target="kdf-choice"/> for a comment on the choice of
a KDF for the remainder of HPKE, and <xref target="domain-separation"/> for the
rationale of the labels.</t>
        <t>For the variants of DHKEM defined in this document, the size <tt>Nsecret</tt> of the
KEM shared secret is equal to the output length of the hash function
underlying the KDF. For P-256, P-384, and P-521, the size <tt>Ndh</tt> of the
Diffie-Hellman shared secret is equal to 32, 48, and 66, respectively,
corresponding to the x-coordinate of the resulting elliptic curve point <xref target="IEEE1363"/>.
For X25519 and X448, the size <tt>Ndh</tt> is equal to 32 and 56, respectively
(see <xref target="RFC7748"/>, Section 5).</t>
        <t>Senders and recipients MUST validate KEM inputs and outputs as described
in <xref target="kem-ids"/>.</t>
      </section>
    </section>
    <section anchor="hpke">
      <name>Hybrid Public Key Encryption</name>
      <t>In this section, we define a few HPKE variants.  All variants take a
recipient public key and a sequence of plaintexts <tt>pt</tt> and produce an
encapsulated secret <tt>enc</tt> and a sequence of ciphertexts <tt>ct</tt>.  These outputs are
constructed so that only the holder of <tt>skR</tt> can decapsulate the key from
<tt>enc</tt> and decrypt the ciphertexts.  All the algorithms also take an
<tt>info</tt> parameter that can be used to influence the generation of keys
(e.g., to fold in identity information) and an <tt>aad</tt> parameter that
provides additional authenticated data to the AEAD algorithm in use.</t>
      <t>In addition to the base case of encrypting to a public key, we include a variant
that authenticates possession of a pre-shared key. The authenticated variant
contributes additional keying material to the encryption operation. The
following one-byte values will be used to distinguish between modes:</t>
      <table anchor="hpke-modes">
        <name>HPKE Modes</name>
        <thead>
          <tr>
            <th align="left">Mode</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">mode_base</td>
            <td align="left">0x00</td>
          </tr>
          <tr>
            <td align="left">mode_psk</td>
            <td align="left">0x01</td>
          </tr>
          <tr>
            <td align="left">RESERVED</td>
            <td align="left">0x02</td>
          </tr>
          <tr>
            <td align="left">RESERVED</td>
            <td align="left">0x03</td>
          </tr>
        </tbody>
      </table>
      <t>(The values 0x02 and 0x03 were used in <xref target="RFC9180"/> to reflect additional
variants which have been removed from this specification.)</t>
      <t>Both variants follow the same basic two-step pattern:</t>
      <ol spacing="normal" type="1"><li>
          <t>Set up an encryption context that is shared between the sender
and the recipient.</t>
        </li>
        <li>
          <t>Use that context to encrypt or decrypt content.</t>
        </li>
      </ol>
      <t>A <em>context</em> is an implementation-specific structure that encodes
the AEAD algorithm and key in use, and manages the nonces used so
that the same nonce is not used with multiple plaintexts. It also
has an interface for exporting secret values, as described in
<xref target="hpke-export"/>. See <xref target="hpke-dem"/> for a description of this structure
and its interfaces. HPKE decryption fails when the underlying AEAD
decryption fails.</t>
      <t>The constructions described here presume that the relevant non-private
parameters (<tt>enc</tt>, <tt>psk_id</tt>, etc.) are transported between the sender and the
recipient by some application making use of HPKE. Moreover, a recipient with more
than one public key needs some way of determining which of its public keys was
used for the encapsulation operation. As an example, applications may send this
information alongside a ciphertext from the sender to the recipient. Specification of
such a mechanism is left to the application. See <xref target="message-encoding"/> for more
details.</t>
      <t>The procedures described in this section are laid out in a
Python-like pseudocode. The algorithms in use are left implicit.</t>
      <section anchor="encryption-context">
        <name>Creating the Encryption Context</name>
        <t>The variants of HPKE defined in this document share a common
key schedule that translates the protocol inputs into an encryption
context. The key schedule inputs are as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>mode</tt> - A one-byte value indicating the HPKE mode, defined in <xref target="hpke-modes"/>.</t>
          </li>
          <li>
            <t><tt>shared_secret</tt> - A KEM shared secret generated for this transaction.</t>
          </li>
          <li>
            <t><tt>info</tt> - Application-supplied information (optional; default value
"").</t>
          </li>
          <li>
            <t><tt>psk</tt> - A pre-shared key (PSK) held by both the sender
and the recipient (optional; default value "").</t>
          </li>
          <li>
            <t><tt>psk_id</tt> - An identifier for the PSK (optional; default value "").</t>
          </li>
        </ul>
        <t>Senders and recipients MUST validate KEM inputs and outputs as described
in <xref target="kem-ids"/>.</t>
        <t>The <tt>info</tt> parameter used by HPKE is not related to the optional string <tt>info</tt>
used by the <tt>LabeledExpand()</tt> or <tt>Expand()</tt> functions detailed in <xref target="base-crypto"/>.</t>
        <t>The <tt>psk</tt> and <tt>psk_id</tt> parameters MUST appear together or not at all.
That is, if a non-default value is provided for one of them, then
the other MUST be set to a non-default value. This requirement is
encoded in <tt>VerifyPSKInputs()</tt> below.</t>
        <t>The <tt>psk</tt>, <tt>psk_id</tt>, and <tt>info</tt> parameters have maximum lengths that depend
on the KDF itself, on the definition of <tt>LabeledExtract()</tt>, and on the
constant labels used together with them. See <xref target="kdf-input-length"/> for
precise limits on these lengths.</t>
        <t>The <tt>key</tt>, <tt>base_nonce</tt>, and <tt>exporter_secret</tt> computed by the key schedule
have the property that they are only known to the holder of the recipient
private key, and the entity that used the KEM to generate <tt>shared_secret</tt> and
<tt>enc</tt>.</t>
        <t>The HPKE algorithm identifiers, i.e., the KEM <tt>kem_id</tt>, KDF <tt>kdf_id</tt>, and
AEAD <tt>aead_id</tt> 2-byte code points, as defined in <xref target="kemid-values"/>, <xref target="kdfid-values"/>,
and <xref target="aeadid-values"/>, respectively, are assumed implicit from the implementation
and not passed as parameters. The implicit <tt>suite_id</tt> value used within
<tt>LabeledExtract</tt>, <tt>LabeledExpand</tt>, and <tt>LabeledDerive</tt> is defined based on them as follows:</t>
        <artwork><![CDATA[
suite_id = concat(
  "HPKE",
  I2OSP(kem_id, 2),
  I2OSP(kdf_id, 2),
  I2OSP(aead_id, 2)
)
]]></artwork>
        <artwork><![CDATA[
default_psk = ""
default_psk_id = ""

def VerifyPSKInputs(mode, psk, psk_id):
  got_psk = (psk != default_psk)
  got_psk_id = (psk_id != default_psk_id)
  if got_psk != got_psk_id:
    raise Exception("Inconsistent PSK inputs")

  if got_psk and mode == mode_base:
    raise Exception("PSK input provided when not needed")
  if (not got_psk) and mode == mode_psk:
    raise Exception("Missing required PSK input")

# For use with a one-stage KDF
def CombineSecrets_OneStage(mode, shared_secret, info, psk, psk_id):
  secrets = concat(
    lengthPrefixed(psk),
    lengthPrefixed(shared_secret),
  )
  context = concat(
    mode,
    lengthPrefixed(psk_id),
    lengthPrefixed(info),
  )

  secret = LabeledDerive(secrets, "secret", context, Nk + Nn + Nh)

  key = secret[:Nk]
  base_nonce = secret[Nk:(Nk + Nn)]
  exporter_secret = secret[(Nk + Nn):]

  return (key, base_nonce, exporter_secret)

# For use with a two-stage KDF
def CombineSecrets_TwoStage(mode, shared_secret, info, psk, psk_id):
  psk_id_hash = LabeledExtract("", "psk_id_hash", psk_id)
  info_hash = LabeledExtract("", "info_hash", info)
  key_schedule_context = concat(mode, psk_id_hash, info_hash)

  secret = LabeledExtract(shared_secret, "secret", psk)

  key = LabeledExpand(secret, "key", key_schedule_context, Nk)
  base_nonce = LabeledExpand(secret, "base_nonce",
                             key_schedule_context, Nn)
  exporter_secret = LabeledExpand(secret, "exp",
                                  key_schedule_context, Nh)

  return (key, base_nonce, exporter_secret)

def KeySchedule<ROLE>(mode, shared_secret, info, psk, psk_id):
  VerifyPSKInputs(mode, psk, psk_id)

  key, base_nonce, exporter_secret =
    CombineSecrets(mode, shared_secret, info, psk, psk_id)

  return Context<ROLE>(key, base_nonce, 0, exporter_secret)
]]></artwork>
        <t>The <tt>ROLE</tt> template parameter is either S or R, depending on the role
of sender or recipient, respectively. The third parameter in the
<tt>Context&lt;ROLE&gt;</tt> refers to the sequence number, that is initialised with
a 0 value. See <xref target="hpke-dem"/> for a discussion of the key schedule output,
including the role-specific Context structure and its API, and the
usage of the sequence number.</t>
        <t>Note that the <tt>key_schedule_context</tt> construction in <tt>KeySchedule()</tt> is
equivalent to serializing a structure of the following form in the TLS presentation
syntax:</t>
        <artwork><![CDATA[
struct {
    uint8 mode;
    opaque psk_id_hash[Nh];
    opaque info_hash[Nh];
} KeyScheduleContext;
]]></artwork>
        <section anchor="hpke-kem">
          <name>Encryption to a Public Key</name>
          <t>The most basic function of an HPKE scheme is to enable encryption
to the holder of a given KEM private key.  The <tt>SetupBaseS()</tt> and
<tt>SetupBaseR()</tt> procedures establish contexts that can be used to
encrypt and decrypt, respectively, for a given private key.</t>
          <t>The KEM shared secret is combined via the KDF
with information describing the key exchange, as well as the
explicit <tt>info</tt> parameter provided by the caller.</t>
          <t>The parameter <tt>pkR</tt> is a public key, and <tt>enc</tt> is an encapsulated
KEM shared secret.</t>
          <artwork><![CDATA[
def SetupBaseS(pkR, info):
  shared_secret, enc = Encap(pkR)
  return enc, KeyScheduleS(mode_base, shared_secret, info,
                           default_psk, default_psk_id)

def SetupBaseR(enc, skR, info):
  shared_secret = Decap(enc, skR)
  return KeyScheduleR(mode_base, shared_secret, info,
                      default_psk, default_psk_id)
]]></artwork>
        </section>
        <section anchor="mode-psk">
          <name>Authentication Using a Pre-Shared Key</name>
          <t>This variant extends the base mechanism by allowing the recipient to
authenticate that the sender possessed a given PSK. The PSK also
improves confidentiality guarantees in certain adversary models, as
described in more detail in <xref target="sec-properties"/>. We assume that both
parties have been provisioned with both the PSK value <tt>psk</tt> and another
byte string <tt>psk_id</tt> that is used to identify which PSK should be used.</t>
          <t>The primary difference from the base case is that the <tt>psk</tt> and <tt>psk_id</tt> values
are used as <tt>ikm</tt> inputs to the KDF (instead of using the empty string).</t>
          <t>The PSK MUST have at least 32 bytes of entropy and SHOULD be of length <tt>Nh</tt>
bytes or longer. See <xref target="security-psk"/> for a more detailed discussion.</t>
          <artwork><![CDATA[
def SetupPSKS(pkR, info, psk, psk_id):
  shared_secret, enc = Encap(pkR)
  return enc, KeyScheduleS(mode_psk, shared_secret, info, psk, psk_id)

def SetupPSKR(enc, skR, info, psk, psk_id):
  shared_secret = Decap(enc, skR)
  return KeyScheduleR(mode_psk, shared_secret, info, psk, psk_id)
]]></artwork>
        </section>
      </section>
      <section anchor="hpke-dem">
        <name>Encryption and Decryption</name>
        <t>HPKE allows multiple encryption operations to be done based on a
given setup transaction.  Since the public key operations involved
in setup are typically more expensive than symmetric encryption or
decryption, this allows applications to amortize the cost of the
public key operations, reducing the overall overhead.</t>
        <t>In order to avoid nonce reuse, however, this encryption must be
stateful. Each of the setup procedures above produces a role-specific
context object that stores the AEAD and secret export parameters.
The AEAD parameters consist of:</t>
        <ul spacing="normal">
          <li>
            <t>The AEAD algorithm in use</t>
          </li>
          <li>
            <t>A secret <tt>key</tt></t>
          </li>
          <li>
            <t>A base nonce <tt>base_nonce</tt></t>
          </li>
          <li>
            <t>A sequence number (initially 0)</t>
          </li>
        </ul>
        <t>The secret export parameters consist of:</t>
        <ul spacing="normal">
          <li>
            <t>The HPKE ciphersuite in use and</t>
          </li>
          <li>
            <t>An <tt>exporter_secret</tt> used for the secret export interface (see
<xref target="hpke-export"/>)</t>
          </li>
        </ul>
        <t>All these parameters except the AEAD sequence number are constant.
The sequence number provides nonce uniqueness: The nonce used for
each encryption or decryption operation is the result of XORing
<tt>base_nonce</tt> with the current sequence number, encoded as a big-endian
integer of the same length as <tt>base_nonce</tt>. Implementations MAY use a
sequence number that is shorter than the nonce length (padding on the left
with zero), but MUST raise an error if the sequence number overflows. The AEAD
algorithm produces ciphertext that is Nt bytes longer than the plaintext.
Nt = 16 for AEAD algorithms defined in this document.</t>
        <t>Encryption is unidirectional from sender to recipient. The sender's
context can encrypt a plaintext <tt>pt</tt> with associated data <tt>aad</tt> as
follows:</t>
        <artwork><![CDATA[
def ContextS.Seal(aad, pt):
  ct = Seal(self.key, self.ComputeNonce(self.seq), aad, pt)
  self.IncrementSeq()
  return ct
]]></artwork>
        <t>The recipient's context can decrypt a ciphertext <tt>ct</tt> with associated
data <tt>aad</tt> as follows:</t>
        <artwork><![CDATA[
def ContextR.Open(aad, ct):
  pt = Open(self.key, self.ComputeNonce(self.seq), aad, ct)
  if pt == OpenError:
    raise OpenError
  self.IncrementSeq()
  return pt
]]></artwork>
        <t>Each encryption or decryption operation increments the sequence number for
the context in use. The per-message nonce and sequence number increment
details are as follows:</t>
        <artwork><![CDATA[
def Context<ROLE>.ComputeNonce(seq):
  seq_bytes = I2OSP(seq, Nn)
  return xor(self.base_nonce, seq_bytes)

def Context<ROLE>.IncrementSeq():
  if self.seq >= (1 << (8*Nn)) - 1:
    raise MessageLimitReachedError
  self.seq += 1
]]></artwork>
        <t>The sender's context MUST NOT be used for decryption. Similarly, the recipient's
context MUST NOT be used for encryption. Higher-level protocols reusing the HPKE
key exchange for more general purposes can derive separate keying material as
needed using use the secret export interface; see <xref target="hpke-export"/> and <xref target="bidirectional"/>
for more details.</t>
        <t>It is up to the application to ensure that encryptions and decryptions are
done in the proper sequence, so that encryption and decryption nonces align.
If <tt>ContextS.Seal()</tt> or <tt>ContextR.Open()</tt> would cause the <tt>seq</tt> parameter to
overflow, then the implementation MUST fail with an error. (In the pseudocode
above, <tt>Context&lt;ROLE&gt;.IncrementSeq()</tt> fails with an error when <tt>seq</tt> overflows,
which causes <tt>ContextS.Seal()</tt> and <tt>ContextR.Open()</tt> to fail accordingly.)
Note that the internal <tt>Seal()</tt> and <tt>Open()</tt> calls inside correspond to the
context's AEAD algorithm.</t>
      </section>
      <section anchor="hpke-export">
        <name>Secret Export</name>
        <t>HPKE provides an interface for exporting secrets from the encryption context
using a variable-length pseudorandom function (PRF). This interface takes as input a context
string <tt>exporter_context</tt> and a desired length <tt>L</tt> in bytes, and produces
a secret derived from the internal exporter secret using the corresponding
KDF Expand function. For the KDFs defined in this specification, <tt>L</tt> has
a maximum value of <tt>255*Nh</tt>. Future specifications that define new KDFs
MUST specify a bound for <tt>L</tt>.</t>
        <t>The <tt>exporter_context</tt> parameter has a maximum length that depends on the KDF
itself, on the definition of <tt>LabeledExpand()</tt>, and on the constant labels
used together with them. See <xref target="kdf-input-length"/> for precise limits on this
length.</t>
        <artwork><![CDATA[
# For use with a one-stage KDF
def Context.Export_OneStage(exporter_context, L):
  return LabeledDerive(self.exporter_secret, "sec",
                       exporter_context, L)

# For use with a two-stage KDF
def Context.Export_TwoStage(exporter_context, L):
  return LabeledExpand(self.exporter_secret, "sec",
                       exporter_context, L)
]]></artwork>
        <t>Applications that do not use the encryption API in <xref target="hpke-dem"/> can use
the export-only AEAD ID <tt>0xFFFF</tt> when computing the key schedule. Such
applications can avoid computing the <tt>key</tt> and <tt>base_nonce</tt> values in the
key schedule, as they are not used by the Export interface described above.</t>
        <t>Unlike the similar TLS 1.3 exporter interface (see <xref section="7.5" sectionFormat="of" target="RFC8446"/>),
the HPKE export interface does not provide replay protection. While the resulting
secret will only be known to the sender and recipient, a replayed encapsulated
secret <tt>enc</tt> will produce an identical context, and thus the same exported
secrets. In particular, applications MUST NOT use exported secrets unless it is
safe for the same exported values to be used multiple times.  For example,
applications MUST NOT use an exported secret to derive a (key, nonce) pair for
AEAD encryption (as suggested in <xref section="9.8" sectionFormat="of" target="RFC9180"/>), since reuse of a
(key, nonce) pair harms security in most AEAD algorithms.  In such cases,
applications SHOULD incorporate a fresh recipient-provided nonce when deriving
values from an export context, as discussed in <xref section="4.4" sectionFormat="of" target="RFC9458"/> and
<xref target="bidirectional"/>.</t>
      </section>
    </section>
    <section anchor="single-shot-apis">
      <name>Single-Shot APIs</name>
      <section anchor="single-shot-encryption">
        <name>Encryption and Decryption</name>
        <t>In many cases, applications encrypt only a single message to a recipient's
public key.  This section provides templates for HPKE APIs that implement
stateless "single-shot" encryption and decryption using APIs specified in
<xref target="encryption-context"/> and <xref target="hpke-dem"/>:</t>
        <artwork><![CDATA[
def Seal<MODE>(pkR, info, aad, pt, ...):
  enc, ctx = Setup<MODE>S(pkR, info, ...)
  ct = ctx.Seal(aad, pt)
  return enc, ct

def Open<MODE>(enc, skR, info, aad, ct, ...):
  ctx = Setup<MODE>R(enc, skR, info, ...)
  return ctx.Open(aad, ct)
]]></artwork>
        <t>The <tt>MODE</tt> template parameter is either Base or PSK. The optional parameters
indicated by "..." depend on <tt>MODE</tt> and may be empty. For example, <tt>SetupBase()</tt> has no
additional parameters. <tt>SealPSK()</tt> and <tt>OpenPSK()</tt> would be implemented as follows:</t>
        <artwork><![CDATA[
def SealPSK(pkR, info, aad, pt, psk, psk_id):
  enc, ctx = SetupPSKS(pkR, info, psk, psk_id)
  ct = ctx.Seal(aad, pt)
  return enc, ct

def OpenPSK(enc, skR, info, aad, ct, psk, psk_id):
  ctx = SetupPSKR(enc, skR, info, psk, psk_id)
  return ctx.Open(aad, ct)
]]></artwork>
      </section>
      <section anchor="secret-export">
        <name>Secret Export</name>
        <t>Applications may also want to derive a secret known only to a given recipient.
This section provides templates for HPKE APIs that implement stateless
"single-shot" secret export using APIs specified in <xref target="hpke-export"/>:</t>
        <artwork><![CDATA[
def SendExport<MODE>(pkR, info, exporter_context, L, ...):
  enc, ctx = Setup<MODE>S(pkR, info, ...)
  exported = ctx.Export(exporter_context, L)
  return enc, exported

def ReceiveExport<MODE>(enc, skR, info, exporter_context, L, ...):
  ctx = Setup<MODE>R(enc, skR, info, ...)
  return ctx.Export(exporter_context, L)
]]></artwork>
        <t>As in <xref target="single-shot-encryption"/>, the <tt>MODE</tt> template parameter is either Base or PSK.
The optional parameters indicated by "..." depend on <tt>MODE</tt> and may be empty.</t>
        <t>Secrets exported using this single-shot API face the same replay risks discussed
in <xref target="hpke-export"/>.  Usage of exported secrets needs to be limited as described
in that section.</t>
      </section>
    </section>
    <section anchor="ciphersuites">
      <name>Algorithm Identifiers</name>
      <t>This section lists algorithm identifiers suitable for different HPKE configurations.
Future specifications may introduce new KEM, KDF, and AEAD algorithm identifiers
and retain the security guarantees presented in this document provided they adhere
to the security requirements in <xref target="kem-security"/>, <xref target="kdf-choice"/>, and <xref target="aead-security"/>,
respectively.</t>
      <section anchor="kem-ids">
        <name>Key Encapsulation Mechanisms (KEMs)</name>
        <table anchor="kemid-values">
          <name>KEM IDs</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">KEM</th>
              <th align="left">Nsecret</th>
              <th align="left">Nenc</th>
              <th align="left">Npk</th>
              <th align="left">Nsk</th>
              <th align="left">Auth</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">Reserved</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">yes</td>
              <td align="left">RFC 9180</td>
            </tr>
            <tr>
              <td align="left">0x0010</td>
              <td align="left">DHKEM(P-256, HKDF-SHA256)</td>
              <td align="left">32</td>
              <td align="left">65</td>
              <td align="left">65</td>
              <td align="left">32</td>
              <td align="left">yes</td>
              <td align="left">
                <xref target="NISTCurves"/>, <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">0x0011</td>
              <td align="left">DHKEM(P-384, HKDF-SHA384)</td>
              <td align="left">48</td>
              <td align="left">97</td>
              <td align="left">97</td>
              <td align="left">48</td>
              <td align="left">yes</td>
              <td align="left">
                <xref target="NISTCurves"/>, <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">0x0012</td>
              <td align="left">DHKEM(P-521, HKDF-SHA512)</td>
              <td align="left">64</td>
              <td align="left">133</td>
              <td align="left">133</td>
              <td align="left">66</td>
              <td align="left">yes</td>
              <td align="left">
                <xref target="NISTCurves"/>, <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">0x0020</td>
              <td align="left">DHKEM(X25519, HKDF-SHA256)</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">32</td>
              <td align="left">yes</td>
              <td align="left">
                <xref target="RFC7748"/>, <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">0x0021</td>
              <td align="left">DHKEM(X448, HKDF-SHA512)</td>
              <td align="left">64</td>
              <td align="left">56</td>
              <td align="left">56</td>
              <td align="left">56</td>
              <td align="left">yes</td>
              <td align="left">
                <xref target="RFC7748"/>, <xref target="RFC5869"/></td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>Auth</tt> column indicates if the KEM algorithm provides the <tt>AuthEncap()</tt>/<tt>AuthDecap()</tt>
interface defined in <xref target="RFC9180"/>.</t>
        <section anchor="serializepublickey-and-deserializepublickey">
          <name>SerializePublicKey and DeserializePublicKey</name>
          <t>For P-256, P-384, and P-521, the <tt>SerializePublicKey()</tt> function of the
KEM performs the uncompressed Elliptic-Curve-Point-to-Octet-String
conversion according to <xref target="SECG"/>. <tt>DeserializePublicKey()</tt> performs the
uncompressed Octet-String-to-Elliptic-Curve-Point conversion.</t>
          <t>For X25519 and X448, the <tt>SerializePublicKey()</tt> and <tt>DeserializePublicKey()</tt>
functions are the identity function, since these curves already use
fixed-length byte strings for public keys.</t>
          <t>Some deserialized public keys MUST be validated before they can be used. See
<xref target="validation"/> for specifics.</t>
        </section>
        <section anchor="serializeprivatekey">
          <name>SerializePrivateKey and DeserializePrivateKey</name>
          <t>As per <xref target="SECG"/>, P-256, P-384, and P-521 private keys are field elements in the
scalar field of the curve being used. For this section, and for
<xref target="derive-key-pair"/>, it is assumed that implementors of ECDH over these curves
use an integer representation of private keys that is compatible with the
<tt>OS2IP()</tt> function.</t>
          <t>For P-256, P-384, and P-521, the <tt>SerializePrivateKey()</tt> function of the KEM
performs the Field-Element-to-Octet-String conversion according to <xref target="SECG"/>. If
the private key is an integer outside the range <tt>[0, order-1]</tt>, where <tt>order</tt>
is the order of the curve being used, the private key MUST be reduced to its
representative in <tt>[0, order-1]</tt> before being serialized.
<tt>DeserializePrivateKey()</tt> performs the Octet-String-to-Field-Element conversion
according to <xref target="SECG"/>.</t>
          <t>For X25519 and X448, private keys are identical to their byte string
representation, so little processing has to be done. The
<tt>SerializePrivateKey()</tt> function MUST clamp its output and the
<tt>DeserializePrivateKey()</tt> function MUST clamp its input, where <em>clamping</em> refers to the
bitwise operations performed on <tt>k</tt> in the <tt>decodeScalar25519()</tt> and
<tt>decodeScalar448()</tt> functions defined in Section 5 of <xref target="RFC7748"/>.</t>
          <t>To catch invalid keys early on, implementors of DHKEMs SHOULD check that
deserialized private keys are not equivalent to 0 (mod <tt>order</tt>), where <tt>order</tt>
is the order of the DH group. Note that this property is trivially true for X25519
and X448 groups, since clamped values can never be 0 (mod <tt>order</tt>).</t>
        </section>
        <section anchor="derive-key-pair">
          <name>DeriveKeyPair</name>
          <t>The keys that <tt>DeriveKeyPair()</tt> produces have only as much entropy as the provided
input keying material. For a given KEM, the <tt>ikm</tt> parameter given to <tt>DeriveKeyPair()</tt> SHOULD
have length at least <tt>Nsk</tt>, and SHOULD have at least <tt>Nsk</tt> bytes of entropy.</t>
          <t>All invocations of KDF functions (such as <tt>LabeledExtract</tt> or <tt>LabeledExpand</tt>) in any
DHKEM's <tt>DeriveKeyPair()</tt> function use the DHKEM's associated KDF (as opposed to
the ciphersuite's KDF).</t>
          <t>For P-256, P-384, and P-521, the <tt>DeriveKeyPair()</tt> function of the KEM performs
rejection sampling over field elements:</t>
          <artwork><![CDATA[
# For use with a one-stage KDF
def DeriveCandidate_OneStage(ikm, counter):
  return LabeledDerive(ikm, "candidate", I2OSP(counter, 1), Nsk)

# For use with a two-stage KDF
def DeriveCandidate_TwoStage(ikm, counter):
  # Note: dkp_prk may be derived once and cached
  dkp_prk = LabeledExtract("", "dkp_prk", ikm)
  return LabeledExpand(dkp_prk, "candidate",
                          I2OSP(counter, 1), Nsk)

def DeriveKeyPair(ikm):
  sk = 0
  counter = 0
  while sk == 0 or sk >= order:
    if counter > 255:
      raise DeriveKeyPairError
    bytes = DeriveCandidate(ikm, counter)
    bytes[0] = bytes[0] & bitmask
    sk = OS2IP(bytes)
    counter = counter + 1
  return (sk, pk(sk))
]]></artwork>
          <t><tt>order</tt> is the order of the curve being used (see Section D.1.2 of <xref target="NISTCurves"/>), and
is listed below for completeness.</t>
          <artwork><![CDATA[
P-256:
0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551

P-384:
0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf
  581a0db248b0a77aecec196accc52973

P-521:
0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409
]]></artwork>
          <t><tt>bitmask</tt> is defined to be 0xFF for P-256 and P-384, and 0x01 for P-521.
The precise likelihood of <tt>DeriveKeyPair()</tt> failing with DeriveKeyPairError
depends on the group being used, but it is negligibly small in all cases.
See <xref target="api-errors"/> for information about dealing with such failures.</t>
          <t>For X25519 and X448, the <tt>DeriveKeyPair()</tt> function applies a KDF to the input:</t>
          <sourcecode type="pseudocode"><![CDATA[
# For use with a one-stage KDF
def DeriveKeyPair_OneStage(ikm):
  sk = LabeledDerive(ikm, "sk", "", Nsk)
  return (sk, pk(sk))

# For use with a two-stage KDF
def DeriveKeyPair_TwoStage(ikm):
  dkp_prk = LabeledExtract("", "dkp_prk", ikm)
  sk = LabeledExpand(dkp_prk, "sk", "", Nsk)
  return (sk, pk(sk))
]]></sourcecode>
          <t>The <tt>suite_id</tt> used implicitly in <tt>LabeledExtract()</tt> and <tt>LabeledExpand()</tt>
for <tt>DeriveKeyPair(ikm)</tt> is derived from the KEM identifier of the
DHKEM in use (see <xref target="kem-ids"/>), that is, based on the type of key
pair been generated for that DHKEM type.</t>
          <t>For all of the above instances of DHKEM, the <tt>GenerateKeyPair</tt> can be
implemented as <tt>DeriveKeyPair(random(Nsk))</tt>.</t>
        </section>
        <section anchor="validation">
          <name>Validation of Inputs and Outputs</name>
          <t>The following public keys are subject to validation if the group
requires public key validation: the sender MUST validate the recipient's
public key <tt>pkR</tt>; the recipient MUST validate the ephemeral public key
<tt>pkE</tt>. Validation failure yields a <tt>ValidationError</tt>.</t>
          <t>For P-256, P-384 and P-521, senders and recipients MUST perform partial
public key validation on all public key inputs, as defined in Section 5.6.2.3.4
of <xref target="keyagreement"/>. This includes checking that the coordinates are in the
correct range, that the point is on the curve, and that the point is not the
point at infinity. Additionally, senders and recipients MUST ensure the
Diffie-Hellman shared secret is not the point at infinity.</t>
          <t>For X25519 and X448, public keys and Diffie-Hellman outputs MUST be validated
as described in <xref target="RFC7748"/>. In particular, recipients MUST check whether
the Diffie-Hellman shared secret is the all-zero value and abort if so.</t>
        </section>
        <section anchor="future-kems">
          <name>Future KEMs</name>
          <t><xref target="kem-security"/> lists security requirements on a KEM used within HPKE.</t>
          <t>A KEM algorithm may support different encoding algorithms, with different output
lengths, for KEM public keys. Such KEM algorithms MUST specify only one encoding
algorithm whose output length is <tt>Npk</tt>.</t>
        </section>
      </section>
      <section anchor="kdf-ids">
        <name>Key Derivation Functions (KDFs)</name>
        <table anchor="kdfid-values">
          <name>KDF IDs</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">KDF</th>
              <th align="left">Nh</th>
              <th align="left">Two-Stage</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">Reserved</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">RFC 9180</td>
            </tr>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">HKDF-SHA256</td>
              <td align="left">32</td>
              <td align="left">Y</td>
              <td align="left">
                <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">HKDF-SHA384</td>
              <td align="left">48</td>
              <td align="left">Y</td>
              <td align="left">
                <xref target="RFC5869"/></td>
            </tr>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">HKDF-SHA512</td>
              <td align="left">64</td>
              <td align="left">Y</td>
              <td align="left">
                <xref target="RFC5869"/></td>
            </tr>
          </tbody>
        </table>
        <section anchor="kdf-input-length">
          <name>Input Length Restrictions</name>
          <t>For one-stage KDFs, there is length limit of 65,535 bytes for the <tt>psk</tt>,
<tt>psk_id</tt>, <tt>info</tt> fields. This limitation arises because these fields are all
prefixed with a two-byte length when being used as KDF inputs. There is no
inherent length limitation on <tt>exporter_context</tt>.  If a one-stage KDF has an
input length limit, then implementations MUST limit the length of
<tt>exporter_context</tt> accordingly, so that the <tt>LabeledDerive</tt> call in
<tt>Context.Export</tt> does not overflow the input length limit.</t>
          <t>For two-stage KDFs, this document defines <tt>LabeledExtract()</tt> and <tt>LabeledExpand()</tt> based on the
KDFs listed above. These functions add prefixes to their respective
inputs <tt>ikm</tt> and <tt>info</tt> before calling the KDF's <tt>Extract()</tt> and <tt>Expand()</tt>
functions. This leads to a reduction of the maximum input length that
is available for the inputs <tt>psk</tt>, <tt>psk_id</tt>, <tt>info</tt>, <tt>exporter_context</tt>,
<tt>ikm</tt>, i.e., the variable-length parameters provided by HPKE applications.
The following table lists the maximum allowed lengths of these parameters
for the KDFs defined in this document, as inclusive bounds in bytes:</t>
          <table anchor="input-limits">
            <name>Application Input Limits</name>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">HKDF-SHA256</th>
                <th align="left">HKDF-SHA384</th>
                <th align="left">HKDF-SHA512</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">psk</td>
                <td align="left">2^{61} - 88</td>
                <td align="left">2^{125} - 152</td>
                <td align="left">2^{125} - 152</td>
              </tr>
              <tr>
                <td align="left">psk_id</td>
                <td align="left">2^{61} - 93</td>
                <td align="left">2^{125} - 157</td>
                <td align="left">2^{125} - 157</td>
              </tr>
              <tr>
                <td align="left">info</td>
                <td align="left">2^{61} - 91</td>
                <td align="left">2^{125} - 155</td>
                <td align="left">2^{125} - 155</td>
              </tr>
              <tr>
                <td align="left">exporter_context</td>
                <td align="left">2^{61} - 120</td>
                <td align="left">2^{125} - 200</td>
                <td align="left">2^{125} - 216</td>
              </tr>
              <tr>
                <td align="left">ikm (DeriveKeyPair)</td>
                <td align="left">2^{61} - 84</td>
                <td align="left">2^{125} - 148</td>
                <td align="left">2^{125} - 148</td>
              </tr>
            </tbody>
          </table>
          <t>This shows that the limits are only marginally smaller than the maximum
input length of the underlying hash function; these limits are large and
unlikely to be reached in practical applications. Future specifications
that define new KDFs MUST specify bounds for these variable-length
parameters.</t>
          <t>Since the above bounds are larger than any values used in practice, it may be
useful for implementations to impose a lower limit on the values they will
accept (for example, to avoid dynamic allocations).  Implementations SHOULD set
such a limit to be no less than maximum <tt>Nsk</tt> size for a KEM supported by the
implementation.  For an implementation that supports all of the KEMs in this
document, the limit would be 66 bytes, which is the <tt>Nsk</tt> value for DHKEM(P-521,
HKDF-SHA512).</t>
          <t>The values for <tt>psk</tt>, <tt>psk_id</tt>, <tt>info</tt>, and <tt>ikm</tt>, which are inputs to
<tt>LabeledExtract()</tt>, were computed with the following expression:</t>
          <artwork><![CDATA[
max_size_hash_input - Nb - size_version_label -
    size_suite_id - size_input_label
]]></artwork>
          <t>The value for <tt>exporter_context</tt>, which is an input to <tt>LabeledExpand()</tt>,
was computed with the following expression:</t>
          <artwork><![CDATA[
max_size_hash_input - Nb - Nh - size_version_label -
    size_suite_id - size_input_label - 2 - 1
]]></artwork>
          <t>In these equations, <tt>max_size_hash_input</tt> is the maximum input length
of the underlying hash function in bytes, <tt>Nb</tt> is the block size of the
underlying hash function in bytes, <tt>size_version_label</tt> is the size
of "HPKE-v1" in bytes and equals 7, <tt>size_suite_id</tt> is the size of the
<tt>suite_id</tt> in bytes and equals 5 for DHKEM (relevant for <tt>ikm</tt>) and 10 for the
remainder of HPKE (relevant for <tt>psk</tt>, <tt>psk_id</tt>, <tt>info</tt>, and <tt>exporter_context</tt>),
and <tt>size_input_label</tt> is the size in bytes of the label used as parameter to
<tt>LabeledExtract()</tt> or <tt>LabeledExpand()</tt>, the maximum of which is 13
across all labels in this document.</t>
        </section>
      </section>
      <section anchor="aead-ids">
        <name>Authenticated Encryption with Associated Data (AEAD) Functions</name>
        <table anchor="aeadid-values">
          <name>AEAD IDs</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">AEAD</th>
              <th align="left">Nk</th>
              <th align="left">Nn</th>
              <th align="left">Nt</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0000</td>
              <td align="left">Reserved</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">RFC 9180</td>
            </tr>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">AES-128-GCM</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">
                <xref target="GCM"/></td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">AES-256-GCM</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">
                <xref target="GCM"/></td>
            </tr>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">ChaCha20Poly1305</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">
                <xref target="RFC8439"/></td>
            </tr>
            <tr>
              <td align="left">0xFFFF</td>
              <td align="left">Export-only</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">N/A</td>
              <td align="left">RFC 9180</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>0xFFFF</tt> AEAD ID is reserved for applications that only use the Export
interface; see <xref target="hpke-export"/> for more details.</t>
      </section>
    </section>
    <section anchor="api-considerations">
      <name>API Considerations</name>
      <t>This section documents considerations for interfaces to implementations of HPKE.
This includes error handling considerations and recommendations that improve
interoperability when HPKE is used in applications.</t>
      <section anchor="auxiliary-authenticated-application-information">
        <name>Auxiliary Authenticated Application Information</name>
        <t>HPKE has two places at which applications can specify auxiliary authenticated information:
(1) during context construction via the Setup <tt>info</tt> parameter, and (2) during Context
operations, i.e., with the <tt>aad</tt> parameter for <tt>Open()</tt> and <tt>Seal()</tt>, and the <tt>exporter_context</tt> parameter
for <tt>Export()</tt>. Application information applicable to multiple operations on a single Context
should use the Setup <tt>info</tt> parameter. This avoids redundantly processing this information for
each Context operation. In contrast, application information that varies on a per-message basis
should be specified via the Context APIs (<tt>Seal()</tt>, <tt>Open()</tt>, or <tt>Export()</tt>).</t>
        <t>Applications that only use the single-shot APIs described in <xref target="single-shot-apis"/> should use the
Setup <tt>info</tt> parameter for specifying auxiliary authenticated information. Implementations which
only expose single-shot APIs should not allow applications to use both Setup <tt>info</tt> and Context
<tt>aad</tt> or <tt>exporter_context</tt> auxiliary information parameters.</t>
      </section>
      <section anchor="api-errors">
        <name>Errors</name>
        <t>The high-level, public HPKE APIs specified in this document are all fallible.
These include the Setup functions and all encryption context functions.
For example, <tt>Decap()</tt> can fail if the encapsulated secret <tt>enc</tt> is invalid,
and <tt>Open()</tt> may fail if ciphertext decryption fails. The explicit errors
generated throughout this specification, along with the conditions that
lead to each error, are as follows:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ValidationError</tt>: KEM input or output validation failure; <xref target="dhkem"/>.</t>
          </li>
          <li>
            <t><tt>DeserializeError</tt>: Public or private key deserialization failure; <xref target="base-crypto"/>.</t>
          </li>
          <li>
            <t><tt>EncapError</tt>: <tt>Encap()</tt> failure; <xref target="base-crypto"/>.</t>
          </li>
          <li>
            <t><tt>DecapError</tt>: <tt>Decap()</tt> failure; <xref target="base-crypto"/>.</t>
          </li>
          <li>
            <t><tt>OpenError</tt>: Context AEAD <tt>Open()</tt> failure; <xref target="base-crypto"/> and <xref target="hpke-dem"/>.</t>
          </li>
          <li>
            <t><tt>MessageLimitReachedError</tt>: Context AEAD sequence number overflow; <xref target="base-crypto"/> and <xref target="hpke-dem"/>.</t>
          </li>
          <li>
            <t><tt>DeriveKeyPairError</tt>: Key pair derivation failure; <xref target="derive-key-pair"/>.</t>
          </li>
        </ul>
        <t>Implicit errors may also occur. As an example, certain classes of failures,
e.g., malformed recipient public keys, may not yield explicit errors.
For example, for the DHKEM variant described in this specification,
the <tt>Encap()</tt> algorithm fails when given an invalid recipient public key.
However, other KEM algorithms may not have an efficient algorithm for verifying
the validity of public keys. As a result, an equivalent error may not manifest
until AEAD decryption at the recipient.</t>
        <t>The errors in this document are meant as a guide for implementors. They are not
an exhaustive list of all the errors an implementation might emit. For example,
future KEMs might have internal failure cases, or an implementation might run
out of memory.</t>
        <t>How these errors are expressed in an API or handled by applications is an
implementation-specific detail. For example, some implementations may abort or
panic upon a <tt>DeriveKeyPairError</tt> failure given that it only occurs with
negligible probability, whereas other implementations may retry the failed
DeriveKeyPair operation. See <xref target="derive-key-pair"/> for more information.
As another example, some implementations of the DHKEM specified in this document
may choose to transform <tt>ValidationError</tt> from <tt>DH()</tt> into an <tt>EncapError</tt> or
<tt>DecapError</tt> from <tt>Encap()</tt> or <tt>Decap()</tt>, respectively, whereas others may choose
to raise <tt>ValidationError</tt> unmodified.</t>
        <t>Applications using HPKE APIs should not assume that the errors here are complete,
nor should they assume certain classes of errors will always manifest the same way
for all ciphersuites. For example, the DHKEM specified in this document will emit
a <tt>DeserializationError</tt> or <tt>ValidationError</tt> if a KEM public key is invalid. However,
a new KEM might not have an efficient algorithm for determining whether or not a
public key is valid. In this case, an invalid public key might instead yield an
<tt>OpenError</tt> when trying to decrypt a ciphertext.</t>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <section anchor="sec-properties">
        <name>Security Properties</name>
        <t>HPKE has several security goals, depending on the mode of operation,
against active and adaptive attackers that can compromise partial
secrets of senders and recipients. The desired security goals are
detailed below:</t>
        <ul spacing="normal">
          <li>
            <t>Message secrecy: Confidentiality of the sender's messages against
chosen ciphertext attacks</t>
          </li>
          <li>
            <t>Export key secrecy: Indistinguishability of each export
secret from a uniformly random bitstring of equal length, i.e.,
<tt>Context.Export</tt> is a variable-length PRF</t>
          </li>
          <li>
            <t>Sender authentication: Proof of sender origin for the PSK mode</t>
          </li>
        </ul>
        <t>These security goals are expected to hold for any honest sender and
honest recipient keys, as well as if the honest sender and honest
recipient keys are the same.</t>
        <t>HPKE mitigates malleability problems (called benign malleability <xref target="SECG"/>) in prior
public key encryption standards based on ECIES by including all public keys in the
context of the key schedule.</t>
        <t>HPKE does not provide forward secrecy with respect to recipient compromise.
In the Base mode, the secrecy properties are only expected to
hold if the recipient private key <tt>skR</tt> is not compromised at any point
in time. In the PSK mode, the secrecy properties are
expected to hold if the recipient private key <tt>skR</tt> and the pre-shared key
are not both compromised at any point in time. See <xref target="non-goals"/> for more
details.</t>
        <t>Besides forward secrecy and key-compromise impersonation, which are highlighted
in this section because of their particular cryptographic importance, HPKE
has other non-goals that are described in <xref target="non-goals"/>: no tolerance of
message reordering or loss, no downgrade or replay prevention, no hiding of the
plaintext length, and no protection against bad ephemeral randomness. <xref target="non-goals"/>
suggests application-level mitigations for some of them.</t>
        <section anchor="computational-analysis">
          <name>Computational Analysis</name>
          <t>It is shown in <xref target="CS01"/> that a hybrid public key encryption scheme of
essentially the same form as the Base mode described here is
IND-CCA2-secure as long as the underlying KEM and AEAD schemes are
IND-CCA2-secure. Moreover, it is shown in <xref target="HHK06"/> that IND-CCA2 security
of the KEM and the data encapsulation mechanism are necessary conditions
to achieve IND-CCA2 security for hybrid public key encryption.
The main difference between the scheme proposed in <xref target="CS01"/>
and the Base mode in this document (both named HPKE) is that we interpose
some KDF calls between the KEM and the AEAD. Analyzing the HPKE Base mode
instantiation in this document therefore requires verifying that the
additional KDF calls do not cause the IND-CCA2 property to fail, as
well as verifying the additional export key secrecy property.</t>
          <t>A preliminary computational analysis of all HPKE modes has been done
in <xref target="HPKEAnalysis"/>, indicating asymptotic security for the case where
the KEM is DHKEM, the AEAD is any IND-CPA-secure and INT-CTXT-secure scheme,
and the DH group and KDF satisfy the following conditions:</t>
          <ul spacing="normal">
            <li>
              <t>DH group: The gap Diffie-Hellman (GDH) problem is hard in the
appropriate subgroup <xref target="GAP"/>.</t>
            </li>
            <li>
              <t><tt>Extract()</tt> and <tt>Expand()</tt>: <tt>Extract()</tt> can be modeled as a random oracle.
<tt>Expand()</tt> can be modeled as a pseudorandom function, wherein the first
argument is the key.</t>
            </li>
          </ul>
          <t>In particular, the KDFs and DH groups defined in this document (see
<xref target="kdf-ids"/> and <xref target="kem-ids"/>) satisfy these properties when used as
specified. The analysis in <xref target="HPKEAnalysis"/> demonstrates that under these
constraints, HPKE continues to provide IND-CCA2 security, and provides
the additional properties noted above. Also, the analysis confirms the
expected properties hold under the different key compromise cases
mentioned above. The analysis considers a sender that sends one message
using the encryption context, and additionally exports two independent
secrets using the secret export interface.</t>
          <t>The table below summarizes the main results from <xref target="HPKEAnalysis"/>. N/A
means that a property does not apply for the given mode, whereas <tt>Y</tt> means
the given mode satisfies the property.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Variant</th>
                <th align="center">Message Sec.</th>
                <th align="center">Export Sec.</th>
                <th align="center">Sender Auth.</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Base</td>
                <td align="center">Y</td>
                <td align="center">Y</td>
                <td align="center">N/A</td>
              </tr>
              <tr>
                <td align="left">PSK</td>
                <td align="center">Y</td>
                <td align="center">Y</td>
                <td align="center">Y</td>
              </tr>
            </tbody>
          </table>
          <t>If non-DH-based KEMs are to be used with HPKE, further analysis will be
necessary to prove their security. The results from <xref target="CS01"/> provide
some indication that any IND-CCA2-secure KEM will suffice here, but are
not conclusive given the differences in the schemes.</t>
        </section>
        <section anchor="post-quantum-security">
          <name>Post-Quantum Security</name>
          <t>All of <xref target="CS01"/>, <xref target="HPKEAnalysis"/>, and <xref target="ABHKLR20"/> are premised on
classical security models and assumptions, and do not consider
adversaries capable of quantum computation. A full proof of post-quantum
security would need to take appropriate security models and assumptions
into account, in addition to simply using a post-quantum KEM.</t>
          <t>In future work, the analysis from <xref target="ABHKLR20"/> can be extended to cover
HPKE's other modes and desired security properties.
The hybrid quantum-resistance property described above, which is achieved
by using the PSK mode, is not proven in <xref target="HPKEAnalysis"/> because
this analysis requires the random oracle model; in a quantum
setting, this model needs adaption to, for example, the quantum random
oracle model.</t>
        </section>
      </section>
      <section anchor="kem-security">
        <name>Security Requirements on a KEM Used within HPKE</name>
        <t>A KEM used within HPKE MUST allow HPKE to satisfy its desired security
properties described in <xref target="sec-properties"/>. <xref target="domain-separation"/> lists
requirements concerning domain separation.</t>
        <t>In particular, the KEM
shared secret MUST be a uniformly random byte string of length <tt>Nsecret</tt>.
This means, for instance, that it would not be sufficient if the KEM
shared secret is only uniformly random as an element of some set prior
to its encoding as a byte string.</t>
        <section anchor="encapdecap-interface">
          <name>Encap/Decap Interface</name>
          <t>As mentioned in <xref target="sec-considerations"/>, <xref target="CS01"/> provides some indications
that if the KEM's <tt>Encap()</tt>/<tt>Decap()</tt> interface (which is used in the Base
and PSK modes) is IND-CCA2-secure, HPKE is able to satisfy its desired
security properties. An appropriate definition of IND-CCA2 security for
KEMs can be found in <xref target="CS01"/> and <xref target="BHK09"/>.</t>
        </section>
        <section anchor="kem-key-reuse">
          <name>KEM Key Reuse</name>
          <t>An <tt>ikm</tt> input to <tt>DeriveKeyPair()</tt> (<xref target="derive-key-pair"/>) MUST NOT be
reused elsewhere, in particular not with <tt>DeriveKeyPair()</tt> of a
different KEM.</t>
          <t>Since a KEM key pair belonging to a sender or recipient works with all modes, it can
be used with multiple modes in parallel. HPKE is constructed to be
secure in such settings due to domain separation using the <tt>suite_id</tt>
variable. However, there is no formal proof of security at the time of
writing for using multiple modes in parallel; <xref target="HPKEAnalysis"/> and
<xref target="ABHKLR20"/> only analyze isolated modes.</t>
        </section>
      </section>
      <section anchor="kdf-choice">
        <name>Security Requirements on a KDF</name>
        <t>The choice of the KDF for HPKE SHOULD be made based on the security
level provided by the KEM and, if applicable, by the PSK. The KDF
SHOULD at least have the security level of the KEM and SHOULD
at least have the security level provided by the PSK.</t>
      </section>
      <section anchor="aead-security">
        <name>Security Requirements on an AEAD</name>
        <t>All AEADs MUST be IND-CCA2-secure, as is currently true for all AEADs
listed in <xref target="aead-ids"/>.</t>
      </section>
      <section anchor="security-psk">
        <name>Pre-Shared Key Recommendations</name>
        <t>In the PSK modes, the PSK MUST have at least 32 bytes of
entropy and SHOULD be of length <tt>Nh</tt> bytes or longer. Using a PSK longer than
32 bytes but shorter than <tt>Nh</tt> bytes is permitted.</t>
        <t>HPKE is specified to use HKDF as its key derivation function. HKDF is not
designed to slow down dictionary attacks (see <xref target="RFC5869"/>). Thus, HPKE's
PSK mechanism is not suitable for use with a low-entropy password as the
PSK: In scenarios in which the adversary knows the KEM shared secret
<tt>shared_secret</tt> and has access to an oracle that distinguishes between
a good and a wrong PSK, it can perform PSK-recovering attacks. This oracle
can be the decryption operation on a captured HPKE ciphertext or any other
recipient behavior that is observably different when using a wrong PSK.
The adversary knows the KEM shared secret <tt>shared_secret</tt> if it knows all
KEM private keys of one participant. In the PSK mode, this is trivially
the case if the adversary acts as the sender.</t>
        <t>To recover a lower entropy PSK, an attacker in this scenario can trivially
perform a dictionary attack. Given a set <tt>S</tt> of possible PSK values, the
attacker generates an HPKE ciphertext for each value in <tt>S</tt>, and submits
the resulting ciphertexts to the oracle to learn which PSK is being used by
the recipient. Further, because HPKE uses AEAD schemes that are not key-committing,
an attacker can mount a partitioning oracle attack <xref target="LGR20"/> that can recover
the PSK from a set of <tt>S</tt> possible PSK values, with |S| = m*k, in roughly
m + log k queries to the oracle using ciphertexts of length proportional to
k, the maximum message length in blocks. (Applying the multi-collision algorithm from
<xref target="LGR20"/> requires a small adaptation to the algorithm wherein the appropriate nonce
is computed for each candidate key. This modification adds one call to HKDF per key.
The number of partitioning oracle queries remains unchanged.) As a result, the PSK
must therefore be chosen with sufficient entropy so that m + log k is prohibitive for
attackers (e.g., 2^128). Future specifications can define new AEAD algorithms that
are key-committing.</t>
      </section>
      <section anchor="domain-separation">
        <name>Domain Separation</name>
        <t>HPKE allows combining a DHKEM variant <tt>DHKEM(Group, KDF')</tt> and a KDF
such that both KDFs are instantiated by the same KDF. By design, the
calls to <tt>Extract()</tt> and <tt>Expand()</tt> inside DHKEM and the remainder of
HPKE use separate input domains. This justifies modeling them as
independent functions even if instantiated by the same KDF.
This domain separation between DHKEM and the remainder of HPKE is achieved by
using prefix-free sets of <tt>suite_id</tt> values in <tt>LabeledExtract()</tt>,
<tt>LabeledExpand()</tt>, and LabeledDerive (<tt>KEM...</tt> in DHKEM and <tt>HPKE...</tt> in the remainder of HPKE).
Recall that a set is prefix-free if no element is a prefix of another within the
set.</t>
        <t>Separation between uses of the one-stage and two-stage KDFs is ensured by the
inclusion of the <tt>suite_id</tt> in <tt>LabeledExtract</tt>, <tt>LabeledExpand</tt>, and
<tt>LabeledDerive</tt>.</t>
        <t>Future KEM instantiations MUST ensure, should <tt>Extract()</tt>,
<tt>Expand()</tt>, and/or <tt>Derive()</tt> be used internally, that they can be modeled as functions
independent from the invocations of these functions in the
remainder of HPKE. One way to ensure this is by using <tt>LabeledExtract()</tt> /
<tt>LabeledExpand()</tt> / <tt>LabeledDerive()</tt> functions with a <tt>suite_id</tt> as defined in <xref target="base-crypto"/>,
which will ensure input domain separation, as outlined above.
Particular attention needs to
be paid if the KEM directly invokes functions that are used internally
in HPKE's <tt>Extract()</tt> or <tt>Expand()</tt>, such as <tt>Hash()</tt> and <tt>HMAC()</tt> in the case of HKDF.
It MUST be ensured that inputs to these invocations cannot collide with
inputs to the internal invocations of these functions inside <tt>Extract()</tt> or
<tt>Expand()</tt>. In HPKE's <tt>KeySchedule()</tt> this is avoided by using <tt>Extract()</tt> instead of
<tt>Hash()</tt> on the arbitrary-length inputs <tt>info</tt> and <tt>psk_id</tt>.</t>
        <t>The string literal "HPKE-v1" used in <tt>LabeledExtract()</tt> / <tt>LabeledExpand()</tt> / <tt>LabeledDerive()</tt>
ensures that any secrets derived in HPKE are bound to the scheme's name
and version, even when possibly derived from the same Diffie-Hellman or
KEM shared secret as in another scheme or version.</t>
      </section>
      <section anchor="non-goals">
        <name>Application Embedding and Non-Goals</name>
        <t>HPKE is designed to be a fairly low-level mechanism.  As a result, it assumes
that certain properties are provided by the application in which HPKE is
embedded and leaves certain security properties to be provided by other
mechanisms. Otherwise said, certain properties are out-of-scope for HPKE.</t>
        <section anchor="message-order-and-message-loss">
          <name>Message Order and Message Loss</name>
          <t>The primary requirement that HPKE imposes on applications is the requirement
that ciphertexts MUST be presented to <tt>ContextR.Open()</tt> in the same order in
which they were generated by <tt>ContextS.Seal()</tt>.  When the single-shot API is
used (see <xref target="single-shot-apis"/>), this is trivially true (since there is only
ever one ciphertext.  Applications that allow for multiple invocations of
<tt>Open()</tt> / <tt>Seal()</tt> on the same context MUST enforce the ordering property
described above.</t>
          <t>Ordering requirements of this character are usually fulfilled by providing a
sequence number in the framing of encrypted messages.  Whatever information is
used to determine the ordering of HPKE-encrypted messages SHOULD be included in
the AAD passed to <tt>ContextS.Seal()</tt> and <tt>ContextR.Open()</tt>.  The specifics of
this scheme are up to the application.</t>
          <t>HPKE is not tolerant of lost messages. Applications MUST be able to detect when
a message has been lost.  When an unrecoverable loss is detected, the application MUST discard
any associated HPKE context.</t>
        </section>
        <section anchor="downgrade-prevention">
          <name>Downgrade Prevention</name>
          <t>HPKE assumes that the sender and recipient agree on what algorithms to use.
Depending on how these algorithms are negotiated, it may be possible for an
intermediary to force the two parties to use suboptimal algorithms.</t>
        </section>
        <section anchor="replay-protection">
          <name>Replay Protection</name>
          <t>The requirement that ciphertexts be presented to the <tt>ContextR.Open()</tt> function
in the same order they were generated by <tt>ContextS.Seal()</tt> provides a degree of
replay protection within a stream of ciphertexts resulting from a given context.
HPKE provides no other replay protection.</t>
          <t>While a sender can guarantee the uniqueness of HPKE ciphertexts, a recipient
might receive the same ciphertext multiple times.  Unless the recipient takes
particular care to guarantee that replay is impossible, such as tracking all enc
values that are received, this can result in multiple contexts that have the
same shared secret.  This is particularly relevant for exported secrets.</t>
          <t>If an attacker can cause a recipient to re-use an <tt>enc</tt> value, any exported
secrets will be the same as in the initial transaction.  While the exported
values are still known only to the sender and recipient (not the replay
attacker), such replay can allow the attacker to cause the recipient to re-use
the exported values.</t>
          <t>Consider the following scenario, in which B is using the recipient-to-sender
encryption described as an example in <xref section="9.8" sectionFormat="of" target="RFC9180"/>:</t>
          <figure anchor="replay-attack">
            <name>Attacker-triggered nonce reuse via replay</name>
            <artwork><![CDATA[
B->A: pk

A:    enc1, ctx = SetupBaseS(pk)
      ct1 = ctx.seal(aad, pt)
A->B: enc1, ct1

B:    ctx = SetupBaseR(sk, enc1)
      key, nonce = ctx.export(...)
      ct2 = AEAD.seal(key, nonce, aad2, pt2)
B->A: ct2

X->B: enc1, ct1 [replay of previously sent values]

B:    ctx = SetupBaseR(sk, enc)
      key, nonce = ctx.export(...)
      ct3 = AEAD.seal(key, nonce, aad3, pt3)
B->X: ct3
]]></artwork>
          </figure>
          <t>In this scenario, if <tt>aad2</tt> is different from <tt>aad3</tt> or <tt>pt2</tt> is different from
<tt>pt3</tt> (for example, due to the use of a timestamp in either field), then the
ciphertexts <tt>ct2</tt> and <tt>ct3</tt> will represent encryptions of different values with
the same (key, nonce) pair -- a nonce reuse condition that can completely break
the authenticated encryption guarantees for several AEAD algorithms, including
those defined in <xref target="aead-ids"/>.</t>
          <t>In order to avoid such risks, applications SHOULD incorporate a fresh
recipient-provided nonce when deriving values from an export context, as
discussed in <xref section="4.4" sectionFormat="of" target="RFC9458"/> and <xref target="bidirectional"/>.</t>
        </section>
        <section anchor="forward-secrecy">
          <name>Forward Secrecy</name>
          <t>HPKE ciphertexts are not forward secret with respect to recipient compromise
in any mode. This means that compromise of long-term recipient secrets allows
an attacker to decrypt past ciphertexts encrypted under said secrets. This is because
only long-term secrets are used on the side of the recipient.</t>
          <t>HPKE ciphertexts are forward secret with respect to sender compromise in all
modes. This is because ephemeral randomness is used on the sender's side, which
is supposed to be erased directly after computation of the KEM shared secret and
ciphertext.</t>
        </section>
        <section anchor="bad-ephemeral-randomness">
          <name>Bad Ephemeral Randomness</name>
          <t>If the randomness used for KEM encapsulation is bad -- i.e., of low entropy or
compromised because of a broken or subverted random number generator -- the
confidentiality guarantees of HPKE degrade significantly. In Base mode,
confidentiality guarantees can be lost completely; in the other modes, at least forward secrecy with
respect to sender compromise can be lost completely.</t>
          <t>Such a situation could also lead to the reuse of the same KEM shared secret
and thus to the reuse of same key-nonce pairs for the AEAD.
The AEADs specified in this document are not secure
in case of nonce reuse. This attack vector is particularly relevant in
the authenticated mode because knowledge of the ephemeral randomness is not
enough to derive <tt>shared_secret</tt> in these modes.</t>
          <t>One way for applications to mitigate the impacts of bad ephemeral randomness is
to combine ephemeral randomness with a local long-term secret that has been
generated securely, as described in <xref target="RFC8937"/>.</t>
        </section>
        <section anchor="hiding-plaintext-length">
          <name>Hiding Plaintext Length</name>
          <t>AEAD ciphertexts produced by HPKE do not hide the plaintext length. Applications
requiring this level of privacy should use a suitable padding mechanism. See
<xref target="I-D.ietf-tls-esni"/> and <xref target="RFC8467"/> for examples of protocol-specific
padding policies.</t>
        </section>
      </section>
      <section anchor="bidirectional">
        <name>Bidirectional Encryption</name>
        <t>As discussed in <xref target="hpke-dem"/>, HPKE encryption is unidirectional from sender
to recipient. Applications that require bidirectional encryption can derive
necessary keying material with the secret export interface <xref target="hpke-export"/>.
The type and length of such keying material depends on the application use
case.</t>
        <t>As an example, if an application needs AEAD encryption from the recipient to
the sender, it can derive a key and nonce from the corresponding HPKE context
as follows:</t>
        <artwork><![CDATA[
def EncryptResponse(context, enc, response_aad, response_pt):
  secret = context.Export("[application] response", Nh)
  response_nonce = random(Nh)
  salt = concat(enc, response_nonce)
  prk = Extract(salt, secret)
  aead_key = Expand(prk, "key", Nk)
  aead_nonce = Expand(prk, "nonce", Nn)
  ct = Seal(aead_key, aead_nonce, response_aad, response_pt)
  return (response_nonce, ct)
]]></artwork>
        <t>This example mechanism differs from the example mechanism in <xref target="RFC9180"/> by
incorporating a per-transaction random value <tt>response_nonce</tt>.  Because HPKE
does not provide replay protection, the mechanism in <xref target="RFC9180"/> enabled an
attacker to trigger reuse of a (key, nonce) pair by replaying an HPKE message
under certain application circumstances.  Incorporating per-transaction
entropy ensures that the key and nonce used in AEAD encryption will be distinct
for every invocation of the mechanism.</t>
        <t>In this context, HPKE's limitations with regard to sender authentication become
limits on recipient authentication. In particular, in the Base mode, there is no
authentication of the remote party at all.</t>
      </section>
      <section anchor="metadata-protection">
        <name>Metadata Protection</name>
        <t>The PSK mode of HPKE requires that the recipient
know what key material to use for the sender.  This can be signaled in
applications by sending the PSK ID (<tt>psk_id</tt> above) and/or the sender's public
key (<tt>pkS</tt>).  However, these values themselves might be considered sensitive,
since, in a given application context, they might identify the sender.</t>
        <t>An application that wishes to protect these metadata values without requiring
further provisioning of keys can use an additional instance of HPKE, using the
unauthenticated Base mode.  Where the application might have sent <tt>(psk_id,
enc, ciphertext)</tt> before, it would now send <tt>(enc2, ciphertext2, enc, ciphertext)</tt>,
where <tt>(enc2, ciphertext2)</tt> represent the encryption of the <tt>psk_id</tt> value.</t>
        <t>The cost of this approach is an additional KEM operation each for the sender and
the recipient.  A potential lower-cost approach (involving only symmetric
operations) would be available if the nonce-protection schemes in <xref target="BNT19"/>
could be extended to cover other metadata.  However, this construction would
require further analysis.</t>
      </section>
    </section>
    <section anchor="message-encoding">
      <name>Message Encoding</name>
      <t>This document does not specify a wire format encoding for HPKE messages. Applications
that adopt HPKE must therefore specify an unambiguous encoding mechanism that includes,
minimally: the encapsulated secret <tt>enc</tt>, ciphertext value(s) (and order if there are
multiple), and any info values that are not implicit. One example of a non-implicit
value is the recipient public key used for encapsulation, which may be needed if a
recipient has more than one public key.</t>
      <t>The AEAD interface used in this document is based on <xref target="RFC5116"/>, which produces and
consumes a single ciphertext value. As discussed in <xref target="RFC5116"/>, this ciphertext value
contains the encrypted plaintext as well as any authentication data, encoded in a manner
described by the individual AEAD scheme. Some implementations are not structured in this
way, instead providing a separate ciphertext and authentication tag. When such
AEAD implementations are used in HPKE implementations, the HPKE implementation must combine
these inputs into a single ciphertext value within <tt>Seal()</tt> and parse them out within
<tt>Open()</tt>, where the parsing details are defined by the AEAD scheme. For example, with
the AES-GCM schemes specified in this document, the GCM authentication tag is placed in
the last Nt bytes of the ciphertext output.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA created three new registries as requested in <xref section="11" sectionFormat="of" target="RFC9180"/>:</t>
      <ul spacing="normal">
        <li>
          <t>HPKE KEM Identifiers</t>
        </li>
        <li>
          <t>HPKE KDF Identifiers</t>
        </li>
        <li>
          <t>HPKE AEAD Identifiers</t>
        </li>
      </ul>
      <t>All these registries are under "Hybrid Public Key
Encryption", and administered under a Specification Required policy
<xref target="RFC8126"/>.</t>
      <t>This document requests that entries in these registries referring to RFC 9180 be
updated to refer to this document.</t>
      <section anchor="kem-template">
        <name>KEM Identifiers</name>
        <t>The "HPKE KEM Identifiers" registry lists identifiers for key encapsulation
algorithms defined for use with HPKE.  These identifiers are two-byte values,
so the maximum possible value is 0xFFFF = 65535.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The two-byte identifier for the algorithm</t>
          </li>
          <li>
            <t>KEM: The name of the algorithm</t>
          </li>
          <li>
            <t>Nsecret: The length in bytes of a KEM shared secret produced by the algorithm</t>
          </li>
          <li>
            <t>Nenc: The length in bytes of an encoded encapsulated secret produced by the algorithm</t>
          </li>
          <li>
            <t>Npk: The length in bytes of an encoded public key for the algorithm</t>
          </li>
          <li>
            <t>Nsk: The length in bytes of an encoded private key for the algorithm</t>
          </li>
          <li>
            <t>Auth: A boolean indicating if this algorithm provides the <tt>AuthEncap()</tt>/<tt>AuthDecap()</tt> interface</t>
          </li>
          <li>
            <t>Reference: Where this algorithm is defined</t>
          </li>
        </ul>
        <t>Initial contents: Provided in <xref target="kemid-values"/></t>
      </section>
      <section anchor="kdf-identifiers">
        <name>KDF Identifiers</name>
        <t>The "HPKE KDF Identifiers" registry lists identifiers for key derivation
functions defined for use with HPKE.  These identifiers are two-byte values,
so the maximum possible value is 0xFFFF = 65535.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The two-byte identifier for the algorithm</t>
          </li>
          <li>
            <t>KDF: The name of the algorithm</t>
          </li>
          <li>
            <t>Nh: The output size of the Extract function in bytes</t>
          </li>
          <li>
            <t>Reference: Where this algorithm is defined</t>
          </li>
        </ul>
        <t>Initial contents: Provided in <xref target="kdfid-values"/></t>
      </section>
      <section anchor="aead-identifiers">
        <name>AEAD Identifiers</name>
        <t>The "HPKE AEAD Identifiers" registry lists identifiers for authenticated
encryption with associated data (AEAD) algorithms defined for use with HPKE.
These identifiers are two-byte values, so the maximum possible value is
0xFFFF = 65535.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>
            <t>Value: The two-byte identifier for the algorithm</t>
          </li>
          <li>
            <t>AEAD: The name of the algorithm</t>
          </li>
          <li>
            <t>Nk: The length in bytes of a key for this algorithm</t>
          </li>
          <li>
            <t>Nn: The length in bytes of a nonce for this algorithm</t>
          </li>
          <li>
            <t>Nt: The length in bytes of an authentication tag for this algorithm</t>
          </li>
          <li>
            <t>Reference: Where this algorithm is defined</t>
          </li>
        </ul>
        <t>Initial contents: Provided in <xref target="aeadid-values"/></t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9458">
          <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="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="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CS01" target="https://eprint.iacr.org/2001/108">
          <front>
            <title>Design and Analysis of Practical Public-Key Encryption Schemes Secure against Adaptive Chosen Ciphertext Attack</title>
            <author initials="R." surname="Cramer" fullname="Ronald Cramer">
              <organization/>
            </author>
            <author initials="V." surname="Shoup" fullname="Victor Shoup">
              <organization/>
            </author>
            <date year="2001"/>
          </front>
        </reference>
        <reference anchor="HHK06" target="https://eprint.iacr.org/2006/265">
          <front>
            <title>Some (in)sufficient conditions for secure hybrid encryption</title>
            <author initials="J." surname="Herranz" fullname="Javier Herranz">
              <organization/>
            </author>
            <author initials="D." surname="Hofheinz" fullname="Dennis Hofheinz">
              <organization/>
            </author>
            <author initials="E." surname="Kiltz" fullname="Eike Kiltz">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
        </reference>
        <reference anchor="GAP" target="https://link.springer.com/content/pdf/10.1007/3-540-44586-2_8.pdf">
          <front>
            <title>The Gap-Problems - a New Class of Problems for the Security of Cryptographic Schemes</title>
            <author initials="T." surname="Okamoto" fullname="Tatsuaki Okamoto">
              <organization/>
            </author>
            <author initials="D." surname="Pointcheval" fullname="David Pointcheval">
              <organization/>
            </author>
            <date year="2001"/>
          </front>
          <seriesInfo name="ISBN" value="978-3-540-44586-9"/>
        </reference>
        <reference anchor="ANSI">
          <front>
            <title>ANSI X9.63 Public Key Cryptography for the Financial Services Industry -- Key Agreement and Key Transport Using Elliptic Curve Cryptography</title>
            <author>
              <organization>American National Standards Institute</organization>
            </author>
            <date year="2001"/>
          </front>
        </reference>
        <reference anchor="IEEE1363">
          <front>
            <title>IEEE 1363a, Standard Specifications for Public Key Cryptography - Amendment 1 -- Additional Techniques"</title>
            <author>
              <organization>Institute of Electrical and Electronics Engineers</organization>
            </author>
            <date year="2004"/>
          </front>
        </reference>
        <reference anchor="ISO">
          <front>
            <title>ISO/IEC 18033-2, Information Technology - Security Techniques - Encryption Algorithms - Part 2 -- Asymmetric Ciphers</title>
            <author>
              <organization>International Organization for Standardization / International Electrotechnical Commission</organization>
            </author>
            <date year="2006"/>
          </front>
        </reference>
        <reference anchor="SECG" target="https://secg.org/sec1-v2.pdf">
          <front>
            <title>Elliptic Curve Cryptography, Standards for Efficient Cryptography Group, ver. 2</title>
            <author>
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="BHK09" target="https://eprint.iacr.org/2009/418">
          <front>
            <title>Subtleties in the Definition of IND-CCA: When and How Should Challenge-Decryption be Disallowed?</title>
            <author initials="" surname="Mihir Bellare">
              <organization>University of California San Diego</organization>
            </author>
            <author initials="" surname="Dennis Hofheinz">
              <organization>CWI Amsterdam</organization>
            </author>
            <author initials="" surname="Eike Kiltz">
              <organization>CWI Amsterdam</organization>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="SigncryptionDZ10">
          <front>
            <title>Practical Signcryption</title>
            <author>
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="Information Security and" value="Cryptography"/>
          <seriesInfo name="DOI" value="10.1007/978-3-540-89411-7"/>
          <seriesInfo name="ISBN" value="[&quot;9783540894094&quot;, &quot;9783540894117&quot;]"/>
          <refcontent>Springer Berlin Heidelberg</refcontent>
        </reference>
        <reference anchor="HPKEAnalysis" target="https://eprint.iacr.org/2020/243">
          <front>
            <title>An Analysis of Hybrid Public Key Encryption</title>
            <author initials="B." surname="Lipp" fullname="Benjamin Lipp">
              <organization>Inria Paris</organization>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="ABHKLR20" target="https://eprint.iacr.org/2020/1499">
          <front>
            <title>Analysing the HPKE Standard</title>
            <author initials="J." surname="Alwen" fullname="Joël Alwen">
              <organization>Wickr</organization>
            </author>
            <author initials="B." surname="Blanchet" fullname="Bruno Blanchet">
              <organization>Inria Paris</organization>
            </author>
            <author initials="E." surname="Hauck" fullname="Eduard Hauck">
              <organization>Ruhr-Universität Bochum</organization>
            </author>
            <author initials="E." surname="Kiltz" fullname="Eike Kiltz">
              <organization>Ruhr-Universität Bochum</organization>
            </author>
            <author initials="B." surname="Lipp" fullname="Benjamin Lipp">
              <organization>Inria Paris</organization>
            </author>
            <author initials="D." surname="Riepel" fullname="Doreen Riepel">
              <organization>Ruhr-Universität Bochum</organization>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="MAEA10" target="https://ieeexplore.ieee.org/abstract/document/5604194/">
          <front>
            <title>A Comparison of the Standardized Versions of ECIES</title>
            <author initials="V." surname="Gayoso Martinez" fullname="V. Gayoso Martinez">
              <organization>Applied Physics Institute, CSIC, Madrid, Spain</organization>
            </author>
            <author initials="F." surname="Hernandez Alvarez" fullname="F. Hernandez Alvarez">
              <organization>Applied Physics Institute, CSIC, Madrid, Spain</organization>
            </author>
            <author initials="L." surname="Hernandez Encinas" fullname="L. Hernandez Encinas">
              <organization>Applied Physics Institute, CSIC, Madrid, Spain</organization>
            </author>
            <author initials="C." surname="Sanchez Avila" fullname="C. Sanchez Avila">
              <organization>Polytechnic University, Madrid, Spain</organization>
            </author>
            <date year="2010"/>
          </front>
        </reference>
        <reference anchor="BNT19" target="http://dx.doi.org/10.1007/978-3-030-26948-7_9">
          <front>
            <title>Nonces Are Noticed: AEAD Revisited</title>
            <author initials="M." surname="Bellare" fullname="Mihir Bellare">
              <organization>University of California, San Diego</organization>
            </author>
            <author initials="R." surname="Ng" fullname="Ruth Ng">
              <organization>University of California, San Diego</organization>
            </author>
            <author initials="B." surname="Tackmann" fullname="Björn Tackmann">
              <organization>IBM Research</organization>
            </author>
            <date year="2019"/>
          </front>
        </reference>
        <reference anchor="IMB">
          <front>
            <title>Authentication and authenticated key exchanges</title>
            <author fullname="Whitfield Diffie" initials="W." surname="Diffie">
              <organization/>
            </author>
            <author fullname="Paul C. Van Oorschot" initials="P." surname="Van Oorschot">
              <organization/>
            </author>
            <author fullname="Michael J. Wiener" initials="M." surname="Wiener">
              <organization/>
            </author>
            <date month="June" year="1992"/>
          </front>
          <seriesInfo name="Designs, Codes and Cryptography" value="vol. 2, no. 2, pp. 107-125"/>
          <seriesInfo name="DOI" value="10.1007/bf00124891"/>
          <refcontent>Springer Science and Business Media LLC</refcontent>
        </reference>
        <reference anchor="LGR20" target="https://eprint.iacr.org/2020/1491">
          <front>
            <title>Partitioning Oracle Attacks</title>
            <author initials="J." surname="Len" fullname="Julia Len">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="P." surname="Grubbs" fullname="Paul Grubbs">
              <organization>Cornell Tech</organization>
            </author>
            <author initials="T." surname="Ristenpart" fullname="Thomas Ristenpart">
              <organization>Cornell Tech</organization>
            </author>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="TestVectors" target="https://github.com/cfrg/draft-irtf-cfrg-hpke/blob/5f503c564da00b0687b3de75f1dfbdfc4079ad31/test-vectors.json">
          <front>
            <title>HPKE Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="keyagreement">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="NISTCurves">
          <front>
            <title>Digital signature standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date year="2013"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-4"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="FIPS202">
          <front>
            <title>SHA-3 standard :: permutation-based hash and extendable-output functions</title>
            <author>
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.202"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="GCM">
          <front>
            <title>Recommendation for block cipher modes of operation :: GaloisCounter Mode (GCM) and GMAC</title>
            <author fullname="M J Dworkin" initials="M." surname="Dworkin">
              <organization/>
            </author>
            <date year="2007"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-38d"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
        <reference anchor="RFC1421">
          <front>
            <title>Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures</title>
            <author fullname="J. Linn" initials="J." surname="Linn"/>
            <date month="February" year="1993"/>
            <abstract>
              <t>This document defines message encryption and authentication procedures, in order to provide privacy-enhanced mail (PEM) services for electronic mail transfer in the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1421"/>
          <seriesInfo name="DOI" value="10.17487/RFC1421"/>
        </reference>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
        <reference anchor="I-D.ietf-tls-esni">
          <front>
            <title>TLS Encrypted Client Hello</title>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Independent</organization>
            </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cryptography Consulting LLC</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="14" month="June" year="2025"/>
            <abstract>
              <t>   This document describes a mechanism in Transport Layer Security (TLS)
   for encrypting a ClientHello message under a server public key.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Source for this draft and an issue tracker can be found at
   https://github.com/tlswg/draft-ietf-tls-esni
   (https://github.com/tlswg/draft-ietf-tls-esni).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-esni-25"/>
        </reference>
        <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="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="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </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="RFC8439">
          <front>
            <title>ChaCha20 and Poly1305 for IETF Protocols</title>
            <author fullname="Y. Nir" initials="Y." surname="Nir"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
              <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8439"/>
          <seriesInfo name="DOI" value="10.17487/RFC8439"/>
        </reference>
        <reference anchor="RFC8937">
          <front>
            <title>Randomness Improvements for Security Protocols</title>
            <author fullname="C. Cremers" initials="C." surname="Cremers"/>
            <author fullname="L. Garratt" initials="L." surname="Garratt"/>
            <author fullname="S. Smyshlyaev" initials="S." surname="Smyshlyaev"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="October" year="2020"/>
            <abstract>
              <t>Randomness is a crucial ingredient for Transport Layer Security (TLS) and related security protocols. Weak or predictable "cryptographically secure" pseudorandom number generators (CSPRNGs) can be abused or exploited for malicious purposes. An initial entropy source that seeds a CSPRNG might be weak or broken as well, which can also lead to critical and systemic security problems. This document describes a way for security protocol implementations to augment their CSPRNGs using long-term private keys. This improves randomness from broken or otherwise subverted CSPRNGs.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8937"/>
          <seriesInfo name="DOI" value="10.17487/RFC8937"/>
        </reference>
        <reference anchor="RFC8467">
          <front>
            <title>Padding Policies for Extension Mechanisms for DNS (EDNS(0))</title>
            <author fullname="A. Mayrhofer" initials="A." surname="Mayrhofer"/>
            <date month="October" year="2018"/>
            <abstract>
              <t>RFC 7830 specifies the "Padding" option for Extension Mechanisms for DNS (EDNS(0)) but does not specify the actual padding length for specific applications. This memo lists the possible options ("padding policies"), discusses the implications of each option, and provides a recommended (experimental) option.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8467"/>
          <seriesInfo name="DOI" value="10.17487/RFC8467"/>
        </reference>
      </references>
    </references>
    <?line 1766?>

<section anchor="differences-from-rfc-9180">
      <name>Differences from RFC 9180</name>
      <t>This specification is intended to be backwards-compatible with RFC 9180, in the
sense that any behavior specified in both this document and RFC 9180 should
specify identical behavior for any functionality that they both specify.</t>
      <t>Within that constraint, the following list summarizes the major changes from RFC
9180:</t>
      <ul spacing="normal">
        <li>
          <t>Incorporated fixes for all valid errata on RFC 9180.</t>
        </li>
        <li>
          <t>Updated the IANA considerations refer to existing registries.</t>
        </li>
        <li>
          <t>Added a framework for single-stage KDFs.</t>
        </li>
        <li>
          <t>Removed the Auth and AuthPSK modes.</t>
        </li>
        <li>
          <t>Extended the discussion of replay to conver considerations related to exported
secrets.</t>
        </li>
      </ul>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors would like to thank Joël Alwen, Jean-Philippe Aumasson, David
Benjamin, Benjamin Beurdouche, Bruno Blanchet, Frank Denis, Stephen Farrell,
Scott Fluhrer, Eduard Hauck, Scott Hollenbeck, Kevin Jacobs, Burt Kaliski, Eike
Kiltz, Julia Len, John Mattsson, Christopher Patton, Doreen Riepel, Raphael
Robert, Michael Rosenberg, Michael Scott, Martin Thomson, Steven Valdez, Riad
Wahby, and other contributors in the CFRG for helpful feedback that greatly
improved this document.</t>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>Each section below contains test vectors for a single HPKE ciphersuite and
contains the following values:</t>
      <ol spacing="normal" type="1"><li>
          <t>Configuration information and private key material: This includes the <tt>mode</tt>, <tt>info</tt> string, HPKE
ciphersuite identifiers (<tt>kem_id</tt>, <tt>kdf_id</tt>, <tt>aead_id</tt>), and all
sender, recipient, and ephemeral key material. For each role X,
where X is one of S, R, or E, as sender, recipient, and ephemeral,
respectively, key pairs are generated as <tt>(skX, pkX) = DeriveKeyPair(ikmX)</tt>.
Each key pair <tt>(skX, pkX)</tt> is written in its serialized form, where
<tt>skXm = SerializePrivateKey(skX)</tt> and <tt>pkXm = SerializePublicKey(pkX)</tt>.
For applicable modes, the shared PSK and PSK identifier are also included.</t>
        </li>
        <li>
          <t>Context creation intermediate values and outputs: This includes the
KEM outputs <tt>enc</tt> and <tt>shared_secret</tt> used to create the context, along
with intermediate values <tt>key_schedule_context</tt> and <tt>secret</tt> computed
in the KeySchedule function in <xref target="encryption-context"/>. The outputs
include the context values <tt>key</tt>, <tt>base_nonce</tt>, and <tt>exporter_secret</tt>.</t>
        </li>
        <li>
          <t>Encryption test vectors: A fixed plaintext message is encrypted using
different sequence numbers and AAD values using the context computed in (2).
Each test vector lists the sequence number and corresponding nonce computed
with <tt>base_nonce</tt>, the plaintext message <tt>pt</tt>, AAD <tt>aad</tt>, and output
ciphertext <tt>ct</tt>.</t>
        </li>
        <li>
          <t>Export test vectors: Several exported values of the same length with differing
context parameters are computed using the context computed in (2). Each test
vector lists the <tt>exporter_context</tt>, output length <tt>L</tt>, and resulting export
value.</t>
        </li>
      </ol>
      <t>These test vectors are also available in JSON format at <xref target="TestVectors"/>.</t>
      <section anchor="dhkemx25519-hkdf-sha256-hkdf-sha256-aes-128-gcm">
        <name>DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, AES-128-GCM</name>
        <section anchor="base-setup-information">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 32
kdf_id: 1
aead_id: 1
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
7268600d403fce431561aef583ee1613527cff655c1343f29812e66706df3234
pkEm:
37fda3567bdbd628e88668c3c8d7e97d1d1253b6d4ea6d44c150f741f1bf4431
skEm:
52c4a758a802cd8b936eceea314432798d5baf2d7e9235dc084ab1b9cfa2f736
ikmR:
6db9df30aa07dd42ee5e8181afdb977e538f5e1fec8a06223f33f7013e525037
pkRm:
3948cfe0ad1ddb695d780e59077195da6c56506b027329794ab02bca80815c4d
skRm:
4612c550263fc8ad58375df3f557aac531d26850903e55a9f23f21d8534e8ac8
enc:
37fda3567bdbd628e88668c3c8d7e97d1d1253b6d4ea6d44c150f741f1bf4431
shared_secret:
fe0e18c9f024ce43799ae393c7e8fe8fce9d218875e8227b0187c04e7d2ea1fc
key_schedule_context: 00725611c9d98c07c03f60095cd32d400d8347d45ed670
97bbad50fc56da742d07cb6cffde367bb0565ba28bb02c90744a20f5ef37f3052352
6106f637abb05449
secret:
12fff91991e93b48de37e7daddb52981084bd8aa64289c3788471d9a9712f397
key: 4531685d41d65f03dc48f6b8302c05b0
base_nonce: 56d890e5accaaf011cff4b7d
exporter_secret:
45ff1c2e220db587171952c0592d5f5ebe103f1561a2614e38f2ffd47e99e3f8
]]></artwork>
          <section anchor="encryptions">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 56d890e5accaaf011cff4b7d
ct: f938558b5d72f1a23810b4be2ab4f84331acc02fc97babc53a52ae8218a355a9
6d8770ac83d07bea87e13c512a

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 56d890e5accaaf011cff4b7c
ct: af2d7e9ac9ae7e270f46ba1f975be53c09f8d875bdc8535458c2494e8a6eab25
1c03d0c22a56b8ca42c2063b84

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 56d890e5accaaf011cff4b7f
ct: 498dfcabd92e8acedc281e85af1cb4e3e31c7dc394a1ca20e173cb7251649158
8d96a19ad4a683518973dcc180

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 56d890e5accaaf011cff4b79
ct: 583bd32bc67a5994bb8ceaca813d369bca7b2a42408cddef5e22f880b631215a
09fc0012bc69fccaa251c0246d

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 56d890e5accaaf011cff4b82
ct: 7175db9717964058640a3a11fb9007941a5d1757fda1a6935c805c21af32505b
f106deefec4a49ac38d71c9e0a

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 56d890e5accaaf011cff4a7d
ct: 957f9800542b0b8891badb026d79cc54597cb2d225b54c00c5238c25d05c30e3
fbeda97d2e0e1aba483a2df9f2
]]></artwork>
          </section>
          <section anchor="exported-values">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
3853fe2b4035195a573ffc53856e77058e15d9ea064de3e59f4961d0095250ee

exporter_context: 00
L: 32
exported_value:
2e8f0b54673c7029649d4eb9d5e33bf1872cf76d623ff164ac185da9e88c21a5

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
e9e43065102c3836401bed8c3c3c75ae46be1639869391d62c61f1ec7af54931
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 32
kdf_id: 1
aead_id: 1
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
78628c354e46f3e169bd231be7b2ff1c77aa302460a26dbfa15515684c00130b
pkEm:
0ad0950d9fb9588e59690b74f1237ecdf1d775cd60be2eca57af5a4b0471c91b
skEm:
463426a9ffb42bb17dbe6044b9abd1d4e4d95f9041cef0e99d7824eef2b6f588
ikmR:
d4a09d09f575fef425905d2ab396c1449141463f698f8efdb7accfaff8995098
pkRm:
9fed7e8c17387560e92cc6462a68049657246a09bfa8ade7aefe589672016366
skRm:
c5eb01eb457fe6c6f57577c5413b931550a162c71a03ac8d196babbd4e5ce0fd
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc:
0ad0950d9fb9588e59690b74f1237ecdf1d775cd60be2eca57af5a4b0471c91b
shared_secret:
727699f009ffe3c076315019c69648366b69171439bd7dd0807743bde76986cd
key_schedule_context: 01e78d5cf6190d275863411ff5edd0dece5d39fa48e04e
ec1ed9b71be34729d18ccb6cffde367bb0565ba28bb02c90744a20f5ef37f3052352
6106f637abb05449
secret:
3728ab0b024b383b0381e432b47cced1496d2516957a76e2a9f5c8cb947afca4
key: 15026dba546e3ae05836fc7de5a7bb26
base_nonce: 9518635eba129d5ce0914555
exporter_secret:
3d76025dbbedc49448ec3f9080a1abab6b06e91c0b11ad23c912f043a0ee7655
]]></artwork>
          <section anchor="encryptions-1">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 9518635eba129d5ce0914555
ct: e52c6fed7f758d0cf7145689f21bc1be6ec9ea097fef4e959440012f4feb73fb
611b946199e681f4cfc34db8ea

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 9518635eba129d5ce0914554
ct: 49f3b19b28a9ea9f43e8c71204c00d4a490ee7f61387b6719db765e948123b45
b61633ef059ba22cd62437c8ba

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 9518635eba129d5ce0914557
ct: 257ca6a08473dc851fde45afd598cc83e326ddd0abe1ef23baa3baa4dd8cde99
fce2c1e8ce687b0b47ead1adc9

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 9518635eba129d5ce0914551
ct: a71d73a2cd8128fcccbd328b9684d70096e073b59b40b55e6419c9c68ae21069
c847e2a70f5d8fb821ce3dfb1c

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 9518635eba129d5ce09145aa
ct: 55f84b030b7f7197f7d7d552365b6b932df5ec1abacd30241cb4bc4ccea27bd2
b518766adfa0fb1b71170e9392

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 9518635eba129d5ce0914455
ct: c5bf246d4a790a12dcc9eed5eae525081e6fb541d5849e9ce8abd92a3bc15517
76bea16b4a518f23e237c14b59
]]></artwork>
          </section>
          <section anchor="exported-values-1">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
dff17af354c8b41673567db6259fd6029967b4e1aad13023c2ae5df8f4f43bf6

exporter_context: 00
L: 32
exported_value:
6a847261d8207fe596befb52928463881ab493da345b10e1dcc645e3b94e2d95

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
8aff52b45a1be3a734bc7a41e20b4e055ad4c4d22104b0c20285a7c4302401cd
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="dhkemx25519-hkdf-sha256-hkdf-sha256-chacha20poly1305">
        <name>DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, ChaCha20Poly1305</name>
        <section anchor="base-setup-information-1">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 32
kdf_id: 1
aead_id: 3
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
909a9b35d3dc4713a5e72a4da274b55d3d3821a37e5d099e74a647db583a904b
pkEm:
1afa08d3dec047a643885163f1180476fa7ddb54c6a8029ea33f95796bf2ac4a
skEm:
f4ec9b33b792c372c1d2c2063507b684ef925b8c75a42dbcbf57d63ccd381600
ikmR:
1ac01f181fdf9f352797655161c58b75c656a6cc2716dcb66372da835542e1df
pkRm:
4310ee97d88cc1f088a5576c77ab0cf5c3ac797f3d95139c6c84b5429c59662a
skRm:
8057991eef8f1f1af18f4a9491d16a1ce333f695d4db8e38da75975c4478e0fb
enc:
1afa08d3dec047a643885163f1180476fa7ddb54c6a8029ea33f95796bf2ac4a
shared_secret:
0bbe78490412b4bbea4812666f7916932b828bba79942424abb65244930d69a7
key_schedule_context: 00431df6cd95e11ff49d7013563baf7f11588c75a6611e
e2a4404a49306ae4cfc5b69c5718a60cc5876c358d3f7fc31ddb598503f67be58ea1
e798c0bb19eb9796
secret:
5b9cd775e64b437a2335cf499361b2e0d5e444d5cb41a8a53336d8fe402282c6
key:
ad2744de8e17f4ebba575b3f5f5a8fa1f69c2a07f6e7500bc60ca6e3e3ec1c91
base_nonce: 5c4d98150661b848853b547f
exporter_secret:
a3b010d4994890e2c6968a36f64470d3c824c8f5029942feb11e7a74b2921922
]]></artwork>
          <section anchor="encryptions-2">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 5c4d98150661b848853b547f
ct: 1c5250d8034ec2b784ba2cfd69dbdb8af406cfe3ff938e131f0def8c8b60b4db
21993c62ce81883d2dd1b51a28

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 5c4d98150661b848853b547e
ct: 6b53c051e4199c518de79594e1c4ab18b96f081549d45ce015be002090bb119e
85285337cc95ba5f59992dc98c

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 5c4d98150661b848853b547d
ct: 71146bd6795ccc9c49ce25dda112a48f202ad220559502cef1f34271e0cb4b02
b4f10ecac6f48c32f878fae86b

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 5c4d98150661b848853b547b
ct: 63357a2aa291f5a4e5f27db6baa2af8cf77427c7c1a909e0b37214dd47db122b
b153495ff0b02e9e54a50dbe16

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 5c4d98150661b848853b5480
ct: 18ab939d63ddec9f6ac2b60d61d36a7375d2070c9b683861110757062c52b888
0a5f6b3936da9cd6c23ef2a95c

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 5c4d98150661b848853b557f
ct: 7a4a13e9ef23978e2c520fd4d2e757514ae160cd0cd05e556ef692370ca53076
214c0c40d4c728d6ed9e727a5b
]]></artwork>
          </section>
          <section anchor="exported-values-2">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
4bbd6243b8bb54cec311fac9df81841b6fd61f56538a775e7c80a9f40160606e

exporter_context: 00
L: 32
exported_value:
8c1df14732580e5501b00f82b10a1647b40713191b7c1240ac80e2b68808ba69

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
5acb09211139c43b3090489a9da433e8a30ee7188ba8b0a9a1ccf0c229283e53
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information-1">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 32
kdf_id: 1
aead_id: 3
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
35706a0b09fb26fb45c39c2f5079c709c7cf98e43afa973f14d88ece7e29c2e3
pkEm:
2261299c3f40a9afc133b969a97f05e95be2c514e54f3de26cbe5644ac735b04
skEm:
0c35fdf49df7aa01cd330049332c40411ebba36e0c718ebc3edf5845795f6321
ikmR:
26b923eade72941c8a85b09986cdfa3f1296852261adedc52d58d2930269812b
pkRm:
13640af826b722fc04feaa4de2f28fbd5ecc03623b317834e7ff4120dbe73062
skRm:
77d114e0212be51cb1d76fa99dd41cfd4d0166b08caa09074430a6c59ef17879
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc:
2261299c3f40a9afc133b969a97f05e95be2c514e54f3de26cbe5644ac735b04
shared_secret:
4be079c5e77779d0215b3f689595d59e3e9b0455d55662d1f3666ec606e50ea7
key_schedule_context: 016870c4c76ca38ae43efbec0f2377d109499d7ce73f4a
9e1ec37f21d3d063b97cb69c5718a60cc5876c358d3f7fc31ddb598503f67be58ea1
e798c0bb19eb9796
secret:
16974354c497c9bd24c000ceed693779b604f1944975b18c442d373663f4a8cc
key:
600d2fdb0313a7e5c86a9ce9221cd95bed069862421744cfb4ab9d7203a9c019
base_nonce: 112e0465562045b7368653e7
exporter_secret:
73b506dc8b6b4269027f80b0362def5cbb57ee50eed0c2873dac9181f453c5ac
]]></artwork>
          <section anchor="encryptions-3">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 112e0465562045b7368653e7
ct: 4a177f9c0d6f15cfdf533fb65bf84aecdc6ab16b8b85b4cf65a370e07fc1d78d
28fb073214525276f4a89608ff

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 112e0465562045b7368653e6
ct: 5c3cabae2f0b3e124d8d864c116fd8f20f3f56fda988c3573b40b09997fd6c76
9e77c8eda6cda4f947f5b704a8

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 112e0465562045b7368653e5
ct: 14958900b44bdae9cbe5a528bf933c5c990dbb8e282e6e495adf8205d19da9eb
270e3a6f1e0613ab7e757962a4

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 112e0465562045b7368653e3
ct: c2a7bc09ddb853cf2effb6e8d058e346f7fe0fb3476528c80db6b698415c5f8c
50b68a9a355609e96d2117f8d3

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 112e0465562045b736865318
ct: 2414d0788e4bc39a59a26d7bd5d78e111c317d44c37bd5a4c2a1235f2ddc2085
c487d406490e75210c958724a7

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 112e0465562045b7368652e7
ct: c567ae1c3f0f75abe1dd9e4532b422600ed4a6e5b9484dafb1e43ab9f5fd662b
28c00e2e81d3cde955dae7e218
]]></artwork>
          </section>
          <section anchor="exported-values-3">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
813c1bfc516c99076ae0f466671f0ba5ff244a41699f7b2417e4c59d46d39f40

exporter_context: 00
L: 32
exported_value:
2745cf3d5bb65c333658732954ee7af49eb895ce77f8022873a62a13c94cb4e1

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
ad40e3ae14f21c99bfdebc20ae14ab86f4ca2dc9a4799d200f43a25f99fa78ae
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="dhkemp-256-hkdf-sha256-hkdf-sha256-aes-128-gcm">
        <name>DHKEM(P-256, HKDF-SHA256), HKDF-SHA256, AES-128-GCM</name>
        <section anchor="base-setup-information-2">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 16
kdf_id: 1
aead_id: 1
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
4270e54ffd08d79d5928020af4686d8f6b7d35dbe470265f1f5aa22816ce860e
pkEm: 04a92719c6195d5085104f469a8b9814d5838ff72b60501e2c4466e5e67b32
5ac98536d7b61a1af4b78e5b7f951c0900be863c403ce65c9bfcb9382657222d18c4
skEm:
4995788ef4b9d6132b249ce59a77281493eb39af373d236a1fe415cb0c2d7beb
ikmR:
668b37171f1072f3cf12ea8a236a45df23fc13b82af3609ad1e354f6ef817550
pkRm: 04fe8c19ce0905191ebc298a9245792531f26f0cece2460639e8bc39cb7f70
6a826a779b4cf969b8a0e539c7f62fb3d30ad6aa8f80e30f1d128aafd68a2ce72ea0
skRm:
f3ce7fdae57e1a310d87f1ebbde6f328be0a99cdbcadf4d6589cf29de4b8ffd2
enc: 04a92719c6195d5085104f469a8b9814d5838ff72b60501e2c4466e5e67b325
ac98536d7b61a1af4b78e5b7f951c0900be863c403ce65c9bfcb9382657222d18c4
shared_secret:
c0d26aeab536609a572b07695d933b589dcf363ff9d93c93adea537aeabb8cb8
key_schedule_context: 00b88d4e6d91759e65e87c470e8b9141113e9ad5f0c8ce
efc1e088c82e6980500798e486f9c9c09c9b5c753ac72d6005de254c607d1b534ed1
1d493ae1c1d9ac85
secret:
2eb7b6bf138f6b5aff857414a058a3f1750054a9ba1f72c2cf0684a6f20b10e1
key: 868c066ef58aae6dc589b6cfdd18f97e
base_nonce: 4e0bc5018beba4bf004cca59
exporter_secret:
14ad94af484a7ad3ef40e9f3be99ecc6fa9036df9d4920548424df127ee0d99f
]]></artwork>
          <section anchor="encryptions-4">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 4e0bc5018beba4bf004cca59
ct: 5ad590bb8baa577f8619db35a36311226a896e7342a6d836d8b7bcd2f20b6c7f
9076ac232e3ab2523f39513434

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 4e0bc5018beba4bf004cca58
ct: fa6f037b47fc21826b610172ca9637e82d6e5801eb31cbd3748271affd4ecb06
646e0329cbdf3c3cd655b28e82

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 4e0bc5018beba4bf004cca5b
ct: 895cabfac50ce6c6eb02ffe6c048bf53b7f7be9a91fc559402cbc5b8dcaeb52b
2ccc93e466c28fb55fed7a7fec

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 4e0bc5018beba4bf004cca5d
ct: 8787491ee8df99bc99a246c4b3216d3d57ab5076e18fa27133f520703bc70ec9
99dd36ce042e44f0c3169a6a8f

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 4e0bc5018beba4bf004ccaa6
ct: 2ad71c85bf3f45c6eca301426289854b31448bcf8a8ccb1deef3ebd87f60848a
a53c538c30a4dac71d619ee2cd

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 4e0bc5018beba4bf004ccb59
ct: 10f179686aa2caec1758c8e554513f16472bd0a11e2a907dde0b212cbe87d74f
367f8ffe5e41cd3e9962a6afb2
]]></artwork>
          </section>
          <section anchor="exported-values-4">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
5e9bc3d236e1911d95e65b576a8a86d478fb827e8bdfe77b741b289890490d4d

exporter_context: 00
L: 32
exported_value:
6cff87658931bda83dc857e6353efe4987a201b849658d9b047aab4cf216e796

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
d8f1ea7942adbba7412c6d431c62d01371ea476b823eb697e1f6e6cae1dab85a
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information-2">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 16
kdf_id: 1
aead_id: 1
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
2afa611d8b1a7b321c761b483b6a053579afa4f767450d3ad0f84a39fda587a6
pkEm: 04305d35563527bce037773d79a13deabed0e8e7cde61eecee403496959e89
e4d0ca701726696d1485137ccb5341b3c1c7aaee90a4a02449725e744b1193b53b5f
skEm:
57427244f6cc016cddf1c19c8973b4060aa13579b4c067fd5d93a5d74e32a90f
ikmR:
d42ef874c1913d9568c9405407c805baddaffd0898a00f1e84e154fa787b2429
pkRm: 040d97419ae99f13007a93996648b2674e5260a8ebd2b822e84899cd52d874
46ea394ca76223b76639eccdf00e1967db10ade37db4e7db476261fcc8df97c5ffd1
skRm:
438d8bcef33b89e0e9ae5eb0957c353c25a94584b0dd59c991372a75b43cb661
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc: 04305d35563527bce037773d79a13deabed0e8e7cde61eecee403496959e89e
4d0ca701726696d1485137ccb5341b3c1c7aaee90a4a02449725e744b1193b53b5f
shared_secret:
2e783ad86a1beae03b5749e0f3f5e9bb19cb7eb382f2fb2dd64c99f15ae0661b
key_schedule_context: 01b873cdf2dff4c1434988053b7a775e980dd2039ea24f
950b26b056ccedcb933198e486f9c9c09c9b5c753ac72d6005de254c607d1b534ed1
1d493ae1c1d9ac85
secret:
f2f534e55931c62eeb2188c1f53450354a725183937e68c85e68d6b267504d26
key: 55d9eb9d26911d4c514a990fa8d57048
base_nonce: b595dc6b2d7e2ed23af529b1
exporter_secret:
895a723a1eab809804973a53c0ee18ece29b25a7555a4808277ad2651d66d705
]]></artwork>
          <section anchor="encryptions-5">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: b595dc6b2d7e2ed23af529b1
ct: 90c4deb5b75318530194e4bb62f890b019b1397bbf9d0d6eb918890e1fb2be1a
c2603193b60a49c2126b75d0eb

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: b595dc6b2d7e2ed23af529b0
ct: 9e223384a3620f4a75b5a52f546b7262d8826dea18db5a365feb8b997180b22d
72dc1287f7089a1073a7102c27

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: b595dc6b2d7e2ed23af529b3
ct: adf9f6000773035023be7d415e13f84c1cb32a24339a32eb81df02be9ddc6abc
880dd81cceb7c1d0c7781465b2

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: b595dc6b2d7e2ed23af529b5
ct: 1f4cc9b7013d65511b1f69c050b7bd8bbd5a5c16ece82b238fec4f30ba2400e7
ca8ee482ac5253cffb5c3dc577

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: b595dc6b2d7e2ed23af5294e
ct: cdc541253111ed7a424eea5134dc14fc5e8293ab3b537668b8656789628e4589
4e5bb873c968e3b7cdcbb654a4

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: b595dc6b2d7e2ed23af528b1
ct: faf985208858b1253b97b60aecd28bc18737b58d1242370e7703ec33b73a4c31
a1afee300e349adef9015bbbfd
]]></artwork>
          </section>
          <section anchor="exported-values-5">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
a115a59bf4dd8dc49332d6a0093af8efca1bcbfd3627d850173f5c4a55d0c185

exporter_context: 00
L: 32
exported_value:
4517eaede0669b16aac7c92d5762dd459c301fa10e02237cd5aeb9be969430c4

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
164e02144d44b607a7722e58b0f4156e67c0c2874d74cf71da6ca48a4cbdc5e0
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="dhkemp-256-hkdf-sha256-hkdf-sha512-aes-128-gcm">
        <name>DHKEM(P-256, HKDF-SHA256), HKDF-SHA512, AES-128-GCM</name>
        <section anchor="base-setup-information-3">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 16
kdf_id: 3
aead_id: 1
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
4ab11a9dd78c39668f7038f921ffc0993b368171d3ddde8031501ee1e08c4c9a
pkEm: 0493ed86735bdfb978cc055c98b45695ad7ce61ce748f4dd63c525a3b8d53a
15565c6897888070070c1579db1f86aaa56deb8297e64db7e8924e72866f9a472580
skEm:
2292bf14bb6e15b8c81a0f45b7a6e93e32d830e48cca702e0affcfb4d07e1b5c
ikmR:
ea9ff7cc5b2705b188841c7ace169290ff312a9cb31467784ca92d7a2e6e1be8
pkRm: 04085aa5b665dc3826f9650ccbcc471be268c8ada866422f739e2d531d4a88
18a9466bc6b449357096232919ec4fe9070ccbac4aac30f4a1a53efcf7af90610edd
skRm:
3ac8530ad1b01885960fab38cf3cdc4f7aef121eaa239f222623614b4079fb38
enc: 0493ed86735bdfb978cc055c98b45695ad7ce61ce748f4dd63c525a3b8d53a1
5565c6897888070070c1579db1f86aaa56deb8297e64db7e8924e72866f9a472580
shared_secret:
02f584736390fc93f5b4ad039826a3fa08e9911bd1215a3db8e8791ba533cafd
key_schedule_context: 005b8a3617af7789ee716e7911c7e77f84cdc4cc46e60f
b7e19e4059f9aeadc00585e26874d1ddde76e551a7679cd47168c466f6e1f705cc93
74c192778a34fcd5ca221d77e229a9d11b654de7942d685069c633b2362ce3b3d8ea
4891c9a2a87a4eb7cdb289ba5e2ecbf8cd2c8498bb4a383dc021454d70d46fcbbad1
252ef4f9
secret: 0c7acdab61693f936c4c1256c78e7be30eebfe466812f9cc49f0b58dc970
328dfc03ea359be0250a471b1635a193d2dfa8cb23c90aa2e25025b892a725353eeb
key: 090ca96e5f8aa02b69fac360da50ddf9
base_nonce: 9c995e621bf9a20c5ca45546
exporter_secret: 4a7abb2ac43e6553f129b2c5750a7e82d149a76ed56dc342d7b
ca61e26d494f4855dff0d0165f27ce57756f7f16baca006539bb8e4518987ba61048
0ac03efa8
]]></artwork>
          <section anchor="encryptions-6">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 9c995e621bf9a20c5ca45546
ct: d3cf4984931484a080f74c1bb2a6782700dc1fef9abe8442e44a6f09044c8890
7200b332003543754eb51917ba

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 9c995e621bf9a20c5ca45547
ct: d14414555a47269dfead9fbf26abb303365e40709a4ed16eaefe1f2070f1ddeb
1bdd94d9e41186f124e0acc62d

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 9c995e621bf9a20c5ca45544
ct: 9bba136cade5c4069707ba91a61932e2cbedda2d9c7bdc33515aa01dd0e0f7e9
d3579bf4016dec37da4aafa800

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 9c995e621bf9a20c5ca45542
ct: a531c0655342be013bf32112951f8df1da643602f1866749519f5dcb09cc6843
2579de305a77e6864e862a7600

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 9c995e621bf9a20c5ca455b9
ct: be5da649469efbad0fb950366a82a73fefeda5f652ec7d3731fac6c4ffa21a70
04d2ab8a04e13621bd3629547d

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 9c995e621bf9a20c5ca45446
ct: 62092672f5328a0dde095e57435edf7457ace60b26ee44c9291110ec135cb0e1
4b85594e4fea11247d937deb62
]]></artwork>
          </section>
          <section anchor="exported-values-6">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
a32186b8946f61aeead1c093fe614945f85833b165b28c46bf271abf16b57208

exporter_context: 00
L: 32
exported_value:
84998b304a0ea2f11809398755f0abd5f9d2c141d1822def79dd15c194803c2a

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
93fb9411430b2cfa2cf0bed448c46922a5be9beff20e2e621df7e4655852edbc
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information-3">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 16
kdf_id: 3
aead_id: 1
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
c11d883d6587f911d2ddbc2a0859d5b42fb13bf2c8e89ef408a25564893856f5
pkEm: 04a307934180ad5287f95525fe5bc6244285d7273c15e061f0f2efb211c350
57f3079f6e0abae200992610b25f48b63aacfcb669106ddee8aa023feed301901371
skEm:
a5901ff7d6931959c2755382ea40a4869b1dec3694ed3b009dda2d77dd488f18
ikmR:
75bfc2a3a3541170a54c0b06444e358d0ee2b4fb78a401fd399a47a33723b700
pkRm: 043f5266fba0742db649e1043102b8a5afd114465156719cea90373229aabd
d84d7f45dabfc1f55664b888a7e86d594853a6cccdc9b189b57839cbbe3b90b55873
skRm:
bc6f0b5e22429e5ff47d5969003f3cae0f4fec50e23602e880038364f33b8522
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc: 04a307934180ad5287f95525fe5bc6244285d7273c15e061f0f2efb211c3505
7f3079f6e0abae200992610b25f48b63aacfcb669106ddee8aa023feed301901371
shared_secret:
2912aacc6eaebd71ff715ea50f6ef3a6637856b2a4c58ea61e0c3fc159e3bc16
key_schedule_context: 01713f73042575cebfd132f0cc4338523f8eae95c80a74
9f7cf3eb9436ff1c612ca62c37df27ca46d2cc162445a92c5f5fdc57bcde129ca7b1
f284b0c12297c037ca221d77e229a9d11b654de7942d685069c633b2362ce3b3d8ea
4891c9a2a87a4eb7cdb289ba5e2ecbf8cd2c8498bb4a383dc021454d70d46fcbbad1
252ef4f9
secret: ff2051d2128d5f3078de867143e076262ce1d0aecafc3fff3d607f1eaff0
5345c7d5ffcb3202cdecb3d1a2f7da20592a237747b6e855390cbe2109d3e6ac70c2
key: 0b910ba8d9cfa17e5f50c211cb32839a
base_nonce: 0c29e714eb52de5b7415a1b7
exporter_secret: 50c0a182b6f94b4c0bd955c4aa20df01f282cc12c43065a0812
fe4d4352790171ed2b2c4756ad7f5a730ba336c8f1edd0089d8331192058c385bae3
9c7cc8b57
]]></artwork>
          <section anchor="encryptions-7">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 0c29e714eb52de5b7415a1b7
ct: 57624b6e320d4aba0afd11f548780772932f502e2ba2a8068676b2a0d3b5129a
45b9faa88de39e8306da41d4cc

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 0c29e714eb52de5b7415a1b6
ct: 159d6b4c24bacaf2f5049b7863536d8f3ffede76302dace42080820fa51925d4
e1c72a64f87b14291a3057e00a

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 0c29e714eb52de5b7415a1b5
ct: bd24140859c99bf0055075e9c460032581dd1726d52cf980d308e9b20083ca62
e700b17892bcf7fa82bac751d0

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 0c29e714eb52de5b7415a1b3
ct: 93ddd55f82e9aaaa3cfc06840575f09d80160b20538125c2549932977d1238dd
e8126a4a91118faf8632f62cb8

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 0c29e714eb52de5b7415a148
ct: 377a98a3c34bf716581b05a6b3fdc257f245856384d5f2241c8840571c52f5c8
5c21138a4a81655edab8fe227d

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 0c29e714eb52de5b7415a0b7
ct: cc161f5a179831d456d119d2f2c19a6817289c75d1c61cd37ac8a450acd9efba
02e0ac00d128c17855931ff69a
]]></artwork>
          </section>
          <section anchor="exported-values-7">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
8158bea21a6700d37022bb7802866edca30ebf2078273757b656ef7fc2e428cf

exporter_context: 00
L: 32
exported_value:
6a348ba6e0e72bb3ef22479214a139ef8dac57be34509a61087a12565473da8d

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
2f6d4f7a18ec48de1ef4469f596aada4afdf6d79b037ed3c07e0118f8723bffc
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="dhkemp-256-hkdf-sha256-hkdf-sha256-chacha20poly1305">
        <name>DHKEM(P-256, HKDF-SHA256), HKDF-SHA256, ChaCha20Poly1305</name>
        <section anchor="base-setup-information-4">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 16
kdf_id: 1
aead_id: 3
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
f1f1a3bc95416871539ecb51c3a8f0cf608afb40fbbe305c0a72819d35c33f1f
pkEm: 04c07836a0206e04e31d8ae99bfd549380b072a1b1b82e563c935c09582782
4fc1559eac6fb9e3c70cd3193968994e7fe9781aa103f5b50e934b5b2f387e381291
skEm:
7550253e1147aae48839c1f8af80d2770fb7a4c763afe7d0afa7e0f42a5b3689
ikmR:
61092f3f56994dd424405899154a9918353e3e008171517ad576b900ddb275e7
pkRm: 04a697bffde9405c992883c5c439d6cc358170b51af72812333b015621dc0f
40bad9bb726f68a5c013806a790ec716ab8669f84f6b694596c2987cf35baba2a006
skRm:
a4d1c55836aa30f9b3fbb6ac98d338c877c2867dd3a77396d13f68d3ab150d3b
enc: 04c07836a0206e04e31d8ae99bfd549380b072a1b1b82e563c935c095827824
fc1559eac6fb9e3c70cd3193968994e7fe9781aa103f5b50e934b5b2f387e381291
shared_secret:
806520f82ef0b03c823b7fc524b6b55a088f566b9751b89551c170f4113bd850
key_schedule_context: 00b738cd703db7b4106e93b4621e9a19c89c838e559642
40e5d3f331aaf8b0d58b2e986ea1c671b61cf45eec134dac0bae58ec6f63e790b140
0b47c33038b0269c
secret:
fe891101629aa355aad68eff3cc5170d057eca0c7573f6575e91f9783e1d4506
key:
a8f45490a92a3b04d1dbf6cf2c3939ad8bfc9bfcb97c04bffe116730c9dfe3fc
base_nonce: 726b4390ed2209809f58c693
exporter_secret:
4f9bd9b3a8db7d7c3a5b9d44fdc1f6e37d5d77689ade5ec44a7242016e6aa205
]]></artwork>
          <section anchor="encryptions-8">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 726b4390ed2209809f58c693
ct: 6469c41c5c81d3aa85432531ecf6460ec945bde1eb428cb2fedf7a29f5a685b4
ccb0d057f03ea2952a27bb458b

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 726b4390ed2209809f58c692
ct: f1564199f7e0e110ec9c1bcdde332177fc35c1adf6e57f8d1df24022227ffa87
16862dbda2b1dc546c9d114374

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 726b4390ed2209809f58c691
ct: 39de89728bcb774269f882af8dc5369e4f3d6322d986e872b3a8d074c7c18e85
49ff3f85b6d6592ff87c3f310c

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 726b4390ed2209809f58c697
ct: bc104a14fbede0cc79eeb826ea0476ce87b9c928c36e5e34dc9b6905d91473ec
369a08b1a25d305dd45c6c5f80

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 726b4390ed2209809f58c66c
ct: 8f2814a2c548b3be50259713c6724009e092d37789f6856553d61df23ebc0792
35f710e6af3c3ca6eaba7c7c6c

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 726b4390ed2209809f58c793
ct: b45b69d419a9be7219d8c94365b89ad6951caf4576ea4774ea40e9b7047a09d6
537d1aa2f7c12d6ae4b729b4d0
]]></artwork>
          </section>
          <section anchor="exported-values-8">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
9b13c510416ac977b553bf1741018809c246a695f45eff6d3b0356dbefe1e660

exporter_context: 00
L: 32
exported_value:
6c8b7be3a20a5684edecb4253619d9051ce8583baf850e0cb53c402bdcaf8ebb

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
477a50d804c7c51941f69b8e32fe8288386ee1a84905fe4938d58972f24ac938
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information-4">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 16
kdf_id: 1
aead_id: 3
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
e1a4e1d50c4bfcf890f2b4c7d6b2d2aca61368eddc3c84162df2856843e1057a
pkEm: 04f336578b72ad7932fe867cc4d2d44a718a318037a0ec271163699cee653f
a805c1fec955e562663e0c2061bb96a87d78892bff0cc0bad7906c2d998ebe1a7246
skEm:
7d6e4e006cee68af9b3fdd583a0ee8962df9d59fab029997ee3f456cbc857904
ikmR:
ee51dec304abf993ef8fd52aacdd3b539108bbf6e491943266c1de89ec596a17
pkRm: 041eb8f4f20ab72661af369ff3231a733672fa26f385ffb959fd1bae46bfda
43ad55e2d573b880831381d9367417f554ce5b2134fbba5235b44db465feffc6189e
skRm:
12ecde2c8bc2d5d7ed2219c71f27e3943d92b344174436af833337c557c300b3
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc: 04f336578b72ad7932fe867cc4d2d44a718a318037a0ec271163699cee653fa
805c1fec955e562663e0c2061bb96a87d78892bff0cc0bad7906c2d998ebe1a7246
shared_secret:
ac4f260dce4db6bf45435d9c92c0e11cfdd93743bd3075949975974cc2b3d79e
key_schedule_context: 01622b72afcc3795841596c67ea74400ca3b029374d7d5
640bda367c5d67b3fbeb2e986ea1c671b61cf45eec134dac0bae58ec6f63e790b140
0b47c33038b0269c
secret:
858c8087a1c056db5811e85802f375bb0c19b9983204a1575de4803575d23239
key:
6d61cb330b7771168c8619498e753f16198aad9566d1f1c6c70e2bc1a1a8b142
base_nonce: 0de7655fb65e1cd51a38864e
exporter_secret:
754ca00235b245e72d1f722a7718e7145bd113050a2aa3d89586d4cb7514bfdb
]]></artwork>
          <section anchor="encryptions-9">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 0de7655fb65e1cd51a38864e
ct: 21433eaff24d7706f3ed5b9b2e709b07230e2b11df1f2b1fe07b3c70d5948a53
d6fa5c8bed194020bd9df0877b

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 0de7655fb65e1cd51a38864f
ct: c74a764b4892072ea8c2c56b9bcd46c7f1e9ca8cb0a263f8b40c2ba59ac9c857
033f176019562218769d3e0452

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 0de7655fb65e1cd51a38864c
ct: dc8cd68863474d6e9cbb6a659335a86a54e036249d41acf909e738c847ff2bd3
6fe3fcacda4ededa7032c0a220

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 0de7655fb65e1cd51a38864a
ct: cd54a8576353b1b9df366cb0cc042e46eef6f4cf01e205fe7d47e306b2fdd90f
7185f289a26c613ca094e3be10

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 0de7655fb65e1cd51a3886b1
ct: 6324570c9d542c70c7e70570c1d8f4c52a89484746bf0625441890ededcc80c2
4ef2301c38bfd34d689d19f67d

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 0de7655fb65e1cd51a38874e
ct: 1ea6326c8098ed0437a553c466550114fb2ca1412cca7de98709b9ccdf19206e
52c3d39180e2cf62b3e9f4baf4
]]></artwork>
          </section>
          <section anchor="exported-values-9">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
530bbc2f68f078dccc89cc371b4f4ade372c9472bafe4601a8432cbb934f528d

exporter_context: 00
L: 32
exported_value:
6e25075ddcc528c90ef9218f800ca3dfe1b8ff4042de5033133adb8bd54c401d

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
6f6fbd0d1c7733f796461b3235a856cc34f676fe61ed509dfc18fa16efe6be78
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="dhkemp-521-hkdf-sha512-hkdf-sha512-aes-256-gcm">
        <name>DHKEM(P-521, HKDF-SHA512), HKDF-SHA512, AES-256-GCM</name>
        <section anchor="base-setup-information-5">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 18
kdf_id: 3
aead_id: 2
info: 4f6465206f6e2061204772656369616e2055726e
ikmE: 7f06ab8215105fc46aceeb2e3dc5028b44364f960426eb0d8e4026c2f8b5d7
e7a986688f1591abf5ab753c357a5d6f0440414b4ed4ede71317772ac98d9239f709
04
pkEm: 040138b385ca16bb0d5fa0c0665fbbd7e69e3ee29f63991d3e9b5fa740aab8
900aaeed46ed73a49055758425a0ce36507c54b29cc5b85a5cee6bae0cf1c21f2731
ece2013dc3fb7c8d21654bb161b463962ca19e8c654ff24c94dd2898de12051f1ed0
692237fb02b2f8d1dc1c73e9b366b529eb436e98a996ee522aef863dd5739d2f29b0
skEm: 014784c692da35df6ecde98ee43ac425dbdd0969c0c72b42f2e708ab9d5354
15a8569bdacfcc0a114c85b8e3f26acf4d68115f8c91a66178cdbd03b7bcc5291e37
4b
ikmR: 2ad954bbe39b7122529f7dde780bff626cd97f850d0784a432784e69d86ecc
aade43b6c10a8ffdb94bf943c6da479db137914ec835a7e715e36e45e29b587bab3b
f1
pkRm: 0401b45498c1714e2dce167d3caf162e45e0642afc7ed435df7902ccae0e84
ba0f7d373f646b7738bbbdca11ed91bdeae3cdcba3301f2457be452f271fa6837580
e661012af49583a62e48d44bed350c7118c0d8dc861c238c72a2bda17f64704f464b
57338e7f40b60959480c0e58e6559b190d81663ed816e523b6b6a418f66d2451ec64
skRm: 01462680369ae375e4b3791070a7458ed527842f6a98a79ff5e0d4cbde83c2
7196a3916956655523a6a2556a7af62c5cadabe2ef9da3760bb21e005202f7b24628
47
enc: 040138b385ca16bb0d5fa0c0665fbbd7e69e3ee29f63991d3e9b5fa740aab89
00aaeed46ed73a49055758425a0ce36507c54b29cc5b85a5cee6bae0cf1c21f2731e
ce2013dc3fb7c8d21654bb161b463962ca19e8c654ff24c94dd2898de12051f1ed06
92237fb02b2f8d1dc1c73e9b366b529eb436e98a996ee522aef863dd5739d2f29b0
shared_secret: 776ab421302f6eff7d7cb5cb1adaea0cd50872c71c2d63c30c4f1
d5e43653336fef33b103c67e7a98add2d3b66e2fda95b5b2a667aa9dac7e59cc1d46
d30e818
key_schedule_context: 0083a27c5b2358ab4dae1b2f5d8f57f10ccccc822a4733
26f543f239a70aee46347324e84e02d7651a10d08fb3dda739d22d50c53fbfa8122b
aacd0f9ae5913072ef45baa1f3a4b169e141feb957e48d03f28c837d8904c3d67753
08c3d3faa75dd64adfa44e1a1141edf9349959b8f8e5291cbdc56f62b0ed6527d692
e85b09a4
secret: 49fd9f53b0f93732555b2054edfdc0e3101000d75df714b98ce5aa295a37
f1b18dfa86a1c37286d805d3ea09a20b72f93c21e83955a1f01eb7c5eead563d21e7
key:
751e346ce8f0ddb2305c8a2a85c70d5cf559c53093656be636b9406d4d7d1b70
base_nonce: 55ff7a7d739c69f44b25447b
exporter_secret: e4ff9dfbc732a2b9c75823763c5ccc954a2c0648fc6de80a585
81252d0ee3215388a4455e69086b50b87eb28c169a52f42e71de4ca61c920e7bd24c
95cc3f992
]]></artwork>
          <section anchor="encryptions-10">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 55ff7a7d739c69f44b25447b
ct: 170f8beddfe949b75ef9c387e201baf4132fa7374593dfafa90768788b7b2b20
0aafcc6d80ea4c795a7c5b841a

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 55ff7a7d739c69f44b25447a
ct: d9ee248e220ca24ac00bbbe7e221a832e4f7fa64c4fbab3945b6f3af0c5ecd5e
16815b328be4954a05fd352256

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 55ff7a7d739c69f44b254479
ct: 142cf1e02d1f58d9285f2af7dcfa44f7c3f2d15c73d460c48c6e0e506a3144ba
e35284e7e221105b61d24e1c7a

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 55ff7a7d739c69f44b25447f
ct: 3bb3a5a07100e5a12805327bf3b152df728b1c1be75a9fd2cb2bf5eac0cca1fb
80addb37eb2a32938c7268e3e5

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 55ff7a7d739c69f44b254484
ct: 4f268d0930f8d50b8fd9d0f26657ba25b5cb08b308c92e33382f369c768b558e
113ac95a4c70dd60909ad1adc7

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 55ff7a7d739c69f44b25457b
ct: dbbfc44ae037864e75f136e8b4b4123351d480e6619ae0e0ae437f036f2f8f1e
f677686323977a1ccbb4b4f16a
]]></artwork>
          </section>
          <section anchor="exported-values-10">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
05e2e5bd9f0c30832b80a279ff211cc65eceb0d97001524085d609ead60d0412

exporter_context: 00
L: 32
exported_value:
fca69744bb537f5b7a1596dbf34eaa8d84bf2e3ee7f1a155d41bd3624aa92b63

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
f389beaac6fcf6c0d9376e20f97e364f0609a88f1bc76d7328e9104df8477013
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information-5">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 18
kdf_id: 3
aead_id: 2
info: 4f6465206f6e2061204772656369616e2055726e
ikmE: f3ebfa9a69a924e672114fcd9e06fa9559e937f7eccce4181a2b506df53dbe
514be12f094bb28e01de19dd345b4f7ede5ad7eaa6b9c3019592ec68eaae9a14732c
e0
pkEm: 040085eff0835cc84351f32471d32aa453cdc1f6418eaaecf1c2824210eb1d
48d0768b368110fab21407c324b8bb4bec63f042cfa4d0868d19b760eb4beba1bff7
93b30036d2c614d55730bd2a40c718f9466faf4d5f8170d22b6df98dfe0c067d02b3
49ae4a142e0c03418f0a1479ff78a3db07ae2c2e89e5840f712c174ba2118e90fdcb
skEm: 012e5cfe0daf5fe2a1cd617f4c4bae7c86f1f527b3207f115e262a98cc6526
8ec88cb8645aec73b7aa0a472d0292502d1078e762646e0c093cf873243d12c39915
f6
ikmR: a2a2458705e278e574f835effecd18232f8a4c459e7550a09d44348ae5d3b1
ea9d95c51995e657ad6f7cae659f5e186126a471c017f8f5e41da9eba74d4e0473e1
79
pkRm: 04006917e049a2be7e1482759fb067ddb94e9c4f7f5976f655088dec452466
14ff924ed3b385fc2986c0ecc39d14f907bf837d7306aada59dd5889086125ecd038
ead400603394b5d81f89ebfd556a898cc1d6a027e143d199d3db845cb91c5289fb26
c5ff80832935b0e8dd08d37c6185a6f77683347e472d1edb6daa6bd7652fea628fae
skRm: 011bafd9c7a52e3e71afbdab0d2f31b03d998a0dc875dd7555c63560e142bd
e264428de03379863b4ec6138f813fa009927dc5d15f62314c56d4e7ff2b485753eb
72
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc: 040085eff0835cc84351f32471d32aa453cdc1f6418eaaecf1c2824210eb1d4
8d0768b368110fab21407c324b8bb4bec63f042cfa4d0868d19b760eb4beba1bff79
3b30036d2c614d55730bd2a40c718f9466faf4d5f8170d22b6df98dfe0c067d02b34
9ae4a142e0c03418f0a1479ff78a3db07ae2c2e89e5840f712c174ba2118e90fdcb
shared_secret: 0d52de997fdaa4797720e8b1bebd3df3d03c4cf38cc8c1398168d
36c3fc7626428c9c254dd3f9274450909c64a5b3acbe45e2d850a2fd69ac0605fe5c
8a057a5
key_schedule_context: 0124497637cf18d6fbcc16e9f652f00244c981726f293b
b7819861e85e50c94f0be30e022ab081e18e6f299fd3d3d976a4bc590f85bc7711bf
ce32ee1a7fb1c154ef45baa1f3a4b169e141feb957e48d03f28c837d8904c3d67753
08c3d3faa75dd64adfa44e1a1141edf9349959b8f8e5291cbdc56f62b0ed6527d692
e85b09a4
secret: 2cf425e26f65526afc0634a3dba4e28d980c1015130ce07c2ac7530d7a39
1a75e5a0db428b09f27ad4d975b4ad1e7f85800e03ffeea35e8cf3fe67b18d4a1345
key:
f764a5a4b17e5d1ffba6e699d65560497ebaea6eb0b0d9010a6d979e298a39ff
base_nonce: 479afdf3546ddba3a9841f38
exporter_secret: 5c3d4b65a13570502b93095ef196c42c8211a4a188c4590d358
63665c705bb140ecba6ce9256be3fad35b4378d41643867454612adfd0542a684b61
799bf293f
]]></artwork>
          <section anchor="encryptions-11">
            <name>Encryptions</name>
            <artwork><![CDATA[
sequence number: 0
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d30
nonce: 479afdf3546ddba3a9841f38
ct: de69e9d943a5d0b70be3359a19f317bd9aca4a2ebb4332a39bcdfc97d5fe62f3
a77702f4822c3be531aa7843a1

sequence number: 1
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d31
nonce: 479afdf3546ddba3a9841f39
ct: 77a16162831f90de350fea9152cfc685ecfa10acb4f7994f41aed43fa5431f23
82d078ec88baec53943984553e

sequence number: 2
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d32
nonce: 479afdf3546ddba3a9841f3a
ct: f1d48d09f126b9003b4c7d3fe6779c7c92173188a2bb7465ba43d899a6398a33
3914d2bb19fd769d53f3ec7336

sequence number: 4
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d34
nonce: 479afdf3546ddba3a9841f3c
ct: 829b11c082b0178082cd595be6d73742a4721b9ac05f8d2ef8a7704a53022d82
bd0d8571f578c5c13b99eccff8

sequence number: 255
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323535
nonce: 479afdf3546ddba3a9841fc7
ct: a3ee291e20f37021e82df14d41f3fbe98b27c43b318a36cacd8471a3b1051ab1
2ee055b62ded95b72a63199a3f

sequence number: 256
pt: 4265617574792069732074727574682c20747275746820626561757479
aad: 436f756e742d323536
nonce: 479afdf3546ddba3a9841e38
ct: eecc2173ce1ac14b27ee67041e90ed50b7809926e55861a579949c07f6d26137
bf9cf0d097f60b5fd2fbf348ec
]]></artwork>
          </section>
          <section anchor="exported-values-11">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
62691f0f971e34de38370bff24deb5a7d40ab628093d304be60946afcdb3a936

exporter_context: 00
L: 32
exported_value:
76083c6d1b6809da088584674327b39488eaf665f0731151128452e04ce81bff

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
0c7cfc0976e25ae7680cf909ae2de1859cd9b679610a14bec40d69b91785b2f6
]]></artwork>
          </section>
        </section>
      </section>
      <section anchor="dhkemx25519-hkdf-sha256-hkdf-sha256-export-only-aead">
        <name>DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, Export-Only AEAD</name>
        <section anchor="base-setup-information-6">
          <name>Base Setup Information</name>
          <artwork><![CDATA[
mode: 0
kem_id: 32
kdf_id: 1
aead_id: 65535
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
55bc245ee4efda25d38f2d54d5bb6665291b99f8108a8c4b686c2b14893ea5d9
pkEm:
e5e8f9bfff6c2f29791fc351d2c25ce1299aa5eaca78a757c0b4fb4bcd830918
skEm:
095182b502f1f91f63ba584c7c3ec473d617b8b4c2cec3fad5af7fa6748165ed
ikmR:
683ae0da1d22181e74ed2e503ebf82840deb1d5e872cade20f4b458d99783e31
pkRm:
194141ca6c3c3beb4792cd97ba0ea1faff09d98435012345766ee33aae2d7664
skRm:
33d196c830a12f9ac65d6e565a590d80f04ee9b19c83c87f2c170d972a812848
enc:
e5e8f9bfff6c2f29791fc351d2c25ce1299aa5eaca78a757c0b4fb4bcd830918
shared_secret:
e81716ce8f73141d4f25ee9098efc968c91e5b8ce52ffff59d64039e82918b66
key_schedule_context: 009bd09219212a8cf27c6bb5d54998c5240793a70ca0a8
92234bd5e082bc619b6a3f4c22aa6d9a0424c2b4292fdf43b8257df93c2f6adbf6dd
c9c64fee26bdd292
secret:
04d64e0620aa047e9ab833b0ebcd4ff026cefbe44338fd7d1a93548102ee01af
key:
base_nonce:
exporter_secret:
79dc8e0509cf4a3364ca027e5a0138235281611ca910e435e8ed58167c72f79b
]]></artwork>
          <section anchor="exported-values-12">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
7a36221bd56d50fb51ee65edfd98d06a23c4dc87085aa5866cb7087244bd2a36

exporter_context: 00
L: 32
exported_value:
d5535b87099c6c3ce80dc112a2671c6ec8e811a2f284f948cec6dd1708ee33f0

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
ffaabc85a776136ca0c378e5d084c9140ab552b78f039d2e8775f26efff4c70e
]]></artwork>
          </section>
        </section>
        <section anchor="psk-setup-information-6">
          <name>PSK Setup Information</name>
          <artwork><![CDATA[
mode: 1
kem_id: 32
kdf_id: 1
aead_id: 65535
info: 4f6465206f6e2061204772656369616e2055726e
ikmE:
c51211a8799f6b8a0021fcba673d9c4067a98ebc6794232e5b06cb9febcbbdf5
pkEm:
d3805a97cbcd5f08babd21221d3e6b362a700572d14f9bbeb94ec078d051ae3d
skEm:
1d72396121a6a826549776ef1a9d2f3a2907fc6a38902fa4e401afdb0392e627
ikmR:
5e0516b1b29c0e13386529da16525210c796f7d647c37eac118023a6aa9eb89a
pkRm:
d53af36ea5f58f8868bb4a1333ed4cc47e7a63b0040eb54c77b9c8ec456da824
skRm:
98f304d4ecb312689690b113973c61ffe0aa7c13f2fbe365e48f3ed09e5a6a0c
psk:
0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82
psk_id: 456e6e796e20447572696e206172616e204d6f726961
enc:
d3805a97cbcd5f08babd21221d3e6b362a700572d14f9bbeb94ec078d051ae3d
shared_secret:
024573db58c887decb4c57b6ed39f2c9a09c85600a8a0ecb11cac24c6aaec195
key_schedule_context: 01446fb1fe2632a0a338f0a85ed1f3a0ac475bdea2cd72
f8c713b3a46ee737379a3f4c22aa6d9a0424c2b4292fdf43b8257df93c2f6adbf6dd
c9c64fee26bdd292
secret:
638b94532e0d0bf812cf294f36b97a5bdcb0299df36e22b7bb6858e3c113080b
key:
base_nonce:
exporter_secret:
04261818aeae99d6aba5101bd35ddf3271d909a756adcef0d41389d9ed9ab153
]]></artwork>
          <section anchor="exported-values-13">
            <name>Exported Values</name>
            <artwork><![CDATA[
exporter_context:
L: 32
exported_value:
be6c76955334376aa23e936be013ba8bbae90ae74ed995c1c6157e6f08dd5316

exporter_context: 00
L: 32
exported_value:
1721ed2aa852f84d44ad020c2e2be4e2e6375098bf48775a533505fd56a3f416

exporter_context: 54657374436f6e74657874
L: 32
exported_value:
7c9d79876a288507b81a5a52365a7d39cc0fa3f07e34172984f96fec07c44cba
]]></artwork>
          </section>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9S92XYb2ZUo+H6+Ikq5VhdZBUCYB2alqyiJSrFS0yWVdrrd
vkIg4oAIE0CgEAFRtKz6ln7ot/veH9D1Y72nM0UEKKbt6rU6l51JABFn2Gef
PQ/tdluVWbnWZ9Gr+8U+S6P3h8U6S6Kf9H10sU3297syy7cqXiz2+hM89P6n
C5XmyTbewCvpPl6W7UyXy/Zqd6v5X92+SuNSn6kE/n2T7+/PoqJM1V2+v73Z
54edDJIvinytS12cRbPetKtUttufReX+UJT9bncGo9zqe3gpPYsut6Xeb3XZ
foHzKVWU8Tb9GK/zLazhXhdql51FfyjzpBUV+b7c62UBf91v8I8/KhUfylW+
P1NRO4qyLcx31YmexTBgoSL4h7dylSWreJ9Gr4Pf8v3NWfQ8K5KcPupNnK3P
ov168W/Z7lOn+OzG/AnegwFu4k/x1hv2p3hfrrLbym807OV2n8X+sLf8rL6P
t52Fef7fMnyss9y7qZ51otfZbufN8kxv/xRvsq37vnkGPKl/W8jDa3i2k2o3
7vNO9Ls8T71xn6/2WVHmu5XeR+ferzJcEt/920rHu2x7s8jKogNHBMe4Xeb7
TVxmnwAFouj5dbd3Ri8Jmj15oYvsZhvBEUbn23h9X2RFlC+j9/s4KbMkXgsG
tkMMjK6Tld7oIrrWyWGvo/gmhkWX0Xka73AuWGte6C0cFq621J/hp7KMk9sn
PDmAU5dn0aosd8XZ06d6t8+2ZSeLk30HYPUUUK73tNed0sOEvhF+RR8t/tA/
bfmvw6XnewDW3n4t+JTD3tLwt8qrv+1E1yu4EJU3f5slZb6Xn+C3V69+6o5D
EF7nGx2dZNvT4rBcZkmmt2WU5Ns0Q0gVERxAVDCYVnyptYXjo8Exftofj0Jw
jL8Njn/vRK/0fh9v/1zZ1b/HnzLAovDHyssv4OV8udJZ7e0XersFNKn8Wnn9
ohP9lK3L6rsXcKXkB/jlx/P3ISw/rHT0Y7xrv9/ni7XeFHAd4uitvouer+NC
MFN+QbiW8DihYFbe44/PEa75zT7erYBqCpI2A3mdbW87BUL6Ru87Sb55CmdW
wtk93aVLQL5Or9udPB20R8NuezgcTcft/sdpB3771Uj5oRO9u403eZlXYPEh
LotDfJtVfq6fw/sc8AE28yleV48CDjKt/V7ofQb3Gu6+WdLl9bO3QNon07a/
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
8LBdsaccucNMCVy9X+1/AFKh+4ij3QEA

-->

</rfc>
