<?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.34 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ms-hpke-auth-modes-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="HPKE Authenticated Modes">Authenticated Modes for HPKE</title>
    <seriesInfo name="Internet-Draft" value="draft-ms-hpke-auth-modes-00"/>
    <author fullname="Cory Francis Myers" role="editor">
      <organization>Freedom of the Press Foundation</organization>
      <address>
        <email>cfm@acm.org</email>
      </address>
    </author>
    <author fullname="Rowen S." role="editor">
      <organization>Freedom of the Press Foundation</organization>
      <address>
        <email>ro@freedom.press</email>
      </address>
    </author>
    <date year="2026" month="March" day="17"/>
    <keyword>AKEM</keyword>
    <keyword>authenticated KEM</keyword>
    <keyword>DHKEM</keyword>
    <keyword>HPKE</keyword>
    <abstract>
      <?line 71?>

<t>The standards-track <xref target="I-D.ietf-hpke-hpke"/> supersedes the informational
<xref target="RFC9180"/>, omitting its authenticated modes <tt>mode_auth</tt> and <tt>mode_auth_psk</tt>.
This document restores those two modes as a strict extension, requiring only the
addition of <tt>AuthEncap()</tt>/<tt>AuthDecap()</tt> to the DHKEM, the definition of four
setup functions, and a change in <tt>VerifyPSKInputs()</tt>.  The extension does not
alter the externally observable behavior of the existing HPKE modes standardized
in <xref target="I-D.ietf-hpke-hpke"/>.</t>
      <t>This document also illustrates, informatively, how the restored modes can be
used. One such application uses <tt>mode_auth_psk</tt> with a post-quantum KEM (PQ-KEM)
shared secret as the PSK, providing hybrid PQ/T confidentiality. This material
is provided to motivate the extension and may be developed as separate work.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ms-hpke-auth-modes/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cfm/draft-ms-hpke-auth-modes"/>.</t>
    </note>
  </front>
  <middle>
    <?line 86?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="I-D.ietf-hpke-hpke"/> is the standards-track successor to the informational
<xref target="RFC9180"/> and omits the authenticated modes <tt>mode_auth</tt> and <tt>mode_auth_psk</tt>
to simplify the standard. However, some protocols require an authenticated
key-encapsulation mechanism (AKEM)---a KEM whose shared secret is implicitly
bound to the sender's static private key---without requiring a full
authenticated encryption context.  The DHKEM construction in
<xref target="I-D.ietf-hpke-hpke"/> already contains all the primitives needed:
<tt>AuthEncap()</tt> computes a static-static DH value <tt>DH(skS, pkR)</tt> alongside the
ephemeral-static value and mixes both into the key derivation, binding the
output to the sender's key pair.</t>
      <t>The normative portion of this document is small.  It restores <tt>mode_auth</tt> and
<tt>mode_auth_psk</tt> as a strict extension to <xref target="I-D.ietf-hpke-hpke"/>, requiring only
<tt>AuthEncap()</tt>/<tt>AuthDecap()</tt> on the DHKEM, four setup functions, and a modified
<tt>VerifyPSKInputs()</tt>. The externally observable behavior of existing HPKE modes
is unchanged.</t>
      <t><xref target="sec-dh-akem"/> and <xref target="sec-suites"/> describe, informatively, how the restored
modes can be used, including a construction that layers a post-quantum KEM
shared secret as the PSK to achieve hybrid PQ/T confidentiality as defined in
<xref section="5" sectionFormat="of" target="RFC9794"/>. That material is provided to motivate the extension
and may be developed as separate work.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>Terms from <xref target="I-D.ietf-hpke-hpke"/> are used without redefinition. The following
additional term is used herein:</t>
      <ul spacing="normal">
        <li>
          <t><strong>AKEM:</strong> a KEM whose encapsulation additionally takes the sender's static
private key and implicitly binds the shared secret to it.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-ext">
      <name>Authenticated Mode Extensions to <xref target="I-D.ietf-hpke-hpke"/></name>
      <t>This section specifies the additions to <xref target="I-D.ietf-hpke-hpke"/> required to
