<?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.26 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-lamps-pq-composite-kem-06" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="Composite ML-KEM">Composite ML-KEM for use in X.509 Public Key Infrastructure and CMS</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-pq-composite-kem-06"/>
    <author initials="M." surname="Ounsworth" fullname="Mike Ounsworth">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <postal>
          <street>2500 Solandt Road – Suite 100</street>
          <city>Ottawa, Ontario</city>
          <code>K2K 3G5</code>
          <country>Canada</country>
        </postal>
        <email>mike.ounsworth@entrust.com</email>
      </address>
    </author>
    <author initials="J." surname="Gray" fullname="John Gray">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <postal>
          <street>2500 Solandt Road – Suite 100</street>
          <city>Ottawa, Ontario</city>
          <code>K2K 3G5</code>
          <country>Canada</country>
        </postal>
        <email>john.gray@entrust.com</email>
      </address>
    </author>
    <author initials="M." surname="Pala" fullname="Massimiliano Pala">
      <organization>OpenCA Labs</organization>
      <address>
        <postal>
          <city>New York City, New York</city>
          <country>United States of America</country>
        </postal>
        <email>director@openca.org</email>
      </address>
    </author>
    <author initials="J." surname="Klaussner" fullname="Jan Klaussner">
      <organization>Bundesdruckerei GmbH</organization>
      <address>
        <postal>
          <street>Kommandantenstr. 18</street>
          <city>Berlin</city>
          <code>10969</code>
          <country>Germany</country>
        </postal>
        <email>jan.klaussner@bdr.de</email>
      </address>
    </author>
    <author initials="S." surname="Fluhrer" fullname="Scott Fluhrer">
      <organization>Cisco Systems</organization>
      <address>
        <email>sfluhrer@cisco.com</email>
      </address>
    </author>
    <date year="2025" month="March" day="18"/>
    <area>Security</area>
    <workgroup>LAMPS</workgroup>
    <keyword>X.509</keyword>
    <keyword>CMS</keyword>
    <keyword>Post-Quantum</keyword>
    <keyword>KEM</keyword>
    <abstract>
      <?line 263?>

<t>This document defines combinations of ML-KEM <xref target="FIPS.203"/> in hybrid with traditional algorithms RSA-OAEP, ECDH, X25519, and X448. These combinations are tailored to meet security best practices and regulatory requirements. Composite ML-KEM is applicable in any application that uses X.509, PKIX, and CMS data structures and protocols that accept ML-KEM, but where the operator wants extra protection against breaks or catastrophic bugs in ML-KEM. For use within CMS, this document is intended to be coupled with the CMS KEMRecipientInfo mechanism in <xref target="RFC9629"/>.</t>
      <!-- End of Abstract -->



    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://lamps-wg.github.io/draft-composite-kem/draft-ietf-lamps-pq-composite-kem.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-lamps-pq-composite-kem/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        LAMPS Working Group mailing list (<eref target="mailto:spams@ietf.org"/>),
        which is archived at <eref target="https://datatracker.ietf.org/wg/lamps/about/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/spams/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/lamps-wg/draft-composite-kem"/>.</t>
    </note>
  </front>
  <middle>
    <?line 270?>

<section anchor="changes-in-version-06">
      <name>Changes in version -06</name>
      <t>Interop-affecting changes:</t>
      <ul spacing="normal">
        <li>
          <t>Removed the ASN.1 wrapping and added a fixed 4-byte length encoding value for the first mlkem component so the keys and ciphertexts can be separated.</t>
        </li>
        <li>
          <t>Add a ML-KEM-768 + ECDH-P256 variant.</t>
        </li>
        <li>
          <t>Changed the ML-KEM-1024 + P256 variant to use HKDF-SHA384 instead of SHA3 so that it is compliant with CNSA 2.0.</t>
        </li>
        <li>
          <t>In the KEM combiner, HKDF refers to the HKDF-extract() without HKDF-expand().  When used with CMS, HKDF-extract() with HKDF-expand() is used.</t>
        </li>
      </ul>
      <t>Editorial changes:</t>
      <ul spacing="normal">
        <li>
          <t>Added an Implementation Consideration section explaining why private keys need to contain the public keys.</t>
        </li>
        <li>
          <t>Added a security consideration about key reuse.</t>
        </li>
        <li>
          <t>Added security considerations about SHA3-vs-HKDF-SHA2 and a warning against generifying this construction to other combinations of ciphers.</t>
        </li>
        <li>
          <t>Enhanced the section about how to get this FIPS-certified.</t>
        </li>
        <li>
          <t>Renamed the module from Composite-KEM-2023 -&gt; Composite-MLKEM-2025.</t>
        </li>
        <li>
          <t>Added an appendix "Comparison with other Hybred KEMs" with sub-sections on X-Wing and ETSI CatKDF.</t>
        </li>
        <li>
          <t>Added alignment text with SP 800-227.</t>
        </li>
        <li>
          <t>Improved the security considerations around security proofs of the hybrid construction.</t>
        </li>
      </ul>
      <t>Still to do in a future version:</t>
      <ul spacing="normal">
        <li>
          <t><tt>[ ]</tt> We need PEM samples … hackathon? OQS friends? David @ BC? The right format for samples is probably to follow the hackathon ... a Dilithium or ECDSA trust anchor certificate, a composite KEM end entity certificate, and a CMS EnvelopedData sample encrypted for that composite KEM certificate.</t>
        </li>
        <li>
          <t><tt>[ ]</tt> Other outstanding github issues: https://github.com/lamps-wg/draft-composite-kem/issues</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-intro">
      <name>Introduction</name>
      <t>The advent of quantum computing poses a significant threat to current cryptographic systems. Traditional cryptographic algorithms such as RSA-OAEP, ECDH and their elliptic curve variants are vulnerable to quantum attacks. During the transition to post-quantum cryptography (PQC), there is considerable uncertainty regarding the robustness of both existing and new cryptographic algorithms. While we can no longer fully trust traditional cryptography, we also cannot immediately place complete trust in post-quantum replacements until they have undergone extensive scrutiny and real-world testing to uncover and rectify potential implementation flaws.</t>
      <t>Unlike previous migrations between cryptographic algorithms, the decision of when to migrate and which algorithms to adopt is far from straightforward. Even after the migration period, it may be advantageous for an entity's cryptographic identity to incorporate multiple public-key algorithms to enhance security.</t>
      <t>Cautious implementers may opt to combine cryptographic algorithms in such a way that an attacker would need to break all of them simultaneously to compromise the protected data. These mechanisms are referred to as Post-Quantum/Traditional (PQ/T) Hybrids <xref target="I-D.ietf-pquip-pqt-hybrid-terminology"/>.</t>
      <t>Certain jurisdictions are already recommending or mandating that PQC lattice schemes be used exclusively within a PQ/T hybrid framework. The use of Composite scheme provides a straightforward implementation of hybrid solutions compatible with (and advocated by) some governments and cybersecurity agencies <xref target="BSI2021"/>.</t>
      <t>In addition, <xref target="BSI2021"/> specifically references the composite specification as a concrete example of hybrid X.509 certificates.</t>
      <t>A more recent example is <xref target="ANSSI2024"/>, a document co-authored by French Cybersecurity Agency (ANSSI),
Federal Office for Information Security (BSI), Netherlands National Communications Security Agency (NLNCSA), and
Swedish National Communications Security Authority, Swedish Armed Forces which makes the following statement:</t>
      <ul empty="true">
        <li>
          <t>“In light of the urgent need to stop relying only on quantum-vulnerable public-key cryptography for key establishment, the clear priority should therefore be the migration to post-quantum cryptography in hybrid solutions”</t>
        </li>
      </ul>
      <t>This specification represents the straightforward implementation of the hybrid solutions called for by European cyber security agencies.</t>
      <t>PQ/T Hybrid cryptography can, in general, provide solutions to two migration problems:</t>
      <ul spacing="normal">
        <li>
          <t>Algorithm strength uncertainty: During the transition period, some post-quantum signature and encryption algorithms will not be fully trusted, while also the trust in legacy public key algorithms will start to erode.  A relying party may learn some time after deployment that a public key algorithm has become untrustworthy, but in the interim, they may not know which algorithm an adversary has compromised.</t>
        </li>
        <li>
          <t>Ease-of-migration: During the transition period, systems will require mechanisms that allow for staged migrations from fully classical to fully post-quantum-aware cryptography.</t>
        </li>
      </ul>
      <t>This document defines a specific instantiation of the PQ/T Hybrid paradigm called "composite" where multiple cryptographic algorithms are combined to form a single key encapsulation mechanism (KEM) key and ciphertext such that they can be treated as a single atomic algorithm at the protocol level. Composite algorithms address algorithm strength uncertainty because the composite algorithm remains strong so long as one of its components remains strong. Concrete instantiations of composite ML-KEM algorithms are provided based on ML-KEM, RSA-OAEP and ECDH. Backwards compatibility is not directly covered in this document, but is the subject of <xref target="sec-backwards-compat"/>.</t>
      <t>Composite ML-KEM is intended for general applicability anywhere that key establishment or enveloped content encryption is used within PKIX or CMS structures.</t>
      <section anchor="sec-terminology">
        <name>Conventions and Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
These words may also appear in this document in
lower case as plain English words, absent their normative meanings.
<?line -8?>
        </t>
        <t>This document is consistent with all terminology from <xref target="I-D.ietf-pquip-pqt-hybrid-terminology"/>.
In addition, the following terms are used in this document:</t>
        <t><strong>ALGORITHM</strong>:
          The usage of the term "algorithm" within this
          document generally refers to any function which
          has a registered Object Identifier (OID) for
          use within an ASN.1 AlgorithmIdentifier. This
          loosely, but not precisely, aligns with the
          definitions of "cryptographic algorithm" and
          "cryptographic scheme" given in <xref target="I-D.ietf-pquip-pqt-hybrid-terminology"/>.</t>
        <t><strong>COMBINER:</strong>
  A combiner specifies how multiple shared secrets are combined into
  a single shared secret.</t>
        <t><strong>DER:</strong>
  Distinguished Encoding Rules as defined in <xref target="X.690"/>.</t>
        <t><strong>KEM:</strong>
   A key encapsulation mechanism as defined in <xref target="sec-kems"/>.</t>
        <t><strong>PKI:</strong>
  Public Key Infrastructure, as defined in <xref target="RFC5280"/>.</t>
        <t><strong>SHARED SECRET KEY:</strong>
  A value established between two communicating parties for use as
  cryptographic key material suitable for direct use by symmetric
  cryptographic algorithms. This document is concerned with shared
  secrets established via public key cryptographic operations.</t>
      </section>
      <section anchor="composite-design-philosophy">
        <name>Composite Design Philosophy</name>
        <t><xref target="I-D.ietf-pquip-pqt-hybrid-terminology"/> defines composites as:</t>
        <ul empty="true">
          <li>
            <t><em>Composite Cryptographic Element</em>:  A cryptographic element that
     incorporates multiple component cryptographic elements of the same
     type in a multi-algorithm scheme.</t>
          </li>
        </ul>
        <t>Composite keys, as defined here, follow this definition and should be regarded as a single key that performs a single cryptographic operation such as key generation, signing, verifying, encapsulating, or decapsulating -- using its internal sequence of component keys as if they form a single key. This generally means that the complexity of combining algorithms can and should be handled by the cryptographic library or cryptographic module, and the single composite public key, private key, ciphertext and signature can be carried in existing fields in protocols such as PKCS#10 <xref target="RFC2986"/>, CMP <xref target="RFC4210"/>, X.509 <xref target="RFC5280"/>, CMS <xref target="RFC5652"/>, and the Trust Anchor Format <xref target="RFC5914"/>. In this way, composites achieve "protocol backwards-compatibility" in that they will drop cleanly into any protocol that accepts an analogous single-algorithm cryptographic scheme without requiring any modification of the protocol to handle multiple algorithms.</t>
      </section>
    </section>
    <section anchor="sec-kems">
      <name>Overview of the Composite ML-KEM Scheme</name>
      <t>We borrow here the definition of a key encapsulation mechanism (KEM) from <xref target="I-D.ietf-tls-hybrid-design"/>, in which a KEM is a cryptographic primitive that consists of three algorithms:</t>
      <ul spacing="normal">
        <li>
          <t><tt>KeyGen() -&gt; (pk, sk)</tt>: A probabilistic key generation algorithm,
which generates a public key <tt>pk</tt> and a secret key <tt>sk</tt>.\</t>
        </li>
        <li>
          <t><tt>Encap(pk) -&gt; (ss, ct)</tt>: A probabilistic encapsulation algorithm,
which takes as input a public key <tt>pk</tt> and outputs a ciphertext <tt>ct</tt>
and shared secret ss. Note: this document uses <tt>Encap()</tt> to conform to <xref target="RFC9180"/>,
but <xref target="FIPS.203"/> uses <tt>Encaps()</tt>.</t>
        </li>
        <li>
          <t><tt>Decap(sk, ct) -&gt; ss</tt>: A decapsulation algorithm, which takes as
