<?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.36 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-hybrid-kems-11" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="hybrid-kems">Hybrid PQ/T Key Encapsulation Mechanisms</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hybrid-kems-11"/>
    <author fullname="Deirdre Connolly">
      <organization>SandboxAQ</organization>
      <address>
        <email>durumcrustulum@gmail.com</email>
      </address>
    </author>
    <author fullname="Richard Barnes">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author fullname="Paul Grubbs">
      <organization>University of Michigan</organization>
      <address>
        <email>paulgrubbs12@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="May" day="07"/>
    <workgroup>Crypto Forum</workgroup>
    <abstract>
      <?line 229?>

<t>This document defines generic constructions for hybrid Key Encapsulation
Mechanisms (KEMs) based on combining a post-quantum (PQ) KEM with a
traditional cryptographic component. Hybrid KEMs built using these
constructions provide strong security properties as long as either of the
underlying algorithms are secure.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-hybrid-kems"/>.</t>
    </note>
  </front>
  <middle>
    <?line 237?>

<section anchor="intro">
      <name>Introduction</name>
      <t>Post-quantum (PQ) cryptographic algorithms are based on problems that are
conjectured to be resistant to attacks possible on a quantum computer. Key
Encapsulation Mechanisms (KEMs) are a standardized class of cryptographic
scheme that can be used to build protocols in lieu of traditional,
quantum-vulnerable variants such as finite field or elliptic curve
Diffie-Hellman (DH) based protocols.</t>
      <t>Given the novelty of PQ algorithms, however, there is some concern that PQ
algorithms currently believed to be secure will be broken.  Hybrid
constructions that combine both PQ and traditional algorithms can help
moderate this risk while still providing security against quantum attack.  If
constructed properly, a hybrid KEM will retain certain security properties
even if one of the two constituent KEMs is compromised. If the PQ KEM is
broken, then the hybrid KEM should continue to provide security against
non-quantum attackers by virtue of its traditional KEM component. If the
traditional KEM is broken by a quantum computer, then the hybrid KEM should
continue to resist quantum attack by virtue of its PQ KEM component.</t>
      <t>In addition to guarding against algorithm weaknesses, this property also
guards against flaws in implementations, such as timing attacks.  Hybrid KEMs
can also facilitate faster deployment of PQ security by allowing applications
to incorporate PQ algorithms while still meeting compliance requirements
based on traditional algorithms.</t>
      <t>In this document, we define generic frameworks for constructing hybrid KEMs
from a PQ KEM and a traditional algorithm.  The aim of this document is
provide a small set of techniques to achieve specific security properties
given conforming component algorithms, which should make these techniques
suitable for a broad variety of use cases.</t>
      <t>We define four generic frameworks as variants of a common overall scheme.
The variations are based on (1) what type of cryptographic object is being
used for the traditional component, and (2) whether the PQ KEM is assumed to
have an additional property known as Ciphertext Second Preimage Resistance
(C2PRI).  Hybrid KEMs built using PQ KEMs that satisfy C2PRI can achieve the
same security level with more efficient computations, trading off performance
for an additional security assumption.</t>
      <t>The remainder of this document is structured as follows: first, in
<xref target="cryptographic-deps"/> and <xref target="frameworks"/>, we define the abstractions on
which the frameworks are built, and then the frameworks themselves.  Then, in
<xref target="security"/>, we lay out the security analyses that support these frameworks,
including the security requirements for constituent components and the
security notions satisfied by hybrid KEMS constructed according to the
frameworks in the document <xref target="hybrid-ind-cca"/>.  Finally, we discuss
some "path not taken", related topics that might be of interest to readers,
but which are not treated in depth.</t>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="notation">
      <name>Notation</name>
      <t>This document is consistent with all terminology defined in
<xref target="I-D.ietf-pquip-pqt-hybrid-terminology"/>.</t>
      <t>The following terms are used throughout this document:</t>
      <ul spacing="normal">
        <li>
          <t><tt>random(n)</tt>: return a pseudorandom byte string of length <tt>n</tt> bytes produced
by a cryptographically-secure random number generator.</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>split(N1, N2, x)</tt>: Split a byte string <tt>x</tt> of length <tt>N1 + N2</tt> into its
first <tt>N1</tt> bytes and its last <tt>N2</tt> bytes.  This function is the inverse of
<tt>concat(x1, x2)</tt> when <tt>x1</tt> is <tt>N1</tt> bytes long and <tt>x2</tt> is <tt>N2</tt> bytes
long. It is an error to call this function with a byte string that does not
have length <tt>N1 + N2</tt>. Since this function operates over secret data <tt>x</tt>,
it <bcp14>MUST</bcp14> be constant-time for a given <tt>N1</tt> and <tt>N2</tt>.</t>
        </li>
      </ul>
      <t>When <tt>x</tt> is a byte string, we use the notation <tt>x[..i]</tt> and <tt>x[i..]</tt> to
denote the slice of bytes in <tt>x</tt> starting from the beginning of <tt>x</tt> and
leading up to index <tt>i</tt>, including the <tt>i</tt>-th byte, and the slice the bytes
in <tt>x</tt> starting from index <tt>i</tt> to the end of <tt>x</tt>, respectively. For example,
if <tt>x = [0, 1, 2, 3, 4]</tt>, then <tt>x[..2] = [0, 1]</tt> and <tt>x[2..] = [2, 3, 4]</tt>.</t>
      <t>A set is denoted by listing values in braces: <tt>{a,b,c}</tt>.</t>
      <t>A vector of set elements of length <tt>n</tt> is denoted with exponentiation,
such as for the <tt>n</tt>-bit value: {0,1}<sup>n</sup>.</t>
      <t>Drawing uniformly at random from an <tt>n</tt>-bit vector into a value <tt>x</tt>
is denoted: x $← {0,1}<sup>n</sup>.</t>
      <t>A function <tt>f</tt> that maps from one domain to another is denoted
using a right arrow to separate inputs from outputs: f : inputs → outputs.</t>
    </section>
    <section anchor="cryptographic-deps">
      <name>Cryptographic Dependencies</name>
      <t>The generic hybrid PQ/T KEM frameworks we define depend on the following
cryptographic primitives:</t>
      <ul spacing="normal">
        <li>
          <t>Key Encapsulation Mechanisms (<xref target="kems"/>)</t>
        </li>
        <li>
          <t>Nominal Groups (<xref target="groups"/>)</t>
        </li>
        <li>
          <t>Pseudorandom Generators (<xref target="prgs"/>)</t>
        </li>
        <li>
          <t>Key Derivation Functions (<xref target="kdfs"/>)</t>
        </li>
      </ul>
      <t>In the remainder of this section, we describe functional aspects of these
mechanisms.  The security properties we require in order for the resulting
hybrid KEM to be secure are discussed in <xref target="security"/>.</t>
      <section anchor="kems">
        <name>Key Encapsulation Mechanisms</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="248" viewBox="0 0 248 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,272 L 8,304" fill="none" stroke="black"/>
              <path d="M 40,128 L 40,160" fill="none" stroke="black"/>
              <path d="M 40,224 L 40,264" fill="none" stroke="black"/>
              <path d="M 40,312 L 40,352" fill="none" stroke="black"/>
              <path d="M 48,32 L 48,96" fill="none" stroke="black"/>
              <path d="M 80,272 L 80,304" fill="none" stroke="black"/>
              <path d="M 120,96 L 120,128" fill="none" stroke="black"/>
              <path d="M 168,272 L 168,304" fill="none" stroke="black"/>
              <path d="M 192,32 L 192,96" fill="none" stroke="black"/>
              <path d="M 208,128 L 208,160" fill="none" stroke="black"/>
              <path d="M 208,224 L 208,264" fill="none" stroke="black"/>
              <path d="M 208,312 L 208,352" fill="none" stroke="black"/>
              <path d="M 240,272 L 240,304" fill="none" stroke="black"/>
              <path d="M 48,32 L 192,32" fill="none" stroke="black"/>
              <path d="M 48,96 L 192,96" fill="none" stroke="black"/>
              <path d="M 40,128 L 208,128" fill="none" stroke="black"/>
              <path d="M 8,272 L 80,272" fill="none" stroke="black"/>
              <path d="M 168,272 L 240,272" fill="none" stroke="black"/>
              <path d="M 88,288 L 160,288" fill="none" stroke="black"/>
              <path d="M 8,304 L 80,304" fill="none" stroke="black"/>
              <path d="M 168,304 L 240,304" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="216,352 204,346.4 204,357.6" fill="black" transform="rotate(90,208,352)"/>
              <polygon class="arrowhead" points="216,264 204,258.4 204,269.6" fill="black" transform="rotate(90,208,264)"/>
              <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(90,208,160)"/>
              <polygon class="arrowhead" points="168,288 156,282.4 156,293.6" fill="black" transform="rotate(0,160,288)"/>
              <polygon class="arrowhead" points="48,352 36,346.4 36,357.6" fill="black" transform="rotate(90,40,352)"/>
              <polygon class="arrowhead" points="48,264 36,258.4 36,269.6" fill="black" transform="rotate(90,40,264)"/>
              <polygon class="arrowhead" points="48,160 36,154.4 36,165.6" fill="black" transform="rotate(90,40,160)"/>
              <g class="text">
                <text x="120" y="52">GenerateKeyPair</text>
                <text x="116" y="68">or</text>
                <text x="120" y="84">DeriveKeyPair</text>
                <text x="44" y="196">ek</text>
                <text x="204" y="196">dk</text>
                <text x="124" y="276">ct</text>
                <text x="44" y="292">Encaps</text>
                <text x="204" y="292">Decaps</text>
                <text x="44" y="388">ss</text>
                <text x="124" y="388">==</text>
                <text x="204" y="388">ss</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
     +-----------------+
     | GenerateKeyPair |
     |       or        |
     |  DeriveKeyPair  |
     +--------+--------+
              |
    +---------+----------+
    |                    |
    V                    V

    ek                  dk

    |                    |
    |                    |
    V                    V
+--------+    ct    +--------+
| Encaps |--------->| Decaps |
+--------+          +--------+
    |                    |
    |                    |
    V                    V

    ss        ==        ss
]]></artwork>
        </artset>
        <t>A Key Encapsulation Mechanism (KEM) comprises the following algorithms:</t>
        <ul spacing="normal">
          <li>
            <t><tt>GenerateKeyPair() -&gt; (dk, ek)</tt>: A randomized algorithm that generates a
secret decapsulation key <tt>dk</tt> and a public encapsulation key <tt>ek</tt>, each of
which are byte strings.</t>
          </li>
          <li>
            <t><tt>DeriveKeyPair(seed) -&gt; (dk, ek)</tt>: A deterministic algorithm that takes as
input a seed <tt>seed</tt> and generates a secret decapsulation key <tt>dk</tt> and a
public encapsulation key <tt>ek</tt>, each of which are byte strings.</t>
          </li>
          <li>
            <t><tt>Encaps(ek) -&gt; (ss, ct)</tt>: A probabilistic encapsulation
algorithm, which takes as input a public encapsulation key <tt>ek</tt> and outputs
a shared secret <tt>ss</tt> and ciphertext <tt>ct</tt>.</t>
          </li>
          <li>
            <t><tt>Decaps(dk, ct) -&gt; ss</tt>: A deterministic decapsulation algorithm, which
takes as input a secret decapsulation key <tt>dk</tt> and ciphertext <tt>ct</tt> and
outputs a shared secret <tt>ss</tt>.</t>
          </li>
        </ul>
        <t>In this document, <tt>Decaps</tt> is modeled as always returning a
shared secret and never returning an error.  Component KEMs
that use implicit rejection (such as ML-KEM) produce a
deterministic pseudorandom output on invalid ciphertexts,
which propagates through the combiner's KDF.</t>
        <t>We also make use of internal algorithms such as:</t>
        <ul spacing="normal">
          <li>
            <t><tt>expandDecapsulationKey(dk) -&gt; (dk, ek)</tt>: A deterministic algorithm that
takes as input a decapsulation key <tt>dk</tt> and generates keypair intermediate
values for computation.</t>
          </li>
        </ul>
        <t>We assume that the values produced and consumed by the above functions are