restore <tt>mode_auth</tt> and <tt>mode_auth_psk</tt>. These extensions are defined so that
the externally observable behavior of the existing HPKE modes is unchanged,
although this document modifies the <tt>VerifyPSKInputs()</tt> procedure in
<xref target="I-D.ietf-hpke-hpke"/>.</t>
      <section anchor="mode-identifiers">
        <name>Mode Identifiers</name>
        <t>The reserved entries for values <tt>0x02</tt> and <tt>0x03</tt> in Table 1 of
<xref target="I-D.ietf-hpke-hpke"/> are replaced with the following mode identifiers, as
originally specified in Table 1 of <xref target="RFC9180"/>:</t>
        <artwork><![CDATA[
mode_auth     = 0x02
mode_auth_psk = 0x03
]]></artwork>
      </section>
      <section anchor="sec-authencap">
        <name>DHKEM Extension: <tt>AuthEncap()</tt> and <tt>AuthDecap()</tt></name>
        <t>The following two functions are added to the DHKEM, extending it to an AKEM.
They are reproduced verbatim from <xref section="4.1" sectionFormat="of" target="RFC9180"/>. All helper
functions (<tt>GenerateKeyPair</tt>, <tt>DH</tt>, <tt>SerializePublicKey</tt>,
<tt>DeserializePublicKey</tt>, <tt>ExtractAndExpand</tt>) are as defined in
<xref target="I-D.ietf-hpke-hpke"/>.</t>
        <artwork><![CDATA[
def AuthEncap(pkR, skS):
  skE, pkE = GenerateKeyPair()
  dh = concat(DH(skE, pkR), DH(skS, pkR))
  enc = SerializePublicKey(pkE)

  pkRm = SerializePublicKey(pkR)
  pkSm = SerializePublicKey(pk(skS))

  kem_context = concat(enc, pkRm, pkSm)
  shared_secret = ExtractAndExpand(dh, kem_context)

  return shared_secret, enc

def AuthDecap(enc, skR, pkS):
  pkE = DeserializePublicKey(enc)
  dh = concat(DH(skR, pkE), DH(skR, pkS))

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

  shared_secret = ExtractAndExpand(dh, kem_context)
  return shared_secret
]]></artwork>
        <t>Note that the <tt>AuthEncap()</tt> and <tt>AuthDecap()</tt> functions are vulnerable to
key-compromise impersonation (KCI): the assurance that the shared secret was
generated by the holder of the private key <tt>skS</tt> does not hold if the recipient
private key <tt>skR</tt> is compromised. See <xref target="sec-security"/> for further discussion.</t>
      </section>
      <section anchor="verifypskinputs">
        <name><tt>VerifyPSKInputs</tt></name>
        <t>The <tt>VerifyPSKInputs()</tt> function defined in <xref section="5.1" sectionFormat="of" target="RFC9180"/> and
<xref target="I-D.ietf-hpke-hpke"/> is extended to handle the two new modes. The updated
function replaces the original:</t>
        <artwork><![CDATA[
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 in [mode_base, mode_auth]:
    raise Exception("PSK input provided when not needed")
  if (not got_psk) and mode in [mode_psk, mode_auth_psk]:
    raise Exception("Missing required PSK input")
]]></artwork>
        <t>The only change from the original is that <tt>mode_base</tt> is replaced by
<tt>[mode_base, mode_auth]</tt> and <tt>mode_psk</tt> is replaced by <tt>[mode_psk,
mode_auth_psk]</tt> in the final two guards.</t>
      </section>
      <section anchor="sec-setup">
        <name>Setup Functions</name>
        <t>The following four setup functions are reproduced verbatim from Sections <xref target="RFC9180" section="5.1.3" sectionFormat="bare"/> and <xref target="RFC9180" section="5.1.4" sectionFormat="bare"/> of <xref target="RFC9180"/>.  <tt>KeyScheduleS()</tt>/<tt>KeyScheduleR()</tt> and