input a secret key <tt>sk</tt> and ciphertext <tt>ct</tt> and outputs a shared
secret <tt>ss</tt>, or in some cases a distinguished error value.
Note: this document uses <tt>Decap()</tt> to conform to <xref target="RFC9180"/>,
but <xref target="FIPS.203"/> uses <tt>Decaps()</tt>.</t>
        </li>
      </ul>
      <t>We also borrow the following algorithms from <xref target="RFC9180"/>, which deal with encoding and decoding of KEM public key values.</t>
      <ul spacing="normal">
        <li>
          <t><tt>SerializePublicKey(pk) -&gt; bytes</tt>: Produce a byte string encoding the public key pk.</t>
        </li>
        <li>
          <t><tt>DeserializePublicKey(bytes) -&gt; pk</tt>: Parse a byte string to recover a public key pk. This function can fail if the input byte string is malformed.</t>
        </li>
      </ul>
      <t>We define the following algorithms which are used to serialize and deseralize the CompositeCiphertextValue</t>
      <ul spacing="normal">
        <li>
          <t><tt>SerializeCiphertextValue(CompositeCiphertextValue) -&gt; bytes</tt>: Produce a byte string encoding the CompositeCiphertextValue.</t>
        </li>
        <li>
          <t><tt>DeserializeCipherTextValue(bytes) -&gt; pk</tt>: Parse a byte string to recover a CompositeCiphertextValue. This function can fail if the input byte string is malformed.</t>
        </li>
      </ul>
      <t>The KEM interface defined above differs from both traditional key transport mechanism (for example for use with KeyTransRecipientInfo defined in <xref target="RFC5652"/>), and key agreement (for example for use with KeyAgreeRecipientInfo defined in <xref target="RFC5652"/>).</t>
      <t>The KEM interface was chosen as the interface for a composite key establishment because it allows for arbitrary combinations of component algorithm types since both key transport and key agreement mechanisms can be promoted into KEMs as described in <xref target="sec-RSAOAEPKEM"/> and <xref target="sec-DHKEM"/> below.</t>
      <t>This specification uses the Post-Quantum KEM ML-KEM as specified in <xref target="FIPS.203"/> and <xref target="I-D.ietf-lamps-kyber-certificates"/>. For Traditional KEMs, this document uses the RSA-OAEP algorithm defined in <xref target="RFC8017"/>, the Elliptic Curve Diffie-Hellman key agreement schemes ECDH defined in section 5.7.1.2 of <xref target="SP.800-56Ar3"/>, and X25519 / X448 which are defined in <xref target="RFC8410"/>. A combiner function is used to combine the two component shared secrets into a single shared secret.</t>
      <section anchor="sec-RSAOAEPKEM">
        <name>Promotion of RSA-OAEP into a KEM</name>
        <t>The RSA Optimal Asymmetric Encryption Padding (OAEP), as defined in section 7.1 of <xref target="RFC8017"/> is a public key encryption algorithm used to transport key material from a sender to a receiver. It is promoted into a KEM by having the sender generate a random 256 bit secret and encrypt it.</t>
        <t>Note that, at least at the time of writing, the algorithm <tt>RSAOAEPKEM</tt> is not defined as a standalone algorithm within PKIX standards and it does not have an assigned algorithm OID, so it cannot be used directly with CMS KEMRecipientInfo <xref target="RFC9629"/>; it is merely a building block for the composite algorithm.</t>
        <artwork><![CDATA[
RSAOAEPKEM.Encap(pkR):
  shared_secret = SecureRandom(ss_len)
  enc = RSAES-OAEP-ENCRYPT(pkR, shared_secret)

  return shared_secret, enc
]]></artwork>
        <t>Note that the OAEP label <tt>L</tt> is left to its default value, which is the empty string as per <xref target="RFC8017"/>. The shared secret output by the overall Composite ML-KEM already binds a composite domain separator, so there is no need to also utilize the component domain separators.</t>
        <t>The value of <tt>ss_len</tt> as well as the RSA-OAEP parameters used within this specification can be found in <xref target="sect-rsaoaep-params"/>.</t>
        <t><tt>Decap(sk, ct) -&gt; ss</tt> is accomplished in the analogous way.</t>
        <artwork><![CDATA[
RSAOAEPKEM.Decap(skR, enc):
  shared_secret = RSAES-OAEP-DECRYPT(skR, enc)

  return shared_secret
]]></artwork>
      </section>
      <section anchor="sec-DHKEM">
        <name>Promotion of ECDH into a KEM</name>
        <t>An elliptic curve Diffie-Hellman key agreement is promoted into a KEM <tt>Encap(pk) -&gt; (ss, ct)</tt> using a simplified version of the DHKEM definition from <xref target="RFC9180"/>; simplified to remove the context-binding labels since the shared secret output by the overall Composite ML-KEM already binds a composite domain separator, so there is no need to also utilize labels within DHKEM.</t>
        <t>Note that, at least at the time of writing, the algorithm <tt>DHKEM</tt> is not defined as a standalone algorithm within PKIX standards and it does not have an assigned algorithm OID, so it cannot be used directly with CMS KEMRecipientInfo <xref target="RFC9629"/>; it is merely a building block for the composite algorithm.</t>
        <artwork><![CDATA[
DHKEM.Encap(pkR):
  skE, pkE = GenerateKeyPair()
  shared_secret = DH(skE, pkR)
  enc = SerializePublicKey(pkE)

  return shared_secret, enc
]]></artwork>
        <t><tt>Decap(sk, ct) -&gt; ss</tt> is accomplished in the analogous way.</t>
        <artwork><![CDATA[
DHKEM.Decap(skR, enc):
  pkE = DeserializePublicKey(enc)
  shared_secret = DH(skR, pkE)

  return shared_secret
]]></artwork>
        <t>This construction applies for all variants of elliptic curve Diffie-Hellman used in this specification: ECDH, X25519, and X448.</t>
        <t>The simplifications from the DHKEM definition in <xref target="RFC9180"/> is that since the ciphertext and receiver's public key are included explicitly in the Composite ML-KEM combiner, there is no need to construct the <tt>kem_context</tt> object, and since a domain separator is included explicitly in the Composite ML-KEM combiner there is no need to perform the labeled steps of <tt>ExtractAndExpand()</tt>.</t>
      </section>
    </section>
    <section anchor="sec-composite-mlkem">
      <name>Composite ML-KEM Functions</name>
      <t>This section describes the composite ML-KEM functions needed to instantiate the KEM API in <xref target="sec-kems"/>.</t>
      <section anchor="key-generation">
        <name>Key Generation</name>
        <t>To generate a new keypair for Composite schemes, the <tt>KeyGen() -&gt; (pk, sk)</tt> function is used. The KeyGen() function calls the two key generation functions of the component algorithms for the Composite keypair in no particular order. Multi-process or multi-threaded applications might choose to execute the key generation functions in parallel for better key generation performance.</t>
        <t>The following process is used to generate composite keypair values:</t>
        <figure anchor="alg-composite-keygen">
          <name>Composite KeyGen(pk, sk)</name>
          <artwork><![CDATA[
KeyGen() -> (pk, sk)

Explicit Inputs:
     None

Implicit Input:
  ML-KEM     A placeholder for the specific ML-KEM algorithm and
             parameter set to use, for example, could be "ML-KEM-65".

  Trad       A placeholder for the specific traditional algorithm and
             parameter set to use, for example "RSA-OAEP"
             or "X25519".

Output:
  (pk, sk)  The composite keypair.

Key Generation Process:

  1. Generate component keys

    (mlkemPK, mlkemSK) = ML-KEM.KeyGen()
    (tradPK, tradSK)   = Trad.KeyGen()

  2. Check for component key gen failure
    if NOT (mlkemPK, mlkemSK) or NOT (tradPK, tradSK):
      output "Key generation error"

  3. Output the composite public and private keys

    pk = (mlkemPK, tradPK)
    sk = (mlkemSK, tradSK)
    return (pk, sk)

]]></artwork>
        </figure>
        <t>In order to ensure fresh keys, the key generation functions MUST be executed for both component algorithms. Compliant parties MUST NOT use or import component keys that are used in other contexts, combinations, or by themselves as keys for standalone algorithm use.</t>
        <t>Note that in step 2 above, both component key generation processes are invoked, and no indication is given about which one failed. This SHOULD be done in a timing-invariant way to prevent side-channel attackers from learning which component algorithm failed.</t>
      </section>
      <section anchor="encapsulation">
        <name>Encapsulation</name>
        <t>The <tt>Encap(pk)</tt> of a Composite ML-KEM algorithm is designed to behave exactly the same as <tt>ML-KEM.Encaps(ek)</tt> defined in Algorithm 20 in Section 7.2 of <xref target="FIPS.203"/>. Specifically, <tt>Composite-ML-KEM.Encap(pk)</tt> produces a 256-bit shared secret key that can be used directly with any symmetric-key cryptographic algorithm. In this way, Composite ML-KEM can be used as a direct drop-in replacement anywhere that ML-KEM is used.</t>
        <figure anchor="alg-composite-mlkem-encap">
          <name>Composite-ML-KEM.Encap(pk)</name>
          <artwork><![CDATA[
Composite-ML-KEM.Encap(pk) -> (ss, ct)

Explicit Input:

  pk          Composite public key consisting of encryption public keys
              for each component.

Implicit inputs:

  ML-KEM   A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example, could be "ML-KEM-768".

  Trad     A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example "RSA-OAEP"
           or "X25519".

  KDF      The KDF specified for the given Composite ML-KEM algorithm.
           See algorithm specifications below.

  Domain   Domain separator value for binding the ciphertext to the
           Composite OID. See section on Domain Separators below.

Output:

  ss      The shared secret key, a 256-bit key suitable for use with
          symmetric cryptographic algorithms.

  ct      The ciphertext, a byte string.

Encap Process:

  1. Separate the public keys.

      (mlkemPK, tradPK) = pk

  2.  Perform the respective component Encap operations according to
      their algorithm specifications.

      (mlkemCT, mlkemSS) = MLKEM.Encaps(mlkemPK)
      (tradCT, tradSS) = TradKEM.Encap(tradPK)

  3. If either ML-KEM.Encaps() or TradKEM.Encap() return an error,
     then this process must return an error.

      if NOT (mlkemCT, mlkemSS) or NOT (tradCT, tradSS):
        output "Encapsulation error"

  4. Encode the ciphertext

      ct = mlkemCT || tradCT

  5. Combine the KEM secrets and additional context to yield the composite shared secret
      if KDF is "SHA3-256"
        ss = SHA3-256(mlkemSS || tradSS || tradCT || tradPK || Domain)
      else if KDF is "HKDF"
        ss = HKDF-Extract(salt="", IKM=mlkemSS || tradSS || tradCT || tradPK || Domain)
          # Note: salt is the empty string (0 octets), which will internally be mapped
          # to the zero vector `0x00..00` of the correct input size for the underlying
          # hash function as per [RFC 5869].

  6. Output composite shared secret key and ciphertext

     return (ss, ct)
]]></artwork>
        </figure>
        <t>The specific values for <tt>KDF</tt> are defined per Composite ML-KEM algorithm in <xref target="tab-kem-algs"/> and the specific values for <tt>Domain</tt> are defined per Composite ML-KEM algorithm in <xref target="sec-alg-ids"/>.</t>
      </section>
      <section anchor="sect-composite-decaps">
        <name>Decapsulation</name>
        <t>The <tt>Decap(sk, ct) -&gt; ss</tt> of a Composite ML-KEM algorithm is designed to behave exactly the same as <tt>ML-KEM.Decaps(dk, c)</tt> defined in Algorithm 21 in Section 7.3 of <xref target="FIPS.203"/>. Specifically, <tt>Composite-ML-KEM.Decap(sk, ct)</tt> produces a 256-bit shared secret key that can be used directly with any symmetric-key cryptographic algorithm. In this way, Composite ML-KEM can be used as a direct drop-in replacement anywhere that ML-KEM is used.</t>
        <figure anchor="alg-composite-mlkem-decap">
          <name>Composite-ML-KEM.Decap(sk, ct)</name>
          <artwork><![CDATA[
Composite-ML-KEM.Decap(sk, ct) -> ss

Explicit Input:

  sk    Composite private key consisting of decryption private keys for
        each component.

  ct      The ciphertext, a byte string.

Implicit inputs:

  ML-KEM   A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example, could be "ML-KEM-768".

  Trad     A placeholder for the specific traditional algorithm and
           parameter set to use, for example "RSA-OAEP"
           or "X25519".

  KDF      The KDF specified for the given Composite ML-KEM algorithm.
           See algorithm specifications below.

  Domain   Domain separator value for binding the ciphertext to the
           Composite OID. See section on Domain Separators below.

Output:

  ss      The shared secret key, a 256-bit key suitable for use with
          symmetric cryptographic algorithms.

Decap Process:

  1. Separate the private keys

      (mlkemSK, tradSK) = sk

  2. Parse the ciphertext

      (mlkemCT, tradCT) = ct

  3.  Perform the respective component Encap operations according to
      their algorithm specifications.

      mlkemSS = MLKEM.Decaps(mlkemSK, mlkemCT)
      tradSS  = TradKEM.Decap(tradSK, tradCT)

  4. If either ML-KEM.Decaps() or TradKEM.Decap() return an error,
     then this process must return an error.

      if NOT mlkemSS or NOT tradSS:
        output "Encapsulation error"

  5. Combine the KEM secrets and additional context to yield the composite shared secret

      if KDF is "SHA3-256"
        ss = SHA3-256(mlkemSS || tradSS || tradCT || tradPK || Domain)
      else if KDF is "HKDF"
        ss = HKDF-Extract(salt="", IKM=mlkemSS || tradSS || tradCT || tradPK || Domain)
          # Note: salt is the empty string (0 octets), which will internally be mapped
          # to the zero vector `0x00..00` of the correct input size for the underlying
          # hash function as per [RFC 5869].

  6. Output composite shared secret key

     return ss
]]></artwork>
        </figure>
        <t>It is possible to use component private keys stored in separate software or hardware keystores. Variations in the process to accommodate particular private key storage mechanisms are considered to be conformant to this document so long as it produces the same output and error handling as the process sketched above.</t>
        <t>In order to properly achieve its security properties, the KEM combiner requires that all inputs are fixed-length. Since each Composite ML-KEM algorithm fully specifies its component algorithms, including key sizes, all inputs should be fixed-length in non-error scenarios, however some implementations may need to perform additional checking to handle certain error conditions. In particular, the KEM combiner step should not be performed if either of the component decapsulations returned an error condition indicating malformed inputs. For timing-invariance reasons, it is RECOMMENDED to perform both decapsulation operations and check for errors afterwards to prevent an attacker from using a timing channel to tell which component failed decapsulation. Also, RSA-based composites MUST ensure that the modulus size (i.e. the size of tradCT and tradPK) matches that specified for the given Composite ML-KEM algorithm in <xref target="tab-kem-algs"/>; depending on the cryptographic library used, this check may be done by the library or may require an explicit check as part of the <tt>CompositeKEM.Decap()</tt> routine.</t>
      </section>
      <section anchor="sec-serialize-deserialize">
        <name>SerializePublicKey and DeserializePublicKey</name>
        <t>Each component KEM public key is serialized according to its respective standard as shown in <xref target="appdx_components"/> and concatenated together using a fixed 4-byte length field denoting the length in bytes of the first component key, as defined below.</t>
        <figure anchor="alg-composite-serialize">
          <name>Composite SerializePublicKey(pk)</name>
          <artwork><![CDATA[
Composite-ML-KEM.SerializePublicKey(pk) -> bytes

Explicit Input:

  pk    Composite ML-KEM public key

Implicit inputs:

  ML-KEM   A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example, could be "ML-KEM-768".

  Trad     A placeholder for the specific traditional algorithm and
           parameter set to use, for example "RSA-OAEP"
           or "X25519".

  IntegerToBytes  A function that takes an Integer and converts it to
           a byte representation of size byteLength.  See definition in
           [FIPS.204]

Output:

  bytes   The encoded public key

Serialization Process:

  1. Separate the public keys

     (mlkemPK, tradPK) = pk

  2. Serialize each of the constituent public keys
       The component keys are serialized according to their respective standard
       as shown in the component algorithm appendix.

     mlkemEncodedPK = ML-KEM.SerializePublicKey(mlkemPK)
     tradEncodedPK = Trad.SerializePublicKey(tradPK)

  3. Calculate the length encoding of the mlkemEncodedPK

     If (mlkemEncodedPK.length) > 2^32
         then output "message too long" and stop.

     encodedLength = IntegerToBytes(mlkemEncodedPK.length, 4)

  4. Combine and output the encoded public key

     bytes = encodedLength || mlkemEncodedPK || tradEncodedPK
     output bytes
]]></artwork>
        </figure>
        <t>Deserialization reverses this process, raising an error in the event that the input is malformed.  Each component
key is deserialized according to their respective standard as shown in <xref target="appdx_components"/>.</t>
        <figure anchor="alg-composite-deserialize">
          <name>Composite DeserializePublicKey(bytes)</name>
          <artwork><![CDATA[
Composite-ML-KEM.DeserializePublicKey(bytes) -> pk

Explicit Input:

  bytes   An encoded public key

Implicit inputs:

  ML-KEM   A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example, could be "ML-KEM-768".

  Trad     A placeholder for the specific traditional algorithm and
           parameter set to use, for example "RSA-OAEP"
           or "X25519".

Output:

  pk     The composite ML-KEM public key

Deserialization Process:

  1. Validate the length of the the input byte string

     if bytes is not the correct length:
      output "Deserialization error"

  2. Parse each constituent encoded public key
       The first 4 bytes encodes the length of mlkemEncodedPK, which MAY
       be used to separate the mlkemEncodedPK and tradEncodedPK, and then
       is to be discarded.  This length SHOULD be checked against the
       expected length value as per ML-KEM.

     (mlkemEncodedPK, tradEncodedPK) = bytes

  3. Deserialize the constituent public keys
        The component keys are deserialized according to their respective standard
        as shown in the component algorithm appendix.

     mlkemPK = ML-KEM.DeserializePublicKey(mlkemEncodedPK)
     tradPK = Trad.DeserializePublicKey(tradEncodedPK)

  4. If either ML-KEM.DeserializePublicKey() or
     Trad.DeserializePublicKey() return an error,
     then this process must return an error.

      if NOT mlkemPK or NOT tradPK:
        output "Deserialization error"

  5. Output the composite ML-KEM public key

     output (mlkemPK, tradPK)
]]></artwork>
        </figure>
      </section>
      <section anchor="serializeprivatekey-and-deserializeprivatekey">
        <name>SerializePrivateKey and DeserializePrivateKey</name>
        <t>The same serialization and deserialization process as described in <xref target="sec-serialize-deserialize"/>
should be used to serialize and deserialize the private keys.  The only difference is that pk is
the private key, and the output is the concatenation of the mlkem and traditional private keys for
serialization, or the mlkem and traditional private keys for deserialization.</t>
      </section>
      <section anchor="serializeciphertextvalue-and-deserializeciphertextvalue">
        <name>SerializeCiphertextValue and DeSerializeCiphertextValue</name>
        <t>Each Ciphertext component of CompositeCiphertextValue is serialized according to their respective standard as shown in <xref target="appdx_components"/> and concatenated together using a fixed 4-byte length field denoting the length in bytes of the first component signature, as shown below.  For the Traditional component, the CipherText is the encrypted value 'enc' as described in <xref target="sec-RSAOAEPKEM"/> or <xref target="sec-DHKEM"/> depending on the chosen component algorithm.</t>
        <figure anchor="alg-composite-serialize-ct">
          <name>Composite SerializeCiphertextValue(CompositeCiphertextValue)</name>
          <artwork><![CDATA[
Composite-ML-DSA.SerializeCiphertextValue(CompositeCiphertextValue) -> bytes

Explicit Input:

  CompositeCiphertextValue    The Composite CipherText Value obtained from Composite-ML-KEM.Encap(pk)

Implicit inputs:

  ML-KEM   A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example, could be "ML-KEM-768".

  Trad     A placeholder for the specific traditional algorithm and
           parameter set to use, for example "RSAOAEP" or "ECDH".

  IntegerToBytes  A function that takes an Integer and converts it to
           a byte representation of size byteLength.  See definition in
           [FIPS.204]

Output:

  bytes   The encoded CompositeCiphertextValue

Serialization Process:

  1. Separate the cipher texts

     (mldkemct, tradkemct) = CompositeCiphertextValue

  2. Serialize each of the constituent cipher texts
       The component cipher texts are serialized according to their respective standard
       as shown in the component algorithm appendix.  For the tradkemEncodedCT the
       ciphertext is the encrypted output as defined in 'Promotion of RSA-OAEP into a KEM'
       or 'Promotion of ECDH into a KEM'.

     mlkemEncodedCt = ML-KEM.SerializeCiphertext(mlkemct)
     tradkemEncodedCT = Trad.SerializeCiphertext(tradkemct)

  3. Calculate the length encoding of the mlkemEncodedCt

     If (mlkemEncodedCt.length) > 2^32
         then output "message too long" and stop.

     encodedLength = IntegerToBytes(mlkemEncodedCt.length, 4)

  4. Combine and output the encoded composite ciphertext

     bytes = encodedLength || mlkemEncodedCt || tradkemEncodedCT
     output bytes
]]></artwork>
        </figure>
        <t>Deserialization reverses this process, raising an error in the event that the input is malformed.  Each component