all byte strings, with fixed lengths:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Nseed</tt>: The length in bytes of a key seed</t>
          </li>
          <li>
            <t><tt>Nek</tt>: The length in bytes of a public encapsulation key</t>
          </li>
          <li>
            <t><tt>Ndk</tt>: The length in bytes of a secret decapsulation key</t>
          </li>
          <li>
            <t><tt>Nct</tt>: The length in bytes of a ciphertext produced by <tt>Encaps</tt></t>
          </li>
          <li>
            <t><tt>Nss</tt>: The length in bytes of a shared secret produced by <tt>Encaps</tt> or
<tt>Decaps</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="groups">
        <name>Nominal Groups</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="464" width="456" viewBox="0 0 456 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 56,128 L 56,352" fill="none" stroke="black"/>
              <path d="M 80,112 L 80,144" fill="none" stroke="black"/>
              <path d="M 80,336 L 80,368" fill="none" stroke="black"/>
              <path d="M 104,64 L 104,104" fill="none" stroke="black"/>
              <path d="M 104,152 L 104,192" fill="none" stroke="black"/>
              <path d="M 104,224 L 104,240" fill="none" stroke="black"/>
              <path d="M 104,288 L 104,328" fill="none" stroke="black"/>
              <path d="M 104,376 L 104,416" fill="none" stroke="black"/>
              <path d="M 128,112 L 128,144" fill="none" stroke="black"/>
              <path d="M 128,336 L 128,368" fill="none" stroke="black"/>
              <path d="M 224,48 L 224,64" fill="none" stroke="black"/>
              <path d="M 328,112 L 328,144" fill="none" stroke="black"/>
              <path d="M 328,336 L 328,368" fill="none" stroke="black"/>
              <path d="M 352,64 L 352,104" fill="none" stroke="black"/>
              <path d="M 352,152 L 352,192" fill="none" stroke="black"/>
              <path d="M 352,224 L 352,240" fill="none" stroke="black"/>
              <path d="M 352,288 L 352,328" fill="none" stroke="black"/>
              <path d="M 352,376 L 352,416" fill="none" stroke="black"/>
              <path d="M 376,112 L 376,144" fill="none" stroke="black"/>
              <path d="M 376,336 L 376,368" fill="none" stroke="black"/>
              <path d="M 400,128 L 400,352" fill="none" stroke="black"/>
              <path d="M 104,64 L 352,64" fill="none" stroke="black"/>
              <path d="M 80,112 L 128,112" fill="none" stroke="black"/>
              <path d="M 328,112 L 376,112" fill="none" stroke="black"/>
              <path d="M 56,128 L 72,128" fill="none" stroke="black"/>
              <path d="M 384,128 L 400,128" fill="none" stroke="black"/>
              <path d="M 80,144 L 128,144" fill="none" stroke="black"/>
              <path d="M 328,144 L 376,144" fill="none" stroke="black"/>
              <path d="M 40,240 L 56,240" fill="none" stroke="black"/>
              <path d="M 104,240 L 216,240" fill="none" stroke="black"/>
              <path d="M 240,240 L 352,240" fill="none" stroke="black"/>
              <path d="M 400,240 L 416,240" fill="none" stroke="black"/>
              <path d="M 104,288 L 216,288" fill="none" stroke="black"/>
              <path d="M 240,288 L 352,288" fill="none" stroke="black"/>
              <path d="M 80,336 L 128,336" fill="none" stroke="black"/>
              <path d="M 328,336 L 376,336" fill="none" stroke="black"/>
              <path d="M 56,352 L 72,352" fill="none" stroke="black"/>
              <path d="M 384,352 L 400,352" fill="none" stroke="black"/>
              <path d="M 80,368 L 128,368" fill="none" stroke="black"/>
              <path d="M 328,368 L 376,368" fill="none" stroke="black"/>
              <path d="M 128,430 L 320,430" fill="none" stroke="black"/>
              <path d="M 128,434 L 320,434" fill="none" stroke="black"/>
              <path d="M 216,240 L 240,288" fill="none" stroke="black"/>
              <path d="M 216,288 L 240,240" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="392,352 380,346.4 380,357.6" fill="black" transform="rotate(180,384,352)"/>
              <polygon class="arrowhead" points="392,128 380,122.4 380,133.6" fill="black" transform="rotate(180,384,128)"/>
              <polygon class="arrowhead" points="360,416 348,410.4 348,421.6" fill="black" transform="rotate(90,352,416)"/>
              <polygon class="arrowhead" points="360,328 348,322.4 348,333.6" fill="black" transform="rotate(90,352,328)"/>
              <polygon class="arrowhead" points="360,192 348,186.4 348,197.6" fill="black" transform="rotate(90,352,192)"/>
              <polygon class="arrowhead" points="360,104 348,98.4 348,109.6" fill="black" transform="rotate(90,352,104)"/>
              <polygon class="arrowhead" points="112,416 100,410.4 100,421.6" fill="black" transform="rotate(90,104,416)"/>
              <polygon class="arrowhead" points="112,328 100,322.4 100,333.6" fill="black" transform="rotate(90,104,328)"/>
              <polygon class="arrowhead" points="112,192 100,186.4 100,197.6" fill="black" transform="rotate(90,104,192)"/>
              <polygon class="arrowhead" points="112,104 100,98.4 100,109.6" fill="black" transform="rotate(90,104,104)"/>
              <polygon class="arrowhead" points="80,352 68,346.4 68,357.6" fill="black" transform="rotate(0,72,352)"/>
              <polygon class="arrowhead" points="80,128 68,122.4 68,133.6" fill="black" transform="rotate(0,72,128)"/>
              <g class="text">
                <text x="224" y="36">g</text>
                <text x="104" y="132">Exp</text>
                <text x="352" y="132">Exp</text>
                <text x="104" y="212">pkA</text>
                <text x="352" y="212">pkB</text>
                <text x="16" y="244">skA</text>
                <text x="440" y="244">skB</text>
                <text x="104" y="356">Exp</text>
                <text x="352" y="356">Exp</text>
                <text x="100" y="436">pkAB</text>
                <text x="348" y="436">pkBA</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                            g
                            |
             +--------------+---------------+
             |                              |
             V                              V
          +-----+                        +-----+
       +->| Exp |                        | Exp |<-+
       |  +-----+                        +-----+  |
       |     |                              |     |
       |     |                              |     |
       |     V                              V     |
       |    pkA                            pkB    |
       |     |                              |     |
 skA --+     +-------------.  .-------------+     +-- skB
       |                    \/                    |
       |                    /\                    |
       |     +-------------'  '-------------+     |
       |     |                              |     |
       |     V                              V     |
       |  +-----+                        +-----+  |
       +->| Exp |                        | Exp |<-+
          +-----+                        +-----+
             |                              |
             |                              |
             V                              V
           pkAB ========================= pkBA
]]></artwork>
        </artset>
        <t>Nominal groups are an abstract model of elliptic curve groups, over which we
instantiate Diffie-Hellman key agreement <xref target="ABH_21"/>.  A nominal group
comprises a set <tt>G</tt> together with a distinguished basis element <tt>g</tt>, an
"exponentiation" map, and some auxiliary functions:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Exp(p, x) -&gt; q</tt>: An algorithm that produces an element <tt>q</tt> of <tt>G</tt> from an
element <tt>p</tt> and an integer <tt>x</tt>.
            </t>
            <ul spacing="normal">
              <li>
                <t>The integers <tt>x</tt> are called "scalars" to distinguish them from group
elements.</t>
              </li>
              <li>
                <t><tt>Exp</tt> must respect multiplication in its scalar argument <tt>x</tt>, so that
<tt>Exp(Exp(p, x), y) = Exp(p, x * y)</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>RandomScalar(seed) -&gt; k</tt>: Produce a uniform pseudo-random scalar from the
uniformly pseudo-random byte string <tt>seed</tt>.</t>
          </li>
          <li>
            <t><tt>ElementToSharedSecret(P) -&gt; ss</tt>: Extract a shared secret from an element
of the group (e.g., by taking the X coordinate of an elliptic curve point).</t>
          </li>
        </ul>
        <t>We assume that scalars and group elements are represented by byte strings
with fixed lengths:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Nseed</tt>: The length in bytes of a seed (input to RandomScalar)</t>
          </li>
          <li>
            <t><tt>Nscalar</tt>: The length in bytes of a scalar</t>
          </li>
          <li>
            <t><tt>Nelem</tt>: The length in bytes of a serialized group element</t>
          </li>
          <li>
            <t><tt>Nss</tt>: The length in bytes of a shared secret produced by
ElementToSharedSecret</t>
          </li>
        </ul>
        <t>Groups used with the hybrid KEM framework in this document should be secure
with respect to the strong Diffie-Hellman problem (see <xref target="sdh"/>).</t>
      </section>
      <section anchor="prgs">
        <name>Pseudorandom Generators</name>
        <t>A pseudorandom generator (PRG) is a deterministic function whose outputs are
longer than its inputs. When the input is chosen uniformly at random, this
induces a certain distribution over the possible output. The output
distribution is pseudorandom if it is indistinguishable from the uniform
distribution.</t>
        <t>The <tt>PRG</tt>s used in this document have a simpler form, with fixed
output lengths:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Nout</tt>: The length in bytes of an output from this PRG.</t>
          </li>
          <li>
            <t><tt>PRG(seed) -&gt; output</tt>: Produce a byte string of length <tt>Nout</tt> from an input
byte string <tt>seed</tt>.</t>
          </li>
        </ul>
        <t>The fixed sizes are for both security and simplicity.</t>
        <t><tt>PRG</tt>s used with the frameworks in this document <bcp14>MUST</bcp14> provide the bit-security
required to source input randomness for PQ/T components from a seed that is
expanded to a output length, of which a subset is passed to the component key
generation algorithms.</t>
        <t>The security requirements for <tt>PRG</tt>s used with the frameworks in this document
are laid out in <xref target="security-prgs"/>.</t>
      </section>
      <section anchor="kdfs">
        <name>Key Derivation Functions</name>
        <t>A Key Derivation Function (KDF) is a function that produces
keying material based on an input secret and other information.</t>
        <t>While KDFs in the literature can typically consume and produce byte strings
of arbitrary length, the KDFs used in this document have a simpler form, with
fixed output lengths:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Nout</tt>: The length in bytes of an output from this KDF.</t>
          </li>
          <li>
            <t><tt>KDF(input) -&gt; output</tt>: Produce a byte string of length <tt>Nout</tt> from an
input byte string.</t>
          </li>
        </ul>
        <t>The fixed sizes are for both security and simplicity.</t>
        <t>Any KDF that utilizes HKDF <xref target="HKDF"/> <bcp14>MUST</bcp14> fully specify HKDF's salt, IKM,
info, and L arguments.</t>
        <t>The security requirements for KDFs used with the frameworks in this document
are laid out in <xref target="security-kdfs"/>.</t>
      </section>
    </section>
    <section anchor="frameworks">
      <name>Hybrid KEM Frameworks</name>
      <t>In this section, we define four frameworks for building hybrid KEMs.  These
frameworks are based on a common set of subroutines for things like key
generation and computing a final shared secret.</t>
      <t>The four frameworks vary along two axes:</t>
      <ol spacing="normal" type="1"><li>
          <t>Whether traditional component is a nominal group or a KEM</t>
        </li>
        <li>
          <t>Whether to rely on the C2PRI property for the post-quantum component</t>
        </li>
      </ol>
      <t>The choice of which framework to use when building a hybrid KEM will depend
on the application's needs along these two axes.</t>
      <table anchor="variants">
        <name>Hybrid KEM frameworks</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">PQ C2PRI?</th>
            <th align="left">T component</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">UG</td>
            <td align="left">No</td>
            <td align="left">Nominal group</td>
          </tr>
          <tr>
            <td align="left">UK</td>
            <td align="left">No</td>
            <td align="left">KEM</td>
          </tr>
          <tr>
            <td align="left">CG</td>
            <td align="left">Yes</td>
            <td align="left">Nominal group</td>
          </tr>
          <tr>
            <td align="left">CK</td>
            <td align="left">Yes</td>
            <td align="left">KEM</td>
          </tr>
        </tbody>
      </table>
      <t>Instantiating one of these frameworks creates a hybrid KEM <tt>KEM_H</tt> based on