<tt>AuthEncap()</tt>/<tt>AuthDecap()</tt> are as defined in <xref target="I-D.ietf-hpke-hpke"/> and
<xref target="sec-authencap"/> respectively.</t>
        <artwork><![CDATA[
def SetupAuthS(pkR, info, skS):
  shared_secret, enc = AuthEncap(pkR, skS)
  return enc, KeyScheduleS(mode_auth, shared_secret, info,
                           default_psk, default_psk_id)

def SetupAuthR(enc, skR, info, pkS):
  shared_secret = AuthDecap(enc, skR, pkS)
  return KeyScheduleR(mode_auth, shared_secret, info,
                      default_psk, default_psk_id)

def SetupAuthPSKS(pkR, info, psk, psk_id, skS):
  shared_secret, enc = AuthEncap(pkR, skS)
  return enc, KeyScheduleS(mode_auth_psk, shared_secret, info,
                           psk, psk_id)

def SetupAuthPSKR(enc, skR, info, psk, psk_id, pkS):
  shared_secret = AuthDecap(enc, skR, pkS)
  return KeyScheduleR(mode_auth_psk, shared_secret, info,
                      psk, psk_id)
]]></artwork>
      </section>
      <section anchor="input-validation-and-error-handling">
        <name>Input Validation and Error Handling</name>
        <t>In addition to the validation requirements in <xref section="7.1.4" sectionFormat="of" target="I-D.ietf-hpke-hpke"/>, the recipient <bcp14>MUST</bcp14> validate the sender's static public
key <tt>pkS</tt> before use in <tt>AuthDecap()</tt>, applying the same validation rules as for
other public key inputs. Validation failure <bcp14>MUST</bcp14> yield a <tt>ValidationError</tt>.</t>
      </section>
    </section>
    <section anchor="sec-dh-akem">
      <name>Example Applications (Informative)</name>
      <t>This section is informative. It illustrates how the authenticated modes defined
in <xref target="sec-ext"/> can be used.  Any AEAD identifier from <xref target="I-D.ietf-hpke-hpke"/> may
be used; the resulting context supports <tt>Seal()</tt>, <tt>Open()</tt>, and <tt>Export()</tt>.
Key generation follows <tt>GenerateKeyPair()</tt> from <xref target="I-D.ietf-hpke-hpke"/>.</t>
      <t>The modes may be used directly via their setup functions.  For <tt>mode_auth</tt>, the
sender calls <tt>SetupAuthS(pkR, info, skS)</tt> and the receiver calls
<tt>SetupAuthR(enc, skR, info, pkS)</tt>.  For <tt>mode_auth_psk</tt>, the sender calls
<tt>SetupAuthPSKS()</tt> and the receiver calls <tt>SetupAuthPSKR()</tt>, with a shared PSK
and PSK identifier, as defined in <xref target="sec-setup"/>.</t>
      <section anchor="sec-hybrid">
        <name>Hybrid PQ/T Profile (<tt>mode_auth_psk</tt> with PQ-KEM PSK)</name>
        <t>The following terms are used in this section:</t>
        <ul spacing="normal">
          <li>
            <t><strong>PQ-KEM:</strong> a post-quantum KEM, e.g., ML-KEM <xref target="FIPS203"/> or an
algorithm from <xref target="I-D.ietf-hpke-pq"/>.</t>
          </li>
          <li>
            <t><tt>PQKEM.Encap(pkR_pq)</tt>: PQ-KEM encapsulation; returns <tt>(ss_pq, enc_pq)</tt>.</t>
          </li>
          <li>
            <t><tt>PQKEM.Decap(enc_pq, skR_pq)</tt>: PQ-KEM decapsulation; returns <tt>ss_pq</tt>.</t>
          </li>
          <li>
            <t><tt>Nenc_pq</tt>: the fixed ciphertext length of the chosen PQ-KEM, in bytes.</t>
          </li>
        </ul>
        <t>The sender encapsulates a PQ-KEM to the receiver's PQ public key <tt>pkR_pq</tt>, using