ciphertext is deserialized according to their respective standard as shown in <xref target="appdx_components"/>.  For the traditional
component, the ciphertext is the encrypted value 'enc' as described in <xref target="sec-RSAOAEPKEM"/> or <xref target="sec-DHKEM"/> depending
on the chosen component algorithm.</t>
        <figure anchor="alg-composite-deserialize-ct">
          <name>Composite DeserializeCiphertextValue(bytes)</name>
          <artwork><![CDATA[
Composite-ML-KEM.DeserializeCiphertextValue(bytes) -> CompositeCiphertextValue

Explicit Input:

  bytes   An encoded CompositeCiphertextValue

Implicit inputs:

  ML-KEM   A placeholder for the specific ML-KEM algorithm and
           parameter set to use, for example, could be "ML-KEM-768".

  Trad     A placeholder for the specific traditional algorithm and
           parameter set to use, for example "RSAOAEP" or "ECDH".

Output:

  CompositeCiphertextValue  The CompositeCiphertextValue

Deserialization Process:

  1. Validate the length of the the input byte string

     if bytes is not the correct length:
      output "Deserialization error"

  2. Parse each constituent encoded cipher text.
       The first 4 bytes encodes the length of mlkemEncodedCt, which MAY
       be used to separate the mlkemEncodedCt and tradkemEncodedCT,
       and then is to be discarded.  The mlkemEncodedCt length SHOULD
       be checked against the expected length value as per ML-KEM.

     (mlkemEncodedCt, tradkemEncodedCt) = bytes

  3. Deserialize the constituent cipher text values

     mlkemCt = ML-KEM.DeserializeCiphertext(mlkemEncodedCt)
     tradkemCt = Trad.DeserializeCiphertext(tradkemEncodedCt)

  4. If either ML-KEM.DeserializeCiphertext() or
     Trad.DeserializeCiphertext() return an error,
     then this process must return an error.

      if NOT mlkemCt or NOT tradkemCt:
        output "Deserialization error"

  5. Output the CompositeCiphertextValue

     output (mlkemCt, tradkemCt)

]]></artwork>
        </figure>
      </section>
      <section anchor="ml-kem-public-key-private-key-and-cipher-text-sizes-for-serialization-and-deserialization">
        <name>ML-KEM public key, private key and cipher text sizes for serialization and deserialization</name>
        <t>As noted above in the public key, private key and CompositeCiphertextValue
serialization and deserialization methods use a fixed 4-byte length value to
indicate the size of the first component. This is to allow the separation of the first
component from the second component.  It is RECOMMENDED that the length specified for the
first component be checked against the values from the table below to ensure the encoding
has been done propertly.</t>
        <t>If future composite combinations make use of algorithms where the first component uses
variable length keys or cipher texts, then this fixed 4-byte length value can be used to
ensure the components are correctly deserialized.</t>
        <t>The following table shows the fixed length values in bytes for the public, private and cipher text
sizes for ML-KEM which can be used to deserialzie the components.</t>
        <table anchor="tab-mlkem-sizes">
          <name>ML-KEM Key and Ciphertext Sizes</name>
          <thead>
            <tr>
              <th align="left">Algorithm</th>
              <th align="left">Public key</th>
              <th align="left">Private key</th>
              <th align="left">Ciphertext</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ML-KEM-768</td>
              <td align="left">1184</td>
              <td align="left">64 or 2400 or 2464</td>
              <td align="left">1088</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-1024</td>
              <td align="left">1568</td>
              <td align="left">64 or 3168 or 3232</td>
              <td align="left">1568</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="sec-composite-keys">
      <name>Composite Key Structures</name>
      <t>In order to form composite public keys and ciphertext values, we define ASN.1-based composite encodings such that these structures can be used as a drop-in replacement for existing public key and ciphertext fields such as those found in PKCS#10 <xref target="RFC2986"/>, CMP <xref target="RFC4210"/>, X.509 <xref target="RFC5280"/>, CMS <xref target="RFC5652"/>.</t>
      <section anchor="sec-composite-pub-keys">
        <name>CompositeKEMPublicKey</name>
        <t>The wire encoding of a Composite ML-KEM public key is:</t>
        <sourcecode type="ASN.1" name="CompositeKEMPublicKey-asn.1-structures"><![CDATA[
CompositeKEMPublicKey ::= BIT STRING
]]></sourcecode>
        <t>Since RSA and ECDH component public keys are themselves in a DER encoding, the following show the internal structure of the various public key types used in this specification:</t>
        <t>When a CompositeKEMPublicKey is used with an RSA public key, the BIT STRING itself is generated by the concatenation of a raw ML-KEM key according to <xref target="I-D.ietf-lamps-kyber-certificates"/> and an RSAPublicKey (which is a DER encoded RSAPublicKey).</t>
        <t>When a CompositeKEMPublicKey is used with an EC public key, the BIT STRING itself is generated by the concatenation of a raw ML-KEM key according to <xref target="I-D.ietf-lamps-kyber-certificates"/> and an ECDHPublicKey (which is a DER encoded ECPoint).</t>
        <t>When a CompositeKEMPublicKey is used with an Edwards public key, the BIT STRING itself is generated by the concatenation of a raw ML-KEM key according to <xref target="I-D.ietf-lamps-kyber-certificates"/> and a raw Edwards public key according to <xref target="RFC8410"/>.</t>
        <t>Some applications may need to reconstruct the <tt>SubjectPublicKeyInfo</tt> objects corresponding to each component public key. <xref target="tab-kem-algs"/> in <xref target="sec-alg-ids"/> provides the necessary mapping between composite and their component algorithms for doing this reconstruction.</t>
        <t>When the CompositeKEMPublicKey must be provided in octet string or bit string format, the data structure is encoded as specified in <xref target="sec-encoding-rules"/>.</t>
        <t>In order to maintain security properties of the composite, applications that use composite keys MUST always perform fresh key generations of both component keys and MUST NOT reuse existing key material. See <xref target="sec-cons-key-reuse"/> for a discussion.</t>
        <t>The following ASN.1 Information Object Class is defined to allow for compact definitions of each composite algorithm, leading to a smaller overall ASN.1 module.</t>
        <sourcecode type="ASN.1" name="CompositeKeyObject-asn.1-structures"><![CDATA[
  pk-CompositeKEM {OBJECT IDENTIFIER:id, PublicKeyType}
    PUBLIC-KEY ::= {
      IDENTIFIER id
      KEY PublicKeyType
      PARAMS ARE absent
      CERT-KEY-USAGE { keyEncipherment }
    }
]]></sourcecode>
        <t>As an example, the public key type <tt>pk-MLKEM768-ECDH-P384</tt> can be defined compactly as:</t>
        <artwork><![CDATA[
pk-MLKEM768-ECDH-P384 PUBLIC-KEY ::=
  pk-CompositeKEM {
    id-MLKEM768-ECDH-P384,
    EcCompositeKemPublicKey }
]]></artwork>
        <t>The full set of key types defined by this specification can be found in the ASN.1 Module in <xref target="sec-asn1-module"/>.</t>
      </section>
      <section anchor="sec-priv-key">
        <name>CompositeKEMPrivateKey</name>
        <t>When a Composite ML-KEM private key is to be exported from a cryptographic module, it uses an analogous definition to the public keys:</t>
        <sourcecode type="ASN.1" name="CompositeKEMPrivateKey-asn.1-structures"><![CDATA[
CompositeKEMPrivateKey ::= OCTET STRING
]]></sourcecode>
        <t>Each element of the <tt>CompositeKEMPrivateKey</tt> Sequence is an <tt>OCTET STRING</tt> according to the encoding of the underlying algorithm specification and will decode into the respective private key structures in an analogous way to the public key structures defined in <xref target="sec-composite-pub-keys"/>. This document does not provide helper classes for private keys.  The PrivateKey for each component algorithm MUST be in the same order as defined in <xref target="sec-composite-pub-keys"/>.</t>
        <t>Use cases that require an interoperable encoding for composite private keys will often need to place a <tt>CompositeKEMPrivateKey</tt> inside a <tt>OneAsymmetricKey</tt> structure defined in <xref target="RFC5958"/>, such as when private keys are carried in PKCS #12 <xref target="RFC7292"/>, CMP <xref target="RFC4210"/> or CRMF <xref target="RFC4211"/>. The definition of <tt>OneAsymmetricKey</tt> is copied here for convenience:</t>
        <sourcecode type="ASN.1" name="RFC5958-OneAsymmetricKey-asn.1-structure"><![CDATA[
 OneAsymmetricKey ::= SEQUENCE {
       version                   Version,
       privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
       privateKey                PrivateKey,
       attributes            [0] Attributes OPTIONAL,
       ...,
       [[2: publicKey        [1] PublicKey OPTIONAL ]],
       ...
     }

  ...
  PrivateKey ::= OCTET STRING
                        -- Content varies based on type of key.  The
                        -- algorithm identifier dictates the format of
                        -- the key.
]]></sourcecode>
        <t>When a <tt>CompositeKEMPrivateKey</tt> is conveyed inside a OneAsymmetricKey structure (version 1 of which is also known as PrivateKeyInfo) <xref target="RFC5958"/>, the privateKeyAlgorithm field SHALL be set to the corresponding composite algorithm identifier defined according to <xref target="sec-alg-ids"/> and its parameters field MUST be absent.  The privateKey field SHALL contain the <tt>CompositeKEMPrivateKey</tt>, and the <tt>publicKey</tt> field remains OPTIONAL.  If the <tt>publicKey</tt> field is present, it MUST be a <tt>CompositeKEMPublicKey</tt>.</t>
        <t>Some applications may need to reconstruct the <tt>OneAsymmetricKey</tt> objects corresponding to each component private key. <xref target="sec-alg-ids"/> provides the necessary mapping between composite and their component algorithms for doing this reconstruction.</t>
        <t>Component keys of a CompositeKEMPrivateKey MUST NOT be used in any other type of key or as a standalone key. For more details on the security considerations around key reuse, see <xref target="sec-cons-key-reuse"/>.</t>
      </section>
      <section anchor="sec-encoding-rules">
        <name>Encoding Rules</name>
        <!-- EDNOTE 7: Examples of how other specifications specify how a data structure is converted to a bit string can be found in RFC 2313, section 10.1.4, 3279 section 2.3.5, and RFC 4055, section 3.2. -->

<t>Many protocol specifications will require that the composite public key and composite private key data structures be represented by an octet string or bit string.</t>
        <t>When an octet string is required, the DER encoding of the composite data structure SHALL be used directly.</t>
        <t>When a bit string is required, the octets of the DER encoded composite data structure SHALL be used as the bits of the bit string, with the most significant bit of the first octet becoming the first bit, and so on, ending with the least significant bit of the last octet becoming the last bit of the bit string.</t>
        <t>In the interests of simplicity and avoiding compatibility issues, implementations that parse these structures MAY accept both BER and DER.</t>
      </section>
      <section anchor="key-usage-bits">
        <name>Key Usage Bits</name>
        <t>When any of the Composite ML-KEM <tt>AlgorithmIdentifier</tt> appears in the <tt>SubjectPublicKeyInfo</tt> field of an X.509 certificate <xref target="RFC5280"/>, the key usage certificate extension MUST only contain</t>
        <artwork><![CDATA[
keyEncipherment
]]></artwork>
        <t>Composite ML-KEM keys MUST NOT be used in a "dual usage" mode because even if the
traditional component key supports both signing and encryption,
the post-quantum algorithms do not and therefore the overall composite algorithm does not.</t>
      </section>
    </section>
    <section anchor="composite-ml-kem-structures">
      <name>Composite ML-KEM Structures</name>
      <section anchor="sec-kema-CompositeKEM">
        <name>kema-CompositeKEM</name>
        <t>The ASN.1 algorithm object for a Composite ML-KEM is:</t>
        <artwork><![CDATA[
kema-CompositeKEM {
  OBJECT IDENTIFIER:id,
    PUBLIC-KEY:publicKeyType }
    KEM-ALGORITHM ::= {
         IDENTIFIER id
         VALUE CompositeCiphertextValue
         PARAMS ARE absent
         PUBLIC-KEYS { publicKeyType }
        }
]]></artwork>
      </section>
      <section anchor="sec-CompositeCiphertextValue">
        <name>CompositeCiphertextValue</name>
        <t>The <tt>CompositeCipherTextValue</tt> is the DER encoding of a SEQUENCE of the ciphertexts from the