the following constituent components:</t>
      <ul spacing="normal">
        <li>
          <t>A traditional component that is either a nominal group or a KEM:
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>Group_T</tt>: A nominal group</t>
            </li>
            <li>
              <t><tt>KEM_T</tt>: A traditional KEM</t>
            </li>
          </ul>
        </li>
        <li>
          <t><tt>KEM_PQ</tt>: A post-quantum KEM</t>
        </li>
        <li>
          <t><tt>PRG</tt>: A PRG producing byte strings of length <tt>KEM_PQ.Nseed +
Comp_T.Nseed</tt> (<tt>PRG.Nout == KEM_PQ.Nseed + Comp_T.Nseed</tt>)</t>
        </li>
        <li>
          <t><tt>KDF</tt>: A KDF producing byte strings of length <tt>KEM_H.Nss</tt> (<tt>KDF.Nout
== KEM_H.Nss</tt>)</t>
        </li>
        <li>
          <t><tt>Label</tt> - A byte string used to label the specific combination of the above
components being used, as well as which framework is being instantiated.
This value should be registered in the Hybrid KEM
Labels IANA registry to avoid conflict with other instantiations (see
<xref target="iana-considerations"/>).</t>
        </li>
      </ul>
      <t><tt>KEM_PQ</tt>, <tt>Group_T</tt>, <tt>PRG</tt>, and <tt>KDF</tt> <bcp14>MUST</bcp14> meet the interfaces
described in <xref target="cryptographic-deps"/> and <bcp14>MUST</bcp14> meet the security requirements
described in <xref target="hybrid-ind-cca"/>.</t>
      <t>The constants for public values are derived from the concatenation of
encapsulation keys and ciphertexts:</t>
      <artwork><![CDATA[
KEM_H.Nek = KEM_PQ.Nek + (KEM_T.Nek or Group_T.Nelem)
KEM_H.Nct = KEM_PQ.Nct + (KEM_T.Nct or Group_T.Nelem)
]]></artwork>
      <t>The <tt>Nseed</tt> and <tt>Nss</tt> constants should reflect the overall security level of
the combined KEM, with the following recommended values:</t>
      <artwork><![CDATA[
KEM_H.Nseed = max(KEM_PQ.Nseed, (KEM_T.Nseed or Group_T.Nseed))
KEM_H.Nss = min(KEM_PQ.Nss, (KEM_T.Nss or Group_T.Nss))
]]></artwork>
      <t>Since we use the seed as the decapsulation key, <tt>Ndk = Nseed</tt>.  For legacy
cases where it is not possible to derive per-component decapsulation keys
from a common seed, see <xref target="key-generation"/>.</t>
      <section anchor="subroutines">
        <name>Subroutines</name>
        <t>The four hybrid KEM frameworks share a substantial amount of structure, which
we capture in a set of subroutines.</t>
        <section anchor="using-a-nominal-group">
          <name>Using a Nominal Group</name>
          <t>Hybrid KEM frameworks that use a nominal group for the traditional component
invoke the <tt>DeriveKeyPair</tt>, <tt>Encaps</tt>, and <tt>Decaps</tt> functions of PQ KEMs,
alongside analogous functions of the nominal group.  The "encapsulation key"
is the receiver's public key group element; the "ciphertext" is an ephemeral
group element; and the shared secret is the secret value resulting from an
ephemeral-static Diffie-Hellman exchange.</t>
          <artwork><![CDATA[
def expandDecapsKeyG(seed):
    seed_full = PRG(seed)
    (seed_PQ, seed_T) = split(KEM_PQ.Nseed, Group_T.Nseed, seed_full)

    (dk_PQ, ek_PQ) = KEM_PQ.DeriveKeyPair(seed_PQ)
    dk_T = Group_T.RandomScalar(seed_T)
    ek_T = Group_T.Exp(Group_T.g, dk_T)

    return (ek_PQ, ek_T, dk_PQ, dk_T)

def prepareEncapsG(ek_PQ, ek_T):
    (ss_PQ, ct_PQ) = KEM_PQ.Encaps(ek_PQ)
    sk_E = Group_T.RandomScalar(random(Group_T.Nseed))
    ct_T = Group_T.Exp(Group_T.g, sk_E)
    ss_T = Group_T.ElementToSharedSecret(Group_T.Exp(ek_T, sk_E))
    return (ss_PQ, ss_T, ct_PQ, ct_T)

def prepareDecapsG(ct_PQ, ct_T, dk_PQ, dk_T):
    ss_PQ = KEM_PQ.Decaps(dk_PQ, ct_PQ)
    ss_T = Group_T.ElementToSharedSecret(Group_T.Exp(ct_T, dk_T))
    return (ss_PQ, ss_T)
]]></artwork>
        </section>
        <section anchor="using-a-traditional-kem">
          <name>Using a Traditional KEM</name>
          <t>Hybrid KEM frameworks that use a KEM for the traditional component invoke the
<tt>DeriveKeyPair</tt>, <tt>Encaps</tt>, and <tt>Decaps</tt> functions of the traditional and PQ
KEMs in parallel.</t>
          <artwork><![CDATA[
def expandDecapsKeyK(seed):
    seed_full = PRG(seed)
    (seed_PQ, seed_T) = split(KEM_PQ.Nseed, KEM_T.Nseed, seed_full)
    (dk_PQ, ek_PQ) = KEM_PQ.DeriveKeyPair(seed_PQ)
    (dk_T, ek_T) = KEM_T.DeriveKeyPair(seed_T)
    return (ek_PQ, ek_T, dk_PQ, dk_T)

def prepareEncapsK(ek_PQ, ek_T):
    (ss_PQ, ct_PQ) = KEM_PQ.Encaps(ek_PQ)
    (ss_T, ct_T) = KEM_T.Encaps(ek_T)
    return (ss_PQ, ss_T, ct_PQ, ct_T)

def prepareDecapsK(ct_PQ, ct_T, dk_PQ, dk_T):
    ss_PQ = KEM_PQ.Decaps(dk_PQ, ct_PQ)
    ss_T = KEM_T.Decaps(dk_T, ct_T)
    return (ss_PQ, ss_T)
]]></artwork>
        </section>
        <section anchor="combiners">
          <name>Combiners</name>
          <t>A combiner function uses the <tt>KDF</tt> used in the hybrid KEM to combine the
shared secrets output by the component algorithms with contextual
information.</t>
          <t>The two combiner functions defined in this document are as follows:</t>
          <artwork><![CDATA[
def UniversalCombiner(ss_PQ, ss_T, ct_PQ, ct_T, ek_PQ, ek_T, label):
    return KDF(concat(ss_PQ, ss_T, ct_PQ, ct_T, ek_PQ, ek_T, label))

def C2PRICombiner(ss_PQ, ss_T, ct_T, ek_T, label):
    return KDF(concat(ss_PQ, ss_T, ct_T, ek_T, label))
]]></artwork>
          <t>Note that while the names of the inputs are suggestive of the shared secret,
ciphertext, and encapsulation key outputs of a KEM, the inputs to this
function in the hybrid KEM framework are not necessarily the output of a
secure KEM. In particular, when the framework is instantiated with a nominal
group, the "ciphertext" component is an ephemeral group element, and the
"encapsulation key" is the group element that functions as the recipient's
public key.</t>
          <t>The choice of combiner brings with it certain assumptions
under which the resulting hybrid KEM is secure.</t>
          <t>The <tt>UniversalCombiner</tt> combiner explicitly computes over shared secrets,
ciphertexts, and encapsulation keys from both components.  This allows the
resulting hybrid KEM to be secure as long as either component is secure, with
no further assumptions on the components.</t>
          <t>The <tt>C2PRICombiner</tt> combiner does not compute over the ciphertext or
encapsulation key from the PQ component. The resulting hybrid KEM will
be secure if the PQ component is IND-CCA secure, or, the traditional
component is secure and the PQ component also satisfies the C2PRI property.</t>
        </section>
      </section>
      <section anchor="key-generation">
        <name>Key Generation</name>
        <t>All four frameworks share a common key generation function, and a function to
compute the encapsulation key that corresponds to a decapsulation key:</t>
        <artwork><![CDATA[
def GenerateKeyPair():
    seed = random(Nseed)
    return DeriveKeyPair(seed)

def DecapsToEncaps(dk):
    # The dk is always in seed format
    (_, ek) = DeriveKeyPair(dk)
    return ek
]]></artwork>
        <t>In some deployment environments, it is not possible to instantiate this
process.  Some implementations of component schemes do not support the
<tt>DeriveKeyPair</tt> function, only <tt>GenerateKeyPair</tt>. Likewise in the nominal
group case, a (scalar, group element) pair will only be generated when the
scalar is generated internal to the implementation.</t>
        <t>An implementation of a hybrid KEM in such environments <bcp14>MAY</bcp14> deviate from the
above description in the following ways:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DeriveKeyPair</tt> is not implemented.</t>
          </li>
          <li>
            <t>The decapsulation key returned by <tt>GenerateKeyPair</tt> and consumed by
<tt>Decaps</tt> is a tuple <tt>(dk_PQ, dk_T)</tt> of per-constituent decapsulation keys
(or pointers/handles to keys).</t>
          </li>
          <li>
            <t>The <tt>expandDecapsKeyG</tt> and <tt>expandDecapsKeyK</tt> functions are
replaced by the following, where <tt>decapsToEncaps()</tt> is a function that
returns the encapsulation key associated with a decapsulation key:</t>
          </li>
        </ul>
        <artwork><![CDATA[
def expandDecapsKey(dk):
    (dk_PQ, dk_T) = dk # depending on the private key storage format
    ek_PQ = decapsToEncaps(dk_PQ)
    ek_T = decapsToEncaps(dk_T)
    return (ek_PQ, ek_T, dk_PQ, dk_T)
]]></artwork>
        <t>These deviations have both interoperability and security impacts.</t>
        <t>From an interoperability point of view, the use of a second format for the
hybrid KEM decapsulation key (other than the shared seed) introduces the risk
of incompatibilities in cases where a private key needs to be moved from one
system to another.</t>
        <t>Separate key generation / handling also reduces binding properties from
MAL-BIND-P-Q to LEAK-BIND-P-Q. As discussed below, binding properties can
address a variety of attack scenarios, including LEAK scenarios in which an
attacker has passive access to the decapsulation key and MAL scenarios in
which an attacker can cause the victim to use a crafted decapsulation
key. The above hybrid KEM framework assures binding properties in the face of
a LEAK attacker, irrespective of how key generation is done. The additional
protection provided by the default "shared seed" key generation upgrades this to
protection against a MAL attacker.</t>
        <t>Allowing for separate private key generation and handling also introduces a
risk of inappropriate key reuse and cross-protocol attacks.  A given key pair
<bcp14>MUST</bcp14> never be used in both a hybrid KEM and with a non-hybrid algorithm. A
pair of key pairs generated for a hybrid algorithm <bcp14>MUST</bcp14> only be used with
that hybrid algorithm, not separately with their component algorithms.
Likewise, key pairs generated outside of the context of a hybrid KEM <bcp14>MUST NOT</bcp14>
be used with a hybrid KEM.  The "shared seed" style of key generation
prevents such reuse, because the per-component private keys are derived
internally to the hybrid KEM.</t>
        <t>As a result, this alternative style of key generation should only be used in
environments where implementations of component algorithms do not allow
decapsulation keys to be imported or exported.  In scenarios where separate
key generation is used and decapsulation keys can be imported/exported,
additional measures should be put in place to mitigate the key reuse risks
noted above.</t>
      </section>
      <section anchor="ug-framework-universal-combiner-with-a-nominal-group">
        <name>UG Framework: Universal Combiner with a Nominal Group</name>
        <t>This framework combines a PQ KEM with a nominal group, using the universal