the resulting shared secret <tt>ss_pq</tt> as the HPKE PSK and the PQ ciphertext
<tt>enc_pq</tt> as the PSK identifier. The receiver's PQ public key <tt>pkR_pq</tt> is
included in <tt>info</tt> to bind it to the key schedule. The combined encapsulation is
<tt>concat(enc_dh, enc_pq)</tt>; <tt>Nenc</tt> bytes are parsed as <tt>enc_dh</tt> and the remaining
<tt>Nenc_pq</tt> bytes as <tt>enc_pq</tt>.</t>
        <artwork><![CDATA[
def HybridSetupS(pkR, pkR_pq, skS, info):
  ss_pq, enc_pq = PQKEM.Encap(pkR_pq)
  enc_dh, ctx = SetupAuthPSKS(pkR, concat(info, pkR_pq), ss_pq, enc_pq, skS)
  return concat(enc_dh, enc_pq), ctx

def HybridSetupR(enc, skR, skR_pq, pkR_pq, pkS, info):
  enc_dh, enc_pq = enc[:Nenc], enc[Nenc:]
  ss_pq = PQKEM.Decap(enc_pq, skR_pq)
  return SetupAuthPSKR(enc_dh, skR, concat(info, pkR_pq), ss_pq, enc_pq, pkS)
]]></artwork>
        <t>Implementations should verify <tt>len(enc) == Nenc + Nenc_pq</tt> and reject
encapsulations of any other length. A fresh <tt>(ss_pq, enc_pq)</tt> pair should be
generated for each encapsulation; reuse of a prior <tt>enc_pq</tt> is prohibited. The
<tt>suite_id</tt> in the HPKE key schedule reflects only the classical ciphersuite
<tt>(KEM_ID, KDF_ID, AEAD_ID)</tt>; the PQ-KEM algorithm identity should be conveyed
via application-layer framing or the <tt>info</tt> parameter when multiple PQ-KEM
algorithms are supported.</t>
        <t><strong>Hybrid confidentiality.</strong> <tt>KeyScheduleS()</tt>/<tt>KeyScheduleR()</tt> delegate to
<tt>CombineSecrets</tt>, for which <xref target="I-D.ietf-hpke-hpke"/> defines two variants. In
<tt>CombineSecrets_TwoStage()</tt>, the combination is <tt>secret =
LabeledExtract(dhkem_shared_secret, "secret", psk)</tt>, equivalent to
<tt>HKDF-Extract(salt = dhkem_shared_secret, IKM = ss_pq)</tt> <xref target="RFC5869"/>. In
<tt>CombineSecrets_OneStage()</tt>, <tt>dhkem_shared_secret</tt> and <tt>psk</tt> are length-prefixed
and concatenated before a single <tt>LabeledDerive()</tt> call. In both cases,
<tt>dhkem_shared_secret</tt> and <tt>ss_pq</tt> enter the combination as independent inputs.
The intended design property is that <tt>secret</tt> remains pseudorandom as long as at
least one of the two inputs is---meaning an adversary would need to attack both
the classical DH-based component and the PQ-KEM to recover <tt>secret</tt>.  Whether
this property holds formally for a specific <tt>CombineSecrets</tt> variant depends on
that variant's security analysis, which is outside the scope of this document.
Authentication remains entirely classical; a quantum adversary that breaks the
DH assumption can also forge sender authentication, so post-quantum sender
authentication would require an additional PQ signature. Note that <xref target="Alwen2023"/>
describes a related hybrid construction in which a PQ <em>AKEM</em> (rather than a
plain KEM) is used to generate the PSK, which would additionally provide
post-quantum sender authentication; that stronger construction is outside the
scope of this document.</t>
        <t><strong>PSK freshness.</strong> The ML-KEM shared secret <tt>ss_pq</tt> satisfies the
entropy requirement in <xref section="9.5" sectionFormat="of" target="I-D.ietf-hpke-hpke"/> (32 bytes of
uniform randomness). The prohibition on <tt>enc_pq</tt> reuse above ensures a fresh PSK
per session.</t>
      </section>
    </section>
    <section anchor="sec-suites">
      <name>HPKE-Auth Profiles (Informative)</name>
      <t>This section is informative. The profiles below are suggested KEM and KDF