underlying component algorithms.  It is represented in ASN.1 as follows:</t>
        <artwork><![CDATA[
CompositeCiphertextValue ::= OCTET STRING
]]></artwork>
        <t>The order of the component ciphertexts is the same as the order defined in <xref target="sec-composite-pub-keys"/>.</t>
      </section>
    </section>
    <section anchor="sec-alg-ids">
      <name>Algorithm Identifiers</name>
      <t>This table summarizes the list of Composite ML-KEM algorithms and lists the OID, two component algorithms, and the KDF to be used within combiner function. Domain separator values are defined below in <xref target="sec-domsep-values"/>.</t>
      <t>EDNOTE: these are prototyping OIDs to be replaced by IANA.</t>
      <t>&lt;CompKEM&gt;.1 is equal to 2.16.840.1.114027.80.5.2.1</t>
      <section anchor="composite-ml-kem-algorithm-identifiers">
        <name>Composite-ML-KEM Algorithm Identifiers</name>
        <table anchor="tab-kem-algs">
          <name>Composite ML-KEM key types</name>
          <thead>
            <tr>
              <th align="left">Composite ML-KEM Algorithm</th>
              <th align="left">OID</th>
              <th align="left">First Algorithm</th>
              <th align="left">Second Algorithm</th>
              <th align="left">KDF</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">id-MLKEM768-RSA2048</td>
              <td align="left">&lt;CompKEM&gt;.30</td>
              <td align="left">MLKEM768</td>
              <td align="left">RSA-OAEP 2048</td>
              <td align="left">HKDF-SHA256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-RSA3072</td>
              <td align="left">&lt;CompKEM&gt;.31</td>
              <td align="left">MLKEM768</td>
              <td align="left">RSA-OAEP 3072</td>
              <td align="left">HKDF-SHA256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-RSA4096</td>
              <td align="left">&lt;CompKEM&gt;.32</td>
              <td align="left">MLKEM768</td>
              <td align="left">RSA-OAEP 4096</td>
              <td align="left">HKDF-SHA256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-X25519</td>
              <td align="left">&lt;CompKEM&gt;.33</td>
              <td align="left">MLKEM768</td>
              <td align="left">X25519</td>
              <td align="left">SHA3-256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-P256</td>
              <td align="left">&lt;CompKEM&gt;.34</td>
              <td align="left">MLKEM768</td>
              <td align="left">ECDH-P256</td>
              <td align="left">HKDF-SHA256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-P384</td>
              <td align="left">&lt;CompKEM&gt;.35</td>
              <td align="left">MLKEM768</td>
              <td align="left">ECDH-P384</td>
              <td align="left">HKDF-SHA256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-brainpoolP256r1</td>
              <td align="left">&lt;CompKEM&gt;.36</td>
              <td align="left">MLKEM768</td>
              <td align="left">ECDH-brainpoolp256r1</td>
              <td align="left">HKDF-SHA256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-ECDH-P384</td>
              <td align="left">&lt;CompKEM&gt;.37</td>
              <td align="left">MLKEM1024</td>
              <td align="left">ECDH-P384</td>
              <td align="left">HKDF-SHA384/256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-ECDH-brainpoolP384r1</td>
              <td align="left">&lt;CompKEM&gt;.38</td>
              <td align="left">MLKEM1024</td>
              <td align="left">ECDH-brainpoolP384r1</td>
              <td align="left">SHA3-256</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-X448</td>
              <td align="left">&lt;CompKEM&gt;.39</td>
              <td align="left">MLKEM1024</td>
              <td align="left">X448</td>
              <td align="left">SHA3-256</td>
            </tr>
          </tbody>
        </table>
        <t>Note that in alignment with ML-KEM which outputs a 256-bit shared secret key at all security levels, all Composite KEM algorithms output a 256-bit shared secret key.</t>
        <t>For the use of HKDF <xref target="RFC5869"/>: a salt is not provided; i.e. the default salt (all zeroes of length HashLen) will be used. For HKDF-SHA256 the output of 256 bit output is used directly; for HKDF-SHA384/256, HKDF is invoked with SHA384 and then the output is truncated to 256 bits, meaning that only the first 256 bits of output are used.</t>
        <t>Full specifications for the referenced component algorithms can be found in <xref target="appdx_components"/>.</t>
      </section>
      <section anchor="sec-domsep-values">
        <name>Domain Separators</name>
        <t>The KEM combiner used in this document requires a domain separator <tt>Domain</tt> input.  The following table shows the HEX-encoded domain separator for each Composite ML-KEM AlgorithmID; to use it, the value MUST be HEX-decoded and used in binary form. The domain separator is simply the DER encoding of the composite algorithm OID.</t>
        <table anchor="tab-kem-domains">
          <name>Composite ML-KEM fixedInfo Domain Separators</name>
          <thead>
            <tr>
              <th align="left">Composite ML-KEM Algorithm</th>
              <th align="left">Domain Separator (in Hex encoding)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">id-MLKEM768-RSA2048</td>
              <td align="left">060B6086480186FA6B5005021E</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-RSA3072</td>
              <td align="left">060B6086480186FA6B5005021F</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-RSA4096</td>
              <td align="left">060B6086480186FA6B50050220</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-X25519</td>
              <td align="left">060B6086480186FA6B50050221</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-P256</td>
              <td align="left">060B6086480186FA6B50050222</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-P384</td>
              <td align="left">060B6086480186FA6B50050223</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-brainpoolP256r1</td>
              <td align="left">060B6086480186FA6B50050224</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-ECDH-P384</td>
              <td align="left">060B6086480186FA6B50050225</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-ECDH-brainpoolP384r1</td>
              <td align="left">060B6086480186FA6B50050226</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-X448</td>
              <td align="left">060B6086480186FA6B50050227</td>
            </tr>
          </tbody>
        </table>
        <t>EDNOTE: these domain separators are based on the prototyping OIDs assigned on the Entrust arc. We will need to ask for IANA early allocation of these OIDs so that we can re-compute the domain separators over the final OIDs.</t>
      </section>
      <section anchor="rationale-for-choices">
        <name>Rationale for choices</name>
        <t>In generating the list of Composite algorithms, the following general guidance was used, however, during development of this specification several algorithms were added by direct request even though they do not fit this guidance.</t>
        <ul spacing="normal">
          <li>
            <t>Pair equivalent security levels between</t>
          </li>
          <li>
            <t>NIST-P-384 is CNSA approved <xref target="CNSA2.0"/> for all classification levels.</t>
          </li>
          <li>
            <t>521 bit curve not widely used.</t>
          </li>
          <li>
            <t>SHA256 and SHA512 generally have better adoption than SHA384.</t>
          </li>
        </ul>
        <t>A single invocation of SHA3 is known to behave as a dual-PRF, and thus is sufficient for use as a KDF, see <xref target="sec-cons-kem-combiner"/>, however SHA2 is not so must be wrapped in the HKDF construction.</t>
        <t>The lower security levels (i.e. ML-KEM768) are provided with HKDF-SHA2 as the KDF in order to facilitate implementations that do not have easy access to SHA3 outside of the ML-KEM function. Higher security levels (i.e. ML-KEM1024) are paired with SHA3 for computational efficiency except for one variant paired with HKDF-SHA384 for compliance with <xref target="CNSA2.0"/>, and the Edwards Curve (X25519 and X448) combinations are paired with SHA3 for compatibility with other similar specifications.</t>
        <t>While it may seem odd to use 256-bit hash functions at all security levels, this aligns with ML-KEM which produces a 256-bit shared secret key at all security levels. SHA-256 and SHA3-256 both have &gt;= 256 bits of (2nd) pre-image resistance, which is the required property for a KDF to provide 128 bits of security, as allowed in Table 3 of <xref target="SP.800-57pt1r5"/>.</t>
      </section>
      <section anchor="sect-rsaoaep-params">
        <name>RSA-OAEP Parameters</name>
        <t>Use of RSA-OAEP <xref target="RFC8017"/> within <tt>id-MLKEM768-RSA2048</tt>, <tt>id-MLKEM768-RSA3072</tt>, and <tt>id-MLKEM768-RSA4096</tt> requires additional specification.</t>
        <t>First, a quick note on the choice of RSA-OAEP as the supported RSA encryption primitive. RSA-KEM <xref target="RFC5990"/> is more straightforward to work with, but it has fairly limited adoption and therefore is of limited backwards compatibility value. Also, while RSA-PKCS#1v1.5 <xref target="RFC8017"/> is still everywhere, but hard to make secure and no longer FIPS-approved as of the end of 2023 <xref target="SP800-131Ar2"/>, so it is of limited forwards value. This leaves RSA-OAEP <xref target="RFC8017"/> as the remaining choice.</t>
        <t>The RSA component keys MUST be generated at the 2048-bit and 3072-bit security levels respectively.</t>
        <t>As with the other Composite ML-KEM algorithms, when <tt>id-MLKEM768-RSA2048</tt>, <tt>id-MLKEM768-RSA3072</tt>, or <tt>id-MLKEM-RSA4096</tt> is used in an AlgorithmIdentifier, the parameters MUST be absent. The RSA-OAEP SHALL be instantiated with the following hard-coded parameters which are the same for the 2048, 3072 and 4096 bit security levels.</t>
        <table anchor="rsa-oaep-params">
          <name>RSA-OAEP Parameters</name>
          <thead>
            <tr>
              <th align="left">RSAES-OAEP-params</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">hashAlgorithm</td>
              <td align="left">id-sha256</td>
            </tr>
            <tr>
              <td align="left">maskGenAlgorithm</td>
              <td align="left">mgf1SHA256Identifier</td>
            </tr>
            <tr>
              <td align="left">pSourceAlgorithm</td>
              <td align="left">pSpecifiedEmpty</td>
            </tr>
            <tr>
              <td align="left">ss_len</td>
              <td align="left">256 bits</td>
            </tr>
          </tbody>
        </table>
        <t>where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>id-sha256</tt> is defined in <xref target="RFC8017"/>.</t>
          </li>
          <li>
            <t><tt>mgf1SHA256Identifier</tt> is defined in <xref target="RFC4055"/>, which refers to the MFG1 function defined in <xref target="RFC8017"/> appendix B.2.1.</t>
          </li>
          <li>
            <t><tt>pSpecifiedEmpty</tt> is defined in <xref target="RFC8017"/> to indicate that the empty string is used for the label.</t>
          </li>
        </ul>
        <t>Note: The mask length, according to <xref target="RFC8017"/>, is <tt>k - hLen - 1</tt>, where <tt>k</tt> is the size of the RSA modulus. Since the choice of hash function and the RSA key size is fixed for each composite algorithm, implementations could choose to pre-compute and hard-code the mask length.</t>
      </section>
    </section>
    <section anchor="use-in-cms">
      <name>Use in CMS</name>
      <t>[EDNOTE: The convention in LAMPS is to specify algorithms and their CMS conventions in separate documents. Here we have presented them in the same document, but this section has been written so that it can easily be moved to a standalone document.]</t>
      <t>Composite ML-KEM algorithms MAY be employed for one or more recipients in the CMS enveloped-data content type <xref target="RFC5652"/>, the CMS authenticated-data content type <xref target="RFC5652"/>, or the CMS authenticated-enveloped-data content type <xref target="RFC5083"/>. In each case, the KEMRecipientInfo <xref target="RFC9629"/> is used with the chosen Composite ML-KEM Algorithm to securely transfer the content-encryption key from the originator to the recipient.</t>
      <t>All recommendations for using Composite ML-KEM in CMS are fully aligned with the use of ML-KEM in CMS <xref target="I-D.ietf-lamps-cms-kyber"/>.</t>
      <section anchor="underlying-components">
        <name>Underlying Components</name>
        <t>A compliant implementation MUST support the following algorithm combinations for the KEMRecipientInfo <tt>kdf</tt> and <tt>wrap</tt> fields when the corresponding Composite ML-KEM algorithm is listed in the KEMRecipientInfo <tt>kem</tt> field. The KDFs listed below align with the KDF used internally within the KEM combiner. An implementation MAY also support other key-derivation functions and other key-encryption algorithms within CMS KEMRecipientInfo and SHOULD use algorithms of equivalent strength or greater.</t>
        <table anchor="tab-cms-kdf-wrap">
          <name>Mandatory-to-implement pairings for CMS KDF and WRAP</name>
          <thead>
            <tr>
              <th align="left">Composite ML-KEM Algorithm</th>
              <th align="left">KDF</th>
              <th align="left">Wrap</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">id-MLKEM768-RSA2048</td>
              <td align="left">id-alg-hkdf-with-sha256</td>
              <td align="left">id-aes128-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-RSA3072</td>
              <td align="left">id-alg-hkdf-with-sha256</td>
              <td align="left">id-aes128-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-RSA4096</td>
              <td align="left">id-alg-hkdf-with-sha256</td>
              <td align="left">id-aes128-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-X25519</td>
              <td align="left">id-kmac256</td>
              <td align="left">id-aes128-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-P256</td>
              <td align="left">id-alg-hkdf-with-sha256</td>
              <td align="left">id-aes256-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-P384</td>
              <td align="left">id-alg-hkdf-with-sha256</td>
              <td align="left">id-aes256-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM768-ECDH-brainpoolP256r1</td>
              <td align="left">id-alg-hkdf-with-sha256</td>
              <td align="left">id-aes256-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-ECDH-P384</td>
              <td align="left">id-alg-hkdf-with-sha384</td>
              <td align="left">id-aes256-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-ECDH-brainpoolP384r1</td>
              <td align="left">id-kmac256</td>
              <td align="left">id-aes256-wrap</td>
            </tr>
            <tr>
              <td align="left">id-MLKEM1024-X448</td>
              <td align="left">id-kmac256</td>
              <td align="left">id-aes256-wrap</td>
            </tr>
          </tbody>
        </table>
        <t>Full specifications for the referenced algorithms can be found either further down in this section, or in <xref target="appdx_components"/>.</t>
        <t>Note that here we differ slightly from the internal KDF used within the KEM combiner in <xref target="sec-alg-ids"/> because <xref target="RFC9629"/> requires that the KDF listed in the KEMRecipientInfo <tt>kdf</tt> field must have an interface which accepts <tt>KDF(IKM, L, info)</tt>, so here we need to use KMAC and cannot directly use SHA3. Since we require 256-bits of (2nd) pre-image resistance, we use KMAC256 for the Composite ML-KEM algorithms with internally use SHA3-256, as aligned with Table 3 of <xref target="SP.800-57pt1r5"/>.</t>
        <section anchor="use-of-the-hkdf-based-key-derivation-function-within-cms">
          <name>Use of the HKDF-based Key Derivation Function within CMS</name>
          <t>Unlike within the Composite KEM Combiner function, When used as a KDF for CMS, HKDF requires use of the HKDF-Expand step so that it can accept the length parameter <tt>kekLength</tt> from CMS KEMRecipientInfo as the HKDF parameter <tt>L</tt>.</t>
          <t>The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) is defined in <xref target="RFC5869"/>. The HKDF function is a composition of the HKDF-Extract and HKDF-Expand functions.</t>
          <artwork><![CDATA[
HKDF(salt, IKM, info, L)
  = HKDF-Expand(HKDF-Extract(salt, IKM), info, L)
]]></artwork>
          <t>HKDF(salt, IKM, info, L) takes the following parameters:</t>
          <dl>
            <dt>salt:</dt>
            <dd>
              <t>optional salt value (a non-secret random value). In this document this parameter is left at its default value, which is the string of HashLen zeros.</t>
            </dd>
            <dt>IKM:</dt>
            <dd>
              <t>input keying material. In this document this is the shared secret outputted from the Encaps() or Decaps() functions.  This corresponds to the IKM KDF input from <xref section="5" sectionFormat="of" target="RFC9629"/>.</t>
            </dd>
            <dt>info:</dt>
            <dd>
              <t>optional context and application specific information. In this document this corresponds to the info KDF input from <xref section="5" sectionFormat="of" target="RFC9629"/>. This is the ASN.1 DER encoding of CMSORIforKEMOtherInfo.</t>
            </dd>
            <dt>L:</dt>
            <dd>
              <t>length of output keying material in octets. This corresponds to the L KDF input from <xref section="5" sectionFormat="of" target="RFC9629"/>, which is identified in the kekLength value from KEMRecipientInfo. Implementations MUST confirm that this value is consistent with the key size of the key-encryption algorithm.</t>
            </dd>
          </dl>
          <t>HKDF may be used with different hash functions, including SHA-256 and SHA-384 <xref target="FIPS.180-4"/>. The object identifier id-alg-hkdf-with-sha256 and id-alg-hkdf-with-sha384 are defined in <xref target="RFC8619"/>, and specify the use of HKDF with SHA-256 and SHA-384. The parameter field MUST be absent when this algorithm identifier is used to specify the KDF for ML-KEM in KemRecipientInfo.</t>
        </section>
        <section anchor="use-of-the-kmac-based-key-derivation-function-within-cms">
          <name>Use of the KMAC-based Key Derivation Function within CMS</name>
          <t>KMAC256-KDF is a KMAC-based KDF specified for use in CMS in <xref target="I-D.ietf-lamps-cms-sha3-hash"/>. The definition of KMAC is copied here for convenience.  Here, KMAC# indicates the use of either KMAC128-KDF or KMAC256-KDF, although only KMAC256 is used in this specification.</t>
          <t>KMAC#(K, X, L, S) takes the following parameters:</t>
          <ul empty="true">
            <li>
              <t>K: the input key-derivation key.  In this document this is the shared secret outputted from the Encaps() or Decaps() functions.  This corresponds to the IKM KDF input from Section 5 of <xref target="RFC9629"/>.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>X: the context, corresponding to the info KDF input from Section 5 of <xref target="RFC9629"/>. This is the ASN.1 DER encoding of CMSORIforKEMOtherInfo.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>L: the output length, in bits.  This corresponds to the L KDF input from Section 5 of <xref target="RFC9629"/>, which is identified in the kekLength value from KEMRecipientInfo.  The L KDF input and kekLength values are specified in octets while this L parameter is specified in bits.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>S: the optional customization label.  In this document this parameter is unused, that is it is the zero-length string "".</t>
            </li>
          </ul>
          <t>The object identifier for KMAC256-KDF is id-kmac256, as defined in <xref target="I-D.ietf-lamps-cms-sha3-hash"/>.</t>
          <t>Since the customization label to KMAC# is not used, the parameter field MUST be absent when id-kmac256 is used as part of an algorithm identifier specifying the KDF to use for Composite ML-KEM in KemRecipientInfo.</t>
        </section>
      </section>
      <section anchor="sec-using-recipientInfo">
        <name>RecipientInfo Conventions</name>
        <t>When Composite ML-KEM is employed for a recipient, the RecipientInfo alternative for that recipient MUST be OtherRecipientInfo using the KEMRecipientInfo structure as defined in <xref target="RFC9629"/>.</t>
        <t>The fields of the KEMRecipientInfo MUST have the following values:</t>
        <ul empty="true">
          <li>
            <t>version is the syntax version number; it MUST be 0.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>rid identifies the recipient's certificate or public key.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>kem identifies the KEM algorithm; it MUST contain one of the Composite ML-KEM identifiers listed in <xref target="sec-alg-ids"/>.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>kemct is the ciphertext produced for this recipient.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>kdf identifies the key-derivation algorithm. Note that the Key Derivation Function (KDF) used for CMS RecipientInfo process (to calculate the RecipientInfo KEK key) MAY be different than the KDF used within the Composite ML-KEM algorithm (to calculate the shared secret ss) and MAY also be different from any KDFs used internally within a component algorithm.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>kekLength is the size of the key-encryption key in octets.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>ukm is an optional random input to the key-derivation function. ML-KEM doesn't place any requirements on the ukm contents.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>wrap identifies a key-encryption algorithm used to encrypt the content-encryption key.</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>encryptedKey is the result of encryptiong the CEK with the KEK.</t>
          </li>
        </ul>
        <!-- End of recipientinfo conventions section -->