combiner function.  It should be used in cases where the application wants to
use a nominal group for the traditional component, and does not want to rely
on the C2PRI assumption for the PQ KEM.</t>
        <artwork><![CDATA[
def DeriveKeyPair(seed):
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyG(seed)
    return (seed, concat(ek_PQ, ek_T))

def Encaps(ek):
    (ek_PQ, ek_T) = split(KEM_PQ.Nek, Group_T.Nelem, ek)
    (ss_PQ, ss_T, ct_PQ, ct_T) = prepareEncapsG(ek_PQ, ek_T)
    ss_H = UniversalCombiner(ss_PQ, ss_T, ct_PQ, ct_T, ek_PQ, ek_T, Label)
    ct_H = concat(ct_PQ, ct_T)
    return (ss_H, ct_H)

def Decaps(dk, ct):
    (ct_PQ, ct_T) = split(KEM_PQ.Nct, Group_T.Nelem, ct)
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyG(dk)
    (ss_PQ, ss_T) = prepareDecapsG(ct_PQ, ct_T, dk_PQ, dk_T)
    ss_H = UniversalCombiner(ss_PQ, ss_T, ct_PQ, ct_T, ek_PQ, ek_T, Label)
    return ss_H
]]></artwork>
      </section>
      <section anchor="uk-framework-universal-combiner-with-a-kem">
        <name>UK Framework: Universal Combiner with a KEM</name>
        <t>This framework combines a PQ KEM with a traditional KEM, using the universal
combiner function.  It should be used in cases where the application wants to
use a KEM for the traditional component, and does not want to rely on the
C2PRI assumption for the PQ KEM.</t>
        <artwork><![CDATA[
def DeriveKeyPair(seed):
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyK(seed)
    return (seed, concat(ek_PQ, ek_T))

def Encaps(ek):
    (ek_PQ, ek_T) = split(KEM_PQ.Nek, KEM_T.Nek, ek)
    (ss_PQ, ss_T, ct_PQ, ct_T) = prepareEncapsK(ek_PQ, ek_T)
    ss_H = UniversalCombiner(ss_PQ, ss_T, ct_PQ, ct_T, ek_PQ, ek_T, Label)
    ct_H = concat(ct_PQ, ct_T)
    return (ss_H, ct_H)

def Decaps(dk, ct):
    (ct_PQ, ct_T) = split(KEM_PQ.Nct, KEM_T.Nct, ct)
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyK(dk)
    (ss_PQ, ss_T) = prepareDecapsK(ct_PQ, ct_T, dk_PQ, dk_T)
    ss_H = UniversalCombiner(ss_PQ, ss_T, ct_PQ, ct_T, ek_PQ, ek_T, Label)
    return ss_H
]]></artwork>
      </section>
      <section anchor="cg-framework-c2pri-combiner-with-a-nominal-group">
        <name>CG Framework: C2PRI Combiner with a Nominal Group</name>
        <t>This framework combines a PQ KEM with a nominal group, using the C2PRI
combiner function.  It should be used in cases where the application wants to
use a nominal group for the traditional component, and is comfortable relying
on the C2PRI assumption for the PQ KEM.</t>
        <artwork><![CDATA[
def DeriveKeyPair(seed):
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyG(seed)
    return (seed, concat(ek_PQ, ek_T))

def Encaps(ek):
    (ek_PQ, ek_T) = split(KEM_PQ.Nek, Group_T.Nelem, ek)
    (ss_PQ, ss_T, ct_PQ, ct_T) = prepareEncapsG(ek_PQ, ek_T)
    ss_H = C2PRICombiner(ss_PQ, ss_T, ct_T, ek_T, Label)
    ct_H = concat(ct_PQ, ct_T)
    return (ss_H, ct_H)

def Decaps(dk, ct):
    (ct_PQ, ct_T) = split(KEM_PQ.Nct, Group_T.Nelem, ct)
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyG(dk)
    (ss_PQ, ss_T) = prepareDecapsG(ct_PQ, ct_T, dk_PQ, dk_T)
    ss_H = C2PRICombiner(ss_PQ, ss_T, ct_T, ek_T, Label)
    return ss_H
]]></artwork>
      </section>
      <section anchor="ck-framework-c2pri-combiner-with-a-kem">
        <name>CK Framework: C2PRI Combiner with a KEM</name>
        <t>This framework combines a PQ KEM with a traditional KEM, using the C2PRI
combiner function.  It should be used in cases where the application wants to
use a KEM for the traditional component, and is comfortable relying on the
C2PRI assumption for the PQ KEM.</t>
        <artwork><![CDATA[
def DeriveKeyPair(seed):
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyK(seed)
    return (seed, concat(ek_PQ, ek_T))

def Encaps(ek):
    (ek_PQ, ek_T) = split(KEM_PQ.Nek, KEM_T.Nek, ek)
    (ss_PQ, ss_T, ct_PQ, ct_T) = prepareEncapsK(ek_PQ, ek_T)
    ss_H = C2PRICombiner(ss_PQ, ss_T, ct_T, ek_T, Label)
    ct_H = concat(ct_PQ, ct_T)
    return (ss_H, ct_H)

def Decaps(dk, ct):
    (ct_PQ, ct_T) = split(KEM_PQ.Nct, KEM_T.Nct, ct)
    (ek_PQ, ek_T, dk_PQ, dk_T) = expandDecapsKeyK(dk)
    (ss_PQ, ss_T) = prepareDecapsK(ct_PQ, ct_T, dk_PQ, dk_T)
    ss_H = C2PRICombiner(ss_PQ, ss_T, ct_T, ek_T, Label)
    return ss_H
]]></artwork>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>Hybrid KEMs provide security by combining two or more schemes so that
security is preserved if all but one scheme is broken. Informally, these
hybrid KEMs are secure if the <tt>KDF</tt> is secure, and either the traditional
component is secure, or the post-quantum KEM is secure: this is the 'hybrid'
property.</t>
      <t>In this section, we review the important security properties for hybrid KEMs,
and discuss how these security properties are provided by hybrid KEMs
constructed according to the framework in this document.</t>
      <section anchor="security-properties-for-component-algorithms">
        <name>Security Properties for Component Algorithms</name>
        <t>In order to precisely define our security objectives for a hybrid KEM, we
need to describe some properties that we will require from the component
algorithms.</t>
        <section anchor="indistinguishability-under-chosen-ciphertext-attack-ind-cca">
          <name>Indistinguishability under Chosen Ciphertext Attack (IND-CCA)</name>
          <t>The first goal we have for our hybrid KEM constructions is
indistinguishability under adaptive chosen ciphertext attack, or
IND-CCA <xref target="BHK09"/>. This is most common security goal for KEMs and public-key
encryption.</t>
          <t>For KEMs, IND-CCA requires that no efficient adversary, given a ciphertext
obtained by running <tt>Encaps()</tt> with an honestly-generated public key, can
distinguish whether it is given the "real" secret output from <tt>Encaps()</tt>, or
a random string unrelated to the <tt>Encaps()</tt> call that created that
ciphertext. (Readers should note that this definition is slightly different
than the corresponding definitions for public-key encryption <xref target="BHK09"/>.)</t>
          <t>Whether a given KEM provides IND-CCA depends on whether the attacker is
assumed to have access to quantum computing capabilities or not (assuming the
scheme is without bugs and the implementation is correct).  Post-quantum KEMs
are intended to provide IND-CCA security against such an attacker.
Traditional KEMs are not.</t>
          <t>IND-CCA is the standard security notion for KEMs; most PQ KEMs were
explicitly designed to achieve this type of security against both a
quantum attacker and a traditional one.</t>
          <t>For traditional algorithms, things are less clear.  The DHKEM construction in
<xref target="RFC9180"/> is an IND-CCA KEM based on Diffie-Hellman <xref target="ABH_21"/>, but "raw"
ephemeral-static Diffie-Hellman, interpreting the ephemeral public key as the
ciphertext, is not IND-CCA secure.  RSA-KEM is IND-CCA secure <xref target="ISO18033-2"/>,
and RSA-OAEP public-key encryption can be used to construct an IND-CCA KEM,
but "classical" RSA encryption (RSAES-PKCS1-v1_5 as defined in <xref target="RFC8017"/>)
is not even IND-CCA secure as a public-key encryption algorithm.</t>
        </section>
        <section anchor="ciphertext-second-preimage-resistance-c2pri">
          <name>Ciphertext Second-Preimage Resistance (C2PRI)</name>
          <t>Ciphertext Second-Preimage Resistance (C2PRI) is the property that given an
honestly generated ciphertext, it is difficult for an attacker to generate a
different ciphertext that decapsulates to the same shared secret.  In other
words, if an honest party computes <tt>(ss, ct) = Encaps(ek)</tt>, then it is
infeasible for an attacker to find another ciphertext <tt>ct'</tt> such that
<tt>Decaps(dk, ct') == ss</tt> (where <tt>dk</tt> is the decapsulation key corresponding to
the encapsulation key <tt>ek</tt>).</t>
          <t>A related notion in the literature is chosen-ciphertext resistance (CCR)
<xref target="CDM23"/>. C2PRI targets preimage-resistance, whereas CCR targets
collision-resistance, much like the analogous properties for hash functions.
In the language of the binding properties discussed in
<xref target="binding-properties"/>, CCR is equivalent to the property LEAK-BIND-K,PK-CT.</t>
          <t>C2PRI is a weaker property than CCR / LEAK-BIND-K,PK-CT because it requires
the attacker to match a specific, honestly generated ciphertext, as opposed
to finding an arbitrary pair.</t>
          <t>Several PQ KEMs have been shown to have C2PRI.  ML-KEM <xref target="FIPS203"/> was shown to have this
property in <xref target="XWING"/>, and <xref target="CHH_25"/> proves C2PRI for several other
algorithms, including FrodoKEM, HQC, Classic McEliece, and sntrup.</t>
        </section>
        <section anchor="sdh">
          <name>Strong Diffie-Hellman Problem (SDH)</name>
          <t>The standard Diffie-Hellman problem is whether an attacker can compute <tt>g^xy</tt>
given access to <tt>g^x</tt> and <tt>g^y</tt> and an oracle <tt>DH(Y, Z)</tt> that answers whether
<tt>Y^x = Z</tt>. (This is the notion specified in <xref target="XWING"/>, not the notion of the
same name used in the context of bilinear pairings <xref target="Cheon06"/>.)</t>
          <t>When we say that the strong Diffie-Hellman problem is hard in a group, we
always mean this in the context of classical attackers, without access to
quantum computers.  An attacker with access to a quantum computer that can
execute Shor's algorithm for a group can efficiently solve the discrete log
problem in that group, which implies the ability to solve the strong
Diffie-Hellman problem.</t>
          <t>As shown in <xref target="ABH_21"/>, this problem is hard in prime-order groups such as
the NIST elliptic curve groups P-256, P-384, and P-521, as well as in the
Montgomery curves Curve25519 and Curve448.</t>
        </section>
        <section anchor="binding-properties">
          <name>Binding Properties</name>
          <t>It is often useful for a KEM to have certain "binding" properties, by which
certain parameters determine certain others. Recent work <xref target="CDM23"/> gave a
useful framework of definitions for these binding properties. Binding for
KEMs is related to other properties for KEMs and public-key encryption, such
as robustness <xref target="GMP22"/> <xref target="ABN10"/>, and collision-freeness <xref target="MOHASSEL10"/>.</t>
          <t>The framework given by <xref target="CDM23"/> refers to these properties with labels of
the form X-BIND-P-Q.  The first element X is the model for how the attacker
can access the decapsulation key: HON for the case where the attacker never
accesses the decapsulation key, LEAK for the case where the attacker has
access to the honestly-generated decapsulation key, or MAL for the case where
the attacker can choose or manipulate the keys used by the victim.  P,Q means
that given the value P, it is hard to produce another Q that causes Decaps to
succeed. For example, LEAK-BIND-K-PK means that for a given shared secret
(K), there is a unique encapsulation key (PK) that could have produced it,
even if all of the secrets involved are given to the adversary after the
encapsulation operation is completed (LEAK).</t>
          <t>There is quite a bit of diversity in the binding properties provided by KEMs.
Table 5 of <xref target="CDM23"/> shows the binding properties of a few KEMs.  For
example: DHKEM provides MAL-level binding for several properties. ML-KEM
provides only LEAK-level binding <xref target="SCHMIEG2024"/>. Classic McEliece provides MAL-BIND-K-CT,
but no assurance at all of X-BIND-K-PK.</t>
        </section>
        <section anchor="security-kdfs">
          <name>Indifferentiability from a Random Oracle</name>
          <t>The <tt>KDF</tt> used with a hybrid KEM <bcp14>MUST</bcp14> be indifferentiable from a random
