<?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-01" category="std" consensus="true" obsoletes="9180" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="HPKE">Hybrid Public Key Encryption</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-hpke-01"/>
    <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>Apple</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2025" month="June" day="24"/>
    <workgroup>HPKE</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 235?>

<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 247?>

<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 an encryption key 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="I-D.ietf-mls-protocol"/> and
TLS Encrypted ClientHello <xref target="I-D.ietf-tls-esni"/>.</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>
      <t>This document represents the consensus of the Crypto Forum Research Group (CFRG).</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> SHOULD have at
least <tt>Nsk</tt> bytes of entropy (see <xref target="derive-key-pair"/> for discussion).</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 symmetric key (the KEM shared secret) and
a fixed-length encapsulation of that key 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 ephemeral symmetric key (the KEM shared secret) from
its encapsulated representation <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 key 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>Note that <tt>GenerateKeyPair</tt> can be implemented as <tt>DeriveKeyPair(random(Nsk))</tt>.</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 keys 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 key <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), similar to the TLS 1.3 exporter interface
(see <xref target="RFC8446"/>, Section 7.5). 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>
      </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>
      </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>
          <artwork><![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))
]]></artwork>
          <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>
        </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 key <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>
        </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[
key = context.Export("response key", Nk)
nonce = context.Export("response nonce", Nn)
]]></artwork>
        <t>In this example, the length of each secret is based on the AEAD algorithm
used for the corresponding HPKE context.</t>
        <t>Note that HPKE's limitations with regard to sender authentication become limits
on recipient authentication in this context. 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 value <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 key 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="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="I-D.ietf-mls-protocol">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Jon Millican" initials="J." surname="Millican">
              <organization>Meta Platforms</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Katriel Cohn-Gordon" initials="K." surname="Cohn-Gordon">
              <organization>University of Oxford</organization>
            </author>
            <date day="27" month="March" 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="Internet-Draft" value="draft-ietf-mls-protocol-20"/>
        </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="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="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="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 1693?>

<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:
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

-->

</rfc>