</section>
      <section anchor="certificate-conventions">
        <name>Certificate Conventions</name>
        <t>The conventions specified in this section augment RFC 5280 <xref target="RFC5280"/>.</t>
        <t>The willingness to accept a Composite ML-KEM Algorithm MAY be signaled by the use of the SMIMECapabilities Attribute as specified in Section 2.5.2. of <xref target="RFC8551"/> or the SMIMECapabilities certificate extension as specified in <xref target="RFC4262"/>.</t>
        <t>The intended application for the public key MAY be indicated in the key usage certificate extension as specified in Section 4.2.1.3 of <xref target="RFC5280"/>. If the keyUsage extension is present in a certificate that conveys a Composite ML-KEM public key, then the key usage extension MUST contain only the following value:</t>
        <artwork><![CDATA[
keyEncipherment
]]></artwork>
        <t>The digitalSignature and dataEncipherment values MUST NOT be present. That is, a public key intended to be employed only with a Composite ML-KEM algorithm MUST NOT also be employed for data encryption or for digital signatures. This requirement does not carry any particular security consideration; only the convention that KEM keys be identified with the <tt>keyEncipherment</tt> key usage.</t>
      </section>
      <section anchor="smimecapabilities-attribute-conventions">
        <name>SMIMECapabilities Attribute Conventions</name>
        <t>Section 2.5.2 of <xref target="RFC8551"/> defines the SMIMECapabilities attribute to announce a partial list of algorithms that an S/MIME implementation can support. When constructing a CMS signed-data content type <xref target="RFC5652"/>, a compliant implementation MAY include the SMIMECapabilities attribute that announces support for the RSA-OAEP Algorithm.</t>
        <t>The SMIMECapability SEQUENCE representing a Composite ML-KEM Algorithm MUST include the appropriate object identifier as per <xref target="tab-kem-algs"/> in the capabilityID field.</t>
      </section>
    </section>
    <section anchor="sec-asn1-module">
      <name>ASN.1 Module</name>
      <sourcecode type="ASN.1"><![CDATA[
<CODE STARTS>

Composite-MLKEM-2025
      { iso(1) identified-organization(3) dod(6) internet(1) 
        security(5) mechanisms(5) pkix(7) id-mod(0) 
        id-mod-composite-mlkem-2025(TBDMOD) }

DEFINITIONS IMPLICIT TAGS ::= BEGIN

EXPORTS ALL;

IMPORTS

PUBLIC-KEY, AlgorithmIdentifier{}, SMIME-CAPS
  FROM AlgorithmInformation-2009  -- RFC 5912 [X509ASN1]
      { iso(1) identified-organization(3) dod(6) internet(1)
        security(5) mechanisms(5) pkix(7) id-mod(0)
        id-mod-algorithmInformation-02(58) }

KEM-ALGORITHM
  FROM KEMAlgorithmInformation-2023
      { iso(1) identified-organization(3) dod(6) internet(1)
        security(5) mechanisms(5) pkix(7) id-mod(0)
        id-mod-kemAlgorithmInformation-2023(109) }
;


--
-- Object Identifiers
--

-- Defined in ITU-T X.690
der OBJECT IDENTIFIER ::=
  {joint-iso-itu-t asn1(1) ber-derived(2) distinguished-encoding(1)}

--
-- Composite KEM basic structures
--

-- When a CompositeKEMPublicKey is used with an RSA public key, the BIT STRING itself is generated
-- by the concatenation of a raw ML-KEM key according to {{I-D.ietf-lamps-kyber-certificates}} and
-- an RSAPublicKey (which is a DER encoded RSAPublicKey).

-- When a CompositeKEMPublicKey is used with an EC public key, the BIT STRING itself is generated
-- by the concatenation of a raw ML-KEM key according to {{I-D.ietf-lamps-kyber-certificates}} and
-- an ECDHPublicKey (which is a DER encoded ECPoint).

-- When a CompositeKEMPublicKey is used with an Edwards public key, the BIT STRING itself is generated
-- by the concatenation of a raw ML-KEM key according to {{I-D.ietf-lamps-kyber-certificates}} and
-- a raw Edwards public key according to [RFC8410].

CompositeKEMPublicKey ::= BIT STRING

-- When a CompositeKEMPrivateKey is used with an RSA private key, the BIT STRING itself is generated
-- by the concatenation of a raw ML-KEM key according to {{I-D.ietf-lamps-kyber-certificates}} and
-- an RSAPrivateKey (which is a DER encoded RSAPrivateKey).

-- When a CompositeKEMPrivateKey is used with an EC private key, the BIT STRING itself is generated
-- by the concatenation of a raw ML-KEM key according to {{I-D.ietf-lamps-kyber-certificates}} and
-- an ECDHPrivateKey (which is a DER encoded ECPoint).

-- When a CompositeKEMPrivateKey is used with an Edwards private key, the BIT STRING itself is generated
-- by the concatenation of a raw ML-KEM key according to {{I-D.ietf-lamps-kyber-certificates}} and
-- a raw Edwards private key according to [RFC8410].

CompositeKEMPrivateKey ::= OCTET STRING

-- Composite Ciphertext Value is just an OCTET STRING and is a concatenation of the component ciphertext
-- values.

CompositeCiphertextValue ::= OCTET STRING

--
-- Information Object Classes
--

pk-CompositeKEM {OBJECT IDENTIFIER:id, PublicKeyType}
  PUBLIC-KEY ::= {
    IDENTIFIER id
    KEY PublicKeyType
    PARAMS ARE absent
    CERT-KEY-USAGE { keyEncipherment }
  }

kema-CompositeKEM {
  OBJECT IDENTIFIER:id,
    PUBLIC-KEY:publicKeyType }
    KEM-ALGORITHM ::= {
         IDENTIFIER id
         VALUE CompositeCiphertextValue
         PARAMS ARE absent
         PUBLIC-KEYS { publicKeyType }
         SMIME-CAPS { IDENTIFIED BY id }
        }



--
-- Composite KEM Algorithms
--


-- TODO: OID to be replaced by IANA
id-MLKEM768-RSA2048 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 30 }

pk-MLKEM768-RSA2048 PUBLIC-KEY ::= 
  pk-CompositeKEM { 
    id-MLKEM768-RSA2048, 
    CompositeKEMPublicKey }

kema-MLKEM768-RSA2048 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM768-RSA2048, 
      pk-MLKEM768-RSA2048 }



-- TODO: OID to be replaced by IANA
id-MLKEM768-RSA3072 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 31 }

pk-MLKEM768-RSA3072 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM768-RSA3072, 
    CompositeKEMPublicKey }

kema-MLKEM768-RSA3072 KEM-ALGORITHM ::=
    kema-CompositeKEM{
      id-MLKEM768-RSA3072, 
      pk-MLKEM768-RSA3072 }



-- TODO: OID to be replaced by IANA
id-MLKEM768-RSA4096 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 32 }

pk-MLKEM768-RSA4096 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM768-RSA4096, 
    CompositeKEMPublicKey }

kema-MLKEM768-RSA4096 KEM-ALGORITHM ::=
    kema-CompositeKEM{
      id-MLKEM768-RSA4096, 
      pk-MLKEM768-RSA4096 }


-- TODO: OID to be replaced by IANA
id-MLKEM768-ECDH-P384 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 33 }

pk-MLKEM768-ECDH-P384 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM768-ECDH-P384, 
    CompositeKEMPublicKey }

kema-MLKEM768-ECDH-P384 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM768-ECDH-P384, 
      pk-MLKEM768-ECDH-P384 }


-- TODO: OID to be replaced by IANA
id-MLKEM768-ECDH-brainpoolP256r1 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 34 }

pk-MLKEM768-ECDH-brainpoolP256r1 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM768-ECDH-brainpoolP256r1, 
    CompositeKEMPublicKey }

kema-MLKEM768-ECDH-brainpoolP256r1 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM768-ECDH-brainpoolP256r1, 
      pk-MLKEM768-ECDH-brainpoolP256r1 }


-- TODO: OID to be replaced by IANA
id-MLKEM768-X25519 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1)
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 35 }

pk-MLKEM768-X25519 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM768-X25519, 
    CompositeKEMPublicKey }

kema-MLKEM768-X25519 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM768-X25519, 
      pk-MLKEM768-X25519 }



-- TODO: OID to be replaced by IANA
id-MLKEM1024-ECDH-P384 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1)
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 36 }

pk-MLKEM1024-ECDH-P384 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM1024-ECDH-P384, 
    CompositeKEMPublicKey }

kema-MLKEM1024-ECDH-P384 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM1024-ECDH-P384, 
      pk-MLKEM1024-ECDH-P384 }


-- TODO: OID to be replaced by IANA
id-MLKEM1024-ECDH-brainpoolP384r1 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 37 }

pk-MLKEM1024-ECDH-brainpoolP384r1 PUBLIC-KEY ::= 
  pk-CompositeKEM{
    id-MLKEM1024-ECDH-brainpoolP384r1, 
    CompositeKEMPublicKey }

kema-MLKEM1024-ECDH-brainpoolP384r1 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM1024-ECDH-brainpoolP384r1, 
      pk-MLKEM1024-ECDH-brainpoolP384r1 }
      

-- TODO: OID to be replaced by IANA
id-MLKEM1024-X448 OBJECT IDENTIFIER ::= {
  joint-iso-itu-t(2) country(16) us(840) organization(1) 
  entrust(114027) algorithm(80) explicitcomposite(5) kem(2) 38 }

pk-MLKEM1024-X448 PUBLIC-KEY ::= 
  pk-CompositeKEM {
    id-MLKEM1024-X448, 
    CompositeKEMPublicKey }

kema-MLKEM1024-X448 KEM-ALGORITHM ::= 
    kema-CompositeKEM{
      id-MLKEM1024-X448, 
      pk-MLKEM1024-X448 }


--
-- Expand the S/MIME capabilities set used by CMS [RFC5911]
--

-- TODO: this doesn't compile, error:
-- "The referenced object in the 'ValueFromObject' 
-- syntax with the field '&smimeCaps' is invalid or does not exist."
-- We need help from an SMIME expert

SMimeCaps SMIME-CAPS ::=
    { kema-MLKEM768-RSA2048.&smimeCaps |
      kema-MLKEM768-RSA3072.&smimeCaps |
      kema-MLKEM768-RSA4096.&smimeCaps |
      kema-MLKEM768-ECDH-P384.&smimeCaps |
      kema-MLKEM768-ECDH-brainpoolP256r1.&smimeCaps |
      kema-MLKEM768-X25519.&smimeCaps |
      kema-MLKEM1024-ECDH-P384.&smimeCaps |
      kema-MLKEM1024-ECDH-brainpoolP384r1.&smimeCaps |
      kema-MLKEM1024-X448.&smimeCaps,
      ... }

END

<CODE ENDS>

]]></sourcecode>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <section anchor="object-identifier-allocations">
        <name>Object Identifier Allocations</name>
        <t>EDNOTE to IANA: OIDs will need to be replaced in both the ASN.1 module and in <xref target="tab-kem-algs"/>.</t>
        <section anchor="module-registration-smi-security-for-pkix-module-identifier">
          <name>Module Registration - SMI Security for PKIX Module Identifier</name>
          <ul spacing="normal">
            <li>
              <t>Decimal: IANA Assigned - <strong>Replace TBDMOD</strong></t>
            </li>
            <li>
              <t>Description: Composite-KEM-2023 - id-mod-composite-kems</t>
            </li>
            <li>
              <t>References: This Document</t>
            </li>
          </ul>
        </section>
        <section anchor="object-identifier-registrations-smi-security-for-pkix-algorithms">
          <name>Object Identifier Registrations - SMI Security for PKIX Algorithms</name>
          <ul spacing="normal">
            <li>
              <t>id-raw-key</t>
            </li>
            <li>
              <t>Decimal: IANA Assigned</t>
            </li>
            <li>
              <t>Description: Designates a public key BIT STRING with no ASN.1 structure.</t>
            </li>
            <li>
              <t>References: This Document</t>
            </li>
            <li>
              <t>id-MLKEM768-RSA2048
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-RSA2048</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM768-RSA3072
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-RSA3072</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM768-RSA4096
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-RSA4096</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM768-ECDH-P256
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-ECDH-P256</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM768-ECDH-P384
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-ECDH-P384</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM768-ECDH-brainpoolP256r1
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-ECDH-brainpoolP256r1</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM768-X25519
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM768-X25519</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM1024-ECDH-P384
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM1024-ECDH-P384</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM1024-ECDH-brainpoolP384r1
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM1024-ECDH-brainpoolP384r1</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
            <li>
              <t>id-MLKEM1024-X448
              </t>
              <ul spacing="normal">
                <li>
                  <t>Decimal: IANA Assigned</t>
                </li>
                <li>
                  <t>Description: id-MLKEM1024-X448</t>
                </li>
                <li>
                  <t>References: This Document</t>
                </li>
              </ul>
            </li>
          </ul>
          <!-- End of IANA Considerations section -->

</section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="why-hybrids">
        <name>Why Hybrids?</name>
        <t>In broad terms, a PQ/T Hybrid can be used either to provide dual-algorithm security or to provide migration flexibility. Let's quickly explore both.</t>
        <t>Dual-algorithm security. The general idea is that the data is proctected by two algorithms such that an attacker would need to break both in order to compromise the data. As with most of cryptography, this property is easy to state in general terms, but becomes more complicated when expressed in formalisms. The following sections go into more detail here.</t>
        <t>Migration flexibility. Some PQ/T hybrids exist to provide a sort of "OR" mode where the client can choose to use one algorithm or the other or both. The intention is that the PQ/T hybrid mechanism builds in backwards compatibility to allow legacy and upgraded clients to co-exist and communicate. The Composites presented in this specification do not provide this since they operate in a strict "AND" mode, but they do provide codebase migration flexibility. Consider that an organization has today a mature, validated, certified, hardened implementation of RSA or ECC. Composites allow them to add to this an ML-KEM implementation which immediately starts providing benefits against harvest-now-decrypt-later attacks even if that ML-KEM implemtation is still experimental, non-validated, non-certified, non-hardened implementation. More details of obtaining FIPS certification of a composite algorithm can be found in <xref target="sec-fips"/>.</t>
      </section>
      <section anchor="sec-cons-kem-combiner">
        <name>KEM Combiner</name>
        <t>The following KEM combiner construction is as follows is used by both <tt>Composite-ML-KEM.Encap()</tt> and <tt>Composite-ML-KEM.Decap()</tt> and is split out here for easier analysis.</t>
        <figure anchor="code-generic-kem-combiner">
          <name>KEM combiner construction</name>
          <artwork><![CDATA[
  KDF(mlkemSS || tradSS || tradCT || tradPK || Domain)
]]></artwork>
        </figure>
        <t>where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>KDF(message)</tt> represents a key derivation function suitable to the chosen KEMs according to <xref target="tab-kem-algs"/>. All KDFs produce a 256-bit shared secret key, which matches ML-KEM.</t>
          </li>
          <li>
            <t><tt>mlkemSS</tt> is the shared secret key from the ML-KEM component.</t>
          </li>
          <li>
            <t><tt>tradSS</tt> is the shared secret from the traditional component (elliptic curve or RSA).</t>
          </li>
          <li>
            <t><tt>tradCT</tt> is the ciphertext from the traditional component (elliptic curve or RSA).</t>
          </li>
          <li>
            <t><tt>tradPK</tt> is the public key of the traditional component (elliptic curve or RSA).</t>
          </li>
          <li>
            <t><tt>Domain</tt> is the DER encoded value of the object identifier of the Composite ML-KEM algorithm as listed in <xref target="sec-domsep-values"/>.</t>
          </li>
          <li>
            <t><tt>||</tt> represents concatenation.</t>
          </li>
        </ul>
        <t>Each registered Composite ML-KEM algorithm specifies the choice of <tt>KDF</tt> and <tt>Domain</tt> to be used in <xref target="sec-alg-ids"/> and <xref target="sec-domsep-values"/> below. Given that each Composite ML-KEM algorithm fully specifies the component algorithms, including for example the size of the RSA modulus, all inputs to the KEM combiner are fixed-size and thus do not require length-prefixing. The <tt>CompositeKEM.Decap()</tt> specified in <xref target="sect-composite-decaps"/> adds further error handling to protect the KEM combiner from malicious inputs.</t>
        <t>The primary security property of the KEM combiner is that it preserves IND-CCA2 of the overall Composite ML-KEM so long as at least one component is IND-CCA2 <xref target="GHP18">[X-Wing]</xref>. Additionally, we also need to consider the case where one of the component algorithms is completely broken; that the private key is known to an attacker, or worse that the public key, private key, and ciphertext are manipulated by the attacker. In this case, we rely on the construction of the KEM combiner to ensure that the value of the other shared secret cannot be leaked or the combined shared secret predicted via manipulation of the broken algorithm. The following sections continue this discussion.</t>
        <t>Note that length-tagging of the inputs to the KDF is not required:</t>
        <ul spacing="normal">
          <li>
            <t><tt>mlkemSS</tt> is always 32 bytes.</t>
          </li>
          <li>
            <t><tt>tradSS</tt> in the case of ECDH this is derived by the decapsulator and therefore the length is not controlled by the attacker, however in the case of RSA-OAEP this value is directly chosen by the sender and both the length and content could be freely chosen by an attacker.</t>
          </li>
          <li>
            <t><tt>tradCT</tt> is either an elliptic curve public key or an RSA-OAEP ciphertext which is required to have its length checked by step 1b of RSAES-OAEP-DECRYPT in <xref target="RFC8017"/>.</t>
          </li>
          <li>
            <t><tt>tradPK</tt> is the public key of the traditional component (elliptic curve or RSA) and therefore fixed-length.</t>
          </li>
          <li>
            <t><tt>Domain</tt> is a fixed value specified in this document.</t>
          </li>
        </ul>
        <t>In the case of a composite with ECDH, all inputs to the KDF are fixed-length.