oracle (RO) <xref target="MRH03"/>, even to a quantum attacker <xref target="BDFL_10"/> <xref target="ZHANDRY19"/>.
This is a conservative choice given a review of the existing security
analyses for our hybrid KEM constructions: most IND-CCA analyses for the four
frameworks require only that the <tt>KDF</tt> is some kind of pseudorandom function,
but the SDH-based IND-CCA analysis of CG in <xref target="XWING"/>, and the corresponding
analysis for UG <xref target="CG26"/> relies on the <tt>KDF</tt> being a RO. Proofs of our
target binding properties for our hybrid KEMs require the <tt>KDF</tt> is a
collision-resistant function.</t>
          <t>If the <tt>KDF</tt> is a RO, the key derivation step in the hybrid KEMs can be
viewed as applying a (RO-based) pseudorandom function - keyed with the shared
secrets output by the constituent KEMs - to the other inputs. Thus, analyses
which require the <tt>KDF</tt> to be a PRF, such as the one given in <xref target="GHP18"/> for
UK, or the standard-model analysis of CG in <xref target="XWING"/>, apply.</t>
          <t>Sponge-based constructions such as SHA-3 <xref target="FIPS202"/> have been shown to be
indifferentiable against classical <xref target="BDP_08"/> as well as quantum adversaries
<xref target="ACM_25"/>.</t>
          <t>HKDF has been shown to be indifferentiable from a random oracle under
specific constraints <xref target="LBB20"/>:</t>
          <ul spacing="normal">
            <li>
              <t>that HMAC is indifferentiable from a random oracle,
which for HMAC-SHA-256 has been shown in <xref target="DRS_13"/> when
the compression function underlying SHA-256 is a random oracle,
which is a regular assumption in the literature.</t>
            </li>
            <li>
              <t>the values of HKDF's <tt>IKM</tt> input do not collide with
values of <tt>info || 0x01</tt>. This <bcp14>MUST</bcp14> be enforced by the
concrete instantiations that use HKDF as its <tt>KDF</tt>.</t>
            </li>
          </ul>
          <t>Using HKDF as a KDF in the sense defined in this document requires mapping the
single <tt>input</tt> defined here to the <tt>IKM</tt>, <tt>salt</tt>, and <tt>info</tt> inputs required by
HKDF.  Concrete instantiations <bcp14>MUST</bcp14> define this mapping in such a way that no
<tt>input</tt> value will ever map to colliding <tt>IKM</tt> and <tt>info</tt> values.</t>
          <t>The choice of the <tt>KDF</tt> security level <bcp14>SHOULD</bcp14> be made based on the security
level provided by the constituent KEMs. The <tt>KDF</tt> <bcp14>SHOULD</bcp14> at least have the
security level of the strongest constituent KEM.</t>
        </section>
        <section anchor="security-prgs">
          <name>Security Requirements for PRGs</name>
          <t>The functions used to expand a key seed to multiple key seeds is closer to a
pseudorandom generator (<tt>PRG</tt>) in its security requirements <xref target="AOB_24"/>.  A
secure PRG is an algorithm <tt>PRG</tt> : {0, 1}<sup>n</sup> → {0, 1}<sup>m</sup>,
such that no polynomial-time adversary can distinguish between <tt>PRG(r)</tt> (for
r $← {0, 1}<sup>n</sup>) and a random z $← {0, 1}<sup>m</sup> <xref target="Rosulek"/>.
The uniform string r ∈ {0, 1}<sup>n</sup> is called the seed of the <tt>PRG</tt>.</t>
          <t>A <tt>PRG</tt> is not to be confused with a random (or pseudorandom) <em>number</em>
generator (RNG): a <tt>PRG</tt> requires the seed randomness to be chosen uniformly
and extend it; an RNG takes sources of noisy data and transforms them into
uniform outputs.</t>
          <t><tt>PRG</tt>s are related to extendable output functions (XOFs) which can be built
from random oracles. Examples include SHAKE256.</t>
        </section>
      </section>
      <section anchor="security-properties">
        <name>Security Goals for Hybrid KEMs</name>
        <t>The security notions for hybrid KEMs are largely the same as for other
algorithms, but they are contingent on the security properties of the
component algorithms.  In this section we discuss the intended security
properties for hybrid KEMs and the requirements that the component algorithms
must meet in order for those properties to hold.</t>
        <section anchor="hybrid-ind-cca">
          <name>IND-CCA Security</name>
          <t>The idea of a hybrid KEM is that it should maintain its security if only one
of the two component KEMs is secure.  For a PQ/T hybrid KEM, this means that
the hybrid KEM should be secure against a quantum attacker if the T component
is broken, and secure against at least a classical attacker if the PQ
component is broken.</t>
          <t>More precisely, the hybrid KEM should meet two different notions of IND-CCA
security, under different assumptions about the component algorithms:</t>
          <ul spacing="normal">
            <li>
              <t>IND-CCA against a classical attacker all of the following are true:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>KDF</tt> is indifferentiable from a random oracle</t>
                </li>
                <li>
                  <t>If using <tt>Group_T</tt>: The strong Diffie-Hellman problem is hard in
<tt>Group_T</tt></t>
                </li>
                <li>
                  <t>If using <tt>KEM_T</tt>: <tt>KEM_T</tt> is IND-CCA against a classical attacker</t>
                </li>
                <li>
                  <t>If using <tt>C2PRICombiner</tt>: <tt>KEM_PQ</tt> is C2PRI</t>
                </li>
              </ul>
            </li>
            <li>
              <t>IND-CCA against a quantum attacker if all of the following are true:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>KDF</tt> is indifferentiable from a random oracle</t>
                </li>
                <li>
                  <t><tt>KEM_PQ</tt> is IND-CCA against a quantum attacker</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Some IND-CCA analyses do not strictly require the <tt>KDF</tt> to be
indifferentiable from a random oracle; they instead only require a kind of
PRF assumption on the KDF. For simplicity we ignore this here; the security
analyses described below for our constructions will elaborate on this point
when appropriate.</t>
        </section>
        <section anchor="hybrid-binding">
          <name>Binding Properties</name>
          <t>The most salient binding properties for a hybrid KEM to be used in Internet
protocols are LEAK-BIND-K-PK and LEAK-BIND-K-CT.</t>
          <t>The LEAK attack model is most appropriate for Internet protocols.  There have
been attacks in the LEAK model <xref target="BJKS24"/> <xref target="FG24"/>, so a hybrid KEM needs to
be resilient at least to LEAK attacks (i.e., HON is too weak).  Internet
applications generally assume that private keys are honestly generated, so
MAL is too strong an attack model to address.</t>
          <t>The LEAK-BIND-K-PK and LEAK-BIND-K-CT properties are naturally aligned with
the needs of protocol design.  Protocols based on traditional algorithms
frequently need to incorporate transcript hashing in order to protect against
key confusion attacks <xref target="FG24"/> or KEM re-encapsulation attacks <xref target="BJKS24"/>.
The LEAK-BIND-K-PK and LEAK-BIND-K-CT properties prevent these attacks at the
level of the hybrid KEM. Protocol designers may still need or want to include
the ciphertext or encapsulation key into their protocol or key schedule for
other reasons, but that can be independent of the specific properties of the
KEM and its resulting shared secret.</t>
          <t>Implementors should not interpret the paragraph above as absolving them
of their responsibility to carefully think through whether MAL-BIND attacks
apply in their settings.</t>
        </section>
      </section>
      <section anchor="non-goals">
        <name>Security Non-goals for Hybrid KEMs</name>
        <t>Security properties not targeted by these designs are listed in
<xref target="out-of-scope"/>.</t>
      </section>
      <section anchor="security-analysis">
        <name>Security Analysis</name>
        <t>In this section, we describe how the hybrid KEM framework in this document
provides the security properties described above.</t>
        <section anchor="ind-cca-analyses">
          <name>IND-CCA analyses</name>
          <t>The UG construction has two complementary IND-CCA analyses: one for when the
SDH problem holds but the PQ KEM is broken, and one for the reverse. Both are
technically novel but are substantially similar to the existing peer-reviewed
analyses of the CG <xref target="XWING"/> and UK <xref target="GHP18"/> constructions. <xref target="CG26"/> by the
editorial team describes the analysis of UG in detail.</t>
          <t>The first IND-CCA analysis, based on SDH, is similar to the
corresponding analysis of CG given in <xref target="XWING"/>: it gives a straightforward
reduction to the SDH hardness in the underlying group. Notably, since the PQ
KEM key and ciphertext are hashed, the C2PRI security of the PQ KEM does not
appear in the bound.</t>
          <t>The second IND-CCA analysis is a straightforward reduction to the IND-CCA
security of the PQ KEM, and the PRF security of the RO when keyed with the PQ
KEM's shared secret.</t>
          <t>This document's UK construction does not have a dedicated IND-CCA analysis; the
<xref target="GHP18"/> paper on which the construction is based gives a slightly different
version, namely they do not include the public encapsulation keys in the
KDF. However, we argue that the proof goes through with trivial modifications
if the public encapsulation keys are included in the KDF. The relevant step
is claim 3 of Theorem 1, which reduces to the split-key pseudorandomness of
the KDF. (<xref target="GHP18"/> call the KDF a "core" function, and denote it as W.) We
observe that adding the public encapsulation keys to the inputs only changes
the concrete contents of the reduction's queries to its oracle. Since the
reduction chooses the public encapsulation keys itself, they can be added to
the oracle inputs, and the remainder of the proof goes through unmodified.</t>
          <t>We reiterate that modulo some low-level technical details, our requirement
that the KDF is indifferentiable from an RO implies that, in the ROM, the KDF
used in <xref target="GHP18"/> meets the split-key pseudorandomness property used in
<xref target="GHP18"/>'s analysis: this is shown in <xref target="GHP18"/>, Lemma 6, where a
pseudorandom skPRF is constructed from any almost-uniform keymixing function
in the random oracle model by <tt>H(g(k1,...,kn), x)</tt> , where <tt>H</tt> is modeled as
a random oracle and <tt>g</tt> is ϵ-almost uniform. Example 3 from <xref target="GHP18"/>
qualifies <tt>g(k_1,...,k_n) = k_1 || ... || k_n</tt> as ϵ-almost uniform with <tt>ϵ =
1/len(k_1 || ... || k_n)</tt>.</t>
          <t>Like UG, the CG construction has two complementary IND-CCA analyses. Both
were given in <xref target="XWING"/>. We summarize them but elide some details.</t>
          <t>One analysis (Theorem 1) <xref target="XWING"/> shows that if the KDF is modelled as a RO,
IND-CCA holds if the PQ KEM is broken, as long as the SDH problem holds in
the nominal group and the PQ KEM satisfies C2PRI. The other (Theorem 2)
<xref target="XWING"/> shows that if the PQ-KEM is IND-CCA and the KDF is a PRF keyed on
the PQ-KEM's shared secret, IND-CCA holds.</t>
          <t>As long as the aforementioned security requirements of the component parts
are met, these analyses imply that this document's CG construction satisfies
IND-CCA security.</t>
          <t>The CK construction has two complementary IND-CCA analyses: one for when the
IND-CCA security of the traditional PKE-based KEM holds but the PQ KEM is
broken, except for the PQ KEM's C2PRI security, and one for where the IND-CCA
security of the PQ KEM holds.  Both are technically novel but are
substantially similar to the existing peer-reviewed analyses of the CG
<xref target="XWING"/> and UK <xref target="GHP18"/> constructions. <xref target="COS_26"/> by the editorial team
and collaborators describes the analysis of UG in detail.</t>
          <t>Therefore all four hybrid KEMs in this document are IND-CCA when instantiated
with cryptographic components that meet the security requirements described
above. Any changes to the algorithms, including key generation/derivation,
are not guaranteed to produce secure results.</t>
          <t>The IND-CCA analyses of UG in <xref target="CG26"/>, CG in <xref target="XWING"/>, and CK in <xref target="COS_26"/>
all model component key generation as sampling the two component key pairs
independently, whereas the default key generation in this document derives both
component key pairs from a single seed via the PRG (<xref target="key-generation"/>). This
apparent mismatch is resolved by a standard hybrid argument: by the PRG security
required in <xref target="security-prgs"/>, the joint distribution of component key pairs derived
from a single seed is computationally indistinguishable from the joint
distribution of independently generated component key pairs. Thus, any IND-CCA
adversary against the shared-seed scheme implies an IND-CCA adversary against
the independent-keys scheme with at most an additive PRG-distinguishing term in
the bound. The same observation underlies the binding sketches in Section
<xref target="binding-analyses"/>.</t>
        </section>
        <section anchor="binding-analyses">
          <name>Binding analyses</name>
          <t>There are four hybrid KEM frameworks, and two target binding properties, so