parameter sets for the example applications in <xref target="sec-dh-akem"/>; they are not
registered by this document. Because <tt>AEAD_ID</tt> is selected by the application,
these are parameter sets, not fully determined ciphersuites. <tt>KEM_ID</tt> and
<tt>KDF_ID</tt> are drawn from the registries in <xref target="I-D.ietf-hpke-hpke"/>.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Profile</th>
            <th align="left">KEM_ID</th>
            <th align="left">KDF_ID</th>
            <th align="left">PQKEM</th>
            <th align="left">Nenc</th>
            <th align="left">Nenc_pq</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>HPKE-Auth-X25519-SHA256</tt></td>
            <td align="left">
              <tt>0x0020</tt></td>
            <td align="left">
              <tt>0x0001</tt></td>
            <td align="left">---</td>
            <td align="left">32</td>
            <td align="left">---</td>
          </tr>
          <tr>
            <td align="left">
              <tt>HPKE-Auth-P256-SHA256</tt></td>
            <td align="left">
              <tt>0x0010</tt></td>
            <td align="left">
              <tt>0x0001</tt></td>
            <td align="left">---</td>
            <td align="left">65</td>
            <td align="left">---</td>
          </tr>
          <tr>
            <td align="left">
              <tt>HPKE-Auth-X448-SHA512</tt></td>
            <td align="left">
              <tt>0x0021</tt></td>
            <td align="left">
              <tt>0x0003</tt></td>
            <td align="left">---</td>
            <td align="left">56</td>
            <td align="left">---</td>
          </tr>
          <tr>
            <td align="left">
              <tt>HPKE-Auth-Hybrid-X25519-SHA256-MLKEM768</tt></td>
            <td align="left">
              <tt>0x0020</tt></td>
            <td align="left">
              <tt>0x0001</tt></td>
            <td align="left">ML-KEM-768</td>
            <td align="left">32</td>
            <td align="left">1088</td>
          </tr>
          <tr>
            <td align="left">
              <tt>HPKE-Auth-Hybrid-X25519-SHA256-MLKEM1024</tt></td>
            <td align="left">
              <tt>0x0020</tt></td>
            <td align="left">
              <tt>0x0001</tt></td>
            <td align="left">ML-KEM-1024</td>
            <td align="left">32</td>
            <td align="left">1568</td>
          </tr>
          <tr>
            <td align="left">
              <tt>HPKE-Auth-Hybrid-P256-SHA256-MLKEM768</tt></td>
            <td align="left">
              <tt>0x0010</tt></td>
            <td align="left">
              <tt>0x0001</tt></td>
            <td align="left">ML-KEM-768</td>
            <td align="left">65</td>
            <td align="left">1088</td>
          </tr>
        </tbody>
      </table>
      <t>ML-KEM parameters are from <xref target="FIPS203"/>.
<tt>HPKE-Auth-Hybrid-X25519-SHA256-MLKEM768</tt> is the suggested default hybrid
profile, yielding a combined encapsulation of 1120 bytes.</t>
    </section>
    <section anchor="sec-security">
      <name>Security Considerations</name>
      <t>The sender-authentication and key-compromise impersonation (KCI) properties of
<tt>mode_auth</tt> and <tt>mode_auth_psk</tt> are as described in Sections <xref target="RFC9180" section="9.1" sectionFormat="bare"/> and <xref target="RFC9180" section="9.1.1" sectionFormat="bare"/> of <xref target="RFC9180"/>, which apply without change to the functions defined in <xref target="sec-ext"/>.
Security properties specific to the hybrid PQ/T construction are discussed
informatively in <xref target="sec-hybrid"/>.</t>
      <t>The formal security of the DHKEM authenticated modes under the Gap-DH assumption