In the case of a composite with RSA-OAEP the <tt>tradSS</tt> is controlled by the attacker but this still does not require length tagging because, unless there is a weakness in the KDF, length-manipulation of only one input is not sufficient to trivially produce collisions.</t>
        <section anchor="security-of-the-hybrid-scheme">
          <name>Security of the hybrid scheme</name>
          <t>Informally, a Composite ML-KEM algorithm is secure if the combiner (HKDF-SHA2 or SHA3) is secure, and either ML-KEM is secure or the traditional component (RSA-OAEP, ECDH, or X25519) is secure.</t>
          <t>The security of ML-KEM and ECDH hybrids is covered in [<xref target="X-Wing"/>] and requires that the first KEM component (ML-KEM in this construction) is IND-CCA and second ciphertext preimage resistant (C2PRI) and that the second traditional component is IND-CCA. This design choice improves performance by not including the large ML-KEM public key and ciphertext, but means that an implementation error in the ML-KEM component that affects the ciphertext check step of the FO transform could result in the overall composite no longer achieving IND-CCA2 security.</t>
          <t>The QSF framework presented in [<xref target="X-Wing"/>] is extended to cover RSA-OAEP as the traditional algorithm in place of ECDH by noting that RSA-OAEP is also IND-CCA secure <xref target="RFC8017"/>.</t>
          <t>Note that X-Wing uses SHA3 as the combiner KDF whereas Composite ML-KEM uses either SHA3 or HKDF-SHA2 which are interchangeable in the X-Wing proof since both behave as random oracles under multiple concatenated inputs.</t>
          <t>The Composite combiner cannot be assumed to be secure when used with different KEMs and a more cautious approach would bind the public key and ciphertext of the first KEM as well.</t>
        </section>
        <section anchor="sec-cons-ct-collision">
          <name>Second pre-image resistance of component KEMs</name>
          <t>The notion of a second pre-image resistant KEM is defined in <xref target="X-Wing"/> being the property that it is computationally difficult to find two different ciphertexts <tt>c != c'</tt> that will decapsulate to the same shared secret under the same public key. For the purposes of a hybrid KEM combiner, this property means that given two composite ciphertexts <tt>(c1, c2)</tt> and <tt>(c1', c2')</tt>, we must obtain a unique overall shared secret so long as either <tt>c1 != c1'</tt> or <tt>c2 != c2'</tt> -- i.e. the overall Composite ML-KEM is second pre-image resistant, and therefore secure so long as one of the component KEMs is secure.</t>
          <t>In <xref target="X-Wing"/> it is proven that ML-KEM is a second pre-image resistant KEM and therefore the ML-KEM ciphertext can safely be omitted from the KEM combiner. Note that this makes a fundamental assumption on ML-KEM remaining ciphertext second pre-image resistant, and therefore this formulation of KEM combiner does not fully protect against implementation errors in the ML-KEM component -- particularly around the ciphertext check step of the Fujisaki-Okamoto transform -- which could trivially lead to second ciphertext pre-image attacks that break the IND-CCA2 security of the ML-KEM component and of the overall Composite ML-KEM. This could be more fully mitigated by binding the ML-KEM ciphertext in the combiner, but a design decision was made to settle for protection against algorithmic attacks and not implementation attacks against ML-KEM in order to increase performance.</t>
          <t>However, since neither RSA-OAEP nor ECDH guarantee second pre-image resistance at all, even in a correct implementation, these ciphertexts are bound to the key derivation in order to guarantee that <tt>c != c'</tt> will yield a unique ciphertext, and thus restoring second pre-image resistance to the overall Composite ML-KEM.</t>
        </section>
        <section anchor="sha3-vs-hkdf-sha2">
          <name>SHA3 vs HKDF-SHA2</name>
          <t>In order to achieve the desired security property that the Composite ML-KEM is IND-CCA2 whenever at least one of the component KEMs is, the KDF used in the KEM combiner needs to possess collision and second pre-image resistance with respect to each of its inputs independently; a property sometimes called "dual-PRF" <xref target="Aviram22"/>. Collision and second-pre-image resistance protects against compromise of one component algorithm from resulting in the ability to construct multiple different ciphertexts which result in the same shared secret. Pre-image resistance protects against compromise of one component algorithm being used to attack and learn the value of the other shared secret.</t>
          <t>SHA3 is known to have all of the necessary dual-PRF properties <xref target="X-Wing"/>, but SHA2 does not and therefore all SHA2-based constructions MUST use SHA2 within an HMAC construction such as HKDF-SHA2 <xref target="GHP18"/>.</t>
        </section>
        <section anchor="generifying-this-construction">
          <name>Generifying this construction</name>
          <t>It should be clear that the security analysis of the presented KEM combiner construction relies heavily on the specific choices of component algorithms and combiner KDF, and this combiner construction SHOULD NOT by applied to any other combination of ciphers without performing the appropriate security analysis.</t>
        </section>
      </section>
      <section anchor="sec-cons-key-reuse">
        <name>Key Reuse</name>
        <t>When using single-algorithm cryptography, the best practice is to always generate fresh keying material for each purpose, for example when renewing a certificate, or obtaining both a TLS and S/MIME certificate for the same device, however in practice key reuse in such scenarios is not always catastrophic to security and therefore often tolerated. With composite keys we have a much stricter security requirement. However this reasoning does not hold in the PQ / Traditional hybrid setting.</t>
        <t>Within the broader context of PQ / Traditional hybrids, we need to consider new attack surfaces that arise due to the hybrid constructions and did not exist in single-algorithm contexts. One of these is key reuse where the component keys within a hybrid are also used by themselves within a single-algorithm context. For example, it might be tempting for an operator to take already-deployed RSA keys and add an ML-KEM key to them to form a hybrid. Within a hybrid signature context this leads to a class of attacks referred to as "stripping attacks" where one component signature can be extracted and presented as a single-algorithm signature. Hybrid KEMs using a concatenation-style KEM combiner, as is done in this document, do not have the analogous attack surface because even if an attacker is able to extract and decrypt one of the component ciphertexts, this will yield a different shared secret than the overall shared secret derived from the composite, so any subsequent symmetric cryptographic operations will fail. However there is still a risk of key reuse which relates to certificate revocation, as well as general key reuse security issues.</t>
        <t>Upon receiving a new certificate enrollment request, many certification authorities will check if the requested public key has been previously revoked due to key compromise. Often a CA will perform this check by using the public key hash. Therefore, even if both components of a composite have been previously revoked, the CA may only check the hash of the combined composite key and not find the revocations. Therefore, it is RECOMMENDED to avoid key reuse and always generate fresh component keys for a new composite. It is also RECOMMENDED that CAs performing revocation checks on a composite key should also check both component keys independently.</t>
      </section>
      <section anchor="decapsulation-failure">
        <name>Decapsulation failure</name>
        <t>Provided all inputs are well-formed, the key establishment procedure of ML-KEM will never explicitly fail. Specifically, the ML-KEM.Encaps and ML-KEM.Decaps algorithms from <xref target="FIPS.203"/> will always output a value with the same data type as a shared secret key, and will never output an error or failure symbol. However, it is possible (though extremely unlikely) that the process will fail in the sense that ML-KEM.Encaps and ML-KEM.Decaps will produce different outputs, even though both of them are behaving honestly and no adversarial interference is present. In this case, the sender and recipient clearly did not succeed in producing a shared secret key. This event is called a decapsulation failure. Estimates for the decapsulation failure probability (or rate) for each of the ML-KEM parameter sets are provided in Table 1  of <xref target="FIPS.203"/> and reproduced here in <xref target="tab-mlkem-failure-rate"/>.</t>
        <table anchor="tab-mlkem-failure-rate">
          <name>ML-KEM decapsulation failure rates</name>
          <thead>
            <tr>
              <th align="left">Parameter set</th>
              <th align="left">Decapsulation failure rate</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ML-KEM-512</td>
              <td align="left">2^(-139)</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-768</td>
              <td align="left">2^(-164)</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-1024</td>
              <td align="left">2^(-174)</td>
            </tr>
          </tbody>
        </table>
        <t>In the case of ML-KEM decapsulation failure, Composite ML-KEM MUST preserve the same behaviour and return a well-formed output.</t>
      </section>
      <section anchor="policy-for-deprecated-and-acceptable-algorithms">
        <name>Policy for Deprecated and Acceptable Algorithms</name>
        <t>Traditionally, a public key or certificate contains a single cryptographic algorithm. If and when an algorithm becomes deprecated (for example, RSA-512, or SHA1), the path to deprecating it and removing it from operational environments is, at least is principle, straightforward.</t>
        <t>In the composite model this is less obvious since implementers may decide that certain cryptographic algorithms have complementary security properties and are acceptable in combination even though one or both algorithms are deprecated for individual use. As such, a single composite public key or certificate may contain a mixture of deprecated and non-deprecated algorithms.</t>
        <t>Since composite algorithms are registered independently of their component algorithms, their deprecation can be handled independently from that of their component algorithms. For example a cryptographic policy might continue to allow <tt>id-MLKEM512-ECDH-P256</tt> even after ECDH-P256 is deprecated.</t>
        <t>The Composite ML-KEM design specified in this document, and especially that of the KEM combiner specified in this document, and discussed in <xref target="sec-cons-kem-combiner"/>, means that the overall Composite ML-KEM algorithm should be considered to have the security strength of the strongest of its component algorithms; i.e. as long as one component algorithm remains strong, then the overall composite algorithm remains strong.</t>
        <!-- End of Security Considerations section -->