we need eight total analyses.  The CG and CK binding analyses additionally
require the corresponding LEAK-BIND property of <tt>KEM_PQ</tt>.
None of these exact results were known; thus the following
are results by the editorial team.  We include informal
justifications here and defer rigorous proofs to a forthcoming paper.  <!--
TODO: Also cite https://eprint.iacr.org/2025/1416.pdf which has some results
about hybrid kem binding; unclear how they compare to ours though.-->
          </t>
          <t>We note that these sketches implicitly ignore the fact that in our hybrid
KEMs, both key pairs are derived from a common random seed; we instead
implicitly think of them as two runs of DeriveKeyPair with independent random
seeds.  We justify this simplification by noting that in the LEAK model - in
which the adversary is given the key pairs resulting from an honest run of
KeyGen - the pseudorandomness of the seed expansion implies the adversary's
input distributions in the two cases are computationally
indistinguishable. The derivation of component scheme key pairs from the
common random seed provides further protection against manipulation or
corruption of keys such that it can contribute to stronger binding properties
against a MAL adversary, as well as operational benefits in practice, but we
do not prove that here.</t>
          <t>The paper that establishes the IND-CCA security of the UG construction
(<xref target="CG26"/>) does not also include a proof of its binding properties.
Instead, <xref target="CG26"/> Section 4.3 observes that the binding arguments for UK
transfer to UG essentially unmodified, since both constructions include the
relevant ciphertexts and encapsulation keys in the KDF input; we make that
argument concrete in the sketches below. The sketches rely on collision
resistance of the KDF (<xref target="security-kdfs"/>), and for CG and CK, additionally on the
corresponding LEAK-BIND property of the PQ KEM.</t>
          <section anchor="ug-binding">
            <name>UG Binding</name>
            <section anchor="leak-bind-k-ct-of-ug">
              <name>LEAK-BIND-K-CT of UG</name>
              <t>Claim: If KDF is collision-resistant, then UG is LEAK-BIND-K-CT.</t>
              <t>Justification: To win LEAK-BIND-K-CT, given knowledge of two
honestly-generated UG secret keys, the adversary must construct two distinct
UG ciphertexts that decapsulate to the same (non-bot) key. Since UG
includes the ciphertexts in the key derivation, the condition that the
ciphertexts are distinct directly implies that a LEAK-BIND-K-CT win gives a
collision in the KDF.</t>
            </section>
            <section anchor="leak-bind-k-pk-of-ug">
              <name>LEAK-BIND-K-PK of UG</name>
              <t>Claim: If KDF is collision-resistant, then UG is LEAK-BIND-K-PK.</t>
              <t>Justification: As described above, in the LEAK-BIND-K-PK game, to win the
adversary must construct two ciphertexts that decapsulate to the same non-bot
key, for distinct UG public keys. Again, since UG includes the public keys
in the KDF, the distinctness condition implies a LEAK-BIND-K-PK win must
collide the KDF.</t>
            </section>
          </section>
          <section anchor="uk-binding">
            <name>UK Binding</name>
            <section anchor="leak-bind-k-ct-of-uk">
              <name>LEAK-BIND-K-CT of UK</name>
              <t>Claim: If KDF is collision-resistant, then UK is LEAK-BIND-K-CT.</t>
              <t>Justification: To win LEAK-BIND-K-CT, given knowledge of two
honestly-generated UK secret keys, the adversary must construct two distinct
UK ciphertexts that decapsulate to the same (non-bot) key. Since UK
includes the ciphertexts in the key derivation, the condition that the
ciphertexts are distinct directly implies that a LEAK-BIND-K-CT win gives a
collision in the KDF.</t>
            </section>
            <section anchor="leak-bind-k-pk-of-uk">
              <name>LEAK-BIND-K-PK of UK</name>
              <t>Claim: If KDF is collision-resistant, then UK is LEAK-BIND-K-PK.</t>
              <t>Justification: As described above, in the LEAK-BIND-K-PK game, to win the
adversary must construct two ciphertexts that decapsulate to the same non-bot
key, for distinct UK public keys. Again, since UK includes the public keys
in the KDF, the distinctness condition implies a LEAK-BIND-K-PK win must
collide the KDF.</t>
            </section>
          </section>
          <section anchor="cg-binding">
            <name>CG Binding</name>
            <t>The LEAK-BIND proofs for CG are a bit more subtle than for UK; the
main reason for this is CG's omission of the PQ KEM key and ciphertext from
the KDF. We will show that CG still has our target LEAK-BIND properties as
long as the underlying PQ-KEM also has the corresponding LEAK-BIND
property. We note that our preliminary results suggest that a different proof
strategy, which instead directly uses properties of the nominal group, may
work here; we present the PQ-KEM route for concreteness.</t>
            <section anchor="leak-bind-k-ct-of-cg">
              <name>LEAK-BIND-K-CT of CG</name>
              <t>Claim: If KDF is collision-resistant and the PQ KEM is LEAK-BIND-K-CT, then
CG is LEAK-BIND-K-CT.</t>
              <t>Justification: To win the adversary must construct two distinct CG
ciphertexts that decapsulate to the same non-bot key.  Call the CG
ciphertexts output by the adversary (ct_PQ^0, ct_T^0) and (ct_PQ^1,
ct_T^1). Distinctness implies (ct_PQ^0, ct_T^0) != (ct_PQ^1, ct_T^1). Since
ct_T is included in the KDF, if ct_T^0 != ct_T^1, a win must collide the KDF.</t>
              <t>Thus we can restrict attention to the case where ct_PQ^0 != ct_PQ^1 but
ct_T^0 = ct_T^1. In this case, there are two relevant sub-cases: either
ss_PQ^0 (:= KEM_PQ.Decaps(dk_PQ^0, ct_PQ^0)) is not equal to ss_PQ^1 (:=
KEM_PQ.Decaps(dk_PQ^1, ct_PQ^1)), or they are equal. If they are not equal,
the KDF inputs are again distinct, so a LEAK-BIND-K-CT win must collide the
KDF.</t>
              <t>If ss_PQ^0 = ss_PQ^1, we can show a reduction to the LEAK-BIND-K-CT security
of the PQ KEM. The reduction is given two PQ KEM key pairs as input and must
output two distinct PQ KEM ciphertexts that decapsulate to the same key. The
reduction does this by generating two nominal-group key pairs and running the
CG LEAK-BIND-K-CT adversary on all keys. Then the reduction outputs the PQ
KEM ciphertexts output by the adversary. The probability that the adversary
wins and ss_PQ^0 = ss_PQ^1 and ct_PQ^0 != ct_PQ^1 and ct_T^0 = ct_T^1 is a
lower bound on the probability of the reduction winning the LEAK-BIND-K-CT
game against the PQ KEM.</t>
              <t>We conclude by noting these cases are exhaustive.</t>
            </section>
            <section anchor="leak-bind-k-pk-of-cg">
              <name>LEAK-BIND-K-PK of CG</name>
              <t>Claim: If KDF is collision-resistant and the PQ KEM is LEAK-BIND-K-PK, then
CG is LEAK-BIND-K-PK.</t>
              <t>Justification: Similar to the above, we proceed by a case analysis on the win
condition of the LEAK-BIND-K-PK game.  The condition is (ek_PQ^0, ek_T^0) !=
(ek_PQ^1, ek_T^1) and ss_H^0 = ss_H^1. Again, as above we argue that the only
nontrivial case is the one where ek_PQ^0 != ek_PQ^1 but ek_T^0 = ek_T^1: in
the other case we can directly get a KDF collision from a winning output. In
this case the result of KEM_PQ.Decaps for the two PQ KEM keys can either be
the same or different. IF they are different, we again get a KDF collision
from a win. If they are the same, in a similar way as above, we can build a
reduction to the LEAK-BIND-K-PK of PQ KEM.</t>
              <t>Again, we conclude by noting that these cases are exhaustive.</t>
            </section>
          </section>
          <section anchor="ck-binding">
            <name>CK Binding</name>
            <section anchor="leak-bind-k-ct-of-ck">
              <name>LEAK-BIND-K-CT of CK</name>
              <t>Claim: If KDF is collision-resistant and the PQ KEM is LEAK-BIND-K-CT, then
CK is LEAK-BIND-K-CT.</t>
              <t>Justification: To win the adversary must construct two distinct CK
ciphertexts that decapsulate to the same non-bot key.  Call the CK
ciphertexts output by the adversary (ct_PQ^0, ct_T^0) and (ct_PQ^1,
ct_T^1). Distinctness implies (ct_PQ^0, ct_T^0) != (ct_PQ^1, ct_T^1). Since
ct_T is included in the KDF, if ct_T^0 != ct_T^1, a win must collide the KDF.</t>
              <t>Thus we can restrict attention to the case where ct_PQ^0 != ct_PQ^1 but
ct_T^0 = ct_T^1. In this case, there are two relevant sub-cases: either
ss_PQ^0 (:= KEM_PQ.Decaps(dk_PQ^0, ct_PQ^0)) is not equal to ss_PQ^1 (:=
KEM_PQ.Decaps(dk_PQ^1, ct_PQ^1)), or they are equal. If they are not equal, the
KDF inputs are again distinct, so a LEAK-BIND-K-CT win must collide the KDF.</t>
              <t>If ss_PQ^0 = ss_PQ^1, we can show a reduction to the LEAK-BIND-K-CT security
of the PQ KEM. The reduction is given two PQ KEM key pairs as input and must
output two distinct PQ KEM ciphertexts that decapsulate to the same key. The
reduction does this by generating two traditional KEM key pairs and running the
CK LEAK-BIND-K-CT adversary on all keys. Then the reduction outputs the PQ
KEM ciphertexts output by the adversary. The probability that the adversary
wins and ss_PQ^0 = ss_PQ^1 and ct_PQ^0 != ct_PQ^1 and ct_T^0 = ct_T^1 is a
lower bound on the probability of the reduction winning the LEAK-BIND-K-CT
game against the PQ KEM.</t>
              <t>We conclude by noting these cases are exhaustive.</t>
            </section>
            <section anchor="leak-bind-k-pk-of-ck">
              <name>LEAK-BIND-K-PK of CK</name>
              <t>Claim: If KDF is collision-resistant and the PQ KEM is LEAK-BIND-K-PK, then
CK is LEAK-BIND-K-PK.</t>
              <t>Justification: Similar to the above, we proceed by a case analysis on the win
condition of the LEAK-BIND-K-PK game.  The condition is (ek_PQ^0, ek_T^0) !=
(ek_PQ^1, ek_T^1) and ss_H^0 = ss_H^1. Again, as above we argue that the only
nontrivial case is the one where ek_PQ^0 != ek_PQ^1 but ek_T^0 = ek_T^1: in
the other case we can directly get a KDF collision from a winning output. In
this case the result of KEM_PQ.Decaps for the two PQ KEM keys can either be
the same or different. IF they are different, we again get a KDF collision
from a win. If they are the same, in a similar way as above, we can build a
reduction to the LEAK-BIND-K-PK of PQ KEM.</t>
              <t>Again, we conclude by noting that these cases are exhaustive.</t>
            </section>
          </section>
        </section>
      </section>
      <section anchor="other-considerations">
        <name>Other Considerations</name>
        <section anchor="domain-separation">
          <name>Domain Separation</name>
          <t>ASCII-encoded bytes provide oracle cloning <xref target="BDG20"/> in the security game
via domain separation. The IND-CCA security of hybrid KEMs often relies on
the KDF function <tt>KDF</tt> to behave as an independent random oracle, which the
inclusion of the <tt>label</tt> achieves via domain separation <xref target="GHP18"/>.</t>
          <t>By design, the calls to <tt>KDF</tt> in these frameworks and usage anywhere else