is established in <xref target="Alwen2021"/>. The security of <tt>mode_auth_psk</tt>---termed
<tt>AuthPSK</tt> in <xref target="Alwen2023"/>---is analyzed there as the <tt>pskAPKE</tt> scheme.</t>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <t>This document requests no IANA actions; all identifiers are drawn from
registries defined in <xref target="I-D.ietf-hpke-hpke"/>.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-hpke-hpke">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Karthikeyan Bhargavan" initials="K." surname="Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp" initials="B." surname="Lipp">
              <organization>Inria</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
         </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This document describes a scheme for hybrid public key encryption
   (HPKE).  This scheme provides a variant of public key encryption of
   arbitrary-sized plaintexts for a recipient public key.  It also
   includes a variant that authenticates possession of a pre-shared key.
   HPKE works for any combination of an asymmetric Key Encapsulation
   Mechanism (KEM), key derivation function (KDF), and authenticated
   encryption with additional data (AEAD) encryption function.  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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-hpke-03"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="FIPS203" target="https://doi.org/10.6028/NIST.FIPS.203">
          <front>
            <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2024" month="August"/>
          </front>
          <seriesInfo name="FIPS" value="203"/>
        </reference>
        <reference anchor="Alwen2021">
          <front>
            <title>HPKE: Hybrid Public Key Encryption</title>
            <author initials="J." surname="Alwen" fullname="Joël Alwen">
              <organization/>
            </author>
            <author initials="B." surname="Blanchet" fullname="Bruno Blanchet">
              <organization/>
            </author>
            <author initials="E." surname="Hauck" fullname="Eduard Hauck">
              <organization/>
            </author>
            <author initials="E." surname="Kiltz" fullname="Eike Kiltz">
              <organization/>
            </author>
            <author initials="B." surname="Lipp" fullname="Benjamin Lipp">
              <organization/>
            </author>
            <author initials="D." surname="Riepel" fullname="Doreen Riepel">
              <organization/>
            </author>
            <date year="2021"/>
          </front>
          <seriesInfo name="DOI" value="10.1007/978-3-030-77886-6_14"/>
          <refcontent>Advances in Cryptology -- EUROCRYPT 2021, LNCS 12696, pp. 396-427</refcontent>
        </reference>
        <reference anchor="Alwen2023" target="https://eprint.iacr.org/2023/1480">
          <front>
            <title>The Pre-Shared Key Modes of HPKE</title>
            <author initials="J." surname="Alwen" fullname="Joël Alwen">
              <organization/>
            </author>
            <author initials="J." surname="Janneck" fullname="Jonas Janneck">
              <organization/>
            </author>
            <author initials="E." surname="Kiltz" fullname="Eike Kiltz">
              <organization/>
            </author>
            <author initials="B." surname="Lipp" fullname="Benjamin Lipp">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>Advances in Cryptology -- ASIACRYPT 2023</refcontent>
        </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="RFC9794">
          <front>
            <title>Terminology for Post-Quantum Traditional Hybrid Schemes</title>
            <author fullname="F. Driscoll" initials="F." surname="Driscoll"/>
            <author fullname="M. Parsons" initials="M." surname="Parsons"/>
            <author fullname="B. Hale" initials="B." surname="Hale"/>
            <date month="June" year="2025"/>
            <abstract>
              <t>One aspect of the transition to post-quantum algorithms in cryptographic protocols is the development of hybrid schemes that incorporate both post-quantum and traditional asymmetric algorithms. This document defines terminology for such schemes. It is intended to be used as a reference and, hopefully, to ensure consistency and clarity across different protocols, standards, and organisations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9794"/>
          <seriesInfo name="DOI" value="10.17487/RFC9794"/>
        </reference>
        <reference anchor="I-D.ietf-hpke-pq">
          <front>
            <title>Post-Quantum and Post-Quantum/Traditional Hybrid Algorithms for HPKE</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Deirdre Connolly" initials="D." surname="Connolly">
              <organization>Selkie Cryptography</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   Updating key exchange and public-key encryption protocols to resist
   attack by quantum computers is a high priority given the possibility
   of "harvest now, decrypt later" attacks.  Hybrid Public Key
   Encryption (HPKE) is a widely-used public key encryption scheme based
   on combining a Key Encapsulation Mechanism (KEM), a Key Derivation
   Function (KDF), and an Authenticated Encryption with Associated Data
   (AEAD) scheme.  In this document, we define KEM algorithms for HPKE
   based on both post-quantum KEMs and hybrid constructions of post-
   quantum KEMs with traditional KEMs, as well as a KDF based on SHA-3
   that is suitable for use with these KEMs.  When used with these
   algorithms, HPKE is resilient with respect to attacks by a quantum
   computer.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-hpke-pq-04"/>
        </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>
      </references>
    </references>
    <?line 371?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t><em>TK</em></t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vb23bbRrJ976/okR9G8hC0KMmyTI8noS05YnxTRGVmsrKy