</section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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="RFC4055" target="https://www.rfc-editor.org/info/rfc4055" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4055.xml">
          <front>
            <title>Additional Algorithms and Identifiers for RSA Cryptography for use in the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>This document supplements RFC 3279. It describes the conventions for using the RSA Probabilistic Signature Scheme (RSASSA-PSS) signature algorithm, the RSA Encryption Scheme - Optimal Asymmetric Encryption Padding (RSAES-OAEP) key transport algorithm and additional one-way hash functions with the Public-Key Cryptography Standards (PKCS) #1 version 1.5 signature algorithm in the Internet X.509 Public Key Infrastructure (PKI). Encoding formats, algorithm identifiers, and parameter formats are specified. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4055"/>
          <seriesInfo name="DOI" value="10.17487/RFC4055"/>
        </reference>
        <reference anchor="RFC5280" target="https://www.rfc-editor.org/info/rfc5280" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5280"/>
          <seriesInfo name="DOI" value="10.17487/RFC5280"/>
        </reference>
        <reference anchor="RFC5480" target="https://www.rfc-editor.org/info/rfc5480" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5480.xml">
          <front>
            <title>Elliptic Curve Cryptography Subject Public Key Information</title>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <author fullname="D. Brown" initials="D." surname="Brown"/>
            <author fullname="K. Yiu" initials="K." surname="Yiu"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="T. Polk" initials="T." surname="Polk"/>
            <date month="March" year="2009"/>
            <abstract>
              <t>This document specifies the syntax and semantics for the Subject Public Key Information field in certificates that support Elliptic Curve Cryptography. This document updates Sections 2.3.5 and 5, and the ASN.1 module of "Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 3279. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5480"/>
          <seriesInfo name="DOI" value="10.17487/RFC5480"/>
        </reference>
        <reference anchor="RFC5652" target="https://www.rfc-editor.org/info/rfc5652" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5652.xml">
          <front>
            <title>Cryptographic Message Syntax (CMS)</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document describes the Cryptographic Message Syntax (CMS). This syntax is used to digitally sign, digest, authenticate, or encrypt arbitrary message content. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="70"/>
          <seriesInfo name="RFC" value="5652"/>
          <seriesInfo name="DOI" value="10.17487/RFC5652"/>
        </reference>
        <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5869.xml">
          <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="RFC5958" target="https://www.rfc-editor.org/info/rfc5958" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5958.xml">
          <front>
            <title>Asymmetric Key Packages</title>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>This document defines the syntax for private-key information and a content type for it. Private-key information includes a private key for a specified public-key algorithm and a set of attributes. The Cryptographic Message Syntax (CMS), as defined in RFC 5652, can be used to digitally sign, digest, authenticate, or encrypt the asymmetric key format content type. This document obsoletes RFC 5208. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5958"/>
          <seriesInfo name="DOI" value="10.17487/RFC5958"/>
        </reference>
        <reference anchor="RFC6234" target="https://www.rfc-editor.org/info/rfc6234" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6234.xml">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC8017" target="https://www.rfc-editor.org/info/rfc8017" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8017.xml">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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="RFC8410" target="https://www.rfc-editor.org/info/rfc8410" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8410.xml">
          <front>
            <title>Algorithm Identifiers for Ed25519, Ed448, X25519, and X448 for Use in the Internet X.509 Public Key Infrastructure</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies algorithm identifiers and ASN.1 encoding formats for elliptic curve constructs using the curve25519 and curve448 curves. The signature algorithms covered are Ed25519 and Ed448. The key agreement algorithms covered are X25519 and X448. The encoding for public key, private key, and Edwards-curve Digital Signature Algorithm (EdDSA) structures is provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8410"/>
          <seriesInfo name="DOI" value="10.17487/RFC8410"/>
        </reference>
        <reference anchor="RFC8411" target="https://www.rfc-editor.org/info/rfc8411" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8411.xml">
          <front>
            <title>IANA Registration for the Cryptographic Algorithm Object Identifier Range</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <author fullname="R. Andrews" initials="R." surname="Andrews"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>When the Curdle Security Working Group was chartered, a range of object identifiers was donated by DigiCert, Inc. for the purpose of registering the Edwards Elliptic Curve key agreement and signature algorithms. This donated set of OIDs allowed for shorter values than would be possible using the existing S/MIME or PKIX arcs. This document describes the donated range and the identifiers that were assigned from that range, transfers control of that range to IANA, and establishes IANA allocation policies for any future assignments within that range.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8411"/>
          <seriesInfo name="DOI" value="10.17487/RFC8411"/>
        </reference>
        <reference anchor="RFC8619" target="https://www.rfc-editor.org/info/rfc8619" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8619.xml">
          <front>
            <title>Algorithm Identifiers for the HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>RFC 5869 specifies the HMAC-based Extract-and-Expand Key Derivation Function (HKDF) algorithm. This document assigns algorithm identifiers to the HKDF algorithm when used with three common one-way hash functions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8619"/>
          <seriesInfo name="DOI" value="10.17487/RFC8619"/>
        </reference>
        <reference anchor="RFC9629" target="https://www.rfc-editor.org/info/rfc9629" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9629.xml">
          <front>
            <title>Using Key Encapsulation Mechanism (KEM) Algorithms in the Cryptographic Message Syntax (CMS)</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="J. Gray" initials="J." surname="Gray"/>
            <author fullname="T. Okubo" initials="T." surname="Okubo"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>The Cryptographic Message Syntax (CMS) supports key transport and key agreement algorithms. In recent years, cryptographers have been specifying Key Encapsulation Mechanism (KEM) algorithms, including quantum-secure KEM algorithms. This document defines conventions for the use of KEM algorithms by the originator and recipients to encrypt and decrypt CMS content. This document updates RFC 5652.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9629"/>
          <seriesInfo name="DOI" value="10.17487/RFC9629"/>
        </reference>
        <reference anchor="I-D.ietf-lamps-cms-sha3-hash" target="https://datatracker.ietf.org/doc/html/draft-ietf-lamps-cms-sha3-hash-04" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-lamps-cms-sha3-hash-04.xml">
          <front>
            <title>Use of the SHA3 One-way Hash Functions in the Cryptographic Message Syntax (CMS)</title>
            <author fullname="Russ Housley" initials="R." surname="Housley">
              <organization>Vigil Security, LLC</organization>
            </author>
            <date day="16" month="May" year="2024"/>
            <abstract>
              <t>This document describes the conventions for using the one-way hash functions in the SHA3 family with the Cryptographic Message Syntax (CMS). The SHA3 family can be used as a message digest algorithm, as part of a signature algorithm, as part of a message authentication code, or part of a key derivation function.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-cms-sha3-hash-04"/>
        </reference>
        <reference anchor="I-D.ietf-lamps-kyber-certificates" target="https://datatracker.ietf.org/doc/html/draft-ietf-lamps-kyber-certificates-06" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-lamps-kyber-certificates-06.xml">
          <front>
            <title>Internet X.509 Public Key Infrastructure - Algorithm Identifiers for the Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM)</title>
            <author fullname="Sean Turner" initials="S." surname="Turner">
              <organization>sn3rd</organization>
            </author>
            <author fullname="Panos Kampanakis" initials="P." surname="Kampanakis">
              <organization>AWS</organization>
            </author>
            <author fullname="Jake Massimo" initials="J." surname="Massimo">
              <organization>AWS</organization>
            </author>
            <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="November" year="2024"/>
            <abstract>
              <t>The Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM) is a quantum-resistant key-encapsulation mechanism (KEM). This document describes the conventions for using the ML-KEM in X.509 Public Key Infrastructure. The conventions for the subject public keys and private keys are also described.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-kyber-certificates-06"/>
        </reference>
        <reference anchor="X.690">
          <front>
            <title>Information technology - ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date year="2015" month="November"/>
          </front>
          <seriesInfo name="ISO/IEC" value="8825-1:2015"/>
        </reference>
        <reference anchor="SP.800-56Ar3" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar3.pdf">
          <front>
            <title>Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2018" month="April"/>
          </front>
        </reference>
        <reference anchor="SP.800-56Cr2" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Cr2.pdf">
          <front>
            <title>Recommendation for Key-Derivation Methods in Key-Establishment Schemes</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2020" month="August"/>
          </front>
        </reference>
        <reference anchor="SP.800-57pt1r5" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf">
          <front>
            <title>Recommendation for Key Management: Part 1 – General</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2020" month="May"/>
          </front>
        </reference>
        <reference anchor="SP.800-185" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf">
          <front>
            <title>SHA-3 Derived Functions: cSHAKE, KMAC, TupleHash, and ParallelHash</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2016" month="December"/>
          </front>
        </reference>
        <reference anchor="FIPS.180-4" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
          <front>
            <title>FIPS Publication 180-4: Secure Hash Standard</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="FIPS.202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
        </reference>
        <reference anchor="FIPS.203" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf">
          <front>
            <title>Module-Lattice-based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="FIPS.204" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf">
          <front>
            <title>Module-Lattice-Based Digital Signature Standard</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2986" target="https://www.rfc-editor.org/info/rfc2986" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2986.xml">
          <front>
            <title>PKCS #10: Certification Request Syntax Specification Version 1.7</title>
            <author fullname="M. Nystrom" initials="M." surname="Nystrom"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <date month="November" year="2000"/>
            <abstract>
              <t>This memo represents a republication of PKCS #10 v1.7 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series, and change control is retained within the PKCS process. The body of this document, except for the security considerations section, is taken directly from the PKCS #9 v2.0 or the PKCS #10 v1.7 document. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2986"/>
          <seriesInfo name="DOI" value="10.17487/RFC2986"/>
        </reference>
        <reference anchor="RFC4210" target="https://www.rfc-editor.org/info/rfc4210" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4210.xml">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate Management Protocol (CMP)</title>
            <author fullname="C. Adams" initials="C." surname="Adams"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="T. Kause" initials="T." surname="Kause"/>
            <author fullname="T. Mononen" initials="T." surname="Mononen"/>
            <date month="September" year="2005"/>
            <abstract>
              <t>This document describes the Internet X.509 Public Key Infrastructure (PKI) Certificate Management Protocol (CMP). Protocol messages are defined for X.509v3 certificate creation and management. CMP provides on-line interactions between PKI components, including an exchange between a Certification Authority (CA) and a client system. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4210"/>
          <seriesInfo name="DOI" value="10.17487/RFC4210"/>
        </reference>
        <reference anchor="RFC4211" target="https://www.rfc-editor.org/info/rfc4211" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4211.xml">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate Request Message Format (CRMF)</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="September" year="2005"/>
            <abstract>
              <t>This document describes the Certificate Request Message Format (CRMF) syntax and semantics. This syntax is used to convey a request for a certificate to a Certification Authority (CA), possibly via a Registration Authority (RA), for the purposes of X.509 certificate production. The request will typically include a public key and the associated registration information. This document does not define a certificate request protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4211"/>
          <seriesInfo name="DOI" value="10.17487/RFC4211"/>
        </reference>
        <reference anchor="RFC4262" target="https://www.rfc-editor.org/info/rfc4262" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4262.xml">
          <front>
            <title>X.509 Certificate Extension for Secure/Multipurpose Internet Mail Extensions (S/MIME) Capabilities</title>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <date month="December" year="2005"/>
            <abstract>
              <t>This document defines a certificate extension for inclusion of Secure/Multipurpose Internet Mail Extensions (S/MIME) Capabilities in X.509 public key certificates, as defined by RFC 3280. This certificate extension provides an optional method to indicate the cryptographic capabilities of an entity as a complement to the S/MIME Capabilities signed attribute in S/MIME messages according to RFC 3851. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4262"/>
          <seriesInfo name="DOI" value="10.17487/RFC4262"/>
        </reference>
        <reference anchor="RFC5083" target="https://www.rfc-editor.org/info/rfc5083" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5083.xml">
          <front>
            <title>Cryptographic Message Syntax (CMS) Authenticated-Enveloped-Data Content Type</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="November" year="2007"/>
            <abstract>
              <t>This document describes an additional content type for the Cryptographic Message Syntax (CMS). The authenticated-enveloped-data content type is intended for use with authenticated encryption modes. All of the various key management techniques that are supported in the CMS enveloped-data content type are also supported by the CMS authenticated-enveloped-data content type. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5083"/>
          <seriesInfo name="DOI" value="10.17487/RFC5083"/>
        </reference>
        <reference anchor="RFC5639" target="https://www.rfc-editor.org/info/rfc5639" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5639.xml">
          <front>
            <title>Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation</title>
            <author fullname="M. Lochter" initials="M." surname="Lochter"/>
            <author fullname="J. Merkle" initials="J." surname="Merkle"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>This memo proposes several elliptic curve domain parameters over finite prime fields for use in cryptographic applications. The domain parameters are consistent with the relevant international standards, and can be used in X.509 certificates and certificate revocation lists (CRLs), for Internet Key Exchange (IKE), Transport Layer Security (TLS), XML signatures, and all applications or protocols based on the cryptographic message syntax (CMS). This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5639"/>
          <seriesInfo name="DOI" value="10.17487/RFC5639"/>
        </reference>
        <reference anchor="RFC5914" target="https://www.rfc-editor.org/info/rfc5914" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5914.xml">
          <front>
            <title>Trust Anchor Format</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="S. Ashmore" initials="S." surname="Ashmore"/>
            <author fullname="C. Wallace" initials="C." surname="Wallace"/>
            <date month="June" year="2010"/>
            <abstract>
              <t>This document describes a structure for representing trust anchor information. A trust anchor is an authoritative entity represented by a public key and associated data. The public key is used to verify digital signatures, and the associated data is used to constrain the types of information or actions for which the trust anchor is authoritative. The structures defined in this document are intended to satisfy the format-related requirements defined in Trust Anchor Management Requirements. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5914"/>
          <seriesInfo name="DOI" value="10.17487/RFC5914"/>
        </reference>
        <reference anchor="RFC5990" target="https://www.rfc-editor.org/info/rfc5990" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5990.xml">
          <front>
            <title>Use of the RSA-KEM Key Transport Algorithm in the Cryptographic Message Syntax (CMS)</title>
            <author fullname="J. Randall" initials="J." surname="Randall"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Brainard" initials="J." surname="Brainard"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="September" year="2010"/>
            <abstract>
              <t>The RSA-KEM Key Transport Algorithm is a one-pass (store-and-forward) mechanism for transporting keying data to a recipient using the recipient's RSA public key. ("KEM" stands for "key encapsulation mechanism".) This document specifies the conventions for using the RSA-KEM Key Transport Algorithm with the Cryptographic Message Syntax (CMS). The ASN.1 syntax is aligned with an expected forthcoming change to American National Standard (ANS) X9.44.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5990"/>
          <seriesInfo name="DOI" value="10.17487/RFC5990"/>
        </reference>
        <reference anchor="RFC6090" target="https://www.rfc-editor.org/info/rfc6090" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6090.xml">
          <front>
            <title>Fundamental Elliptic Curve Cryptography Algorithms</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <author fullname="K. Igoe" initials="K." surname="Igoe"/>
            <author fullname="M. Salter" initials="M." surname="Salter"/>
            <date month="February" year="2011"/>
            <abstract>
              <t>This note describes the fundamental algorithms of Elliptic Curve Cryptography (ECC) as they were defined in some seminal references from 1994 and earlier. These descriptions may be useful for implementing the fundamental algorithms without using any of the specialized methods that were developed in following years. Only elliptic curves defined over fields of characteristic greater than three are in scope; these curves are those used in Suite B. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6090"/>
          <seriesInfo name="DOI" value="10.17487/RFC6090"/>
        </reference>
        <reference anchor="RFC7292" target="https://www.rfc-editor.org/info/rfc7292" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7292.xml">
          <front>
            <title>PKCS #12: Personal Information Exchange Syntax v1.1</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="M. Nystrom" initials="M." surname="Nystrom"/>
            <author fullname="S. Parkinson" initials="S." surname="Parkinson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <author fullname="M. Scott" initials="M." surname="Scott"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>PKCS #12 v1.1 describes a transfer syntax for personal identity information, including private keys, certificates, miscellaneous secrets, and extensions. Machines, applications, browsers, Internet kiosks, and so on, that support this standard will allow a user to import, export, and exercise a single set of personal identity information. This standard supports direct transfer of personal information under several privacy and integrity modes.</t>
              <t>This document represents a republication of PKCS #12 v1.1 from RSA Laboratories' Public Key Cryptography Standard (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7292"/>
          <seriesInfo name="DOI" value="10.17487/RFC7292"/>
        </reference>
        <reference anchor="RFC7296" target="https://www.rfc-editor.org/info/rfc7296" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7296.xml">
          <front>
            <title>Internet Key Exchange Protocol Version 2 (IKEv2)</title>
            <author fullname="C. Kaufman" initials="C." surname="Kaufman"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="Y. Nir" initials="Y." surname="Nir"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <author fullname="T. Kivinen" initials="T." surname="Kivinen"/>
            <date month="October" year="2014"/>
            <abstract>
              <t>This document describes version 2 of the Internet Key Exchange (IKE) protocol. IKE is a component of IPsec used for performing mutual authentication and establishing and maintaining Security Associations (SAs). This document obsoletes RFC 5996, and includes all of the errata for it. It advances IKEv2 to be an Internet Standard.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="79"/>
          <seriesInfo name="RFC" value="7296"/>
          <seriesInfo name="DOI" value="10.17487/RFC7296"/>
        </reference>
        <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8551" target="https://www.rfc-editor.org/info/rfc8551" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8551.xml">
          <front>
            <title>Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 Message Specification</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <author fullname="B. Ramsdell" initials="B." surname="Ramsdell"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>This document defines Secure/Multipurpose Internet Mail Extensions (S/MIME) version 4.0. S/MIME provides a consistent way to send and receive secure MIME data. Digital signatures provide authentication, message integrity, and non-repudiation with proof of origin. Encryption provides data confidentiality. Compression can be used to reduce data size. This document obsoletes RFC 5751.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8551"/>
          <seriesInfo name="DOI" value="10.17487/RFC8551"/>
        </reference>
        <reference anchor="I-D.ietf-tls-hybrid-design" target="https://datatracker.ietf.org/doc/html/draft-ietf-tls-hybrid-design-04" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-tls-hybrid-design-04.xml">
          <front>
            <title>Hybrid key exchange in TLS 1.3</title>
            <author fullname="Douglas Stebila" initials="D." surname="Stebila">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Scott Fluhrer" initials="S." surname="Fluhrer">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Shay Gueron" initials="S." surname="Gueron">
              <organization>University of Haifa and Amazon Web Services</organization>
            </author>
            <date day="11" month="January" year="2022"/>
            <abstract>
              <t>Hybrid key exchange refers to using multiple key exchange algorithms simultaneously and combining the result with the goal of providing security even if all but one of the component algorithms is broken. It is motivated by transition to post-quantum cryptography. This document provides a construction for hybrid key exchange in the Transport Layer Security (TLS) protocol version 1.3. Discussion of this work is encouraged to happen on the TLS IETF mailing list tls@ietf.org or on the GitHub repository which contains the draft: https://github.com/dstebila/draft-ietf-tls-hybrid-design.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-hybrid-design-04"/>
        </reference>
        <reference anchor="I-D.ietf-pquip-pqt-hybrid-terminology" target="https://datatracker.ietf.org/doc/html/draft-ietf-pquip-pqt-hybrid-terminology-04" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-pquip-pqt-hybrid-terminology-04.xml">
          <front>
            <title>Terminology for Post-Quantum Traditional Hybrid Schemes</title>
            <author fullname="Florence 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="September" year="2024"/>
            <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-04"/>
        </reference>
        <reference anchor="I-D.ietf-lamps-cms-kyber" target="https://datatracker.ietf.org/doc/html/draft-ietf-lamps-cms-kyber-05" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-lamps-cms-kyber-05.xml">
          <front>
            <title>Use of ML-KEM in the Cryptographic Message Syntax (CMS)</title>
            <author fullname="PRAT Julien" initials="J." surname="Prat">
              <organization>CryptoNext Security</organization>
            </author>
            <author fullname="Mike Ounsworth" initials="M." surname="Ounsworth">
              <organization>Entrust Limited</organization>
            </author>
            <author fullname="Daniel Van Geest" initials="D." surname="Van Geest">
              <organization>CryptoNext Security</organization>
            </author>
            <date day="15" month="October" year="2024"/>
            <abstract>
              <t>The Module-Lattice-based Key-Encapsulation Mechanism (ML-KEM) algorithm is a one-pass (store-and-forward) cryptographic mechanism for an originator to securely send keying material to a recipient using the recipient's ML-KEM public key. Three parameters sets for the ML-KEM algorithm are specified by NIST in [FIPS203]. In order of increasing security strength (and decreasing performance), these parameter sets are ML-KEM-512, ML-KEM-768, and ML-KEM-1024. This document specifies the conventions for using ML-KEM with the Cryptographic Message Syntax (CMS) using KEMRecipientInfo as specified in [RFC9629].</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-cms-kyber-05"/>
        </reference>
        <reference anchor="X-Wing" target="https://eprint.iacr.org/2024/039.pdf">
          <front>
            <title>X-Wing The Hybrid KEM You’ve Been Looking For</title>
            <author initials="M." surname="Barbosa" fullname="Manuel Barbosa">
              <organization/>
            </author>
            <author initials="D." surname="Connolly" fullname="Deirdre Connolly">
              <organization/>
            </author>
            <author initials="J." surname="Duarte" fullname="João Diogo Duarte">
              <organization/>
            </author>
            <author initials="A." surname="Kaiser" fullname="Aaron Kaiser">
              <organization/>
            </author>
            <author initials="P." surname="Schwabe" fullname="Peter Schwabe">
              <organization/>
            </author>
            <author initials="K." surname="Varner" fullname="Karolin Varner">
              <organization/>
            </author>
            <author initials="B." surname="Westerbaan" fullname="Bas Westerbaan">
              <organization/>
            </author>
            <date year="2024" month="January" day="09"/>
          </front>
        </reference>
        <reference anchor="BSI2021" target="https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/Brochure/quantum-safe-cryptography.pdf">
          <front>
            <title>Quantum-safe cryptography - fundamentals, current developments and recommendations</title>
            <author>
              <organization>Federal Office for Information Security (BSI)</organization>
            </author>
            <date year="2021" month="October"/>
          </front>
        </reference>
        <reference anchor="ANSSI2024" target="https://cyber.gouv.fr/sites/default/files/document/Quantum_Key_Distribution_Position_Paper.pdf">
          <front>
            <title>Position Paper on Quantum Key Distribution</title>
            <author>
              <organization>French Cybersecurity Agency (ANSSI)</organization>
            </author>
            <author>
              <organization>Federal Office for Information Security (BSI)</organization>
            </author>
            <author>
              <organization>Netherlands National Communications Security Agency (NLNCSA)</organization>
            </author>
            <author>
              <organization>Swedish National Communications Security Authority, Swedish Armed Forces</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SP800-131Ar2" target="https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-131ar2.pdf">
          <front>
            <title>Transitioning the Use of Cryptographic Algorithms and Key Lengths</title>
            <author initials="E." surname="Barker" fullname="Elaine Barke">
              <organization/>
            </author>
            <author initials="A." surname="Roginksy" fullname="Allan Reginsky">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SP-800-227ipd" target="https://csrc.nist.gov/pubs/sp/800/227/ipd">
          <front>
            <title>Recommendations for Key-Encapsulation Mechanisms (Initial Public Draft)</title>
            <author initials="G." surname="Alagic" fullname="Gorjan Alagic">
              <organization/>
            </author>
            <author initials="E." surname="Barker" fullname="Elaine Barker">
              <organization/>
            </author>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization/>
            </author>
            <author initials="D." surname="Moody" fullname="Dustin Moody">
              <organization/>
            </author>
            <author initials="A." surname="Robinson" fullname="Angela Robinson">
              <organization/>
            </author>
            <author initials="H." surname="Silberg" fullname="Hamilton Silberg">
              <organization/>
            </author>
            <author initials="N." surname="Waller" fullname="Noah Waller">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="GHP18" target="https://eprint.iacr.org/2018/024">
          <front>
            <title>KEM Combiners</title>
            <author initials="B." surname="Poettering" fullname="Bertram Poettering">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="Aviram22" target="https://eprint.iacr.org/2022/065">
          <front>
            <title>Practical (Post-Quantum) Key Combiners from One-Wayness and Applications to TLS</title>
            <author initials="E." surname="Yogev" fullname="Eylon Yogev">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CNSA2.0" target="https://media.defense.gov/2022/Sep/07/2003071834/-1/-1/0/CSA_CNSA_2.0_ALGORITHMS_.PDF">
          <front>
            <title>Commercial National Security Algorithm Suite 2.0</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="FIPS-140-3-IG" target="https://csrc.nist.gov/csrc/media/Projects/cryptographic-module-validation-program/documents/fips%20140-3/FIPS%20140-3%20IG.pdf">
          <front>
            <title>Implementation Guidance for FIPS 140-3 and the Cryptographic Module Validation Program</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2024" month="July"/>
          </front>
        </reference>
        <reference anchor="ETSI.TS.103.744" target="https://www.etsi.org/deliver/etsi_ts/103700_103799/103744/01.01.01_60/ts_103744v010101p.pdf">
          <front>
            <title>ETSI TS 103 744 V1.1.1 CYBER; Quantum-safe Hybrid Key Exchanges</title>
            <author>
              <organization>ETSI</organization>
            </author>
            <date year="2020" month="December"/>
          </front>
        </reference>
        <reference anchor="RFC9180" target="https://www.rfc-editor.org/info/rfc9180" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9180.xml">
          <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>
      </references>
    </references>
    <?line 1770?>