in higher level protocol use separate input domains unless intentionally
duplicating the 'label' per concrete instance with fixed parameters. This
justifies modeling them as independent functions even if instantiated by the
same KDF. This domain separation is achieved by using prefix-free sets of
<tt>label</tt> values. Recall that a set is prefix-free if no element is a prefix of
another within the set.</t>
          <t>Length differentiation is sometimes used to achieve domain separation but as
a technique it is brittle and prone to misuse <xref target="BDG20"/> in practice so we
favor the use of an explicit post-fix label.</t>
        </section>
        <section anchor="fixed-length">
          <name>Fixed-length</name>
          <t>Variable-length secrets are generally dangerous. In particular, using key
material of variable length and processing it using hash functions may result
in a timing side channel. In broad terms, when the secret is longer, the hash
function may need to process more blocks internally. In some unfortunate
circumstances, this has led to timing attacks, e.g. the Lucky Thirteen
<xref target="LUCKY13"/> and Raccoon <xref target="RACCOON"/> attacks.</t>
          <t>Furthermore, <xref target="AVIRAM"/> identified a risk of using variable-length secrets when
the hash function used in the key derivation function is no longer
collision-resistant.</t>
          <t>If concatenation were to be used with values that are not fixed-length, a
length prefix or other unambiguous encoding would need to be used to ensure
that the composition of the two values is injective and requires a mechanism
different from that specified in this document.</t>
          <t>Therefore, this specification <bcp14>MUST</bcp14> only be used with algorithms which have
fixed-length shared secrets.</t>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests that IANA create a registry "Hybrid KEM Labels", which
lists labels that uniquely identify instantiations of the frameworks in this
document.  The registry should be administered under the First Come First
Served policy <xref target="RFC8126"/>.</t>
      <t>Template:</t>
      <ul spacing="normal">
        <li>
          <t>Label: The name of the wire format</t>
        </li>
        <li>
          <t>Framework: The framework used in the hybrid KEM.  This value <bcp14>MUST</bcp14> be one of
the following values: "UG", "UK", "CG", or "CK".</t>
        </li>
        <li>
          <t>PQ component: The name of the post-quantum KEM used in the hybrid KEM.</t>
        </li>
        <li>
          <t>Traditional component: The name of the traditional KEM or nominal group
used in the hybrid KEM.</t>
        </li>
        <li>
          <t>KDF: The name of the Key Derivation Function used in the hybrid KEM.</t>
        </li>
        <li>
          <t>PRG: The name of the Pseudo-Random Generator used in the hybrid KEM.</t>
        </li>
        <li>
          <t>Nseed: An integer representing the size of a seed for this hybrid KEM.</t>
        </li>
        <li>
          <t>Nss: An integer representing the size of a shared secret for this hybrid
KEM.</t>
        </li>
        <li>
          <t>Reference (optional): The document where this hybrid KEM is defined</t>
        </li>
      </ul>
      <t>The registry should initially be empty.</t>
    </section>
    <section anchor="out-of-scope">
      <name>Out of Scope</name>
      <t>Security properties and design considerations that were considered
and not included in these designs:</t>
      <ul spacing="normal">
        <li>
          <t>Anonymity <xref target="GMP22"/>, deniability, obfuscation, other forms of key-robustness
or binding <xref target="GMP22"/>, <xref target="CDM23"/></t>
        </li>
        <li>
          <t>More than two components: this document restricts the scope to two
components: one post-quantum component and one traditional component</t>
        </li>
        <li>
          <t>Parameterized output length: not analyzed as part of any security
proofs in the literature, and a complication deemed unnecessary</t>
        </li>
      </ul>
    </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="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="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="FIPS203">
          <front>
            <title>Module-lattice-based key-encapsulation mechanism standard</title>
            <author>
              <organization/>
            </author>
            <date month="August" year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.203"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="ABH_21">
          <front>
            <title>Analysing the HPKE standard.</title>
            <author initials="" surname="Joël Alwen">
              <organization/>
            </author>
            <author initials="" surname="Bruno Blanchet">
              <organization/>
            </author>
            <author initials="" surname="Eduard Hauck">
              <organization/>
            </author>
            <author initials="" surname="Eike Kiltz">
              <organization/>
            </author>
            <author initials="" surname="Benjamin Lipp">
              <organization/>
            </author>
            <author initials="" surname="Doreen Riepel">
              <organization/>
            </author>
            <date year="2021" month="April"/>
          </front>
        </reference>
        <reference anchor="ABN10" target="https://eprint.iacr.org/2008/440.pdf">
          <front>
            <title>Robust Encryption</title>
            <author>
              <organization/>
            </author>
            <date year="2010"/>
          </front>
        </reference>
        <reference anchor="ACM_25" target="https://eprint.iacr.org/2025/731.pdf">
          <front>
            <title>The Sponge is Quantum Indifferentiable</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="AOB_24" target="https://eprint.iacr.org/2024/843.pdf">
          <front>
            <title>Formally verifying Kyber Episode V: Machine-checked IND-CCA security and correctness of ML-KEM in EasyCrypt</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="AVIRAM" target="https://mailarchive.ietf.org/arch/msg/tls/F4SVeL2xbGPaPB2GW_GkBbD_a5M/">
          <front>
            <title>[TLS] Combining Secrets in Hybrid Key Exchange in TLS 1.3</title>
            <author initials="" surname="Nimrod Aviram">
              <organization/>
            </author>
            <author initials="" surname="Benjamin Dowling">
              <organization/>
            </author>
            <author initials="" surname="Ilan Komargodski">
              <organization/>
            </author>
            <author initials="" surname="Kenny Paterson">
              <organization/>
            </author>
            <author initials="" surname="Eyal Ronen">
              <organization/>
            </author>
            <author initials="" surname="Eylon Yogev">
              <organization/>
            </author>
            <date year="2021" month="September" day="01"/>
          </front>
        </reference>
        <reference anchor="BDFL_10" target="https://eprint.iacr.org/2010/428.pdf">
          <front>
            <title>Random Oracles in a Quantum World</title>
            <author>
              <organization/>
            </author>
            <date year="2010"/>
          </front>
        </reference>
        <reference anchor="BDG20" target="https://eprint.iacr.org/2020/241.pdf">
          <front>
            <title>Separate Your Domains: NIST PQC KEMs, Oracle Cloning and Read-Only Indifferentiability</title>
            <author>
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="BDP_08" target="https://www.iacr.org/archive/eurocrypt2008/49650180/49650180.pdf">
          <front>
            <title>On the Indifferentiability of the Sponge Construction</title>
            <author>
              <organization/>
            </author>
            <date year="2008"/>
          </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 fullname="Mihir Bellare">
              <organization>University of California San Diego</organization>
            </author>
            <author fullname="Dennis Hofheinz">
              <organization>CWI Amsterdam</organization>
            </author>
            <author fullname="Eike Kiltz">
              <organization>CWI Amsterdam</organization>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="BJKS24" target="https://www.usenix.org/system/files/usenixsecurity24-bhargavan.pdf">
          <front>
            <title>Formal verification of the PQXDH Post-Quantum key agreement protocol for end-to-end secure messaging</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="Cheon06">
          <front>
            <title>Security Analysis of the Strong Diffie-Hellman Problem</title>
            <author fullname="Jung Hee Cheon">
              <organization>Seoul National University</organization>
            </author>
            <date year="2006"/>
          </front>
        </reference>
        <reference anchor="CDM23" target="https://eprint.iacr.org/2023/1933.pdf">
          <front>
            <title>Keeping Up with the KEMs: Stronger Security Notions for KEMs and automated analysis of KEM-based protocols</title>
            <author initials="C." surname="Cremers" fullname="Cas Cremers">
              <organization>CISPA Helmholtz Center for Information Security</organization>
            </author>
            <author initials="A." surname="Dax" fullname="Alexander Dax">
              <organization>CISPA Helmholtz Center for Information Security</organization>
            </author>
            <author initials="N." surname="Medinger" fullname="Niklas Medinger">
              <organization>CISPA Helmholtz Center for Information Security</organization>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="CG26">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="COS_26" target="https://eprint.iacr.org/2026/427">
          <front>
            <title>StarHunters— Secure Hybrid Post-Quantum KEMs From IND-CCA2 PKEs</title>
            <author>
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="CHH_25" target="https://eprint.iacr.org/2025/1397">
          <front>
            <title>Starfighters — on the general applicability of X-Wing</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="DRS_13" target="https://eprint.iacr.org/2013/382.pdf">
          <front>
            <title>To Hash or Not to Hash Again? (In)differentiability Results for H^2 and HMAC</title>
            <author>
              <organization/>
            </author>
            <date year="2013"/>
          </front>
        </reference>
        <reference anchor="FG24" target="https://link.springer.com/chapter/10.1007/978-3-031-91823-0_5">
          <front>
            <title>Security Analysis of Signal's PQXDH Handshake</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="GHP18" target="https://eprint.iacr.org/2018/024.pdf">
          <front>
            <title>KEM Combiners</title>
            <author initials="F." surname="Giacon" fullname="Federico Giacon">
              <organization/>
            </author>
            <author initials="F." surname="Heuer" fullname="Felix Heuer">
              <organization/>
            </author>
            <author initials="B." surname="Poettering" fullname="Bertram Poettering">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="GMP22" target="https://eprint.iacr.org/2021/708.pdf">
          <front>
            <title>Anonymous, Robust Post-Quantum Public-Key Encryption</title>
            <author initials="P." surname="Grubbs" fullname="P. Grubbs">
              <organization/>
            </author>
            <author initials="V." surname="Maram" fullname="V. Maram">
              <organization/>
            </author>
            <author initials="K.G." surname="Paterson" fullname="K.G. Paterson">
              <organization/>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="LBB20" target="https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=8806752">
          <front>
            <title>A Mechanised Cryptographic Proof of the WireGuard Virtual Private Network Protocol</title>
            <author>
              <organization/>
            </author>
            <date year="2019"/>
          </front>
        </reference>
        <reference anchor="LUCKY13" target="https://ieeexplore.ieee.org/iel7/6547086/6547088/06547131.pdf">
          <front>
            <title>Lucky Thirteen: Breaking the TLS and DTLS record protocols</title>
            <author initials="N. J." surname="Al Fardan">
              <organization/>
            </author>
            <author initials="K. G." surname="Paterson">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="HKDF">
          <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="ISO18033-2" target="https://www.iso.org/standard/37971.html">
          <front>
            <title>Information technology -- Security techniques -- Encryption algorithms -- Part 2: Asymmetric ciphers</title>
            <author>
              <organization/>
            </author>
            <date year="2006"/>
          </front>
        </reference>
        <reference anchor="MOHASSEL10" target="https://www.iacr.org/archive/asiacrypt2010/6477505/6477505.pdf">
          <front>
            <title>A closer look at anonymity and robustness in encryption schemes.</title>
            <author>
              <organization/>
            </author>
            <date year="2010"/>
          </front>
        </reference>
        <reference anchor="MRH03" target="https://eprint.iacr.org/2003/161.pdf">
          <front>
            <title>Indifferentiability, Impossibility Results on Reductions, and Applications to the Random Oracle Methodology</title>
            <author>
              <organization/>
            </author>
            <date year="2003"/>
          </front>
        </reference>
        <reference anchor="RACCOON" target="https://raccoon-attack.com/">
          <front>
            <title>Raccoon Attack: Finding and Exploiting Most-Significant-Bit-Oracles in TLS-DH(E)</title>
            <author initials="R." surname="Merget">
              <organization/>
            </author>
            <author initials="M." surname="Brinkmann">
              <organization/>
            </author>
            <author initials="N." surname="Aviram">
              <organization/>
            </author>
            <author initials="J." surname="Somorovsky">
              <organization/>
            </author>
            <author initials="J." surname="Mittmann">
              <organization/>
            </author>
            <author initials="J." surname="Schwenk">
              <organization/>
            </author>
            <date year="2020" month="September"/>
          </front>
        </reference>
        <reference anchor="Rosulek" target="https://joyofcryptography.com/pdf/book.pdf">
          <front>
            <title>The Joy of Cryptography</title>
            <author>
              <organization/>
            </author>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="SCHMIEG2024" target="https://eprint.iacr.org/2024/523.pdf">
          <front>
            <title>Unbindable Kemmy Schmidt: ML-KEM is neither MAL-BIND-K-CT nor MAL-BIND-K-PK</title>
            <author initials="S." surname="Schmieg" fullname="Sophie Schmieg">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="XWING" target="https://eprint.iacr.org/2024/039.pdf">
          <front>
            <title>X-Wing: The Hybrid KEM You’ve Been Looking For</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="ZHANDRY19" target="https://doi.org/10.1007/978-3-030-26951-7_9">
          <front>
            <title>How to Record Quantum Queries, and Applications to Quantum Indifferentiability</title>
            <author>
              <organization/>
            </author>
            <date year="2019"/>
          </front>
        </reference>
        <reference anchor="I-D.ietf-pquip-pqt-hybrid-terminology">
          <front>
            <title>Terminology for Post-Quantum Traditional Hybrid Schemes</title>
            <author fullname="Flo D" initials="F." surname="D">
              <organization>UK National Cyber Security Centre</organization>
            </author>
            <author fullname="Michael P" initials="M." surname="P">
              <organization>UK National Cyber Security Centre</organization>
            </author>
            <author fullname="Britta Hale" initials="B." surname="Hale">
              <organization>Naval Postgraduate School</organization>
            </author>
            <date day="10" month="January" 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="Internet-Draft" value="draft-ietf-pquip-pqt-hybrid-terminology-06"/>
        </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="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>
      </references>
    </references>
    <?line 1476?>