jCbRJDECAQQNSGYU51vO+/mLc37s7Kpu3HixnMwcP5gg2Leqrtq1q7rleZ7I
wzzSfbkzKPK5jvNwonIdyLdJoI2cJpk8v3h9tiPUeJzpGzSjr3JD2x1BX2ZJ
tuxLkwdCBMkkVguMHGRqmnsL483Ta+0pdPUW1MPb3xemGC9CY8Ikzpcp2g7P
rl7JB1JFJsFcYRzoVOO/ON/pyB0dhHmShSqiL8PBC3xgfTvDy6tXOyIuFmOd
9UWAVfTFJImNjk1h+jLPCi2w8kOBcTOt+nJweTbAl9sku55lSZH2WUZxrZd4
FfSFlJ4cvD57yw+qJWr59vS8fOKuNzouMOsDKZsD4quV6h+YKYxn8hv6kV4v
VBj1Jenj61Dn026SzTDYLMznxRhyT6aLR9u0tiMEfUkyu85pEUVWzS+hevkq
U/EkNPLtUmcGDaTMEtpdqzp+gblUHP6icii9jw5aB8lCJlMJOeVFpo2Rr5Ii
DrgB99B2uVjV12qycIttTn2Z3OpYjrr/4Qmz5Oupbd1NqZkQcZIt0OxGk/BD
77RL2rMaov/6QoTxtNnm1fBidLB/2OdhS0uHvRaR9t6oHNuqvRfK0M7qpXcW
T1RqiohXIt/qyRwLNws5yhWWlwU7PEytficdhnzHXVQkh7HBNEWuScCyn5H4
lFcYL06iZLa047ClwpVmhcnlwf7BEb81Ogu1ITHKGUgGTAExbL9cZTOdw3zy
PDX9R4+CJKQ9edTb7x7vH5w8ejccXXWpUxdd0GMQYXcwfq+tBTJRGOpynIWB
vCjGUTghJUgoIVumJI6dLpsQOAQ3MCwgQhjLl/QzyyE9T559f/n+5eUPF1ck
Qq8j37x7OZK9g+Onxx2Zpl15+PTYOzp4skl1nrTm823yv/8d2WWu/PIiK+JE
vogw91znKz+eBQV0K89VMble/Sm81vJ1GOW/rA6o43+pBYR4E6bpym+nCYwt
lpchMCdq7BDJtWVrTt8PoRwovre//+TR0ycn3qG3f7jvPXlycnLsHX/oHe00
NmDFDK+s+XujOWCJDdChLizHgu4fUdm3MEMjv1VxrP8dtVSiH36JEQxGw0Fl
BFvMVKdZGOfdUE0yNldq+ah3dLIvhIch1NjkmZrkQpBeTOk5Hr28lnd3f1p3
90+fpClSAJ0mrRGaVN5Pviju7r66fPXyae9k/9MnhIpFCH8HCoe5WUF1Blbp
08cH+sVnf62/f0jNtd/FwoCsCGvFAl0lEAkIxxMnRsv8NnHjQP0KAmThJJf6
Y44whOV00P7nIsxoAUkcLWm5QgVASYIa7LhPMZUBaHfPf8TfTrX9JvOEpeOg
0+HHQE/DuOo7TYpMGJ0XKUA5ntBr02EZlCQMm5FmpP932O90eTF6PYzTIjcY
uSslabtaJaSDAHGSCxXlOuOp6McM6sSakzFc4EaNIy3Heq5uQoRfh+P6Y2hY
u8wPrCLKTQx/0QGAedsmdsWKZin6yzCKCrKIXEOUBqpHy46cJ7c8qduCcgMn
Ksa6RAF76Mr3MayomMylStOI9pnEw09mdV/lLcIuFJUmJvd+LlScFwuK83L3
4jsPn3vCWAc1epLpnLaXA9foNQAuS27CgMSeOxz97tGVBPmYhkRaQFXCfNmV
LB6Wr4m8CDzbfhgzJ6OBWPitUrbdCdq9hVpCIGw2xE5SNMfcRqeKtML0pWt9
ZxEGQaQFmMUwzjNENzYBIbZ5TWhFWHUyqAvebbCpzuC2uxMvjzzKjvQH3Elg
DhMusDfTZWs1XXkOOnGjs440yUKTrvJkkkTGeRBmi9sTEnPzdCt2L6rYvUtM
bg9aUrypt+ys7R2FOnghEwDzUoyJi5QaMMQ+sz+zLWM2LMbuFc3oeWQ5SZE3
XFsxKxJtfegqopJp5Nhj53fs0PQOhm73DCrfumsqAnsNljyGCmOgTBTxIrEo
7AR8A64LuqRBYVtogh4LOLy2uERyeE6c03N5o6JCS//0fNdcj2DR15fooKIk
nhlYKMOUTud6oTMVld1sH7bQ8COGHSfwIIC71Rl0A5NlRTHwjUHjSTc0FLSF
laxpl7qkKsy6Fv0rmgenzEqQy1sYgWezgAKgyWEDi1eMTqz6+kZspuVsUfoq
bIvPwTSNVMM0gbLcAspYVTgNYbkbMfnqi1B3A+IStGAqRvygS/4PC/eCuaeu
9cI5rX1nihD2gFfoNcnCsb4XY0UTYwlIA+oyiYrA2n3LivO5ymWkKAnZgKxb
AZU2Qk3mIbz/c4BKPTgAYgz2l5G20z4mvTBIPXl6hMACTWIdJfDKLwJe8aXA
+wAZV3xDi0piS/BPq6Bs2IzJqimjNEg5vh9dUdZKn/Lde36+PPvu++Hl2Sk9
j84Hb95UD8K1GJ2///7Naf1U93z5/u3bs3entjPeytYrsfN28MOONbad9xdX
w/fvBm92iAO0nQi7QIoYE9JDR0iycpZVlFZB+pUvXl78z3/1jshFoNqDXu8p
7MZ+Oek9gZ4Bqjq2szG1sV+h1aVA8NUqo1EIrOAnYY7o3mF9wsJiOdeZhjIf
/kia+akv/zqepL2jv7kXJHDrZamz1kvW2fqbtc5WiRtebZim0mbr/Yqm2+sd
/ND6Xuq98fKvX0UwWun1Tr76mwDU6Wxh5DRDNnx3txnyM+tqso40NfOzQDFN
oii5hQ9WbBKWjs1ckLlzX1JxGCM39uTDhxQN+w8fymY0bIfOehhiqUAOsykS
guI3YiHvfR1DGfJdt5arw9jCnH1nvYIkz0oXNBaQN2rk7gHBF7z1k2ONxvm+
SfWEMNUREieE+Qy2l3yCwEA4mLs3CSCdmwZcGN6jEo1MwtAn/j3e3ETxDjFx
bP1svuK7LoRYcTeEEYK6iQ6KTFuM3MK8Hzywyh8yvGLAzNgYDIVgzcxeckp7
uRbIgR9Rdv/j/oHTDx4PfXLwK5avB8G2M5iMxk0jNXEmzYuvLJjFl2G9EsIJ
kWThLLR6LPc4aM8nm8wUdv7bb7+Jats4z30uacWitZf25SG3JjVYMlYZYb+d
kVlhW+HemqKlenj1yeqtloYywirys+ywSh2sZHNsSYHNSzn+xVx7pGyT/Mpq
jDk9uoIVj+F9ixI0ysB31O1VoY+10JUD4O1cR0iPRb2IXf8bHWuKYq/18gKE
y+8Q9aP/RxwjkarZUhB+9zvCPyUrWHsvfaiJkvVBHJx9TKEaf88KuBKYt+V7
pHM0lLWGwTvB969He1TpMNdnxETPsEUr693dw8/BHD+AEwA7dpm3nlne2pFN
FkstsTFoui4apjvbE4Rh15eLbS0u97jBaGsDmmuPhwG9+uCofb00TM4rWXR4
FBrNouEHh4bP5aoad4N5pzkYD46mRRa3+3ZINFHp0NokT2hIkalTpNXhpk2k
xht1yb3PSl26se7VFTXdu09fo70vVtUf0tVmVVkHf5cw0QMdZLy8x7XbbntT
RGSEBDeIFJT6UUIFDwwRCRD1gFQIl+yIu69fDvf6NgQZU1A1vjFtOxjeAtxm
zrwDObZZ8DyJEGbL6NAMsT6sza8KNNxQhlPH0SdhGgI2xUqHS5+CSb1aJNcj
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

-->

</rfc>