<section anchor="appdx-samples">
      <name>Samples</name>
      <t>TODO</t>
    </section>
    <section anchor="appdx_components">
      <name>Component Algorithm Reference</name>
      <t>This section provides references to the full specification of the algorithms used in the composite constructions.</t>
      <table anchor="tab-component-encr-algs">
        <name>Component Encryption Algorithms used in Composite Constructions</name>
        <thead>
          <tr>
            <th align="left">Component KEM Algorithm ID</th>
            <th align="left">OID</th>
            <th align="left">Specification</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">id-ML-KEM-768</td>
            <td align="left">2.16.840.1.101.3.4.4.2</td>
            <td align="left">
              <xref target="FIPS.203"/></td>
          </tr>
          <tr>
            <td align="left">id-ML-KEM-1024</td>
            <td align="left">2.16.840.1.101.3.4.4.3</td>
            <td align="left">
              <xref target="FIPS.203"/></td>
          </tr>
          <tr>
            <td align="left">id-X25519</td>
            <td align="left">1.3.101.110</td>
            <td align="left">
              <xref target="RFC8410"/></td>
          </tr>
          <tr>
            <td align="left">id-X448</td>
            <td align="left">1.3.101.111</td>
            <td align="left">
              <xref target="RFC8410"/></td>
          </tr>
          <tr>
            <td align="left">id-ecDH</td>
            <td align="left">1.3.132.1.12</td>
            <td align="left">
              <xref target="RFC5480"/></td>
          </tr>
          <tr>
            <td align="left">id-RSAES-OAEP</td>
            <td align="left">1.2.840.113549.1.1.7</td>
            <td align="left">
              <xref target="RFC8017"/></td>
          </tr>
        </tbody>
      </table>
      <table anchor="tab-component-curve-algs">
        <name>Elliptic Curves used in Composite Constructions</name>
        <thead>
          <tr>
            <th align="left">Elliptic CurveID</th>
            <th align="left">OID</th>
            <th align="left">Specification</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">secp256r1</td>
            <td align="left">1.2.840.10045.3.1.7</td>
            <td align="left">
              <xref target="RFC6090"/></td>
          </tr>
          <tr>
            <td align="left">secp384r1</td>
            <td align="left">1.3.132.0.34</td>
            <td align="left">
              <xref target="RFC6090"/></td>
          </tr>
          <tr>
            <td align="left">brainpoolP256r1</td>
            <td align="left">1.3.36.3.3.2.8.1.1.7</td>
            <td align="left">
              <xref target="RFC5639"/></td>
          </tr>
          <tr>
            <td align="left">brainpoolP384r1</td>
            <td align="left">1.3.36.3.3.2.8.1.1.11</td>
            <td align="left">
              <xref target="RFC5639"/></td>
          </tr>
        </tbody>
      </table>
      <table anchor="tab-component-hash">
        <name>Hash algorithms used in Composite Constructions</name>
        <thead>
          <tr>
            <th align="left">HashID</th>
            <th align="left">OID</th>
            <th align="left">Specification</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">id-sha256</td>
            <td align="left">2.16.840.1.101.3.4.2.1</td>
            <td align="left">
              <xref target="RFC6234"/></td>
          </tr>
          <tr>
            <td align="left">id-sha512</td>
            <td align="left">2.16.840.1..101.3.4.2.3</td>
            <td align="left">
              <xref target="RFC6234"/></td>
          </tr>
          <tr>
            <td align="left">id-alg-hkdf-with-sha256</td>
            <td align="left">1.2.840.113549.1.9.16.3.28</td>
            <td align="left">
              <xref target="RFC8619"/></td>
          </tr>
          <tr>
            <td align="left">id-alg-hkdf-with-sha384</td>
            <td align="left">1.2.840.113549.1.9.16.3.29</td>
            <td align="left">
              <xref target="RFC8619"/></td>
          </tr>
          <tr>
            <td align="left">id-sha3-256</td>
            <td align="left">2.16.840.1.101.3.4.2.8</td>
            <td align="left">
              <xref target="FIPS.202"/></td>
          </tr>
          <tr>
            <td align="left">id-KMAC128</td>
            <td align="left">2.16.840.1.101.3.4.2.21</td>
            <td align="left">
              <xref target="SP.800-185"/></td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="fixed-component-algorithm-identifiers">
      <name>Fixed Component Algorithm Identifiers</name>
      <t>The following sections list explicitly the DER encoded <tt>AlgorithmIdentifier</tt> that MUST be used when reconstructing <tt>SubjectPublicKeyInfo</tt> objects for each component public key, which may be required for example if cryptographic library requires the public key in this form in order to process each component algorithm. The public key <tt>BIT STRING</tt> should be taken directly from the respective component of the CompositeKEMPublicKey.</t>
      <t><strong>ML-KEM-768</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-alg-ml-kem-768   -- (2.16.840.1.101.3.4.4.2)
    }

DER:
  30 0B 06 07 60 86 48 01 65 03 04 04 02
]]></artwork>
      <t><strong>ML-KEM-1024</strong></t>
      <t>ASN.1:</t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-alg-ml-kem-1024   -- (2.16.840.1.101.3.4.4.3)
    }

DER:
  30 0B 06 07 60 86 48 01 65 03 04 04 03
]]></artwork>
      <t><strong>RSA-OAEP - all sizes</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-RSAES-OAEP,   -- (1.2.840.113549.1.1.7)
    parameters RSAES-OAEP-params {
         hashFunc      [0] id-sha256,  -- (2.16.840.1.101.3.4.2.1)
         maskGenFunc   [1] mgf1SHA256Identifier,
         pSourceFunc   [2] pSpecifiedEmpty  }
    }


where
      mgf1SHA256Identifier  AlgorithmIdentifier  ::=  {
                          algorithm id-mgf1,  -- (1.2.840.113549.1.1.8)
                          parameters sha256Identifier }


      sha256Identifier  AlgorithmIdentifier  ::=  { id-sha256, NULL }

DER:
 30 4D 06 09 2A 86 48 86 F7 0D 01 01 07 30 40 A0 0F 30 0D 06 09 60 86
 48 01 65 03 04 02 01 05 00 A1 1C 30 1A 06 09 2A 86 48 86 F7 0D 01 01
 08 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 A2 0F 30 0D 06 09 2A
 86 48 86 F7 0D 01 01 09 04 00
]]></artwork>
      <t><strong>ECDH NIST-P-384</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-ecPublicKey   -- (1.2.840.10045.2.1)
    parameters ANY ::= {
      AlgorithmIdentifier ::= {
        algorithm secp384r1    -- (1.3.132.0.34)
        }
      }
    }

DER:
  30 10 06 07 2A 86 48 CE 3D 02 01 06 05 2B 81 04 00 22
]]></artwork>
      <t><strong>ECDH Brainpool-256</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-ecPublicKey   -- (1.2.840.10045.2.1)
    parameters ANY ::= {
      AlgorithmIdentifier ::= {
        algorithm brainpoolP256r1   -- (1.3.36.3.3.2.8.1.1.7)
        }
      }
    }

DER:
  30 14 06 07 2A 86 48 CE 3D 02 01 06 09 2B 24 03 03 02 08 01 01 07
]]></artwork>
      <t><strong>ECDH Brainpool-384</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-ecPublicKey   -- (1.2.840.10045.2.1)
    parameters ANY ::= {
      AlgorithmIdentifier ::= {
        algorithm brainpoolP384r1   -- (1.3.36.3.3.2.8.1.1.11)
        }
      }
    }

DER:
  30 14 06 07 2A 86 48 CE 3D 02 01 06 09 2B 24 03 03 02 08 01 01 0B
]]></artwork>
      <t><strong>X25519</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-X25519   -- (1.3.101.110)
    }

DER:
  30 05 06 03 2B 65 6E
]]></artwork>
      <t><strong>X448</strong></t>
      <artwork><![CDATA[
ASN.1:
  algorithm AlgorithmIdentifier ::= {
    algorithm id-X448   -- (1.3.101.111)
    }

DER:
  30 05 06 03 2B 65 6F
]]></artwork>
    </section>
    <section anchor="sec-in-pract">
      <name>Implementation Considerations</name>
      <section anchor="sec-fips">
        <name>FIPS Certification</name>
        <t>For reference, the KEM Combiner used in Composite KEM is:</t>
        <t><tt>
ss = KDF(mlkemSS || tradSS || tradCT || tradPK || Domain)
</tt></t>
        <t>where KDF is either SHA3 or HKDF-SHA2.</t>
        <t>NIST SP 800-227 [SP-800-227idp], which at the time of writing is in its initial public draft period, allows hybrid key combiners of the following form:</t>
        <t><tt>
K ← KDM(S1‖S2‖ · · · ‖St , OtherInput)           (14)
</tt></t>
        <t>The key derivation method KDM can take one of two forms, either</t>
        <t><tt>
K ← KDF(Z‖OtherInput)                            (12)
</tt></t>
        <t>or</t>
        <t><tt>
K ← Expand(Extract(salt, Z), OtherInput)         (13)
</tt></t>
        <t>The Composite KEM variants that use SHA3 as a combiner fit form (12) while the variants that use HKDF-SHA2 fit form (13).</t>
        <t>In terms of the order of inputs, Composite KEM places the two shared secret keys <tt>mlkemSS || tradSS</tt> at the beggining of the KDF input such that all other inputs <tt>tradCT || tradPK || Domain</tt> can be considered part of <tt>OtherInput</tt> for the purposes of FIPS certification. <xref target="SP-800-227ipd"/> adds an important stipulation that was not present in earlier NIST specifications:</t>
        <ul empty="true">
          <li>
            <t>This publication approves the use of the key combiner (14) for any t &gt; 1, so long as at
least one shared secret (i.e., S_j for some j) is a shared secret generated from the key-
establishment methods of SP 800-56A or SP 800-56B, or an approved KEM.</t>
          </li>
        </ul>
        <t>This means that although Composite KEM always places the shared secret key from ML-KEM in the first slot, a Composite KEM can be FIPS certified so long as either component is FIPS certified. This is important for several reasons. First, in the early stages of PQC migration, composites allow for a non-FIPS certified ML-KEM implementation to be added to a module that already has a FIPS certified traditional component, and the resulting composite can be FIPS certified. Second, when eventually RSA and Elliptic Curve are no longer FIPS-allowed, the composite can retain its FIPS certified status on the strength of the ML-KEM component. Third, while this is outside the scope of this document, the general composite construction could be used to create FIPS certified algorithms that contain a component algorithm from a different jurisdiction.</t>
        <section anchor="fips-certification-of-combiner-function">
          <name>FIPS certification of Combiner Function</name>
          <t>TODO: update this to NIST SP 800-227, once it is published.</t>
          <t>One of the primary NIST documents which is relevant for certification of a composite algorithm is NIST SP.800-56Cr2 <xref target="SP.800-56Cr2"/> by using the allowed "hybrid" shared secret of the form <tt>Z' = Z || T</tt>. Compliance is achieved in the following way:</t>
          <t><xref target="SP.800-56Cr2"/> section 4 "One-Step Key Derivation" requires a <tt>counter</tt> which begins at the 4-byte value 0x00000001. However, the counter is allowed to be omitted when the hash function is executed only once, as specified on page 159 of the FIPS 140-3 Implementation Guidance <xref target="FIPS-140-3-IG"/>.</t>
          <t>The HKDF-SHA2 options can be certified under <xref target="SP.800-56Cr2"/> One-Step Key Derivation Option 2: <tt>H(x) = HMAC-hash(salt, x)</tt> where <tt>salt</tt> is the empty (0 octet) string, which will internally be mapped to the zero vector <tt>0x00..00</tt> of the correct input size for the underlying hash function in order to satisfy the requirement in <xref target="SP.800-56Cr2"/> that "in the absence of an agreed-upon alternative – the default_salt shall be an all-zero byte string whose bit length equals that specified as the bit length of an input block for the hash function, hash". Note that since the desired shared secret key output length of 256 bits for all security levels aligns with the block size of SHA256, we do not need to use the HKDF-Extract step specified in <xref target="RFC5869"/>, which further simplifies FIPS certification by allowing us to use the One-Step KDF rather than the Two-Step KDF from <xref target="SP.800-56Cr2"/>.</t>
          <t>The SHA3 options can be certified under <xref target="SP.800-56Cr2"/> One-Step Key Derivation Option 1: <tt>H(x) = hash(x)</tt>.</t>
        </section>
      </section>
      <section anchor="sec-backwards-compat">
        <name>Backwards Compatibility</name>
        <t>As noted in the introduction, the post-quantum cryptographic migration will face challenges in both ensuring cryptographic strength against adversaries of unknown capabilities, as well as providing ease of migration. The composite mechanisms defined in this document primarily address cryptographic strength, however this section contains notes on how backwards compatibility may be obtained.</t>
        <t>The term "ease of migration" is used here to mean that existing systems can be gracefully transitioned to the new technology without requiring large service disruptions or expensive upgrades. The term "backwards compatibility" is used here to mean something more specific; that existing systems as they are deployed today can inter-operate with the upgraded systems of the future.</t>
        <t>These migration and interoperability concerns need to be thought about in the context of various types of protocols that make use of X.509 and PKIX with relation to key establishment and content encryption, from online negotiated protocols such as TLS 1.3 <xref target="RFC8446"/> and IKEv2 <xref target="RFC7296"/>, to non-negotiated asynchronous protocols such as S/MIME signed email <xref target="RFC8551"/>, as well as myriad other standardized and proprietary protocols and applications that leverage CMS <xref target="RFC5652"/> encrypted structures.</t>
      </section>
      <section anchor="impl-cons-decaps-pubkey">
        <name>Decapsulation Requires the Public Key</name>
        <t>ML-KEM always requires the public key in order to perform various steps of the Fujisaki-Okamoto decapsulation <xref target="FIPS.203"/>, and for this reason the private key encoding specified in FIPS 203 includes the public key. Therefore it is not required to carry it in the <tt>OneAsymmetricKey.publicKey</tt> field, which remains optional, but is strictly speaking redundant since an ML-KEM public key can be parsed from an ML-KEM private key, and thus populating the <tt>OneAsymmetricKey.publicKey</tt> field would mean that two copies of the public key data are transmitted.</t>
        <t>With regard to the traditional algorithms, RSA or Elliptic Curve, in order to achieve the public-key binding property the KEM combiner used to form the Composite ML-KEM, the combiner requires the traditional public key as input to the KDF that derives the output shared secret. Therefore it is required to carry the public key within the respective <tt>OneAsymmetricKey.publicKey</tt> as per the private key encoding given in <xref target="sec-priv-key"/>. Implementers who choose to use a different private key encoding than the one specified in this document MUST consider how to provide the component public keys to the decapsulate routine. While some implementations might contain routines to computationally derive the public key from the private key, it is not guaranteed that all implementations will support this; for this reason the interoperable composite private key format given in this document in <xref target="sec-priv-key"/> requires the public key of the traditional component to be included.</t>
        <!-- End of Implementation Considerations section -->

</section>
    </section>
    <section anchor="comparison-with-other-hybred-kems">
      <name>Comparison with other Hybred KEMs</name>
      <section anchor="x-wing">
        <name>X-Wing</name>
        <t>This specification borrows extensively from the analysis and KEM combiner construction presented in <xref target="X-Wing"/>. In particular, X-Wing and id-MLKEM768-X25519 are largely interchangeable. The one difference is that X-Wing uses a combined KeyGen function to generate the two component private keys from the same seed, which gives some additional binding properies. However, using a derived value as the seed for ML-KEM.KeyGen_internal() is, at time of writing, explicitely disallowed by <xref target="FIPS.203"/> which makes it impossible to create a FIPS-compliant implentation of X-Wing KeyGen / private key import. For this reason, this specification keeps the key generatation for both components separate so that implementers are free to use an existing certified hardware or software module for one or both components.</t>
        <t>Due to the difference in key generation and security properties, X-Wing and id-MLKEM768-X25519 have been registered as separate algorithms with separate OIDs, and they use a different domain separator string in order to ensure that their ciphertexts are not inter-compatible.</t>
      </section>
      <section anchor="etsi-catkdf">
        <name>ETSI CatKDF</name>
        <t><xref target="ETSI.TS.103.744"/> section 8.2 defines CatKDF as:</t>
        <artwork><![CDATA[
1) Form secret = psk || k1 || k 2 || … || k n.
2) Set f_context = f(context, MA, MB), where f is a context formatting function.
3) key_material = KDF(secret, label, f_context, length).
4) Return key_material.

MA shall contain all of the public keys.
MB shall contain all of the corresponding public keys and ciphertexts.
]]></artwork>
        <t>The main difference between the Composite KEM combiner and the ETSI CatKDF combiner is that CatKDF makes the more conservative choice to bind the public keys and ciphertexts of both components, while Composite KEM follows the analysis presented in <xref target="X-Wing"/> that while preserving the security properties of the traditional component requires binding the public key and ciphertext of the traditional component, it is not necessary to do so for ML-KEM thanks to the rejection sampling step of the Fujisaki-Okamoto transform.</t>
        <t>Additionally, ETSI CatKDF uses HKDF <xref target="RFC5869"/> as the KDF which aligns with some of the variants in this specification, but not the ones that use SHA3.</t>
      </section>
    </section>
    <section anchor="intellectual-property-considerations">
      <name>Intellectual Property Considerations</name>
      <t>The following IPR Disclosure relates to this draft:</t>
      <t>https://datatracker.ietf.org/ipr/3588/</t>
      <t>EDNOTE TODO: Check with Max Pala whether this IPR actually applies to this draft.</t>
    </section>
    <section anchor="contributors-and-acknowledgments">
      <name>Contributors and Acknowledgments</name>
      <t>This document incorporates contributions and comments from a large group of experts. The Editors would especially like to acknowledge the expertise and tireless dedication of the following people, who attended many long meetings and generated millions of bytes of electronic mail and VOIP traffic over the past year in pursuit of this document:</t>
      <t>Serge Mister (Entrust), Ali Noman (Entrust), Peter C. (UK NCSC), Sophie Schmieg (Google), Deirdre Connolly (SandboxAQ), Falko Strenzke (MTG AG), Dan van Geest (Crypto Next), Piotr Popis (Enigma), and
Douglas Stebila (University of Waterloo).</t>
      <t>We are grateful to all, including any contributors who may have
been inadvertently omitted from this list.</t>
      <t>This document borrows text from similar documents, including those referenced below. Thanks go to the authors of those
   documents.  "Copying always makes things easier and less error prone" - <xref target="RFC8411"/>.</t>
      <!-- End of Contributors section -->

</section>
  </back>
  <!-- ##markdown-source:
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
Dr61c0cbT23oSf0F8tvxqm6aAQA=

-->

</rfc>