<section anchor="deterministic-encapsulation">
      <name>Deterministic Encapsulation</name>
      <t>When verifying the behavior of a KEM implementation (e.g., by generating or
verifying test vectors), it is useful for the implementation to expose a
"derandomized" version of the <tt>Encaps</tt> algorithm:</t>
      <ul spacing="normal">
        <li>
          <t><tt>EncapsDerand(ek, randomness) -&gt; (shared_secret, ct)</tt>: A deterministic
 encapsulation algorithm, which takes as input a public encapsulation key
 <tt>ek</tt> and randomness <tt>randomness</tt>, and outputs a shared secret
 <tt>shared_secret</tt> and ciphertext <tt>ct</tt>.</t>
        </li>
      </ul>
      <t>An implementation that exposes <tt>EncapsDerand</tt> must also define a required
amount of randomness:</t>
      <ul spacing="normal">
        <li>
          <t><tt>Nrandom</tt>: The length in bytes of the randomness provided to EncapsDerand</t>
        </li>
      </ul>
      <t>The corresponding change for a nominal group is to replace randomly-generated
inputs to <tt>RandomScalar</tt> with deterministic ones.  In other words, for a
nominal group, <tt>Nrandom = Nseed</tt>.</t>
      <t>When a hybrid KEM is instantiated with constituents that support derandomized
encapsulation (either KEMs or groups), the hybrid KEM can also support
<tt>EncapsDerand()</tt>, with <tt>Nrandom = PQ.Nrandom + T.Nrandom</tt>.  The structure of
the hybrid KEM's <tt>EncapsDerand</tt> algorithm is the same as its <tt>Encaps</tt> method,
with the following differences:</t>
      <ul spacing="normal">
        <li>
          <t>The <tt>EncapsDerand</tt> algorithm also takes a <tt>randomness</tt> parameter, which is
a byte string of length <tt>Nrandom</tt>.</t>
        </li>
        <li>
          <t>Invocations of <tt>Encaps</tt> or <tt>RandomScalar</tt> (with a random input) in the
constituent algorithms are replaced with calls to <tt>EncapsDerand</tt> or
<tt>RandomScalar</tt> with a deterministic input.</t>
        </li>
        <li>
          <t>The randomness used by the PQ constituent is the first <tt>PQ.Nrandom</tt> bytes
of the input randomness.</t>
        </li>
        <li>
          <t>The randomness used by the traditional constituent is the final <tt>T.Nrandom</tt>
bytes of the input randomness.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+29yXYbWbYYOo+vOJd664m4AsBGTUqsyipToESyKDYiqczK
W64SgsAhGMVABCoiwKaYussjLw+9vDzxzPM39g88f4D/ob7EuztdRICilHnr
XnulBiIJRJxmn913p9frRVVSpXpDLe3cnhXJWB29XzlVe/pWvclG8aycp3GV
5Jna16OLOEvKabkUxWdnhb7aUBf0Ru9ST8toFFd6khe3GyrJzvMoGuejLJ7C
uOMiPq96SVGd90bnxaTnvdRbW4vK+dk0KUuYorqdweO7x6dvo1GelTor5+WG
Oo/TUkcw2dPoOi8uJ0U+n8FiB8XtrMrV27yYT5eiKJ5XF3mxEalepODf+TxN
efYtnRTjQqtBnmV5mt7S13kxga38lTa2oU7ibHyW32y+p+/0NE5SWPUcBh4V
87Kap/Ppv5vgp/1RPm3OcJwAYIqxeh0XmS5bxh8k5Sj3xy7Ss3+XzK765U1z
tKN4nqrtYn521jbUhyy50kWZVLcqP1f7MHMCX/tjz+D9Cb2+tu6tOorwVIop
jHOlAUzq7e7RyfrqOgDocLe/ttp/sbr+cuVg9+S0j9/04Sv70NPFDz2FhzZf
7zxZX9ugRRhU2szi9LZMsomqLrTaOdp7o8oKwAxw6i/Rk2NAlw21OSuStKtg
tjX61B4j/evJTwUoBZjwu/x//n+p2kyvddb+wOtinuXqdRpnowtdtT/zZjzH
w9qJ56PLBU8kl1rtJWn11wWz6OzP8TTJ1LtkNmt/ZCsvtM4AM/RMpwSig7XV
EELH+RngFtIYIjIcrg+W9dW1VX46Lia6AkKrqlm5sbKiAV5Z1U/iUdEHzFhZ
X119ufLs2Wp/Nj7HeQb7T9afhxOdwgGczPJsolVSqvfzOKvmU7WbjZPzc13o
rEris1SHs68/f+Ds689Xvnm6ZmY/fP1k/Vk4+1vEOSA7BWibnN8iRuzdnulC
vZklZT7W6rsNtR8DGme6B4c2utRjtXuw1RsMNlWpR/MCUR0QR43yotCjCiis
JNR/19t7sw/QVm/i8paYQW0Lzx66hWcrL589NVv4bvd4c3+j9VWkpbiApV7p
fqKrc3ofP1iZlpOVKi1X3j47+U6/W7852z6Kj16vb3//cfvy9dnWx/j5/koA
lT+cvjv5I7Ck6VmSIUhO9KjQVYnbESZM/PcGOS6eW6bgBbXWf1rb41pv9VVv
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
A/ZLbUGws9AyJ6Z0Q47ZUZTTTYEMGv9M25TvsWX5keQcJaX3pU1Yl7BzuGGK
5dU+YxnmM8iMU9x9eKv9zR/gLK4IsDbJibPC2dc48yWdc4ohOpATvw5BOTy7
FvTscj5ZM++dcUOypeugruereznUHK+q5jCFGi77WiglvLGbyoUdWhxVgLfo
Gc0JrOXKBcyVcq8Z/Lpjljys+xXE51i3V4a1FHpE+1kaj1yivYVcVxxtw3FI
dp1hS7A9MvRTLuAewPrzUaAO3Mc5ast2pB7AEEgZiP6RhNo4HsSBPemGS1n9
VV5gdxePE5C+iC/X+YnV+sWb0XzgwaaScQGXWrCWQE6BfBLAdJ5U/y3NSWPT
tR//AKSMRyQS39pkl9rzhBKIRFeJvmbJIyUjVGeAnW14y8aG9qsmmxi+zCEH
yoMKFFJM0kmkt55IJuxyFlFtCrIuGIOWJJdL+D7aODgJjnqyHjHNrVsfWF/E
Vw14xb+wc3sTSE2CrSgiAq6iKzHQyys7kyaoXjUpjh/ZDppHvfc4w7s3m3v2
g77aLL2SUdDncwBmy1CjOIvi8bjAjJ3Y77EkbcLKkc7gw7z0y9pxKvcNQkeS
dGAs6YAGm+FEHTQG4hGKCsM5m4dEwZfNd8GQkRnSNlWjjJRRbNztVwmQ6dSE
rbHdRHyOZBgMjzkyrBExS223FEB9K9ohbdhuTDpzFPPWzYoAJoWrw0eoXeTX
9XMl2zLTsgrb3ggFaCU1WpJnZXkVsIoY1De15GHrUn3c+WwCGhmhLhoHuT+g
bdBGYDXL7ZNixeIDiceWmfvYXMuCCHHSI5g4oqaARC7xDEFWJGaMQtORoPgo
QIfo2ds8XD+3TWnygI+jTI4o+MYlb6bZIyb25MRTvWPDUa3hlUkjFL/b2WZE
Mh4WZsb2xTg3mKi/xaE/oxHYjBgurKs/3GUlRoCHLXEkZJUUrT6KfmRUlm7r
ksAgpYCCmMzizGhoD6ZlTuSvMHjERBoCrCmr21QbaLjDBWzBToqmFyadGDAI
7egrjDV5KBKEMCOjF6W3hr69BQHCIVtha0Q6A8YpvUAUs2BxJoYYHAiwhEBx
knDZfXqn5ycS1ZOswaipj5hOSVNUTDlYiKUC+Dt2sMw81sTzmuOPmtROq0U0
bZlGepmaeVbMJN3Ia3w21TEzJBeDn3HGFak0uFZsrjCJxaZxJIckWUbcTYMY
HptXH7ZdKtaG82NZF55BpVoEjhvVWDYpFmvpug6GDhAlDhDbOBeTdnmmqOGA
Q6j6mdaG4H0xW0swApWXUmny6Ivjf2wVWkv7WnrbYi6VyWRis9RZ8nZA3qvn
K2+x40SJW6g2gc7VHiAL/azkHxfvnO9/FjvRlXA352u63vVlN4zfk5kYeLKb
LmcY5Z4IlfEc78BjX+0NpXwRG4rCoWTHgeu75n/eoc93AoPZ1IULMGrbCIEx
qhrAgDe/4tTGLSD0oPbZINbPDUKBEY5oXPOY7/Ygcqdw1UOJvJa49fcj88+G
y+4hbjGcor8zce/9XYjb5vd8DWHv/V9E2DZl6euIeu9hRH1P6O3vQdSDQIYz
Qv9Ly2+a5d+G7OZ23vAgNwZG4saOSb8I768S3g+MH/4iqr8eYK00vPd5Gv65
hPK/HO0+UCC3U+wvEvnLJfK/dWr9NyV/fw5KdVeaDYJsdHX3yPbd8xO9vCth
vOsG3AU1mIIC6E190U0szNTRO984jqJLXaAHOTmnnsBn1IPJvORuhOib2zup
RzaViXhucP8+GRPl5SwcL4ZNofSkMp3nPxPdxTBws7YoiPpvsHtHEhUe83Ie
R16gt63oq9Do5zcRNWQWWdXaQdG/JogzcVHpZw83uV25WKb1Mp5CBy5W/xqF
+7qW31MjLtnTZrKjcJ2uPdem9UDR9rnxI90mokdJiRaKVL1hsNuuna8TwO6Z
ob+SE+R1lGmuE7H9KSmi6+2Y83W0uVSFG096xQYmLTookcWkrt2wAptDMpz9
MeA6ce+iAb6mTS1LxkDHlEFiJ+RJDhIBVkCRIdxELa88vKaGq8wXzRyP4xm5
C6VU3cuLYIcyYmdk8hbu7uiicOwjcioIOQWkdTnxAmRaYXC5MSfL9LAW0N39
h7EqeahrcyMEpALoLPduO4jHpP4XQJfs4fZ7XEX5GebWMBoWc24pPHQBSBbr
GeAzSPsqtRn7euxlhncpaOP3/TBXSHDofmLvI1oqdJwumWxvvzDWzUmwi017
XFOIlLmu+sw+3BqlezQmTUjLfOJjbpN9tXzMffaNnpHZHDImIndHO3KDFJvf
IiWY28kiG61zaRm4KveeX1eD5+Xf1ejOv0M9o6WEjaGCqCeswGW6cJyVUnf8
yzhs3Amw013HIUXLNqIVXstDBXfxLLaRQ1gmOiWWaQDRzSLHzvHAsRjtbD6x
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
+t/HOACdVf0AAA==

-->

</rfc>
