<?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.5 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wussler-openpgp-pqc-04" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.1 -->
  <front>
    <title abbrev="PQC in OpenPGP">Post-Quantum Cryptography in OpenPGP</title>
    <seriesInfo name="Internet-Draft" value="draft-wussler-openpgp-pqc-04"/>
    <author initials="S." surname="Kousidis" fullname="Stavros Kousidis">
      <organization>BSI</organization>
      <address>
        <postal>
          <country>Germany</country>
        </postal>
        <email>stavros.kousidis@bsi.bund.de</email>
      </address>
    </author>
    <author initials="J." surname="Roth" fullname="Johannes Roth">
      <organization>MTG AG</organization>
      <address>
        <postal>
          <country>Germany</country>
        </postal>
        <email>johannes.roth@mtg.de</email>
      </address>
    </author>
    <author initials="F." surname="Strenzke" fullname="Falko Strenzke">
      <organization>MTG AG</organization>
      <address>
        <postal>
          <country>Germany</country>
        </postal>
        <email>falko.strenzke@mtg.de</email>
      </address>
    </author>
    <author initials="A." surname="Wussler" fullname="Aron Wussler">
      <organization>Proton AG</organization>
      <address>
        <postal>
          <country>Switzerland</country>
        </postal>
        <email>aron@wussler.it</email>
      </address>
    </author>
    <date year="2024" month="January" day="30"/>
    <area>sec</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 285?>

<t>This document defines a post-quantum public-key algorithm extension for the
OpenPGP protocol. Given the generally assumed threat of a cryptographically
relevant quantum computer, this extension provides a basis for long-term secure
OpenPGP signatures and ciphertexts. Specifically, it defines composite
public-key encryption based on ML-KEM (formerly CRYSTALS-Kyber), composite
public-key signatures based on ML-DSA (formerly CRYSTALS-Dilithium), both in
combination with elliptic curve cryptography, and SLH-DSA (formerly SPHINCS+)
as a standalone public key signature scheme.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wussler-openpgp-pqc/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        WG Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/openpgp-pqc/draft-openpgp-pqc"/>.</t>
    </note>
  </front>
  <middle>
    <?line 296?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The OpenPGP protocol supports various traditional public-key algorithms based
on the factoring or discrete logarithm problem. As the security of algorithms
based on these mathematical problems is endangered by the advent of quantum
computers, there is a need to extend OpenPGP by algorithms that remain secure
in the presence of quantum computers.</t>
      <t>Such cryptographic algorithms are referred to as post-quantum cryptography.
The algorithms defined in this extension were chosen for standardization by the
National Institute of Standards and Technology (NIST) in mid 2022
<xref target="NISTIR-8413"/> as the result of the NIST Post-Quantum Cryptography
Standardization process initiated in 2016 <xref target="NIST-PQC"/>. Namely, these are
ML-KEM (formerly CRYSTALS-Kyber) as a Key Encapsulation Mechanism (KEM), a KEM
being a modern building block for public-key encryption, and ML-DSA (formerly
CRYSTALS-Dilithium) as well as SLH-DSA (formerly SPHINCS+) as signature
schemes.</t>
      <t>For the two ML-* schemes, this document follows the conservative strategy to
deploy post-quantum in combination with traditional schemes such that the
security is retained even if all schemes but one in the combination are broken.
In contrast, the stateless hash-based signature scheme SLH-DSA is considered to
be sufficiently well understood with respect to its security assumptions in
order to be used standalone. To this end, this document specifies the following
new set: SLH-DSA standalone and the two ML-* as composite with ECC-based KEM and
digital signature schemes. Here, the term "composite" indicates that any data
structure or algorithm pertaining to the combination of the two components
appears as single data structure or algorithm from the protocol perspective.</t>
      <t>The document specifies the conventions for interoperability between compliant
OpenPGP implementations that make use of this extension and the newly defined
algorithms or algorithm combinations.</t>
      <section anchor="conventions-used-in-this-document">
        <name>Conventions used in this Document</name>
        <section anchor="terminology-for-multi-algorithm-schemes">
          <name>Terminology for Multi-Algorithm Schemes</name>
          <t>The terminology in this document is oriented towards the definitions in
<xref target="draft-driscoll-pqt-hybrid-terminology"/>. Specifically, the terms
"multi-algorithm", "composite" and "non-composite" are used in correspondence
with the definitions therein. The abbreviation "PQ" is used for post-quantum
schemes. To denote the combination of post-quantum and traditional schemes, the
abbreviation "PQ/T" is used. The short form "PQ(/T)" stands for PQ or PQ/T.</t>
        </section>
      </section>
      <section anchor="post-quantum-cryptography">
        <name>Post-Quantum Cryptography</name>
        <t>This section describes the individual post-quantum cryptographic schemes. All
schemes listed here are believed to provide security in the presence of a
cryptographically relevant quantum computer. However, the mathematical problems
on which the two ML-* schemes and SLH-DSA are based, are fundamentally
different, and accordingly the level of trust commonly placed in them as well
as their performance characteristics vary.</t>
        <t>[Note to the reader: This specification refers to the NIST PQC draft standards
FIPS 203, FIPS 204, and FIPS 205 as if they were a final specification. This is
a temporary solution until the final versions of these documents are available.
The goal is to provide a sufficiently precise specification of the algorithms
already at the draft stage of this specification, so that it is possible for
implementers to create interoperable implementations. Furthermore, we want to
point out that, depending on possible future changes to the draft standards by
NIST, this specification may be updated as soon as corresponding information
becomes available.]</t>
        <section anchor="mlkem-intro">
          <name>ML-KEM</name>
          <t>ML-KEM <xref target="FIPS-203"/> is based on the hardness of solving the learning-with-errors
problem in module lattices (MLWE). The scheme is believed to provide security
against cryptanalytic attacks by classical as well as quantum computers. This
specification defines ML-KEM only in composite combination with ECC-based
encryption schemes in order to provide a pre-quantum security fallback.</t>
        </section>
        <section anchor="mldsa-intro">
          <name>ML-DSA</name>
          <t>ML-DSA <xref target="FIPS-204"/> is a signature scheme that, like ML-KEM, is based on the
hardness of solving the Learning With Errors problem and a variant of the Short
Integer Solution problem in module lattices (MLWE and SelfTargetMSIS).
Accordingly, this specification only defines ML-DSA in composite combination
with ECC-based signature schemes.</t>
        </section>
        <section anchor="slh-dsa">
          <name>SLH-DSA</name>
          <t>SLH-DSA <xref target="FIPS-205"/> is a stateless hash-based signature scheme. Its security
relies on the hardness of finding preimages for cryptographic hash functions.
This feature is generally considered to be a high security guarantee.
Therefore, this specification defines SLH-DSA as a standalone signature scheme.</t>
          <t>In deployments the performance characteristics of SLH-DSA should be taken into
account. We refer to <xref target="performance-considerations"/> for a discussion of the
performance characteristics of this scheme.</t>
        </section>
      </section>
      <section anchor="elliptic-curve-cryptography">
        <name>Elliptic Curve Cryptography</name>
        <t>The ECC-based encryption is defined here as a KEM. This is in contrast to
<xref target="I-D.ietf-openpgp-crypto-refresh"/> where the ECC-based encryption is defined
as a public-key encryption scheme.</t>
        <t>All elliptic curves for the use in the composite combinations are taken from
<xref target="I-D.ietf-openpgp-crypto-refresh"/>. However, as explained in the following, in
the case of Curve25519 encoding changes are applied to the new composite
schemes.</t>
        <section anchor="curve25519-and-curve448">
          <name>Curve25519 and Curve448</name>
          <t>Curve25519 and Curve448 are defined in <xref target="RFC7748"/> for use in a Diffie-Hellman
key agreement scheme and defined in <xref target="RFC8032"/> for use in a digital signature
scheme. For Curve25519 this specification adapts the encoding of objects as
defined in <xref target="RFC7748"/> in contrast to <xref target="I-D.ietf-openpgp-crypto-refresh"/>.</t>
        </section>
        <section anchor="generic-prime-curves">
          <name>Generic Prime Curves</name>
          <t>For interoperability this extension offers CRYSTALS-* in composite combinations
with the NIST curves P-256, P-384 defined in <xref target="SP800-186"/> and the
Brainpool curves brainpoolP256r1, brainpoolP384r1 defined in <xref target="RFC5639"/>.</t>
        </section>
      </section>
      <section anchor="multi-algo-schemes">
        <name>Standalone and Multi-Algorithm Schemes</name>
        <t>This section provides a categorization of the new algorithms and their
combinations.</t>
        <section anchor="composite-multi-alg">
          <name>Standalone and Composite Multi-Algorithm Schemes</name>
          <t>This specification introduces new cryptographic schemes, which can be
categorized as follows:</t>
          <ul spacing="normal">
            <li>
              <t>PQ/T multi-algorithm public-key encryption, namely a composite combination
of ML-KEM with an ECC-based KEM,</t>
            </li>
            <li>
              <t>PQ/T multi-algorithm digital signature, namely composite combinations of
ML-DSA with ECC-based signature schemes,</t>
            </li>
            <li>
              <t>PQ digital signature, namely SLH-DSA as a standalone cryptographic
algorithm.</t>
            </li>
          </ul>
          <t>For each of the composite schemes, this specification mandates that the
recipient has to successfully perform the cryptographic algorithms for each of
the component schemes used in a cryptrographic message, in order for the
message to be deciphered and considered as valid. This means that all component
signatures must be verified successfully in order to achieve a successful
verification of the composite signature. In the case of the composite
public-key decryption, each of the component KEM decapsulation operations must
succeed.</t>
        </section>
        <section anchor="non-composite-multi-alg">
          <name>Non-Composite Algorithm Combinations</name>
          <t>As the OpenPGP protocol <xref target="I-D.ietf-openpgp-crypto-refresh"/> allows for multiple
signatures to be applied to a single message, it is also possible to realize
non-composite combinations of signatures. Furthermore, multiple OpenPGP
signatures may be combined on the application layer. These latter two cases
realize non-composite combinations of signatures. <xref target="multiple-signatures"/>
specifies how implementations should handle the verification of such
combinations of signatures.</t>
          <t>Furthermore, the OpenPGP protocol also allows for parallel encryption to
different keys held by the same recipient. Accordingly, if the sender makes use
of this feature and sends an encrypted message with multiple PKESK packages for
different encryption keys held by the same recipient, a non-composite
multi-algorithm public-key encryption is realized where the recipient has to
decrypt only one of the PKESK packages in order to decrypt the message. See
<xref target="no-pq-t-parallel-encryption"/> for restrictions on parallel encryption
mandated by this specification.</t>
        </section>
      </section>
    </section>
    <section anchor="preliminaries">
      <name>Preliminaries</name>
      <t>This section provides some preliminaries for the definitions in the subsequent
sections.</t>
      <section anchor="elliptic-curves">
        <name>Elliptic curves</name>
        <section anchor="sec1-format">
          <name>SEC1 EC Point Wire Format</name>
          <t>Elliptic curve points of the generic prime curves are encoded using the SEC1
(uncompressed) format as the following octet string:</t>
          <artwork><![CDATA[
B = 04 || X || Y
]]></artwork>
          <t>where <tt>X</tt> and <tt>Y</tt> are coordinates of the elliptic curve point <tt>P = (X, Y)</tt>, and
each coordinate is encoded in the big-endian format and zero-padded to the
adjusted underlying field size. The adjusted underlying field size is the
underlying field size rounded up to the nearest 8-bit boundary, as noted in the
"Field size" column in <xref target="tab-ecdh-nist-artifacts"/>,
<xref target="tab-ecdh-brainpool-artifacts"/>, or <xref target="tab-ecdsa-artifacts"/>. This encoding is
compatible with the definition given in <xref target="SEC1"/>.</t>
        </section>
        <section anchor="measures-to-ensure-secure-implementations">
          <name>Measures to Ensure Secure Implementations</name>
          <t>In the following measures are described that ensure secure implementations
according to existing best practices and standards defining the operations of
Elliptic Curve Cryptography.</t>
          <t>Even though the zero point, also called the point at infinity, may occur as a
result of arithmetic operations on points of an elliptic curve, it MUST NOT
appear in any ECC data structure defined in this document.</t>
          <t>Furthermore, when performing the explicitly listed operations in
<xref target="x25519-kem"/>, <xref target="x448-kem"/> or <xref target="ecdh-kem"/> it is REQUIRED to follow the
specification and security advisory mandated from the respective elliptic curve
specification.</t>
        </section>
      </section>
    </section>
    <section anchor="supported-public-key-algorithms">
      <name>Supported Public Key Algorithms</name>
      <t>This section specifies the composite ML-KEM + ECC and ML-DSA + ECC schemes as
well as the standalone SLH-DSA signature scheme. The composite schemes are
fully specified via their algorithm ID. The SLH-DSA signature schemes are
fully specified by their algorithm ID and an additional parameter ID.</t>
      <section anchor="algorithm-specifications">
        <name>Algorithm Specifications</name>
        <t>For encryption, the following composite KEM schemes are specified:</t>
        <table anchor="kem-alg-specs">
          <name>KEM algorithm specifications</name>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Algorithm</th>
              <th align="left">Requirement</th>
              <th align="left">Definition</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">29</td>
              <td align="left">ML-KEM-768  + X25519</td>
              <td align="left">MUST</td>
              <td align="left">
                <xref target="ecc-mlkem"/></td>
            </tr>
            <tr>
              <td align="right">30</td>
              <td align="left">ML-KEM-1024 + X448</td>
              <td align="left">SHOULD</td>
              <td align="left">
                <xref target="ecc-mlkem"/></td>
            </tr>
            <tr>
              <td align="right">31</td>
              <td align="left">ML-KEM-768  + ECDH-NIST-P-256</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mlkem"/></td>
            </tr>
            <tr>
              <td align="right">32</td>
              <td align="left">ML-KEM-1024 + ECDH-NIST-P-384</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mlkem"/></td>
            </tr>
            <tr>
              <td align="right">33</td>
              <td align="left">ML-KEM-768  + ECDH-brainpoolP256r1</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mlkem"/></td>
            </tr>
            <tr>
              <td align="right">34</td>
              <td align="left">ML-KEM-1024 + ECDH-brainpoolP384r1</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mlkem"/></td>
            </tr>
          </tbody>
        </table>
        <t>For signatures, the following (composite) signature schemes are specified:</t>
        <table anchor="sig-alg-specs">
          <name>Signature algorithm specifications</name>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Algorithm</th>
              <th align="left">Requirement</th>
              <th align="left">Definition</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">35</td>
              <td align="left">ML-DSA-65 + Ed25519</td>
              <td align="left">MUST</td>
              <td align="left">
                <xref target="ecc-mldsa"/></td>
            </tr>
            <tr>
              <td align="right">36</td>
              <td align="left">ML-DSA-87 + Ed448</td>
              <td align="left">SHOULD</td>
              <td align="left">
                <xref target="ecc-mldsa"/></td>
            </tr>
            <tr>
              <td align="right">37</td>
              <td align="left">ML-DSA-65 + ECDSA-NIST-P-256</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mldsa"/></td>
            </tr>
            <tr>
              <td align="right">38</td>
              <td align="left">ML-DSA-87 + ECDSA-NIST-P-384</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mldsa"/></td>
            </tr>
            <tr>
              <td align="right">39</td>
              <td align="left">ML-DSA-65 + ECDSA-brainpoolP256r1</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mldsa"/></td>
            </tr>
            <tr>
              <td align="right">40</td>
              <td align="left">ML-DSA-87 + ECDSA-brainpoolP384r1</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="ecc-mldsa"/></td>
            </tr>
            <tr>
              <td align="right">41</td>
              <td align="left">SLH-DSA-SHA2</td>
              <td align="left">SHOULD</td>
              <td align="left">
                <xref target="slhdsa"/></td>
            </tr>
            <tr>
              <td align="right">42</td>
              <td align="left">SLH-DSA-SHAKE</td>
              <td align="left">MAY</td>
              <td align="left">
                <xref target="slhdsa"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="parameter-specification">
        <name>Parameter Specification</name>
        <section anchor="slh-dsa-sha2">
          <name>SLH-DSA-SHA2</name>
          <t>For the SLH-DSA-SHA2 signature algorithm from <xref target="sig-alg-specs"/>, the following
parameters are specified:</t>
          <table anchor="slhdsa-param-sha2">
            <name>SLH-DSA-SHA2 security parameters</name>
            <thead>
              <tr>
                <th align="right">Parameter ID</th>
                <th align="left">Parameter</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">1</td>
                <td align="left">SLH-DSA-SHA2-128s</td>
              </tr>
              <tr>
                <td align="right">2</td>
                <td align="left">SLH-DSA-SHA2-128f</td>
              </tr>
              <tr>
                <td align="right">3</td>
                <td align="left">SLH-DSA-SHA2-192s</td>
              </tr>
              <tr>
                <td align="right">4</td>
                <td align="left">SLH-DSA-SHA2-192f</td>
              </tr>
              <tr>
                <td align="right">5</td>
                <td align="left">SLH-DSA-SHA2-256s</td>
              </tr>
              <tr>
                <td align="right">6</td>
                <td align="left">SLH-DSA-SHA2-256f</td>
              </tr>
            </tbody>
          </table>
          <t>All security parameters inherit the requirement of SLH-DSA-SHA2 from
<xref target="sig-alg-specs"/>. That is, implementations SHOULD implement the parameters
specified in <xref target="slhdsa-param-sha2"/>. The values <tt>0x00</tt> and <tt>0xFF</tt> are reserved
for future extensions.</t>
        </section>
        <section anchor="slh-dsa-shake">
          <name>SLH-DSA-SHAKE</name>
          <t>For the SLH-DSA-SHAKE signature algorithm from <xref target="sig-alg-specs"/>, the
following parameters are specified:</t>
          <table anchor="slhdsa-param-shake">
            <name>SLH-DSA-SHAKE security parameters</name>
            <thead>
              <tr>
                <th align="right">Parameter ID</th>
                <th align="left">Parameter</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">1</td>
                <td align="left">SLH-DSA-SHAKE-128s</td>
              </tr>
              <tr>
                <td align="right">2</td>
                <td align="left">SLH-DSA-SHAKE-128f</td>
              </tr>
              <tr>
                <td align="right">3</td>
                <td align="left">SLH-DSA-SHAKE-192s</td>
              </tr>
              <tr>
                <td align="right">4</td>
                <td align="left">SLH-DSA-SHAKE-192f</td>
              </tr>
              <tr>
                <td align="right">5</td>
                <td align="left">SLH-DSA-SHAKE-256s</td>
              </tr>
              <tr>
                <td align="right">6</td>
                <td align="left">SLH-DSA-SHAKE-256f</td>
              </tr>
            </tbody>
          </table>
          <t>All security parameters inherit the requirement of SLH-DSA-SHAKE from
<xref target="sig-alg-specs"/>. That is, implementations MAY implement the parameters
specified in <xref target="slhdsa-param-shake"/>. The values <tt>0x00</tt> and <tt>0xFF</tt> are reserved
for future extensions.</t>
        </section>
      </section>
    </section>
    <section anchor="algorithm-combinations">
      <name>Algorithm Combinations</name>
      <section anchor="composite-kems">
        <name>Composite KEMs</name>
        <t>The ML-KEM + ECC public-key encryption involves both the ML-KEM and an
ECC-based KEM in an a priori non-separable manner. This is achieved via KEM
combination, i.e. both key encapsulations/decapsulations are performed in
parallel, and the resulting key shares are fed into a key combiner to produce a
single shared secret for message encryption.</t>
      </section>
      <section anchor="no-pq-t-parallel-encryption">
        <name>Parallel Public-Key Encryption</name>
        <t>As explained in <xref target="non-composite-multi-alg"/>, the OpenPGP protocol inherently
supports parallel encryption to different keys of the same recipient.
Implementations MUST NOT encrypt a message with a purely traditional public-key
encryption key of a recipient if it is encrypted with a PQ/T key of the same
recipient.</t>
      </section>
      <section anchor="composite-signatures">
        <name>Composite Signatures</name>
        <t>The ML-DSA + ECC signature consists of independent ML-DSA and ECC signatures,
and an implementation MUST successfully validate both signatures to state that
the ML-DSA + ECC signature is valid.</t>
      </section>
      <section anchor="multiple-signatures">
        <name>Multiple Signatures</name>
        <t>The OpenPGP message format allows multiple signatures of a message, i.e. the
attachment of multiple signature packets.</t>
        <t>An implementation MAY sign a message with a traditional key and a PQ(/T) key
from the same sender. This ensures backwards compatibility due to
<xref target="I-D.ietf-openpgp-crypto-refresh"/> Section 5.2.5, since a legacy
implementation without PQ(/T) support can fall back on the traditional
signature.</t>
        <t>Newer implementations with PQ(/T) support MAY ignore the traditional
signature(s) during validation.</t>
        <t>Implementations SHOULD consider the message correctly signed if at least one of
the non-ignored signatures validates successfully.</t>
        <t>[Note to the reader: The last requirement, that one valid signature is
sufficient to identify a message as correctly signed, is an interpretation of
<xref target="I-D.ietf-openpgp-crypto-refresh"/> Section 5.2.5.]</t>
      </section>
    </section>
    <section anchor="composite-kem-schemes">
      <name>Composite KEM schemes</name>
      <section anchor="building-blocks">
        <name>Building Blocks</name>
        <section anchor="ecc-kem">
          <name>ECC-Based KEMs</name>
          <t>In this section we define the encryption, decryption, and data formats for the
ECDH component of the composite algorithms.</t>
          <t><xref target="tab-ecdh-cfrg-artifacts"/>, <xref target="tab-ecdh-nist-artifacts"/>, and
<xref target="tab-ecdh-brainpool-artifacts"/> describe the ECC-KEM parameters and artifact
lengths. The artefacts in <xref target="tab-ecdh-cfrg-artifacts"/> follow the encodings
described in <xref target="RFC7748"/>.</t>
          <table anchor="tab-ecdh-cfrg-artifacts">
            <name>Montgomery curves parameters and artifact lengths</name>
            <thead>
              <tr>
                <th align="left"> </th>
                <th align="left">X25519</th>
                <th align="left">X448</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Algorithm ID reference</td>
                <td align="left">29</td>
                <td align="left">30</td>
              </tr>
              <tr>
                <td align="left">Field size</td>
                <td align="left">32 octets</td>
                <td align="left">56 octets</td>
              </tr>
              <tr>
                <td align="left">ECC-KEM</td>
                <td align="left">x25519Kem (<xref target="x25519-kem"/>)</td>
                <td align="left">x448Kem (<xref target="x448-kem"/>)</td>
              </tr>
              <tr>
                <td align="left">ECDH public key</td>
                <td align="left">32 octets <xref target="RFC7748"/></td>
                <td align="left">56 octets <xref target="RFC7748"/></td>
              </tr>
              <tr>
                <td align="left">ECDH secret key</td>
                <td align="left">32 octets <xref target="RFC7748"/></td>
                <td align="left">56 octets <xref target="RFC7748"/></td>
              </tr>
              <tr>
                <td align="left">ECDH ephemeral</td>
                <td align="left">32 octets <xref target="RFC7748"/></td>
                <td align="left">56 octets <xref target="RFC7748"/></td>
              </tr>
              <tr>
                <td align="left">ECDH share</td>
                <td align="left">32 octets <xref target="RFC7748"/></td>
                <td align="left">56 octets <xref target="RFC7748"/></td>
              </tr>
              <tr>
                <td align="left">Key share</td>
                <td align="left">32 octets</td>
                <td align="left">64 octets</td>
              </tr>
              <tr>
                <td align="left">Hash</td>
                <td align="left">SHA3-256</td>
                <td align="left">SHA3-512</td>
              </tr>
            </tbody>
          </table>
          <table anchor="tab-ecdh-nist-artifacts">
            <name>NIST curves parameters and artifact lengths</name>
            <thead>
              <tr>
                <th align="left"> </th>
                <th align="left">NIST P-256</th>
                <th align="left">NIST P-384</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Algorithm ID reference</td>
                <td align="left">31</td>
                <td align="left">32</td>
              </tr>
              <tr>
                <td align="left">Field size</td>
                <td align="left">32 octets</td>
                <td align="left">48 octets</td>
              </tr>
              <tr>
                <td align="left">ECC-KEM</td>
                <td align="left">ecdhKem (<xref target="ecdh-kem"/>)</td>
                <td align="left">ecdhKem (<xref target="ecdh-kem"/>)</td>
              </tr>
              <tr>
                <td align="left">ECDH public key</td>
                <td align="left">65 octets of SEC1-encoded public point</td>
                <td align="left">97 octets of SEC1-encoded public point</td>
              </tr>
              <tr>
                <td align="left">ECDH secret key</td>
                <td align="left">32 octets big-endian encoded secret scalar</td>
                <td align="left">48 octets big-endian encoded secret scalar</td>
              </tr>
              <tr>
                <td align="left">ECDH ephemeral</td>
                <td align="left">65 octets of SEC1-encoded ephemeral point</td>
                <td align="left">97 octets of SEC1-encoded ephemeral point</td>
              </tr>
              <tr>
                <td align="left">ECDH share</td>
                <td align="left">65 octets of SEC1-encoded shared point</td>
                <td align="left">97 octets of SEC1-encoded shared point</td>
              </tr>
              <tr>
                <td align="left">Key share</td>
                <td align="left">32 octets</td>
                <td align="left">64 octets</td>
              </tr>
              <tr>
                <td align="left">Hash</td>
                <td align="left">SHA3-256</td>
                <td align="left">SHA3-512</td>
              </tr>
            </tbody>
          </table>
          <table anchor="tab-ecdh-brainpool-artifacts">
            <name>Brainpool curves parameters and artifact lengths</name>
            <thead>
              <tr>
                <th align="left"> </th>
                <th align="left">brainpoolP256r1</th>
                <th align="left">brainpoolP384r1</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Algorithm ID reference</td>
                <td align="left">33</td>
                <td align="left">34</td>
              </tr>
              <tr>
                <td align="left">Field size</td>
                <td align="left">32 octets</td>
                <td align="left">48 octets</td>
              </tr>
              <tr>
                <td align="left">ECC-KEM</td>
                <td align="left">ecdhKem (<xref target="ecdh-kem"/>)</td>
                <td align="left">ecdhKem (<xref target="ecdh-kem"/>)</td>
              </tr>
              <tr>
                <td align="left">ECDH public key</td>
                <td align="left">65 octets of SEC1-encoded public point</td>
                <td align="left">97 octets of SEC1-encoded public point</td>
              </tr>
              <tr>
                <td align="left">ECDH secret key</td>
                <td align="left">32 octets big-endian encoded secret scalar</td>
                <td align="left">48 octets big-endian encoded secret scalar</td>
              </tr>
              <tr>
                <td align="left">ECDH ephemeral</td>
                <td align="left">65 octets of SEC1-encoded ephemeral point</td>
                <td align="left">97 octets of SEC1-encoded ephemeral point</td>
              </tr>
              <tr>
                <td align="left">ECDH share</td>
                <td align="left">65 octets of SEC1-encoded shared point</td>
                <td align="left">97 octets of SEC1-encoded shared point</td>
              </tr>
              <tr>
                <td align="left">Key share</td>
                <td align="left">32 octets</td>
                <td align="left">64 octets</td>
              </tr>
              <tr>
                <td align="left">Hash</td>
                <td align="left">SHA3-256</td>
                <td align="left">SHA3-512</td>
              </tr>
            </tbody>
          </table>
          <t>The SEC1 format for point encoding is defined in <xref target="sec1-format"/>.</t>
          <t>The various procedures to perform the operations of an ECC-based KEM are
defined in the following subsections. Specifically, each of these subsections
defines the instances of the following operations:</t>
          <artwork><![CDATA[
(eccCipherText, eccKeyShare) <- ECC-KEM.Encaps(eccPublicKey)
]]></artwork>
          <t>and</t>
          <artwork><![CDATA[
(eccKeyShare) <- ECC-KEM.Decaps(eccSecretKey, eccCipherText)
]]></artwork>
          <t>To instantiate <tt>ECC-KEM</tt>, one must select a parameter set from
<xref target="tab-ecdh-cfrg-artifacts"/>, <xref target="tab-ecdh-nist-artifacts"/>, or
<xref target="tab-ecdh-brainpool-artifacts"/>.</t>
          <section anchor="x25519-kem">
            <name>X25519-KEM</name>
            <t>The encapsulation and decapsulation operations of <tt>x25519kem</tt> are described
using the function <tt>X25519()</tt> and encodings defined in <xref target="RFC7748"/>. The
<tt>eccSecretKey</tt> is denoted as <tt>r</tt>, the <tt>eccPublicKey</tt> as <tt>R</tt>, they are subject
to the equation <tt>R = X25519(r, U(P))</tt>. Here, <tt>U(P)</tt> denotes the u-coordinate of
the base point of Curve25519.</t>
            <t>The operation <tt>x25519Kem.Encaps()</tt> is defined as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Generate an ephemeral key pair {<tt>v</tt>, <tt>V</tt>} via <tt>V = X25519(v,U(P))</tt> where <tt>v</tt>
is a random scalar</t>
              </li>
              <li>
                <t>Compute the shared coordinate <tt>X = X25519(v, R)</tt> where <tt>R</tt> is the public key
<tt>eccPublicKey</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccCipherText</tt> to <tt>V</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccKeyShare</tt> to <tt>SHA3-256(X || eccCipherText || eccPublicKey)</tt></t>
              </li>
            </ol>
            <t>The operation <tt>x25519Kem.Decaps()</tt> is defined as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Compute the shared coordinate <tt>X = X25519(r, V)</tt>, where <tt>r</tt> is the
<tt>eccSecretKey</tt> and <tt>V</tt> is the <tt>eccCipherText</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccKeyShare</tt> to <tt>SHA3-256(X || eccCipherText || eccPublicKey)</tt></t>
              </li>
            </ol>
          </section>
          <section anchor="x448-kem">
            <name>X448-KEM</name>
            <t>The encapsulation and decapsulation operations of <tt>x448kem</tt> are described using
the function <tt>X448()</tt> and encodings defined in <xref target="RFC7748"/>. The <tt>eccSecretKey</tt>
is denoted as <tt>r</tt>, the <tt>eccPublicKey</tt> as <tt>R</tt>, they are subject to the equation
<tt>R = X25519(r, U(P))</tt>. Here, <tt>U(P)</tt> denotes the u-coordinate of the base point
of Curve448.</t>
            <t>The operation <tt>x448.Encaps()</tt> is defined as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Generate an ephemeral key pair {<tt>v</tt>, <tt>V</tt>} via <tt>V = X448(v,U(P))</tt> where <tt>v</tt>
is a random scalar</t>
              </li>
              <li>
                <t>Compute the shared coordinate <tt>X = X448(v, R)</tt> where <tt>R</tt> is the public key
<tt>eccPublicKey</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccCipherText</tt> to <tt>V</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccKeyShare</tt> to <tt>SHA3-512(X || eccCipherText || eccPublicKey)</tt></t>
              </li>
            </ol>
            <t>The operation <tt>x448Kem.Decaps()</tt> is defined as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Compute the shared coordinate <tt>X = X448(r, V)</tt>, where <tt>r</tt> is the
<tt>eccSecretKey</tt> and <tt>V</tt> is the <tt>eccCipherText</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccKeyShare</tt> to <tt>SHA3-512(X || eccCipherText || eccPublicKey)</tt></t>
              </li>
            </ol>
          </section>
          <section anchor="ecdh-kem">
            <name>ECDH-KEM</name>
            <t>The operation <tt>ecdhKem.Encaps()</tt> is defined as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Generate an ephemeral key pair {<tt>v</tt>, <tt>V=vG</tt>} as defined in
<xref target="SP800-186"/> or <xref target="RFC5639"/> where <tt>v</tt> is a random scalar</t>
              </li>
              <li>
                <t>Compute the shared point <tt>S = vR</tt>, where <tt>R</tt> is the component public key
<tt>eccPublicKey</tt>, according to <xref target="SP800-186"/> or <xref target="RFC5639"/></t>
              </li>
              <li>
                <t>Extract the <tt>X</tt> coordinate from the SEC1 encoded point <tt>S = 04 || X || Y</tt>
as defined in section <xref target="sec1-format"/></t>
              </li>
              <li>
                <t>Set the output <tt>eccCipherText</tt> to the SEC1 encoding of <tt>V</tt></t>
              </li>
              <li>
                <t>Set the output <tt>eccKeyShare</tt> to <tt>Hash(X || eccCipherText || eccPublicKey)</tt>,
with <tt>Hash</tt> chosen according to <xref target="tab-ecdh-nist-artifacts"/> or
<xref target="tab-ecdh-brainpool-artifacts"/></t>
              </li>
            </ol>
            <t>The operation <tt>ecdhKem.Decaps()</tt> is defined as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Compute the shared Point <tt>S</tt> as <tt>rV</tt>, where <tt>r</tt> is the <tt>eccSecretKey</tt> and
<tt>V</tt> is the <tt>eccCipherText</tt>, according to <xref target="SP800-186"/> or <xref target="RFC5639"/></t>
              </li>
              <li>
                <t>Extract the <tt>X</tt> coordinate from the SEC1 encoded point <tt>S = 04 || X || Y</tt>
as defined in section <xref target="sec1-format"/></t>
              </li>
              <li>
                <t>Set the output <tt>eccKeyShare</tt> to <tt>Hash(X || eccCipherText || eccPublicKey)</tt>,
with <tt>Hash</tt> chosen according to <xref target="tab-ecdh-nist-artifacts"/> or
<xref target="tab-ecdh-brainpool-artifacts"/></t>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="mlkem-ops">
          <name>ML-KEM</name>
          <t>ML-KEM features the following operations:</t>
          <artwork><![CDATA[
(mlkemCipherText, mlkemKeyShare) <- ML-KEM.Encaps(mlkemPublicKey)
]]></artwork>
          <t>and</t>
          <artwork><![CDATA[
(mlkemKeyShare) <- ML-KEM.Decaps(mlkemCipherText, mlkemSecretKey)
]]></artwork>
          <t>The above are the operations <tt>ML-KEM.Encaps</tt> and <tt>ML-KEM.Decaps</tt> defined in
<xref target="FIPS-203"/>. Note that <tt>mlkemPublicKey</tt> is the encapsulation and
<tt>mlkemSecretKey</tt> is the decapsulation key.</t>
          <t>ML-KEM has the parameterization with the corresponding artifact lengths in
octets as given in <xref target="tab-mlkem-artifacts"/>. All artifacts are encoded as
defined in <xref target="FIPS-203"/>.</t>
          <table anchor="tab-mlkem-artifacts">
            <name>ML-KEM parameters artifact lengths in octets</name>
            <thead>
              <tr>
                <th align="right">Algorithm ID reference</th>
                <th align="left">ML-KEM</th>
                <th align="left">Public key</th>
                <th align="left">Secret key</th>
                <th align="left">Ciphertext</th>
                <th align="left">Key share</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">29, 31, 33</td>
                <td align="left">ML-KEM-768</td>
                <td align="left">1184</td>
                <td align="left">2400</td>
                <td align="left">1088</td>
                <td align="left">32</td>
              </tr>
              <tr>
                <td align="right">30, 32, 34</td>
                <td align="left">ML-KEM-1024</td>
                <td align="left">1568</td>
                <td align="left">3168</td>
                <td align="left">1568</td>
                <td align="left">32</td>
              </tr>
            </tbody>
          </table>
          <t>To instantiate <tt>ML-KEM</tt>, one must select a parameter set from the column
"ML-KEM" of <xref target="tab-mlkem-artifacts"/>.</t>
          <t>The procedure to perform <tt>ML-KEM.Encaps()</tt> is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Extract the encapsulation key <tt>mlkemPublicKey</tt> that is part of the
recipient's composite public key</t>
            </li>
            <li>
              <t>Invoke <tt>(mlkemCipherText, mlkemKeyShare) &lt;- ML-KEM.Encaps(mlkemPublicKey)</tt></t>
            </li>
            <li>
              <t>Set <tt>mlkemCipherText</tt> as the ML-KEM ciphertext</t>
            </li>
            <li>
              <t>Set <tt>mlkemKeyShare</tt> as the ML-KEM symmetric key share</t>
            </li>
          </ol>
          <t>The procedure to perform <tt>ML-KEM.Decaps()</tt> is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Invoke <tt>mlkemKeyShare &lt;-  ML-KEM.Decaps(mlkemCipherText, mlkemSecretKey)</tt></t>
            </li>
            <li>
              <t>Set <tt>mlkemKeyShare</tt> as the ML-KEM symmetric key share</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="ecc-mlkem">
        <name>Composite Encryption Schemes with ML-KEM</name>
        <t><xref target="kem-alg-specs"/> specifies the following ML-KEM + ECC composite public-key
encryption schemes:</t>
        <table anchor="tab-mlkem-ecc-composite">
          <name>ML-KEM + ECC composite schemes</name>
          <thead>
            <tr>
              <th align="right">Algorithm ID reference</th>
              <th align="left">ML-KEM</th>
              <th align="left">ECC-KEM</th>
              <th align="left">ECC-KEM curve</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">29</td>
              <td align="left">ML-KEM-768</td>
              <td align="left">x25519Kem</td>
              <td align="left">Curve25519</td>
            </tr>
            <tr>
              <td align="right">30</td>
              <td align="left">ML-KEM-1024</td>
              <td align="left">x448Kem</td>
              <td align="left">Curve448</td>
            </tr>
            <tr>
              <td align="right">31</td>
              <td align="left">ML-KEM-768</td>
              <td align="left">ecdhKem</td>
              <td align="left">NIST P-256</td>
            </tr>
            <tr>
              <td align="right">32</td>
              <td align="left">ML-KEM-1024</td>
              <td align="left">ecdhKem</td>
              <td align="left">NIST P-384</td>
            </tr>
            <tr>
              <td align="right">33</td>
              <td align="left">ML-KEM-768</td>
              <td align="left">ecdhKem</td>
              <td align="left">brainpoolP256r1</td>
            </tr>
            <tr>
              <td align="right">34</td>
              <td align="left">ML-KEM-1024</td>
              <td align="left">ecdhKem</td>
              <td align="left">brainpoolP384r1</td>
            </tr>
          </tbody>
        </table>
        <t>The ML-KEM + ECC composite public-key encryption schemes are built according to
the following principal design:</t>
        <ul spacing="normal">
          <li>
            <t>The ML-KEM encapsulation algorithm is invoked to create a ML-KEM ciphertext
together with a ML-KEM symmetric key share.</t>
          </li>
          <li>
            <t>The encapsulation algorithm of an ECC-based KEM, namely one out of
X25519-KEM, X448-KEM, or ECDH-KEM is invoked to create an ECC ciphertext
together with an ECC symmetric key share.</t>
          </li>
          <li>
            <t>A Key-Encryption-Key (KEK) is computed as the output of a key combiner that
receives as input both of the above created symmetric key shares and the
protocol binding information.</t>
          </li>
          <li>
            <t>The session key for content encryption is then wrapped as described in
<xref target="RFC3394"/> using AES-256 as algorithm and the KEK as key.</t>
          </li>
          <li>
            <t>The PKESK package's algorithm-specific parts are made up of the ML-KEM
ciphertext, the ECC ciphertext, and the wrapped session key.</t>
          </li>
        </ul>
        <section anchor="kem-fixed-info">
          <name>Fixed information</name>
          <t>For the composite KEM schemes defined in <xref target="kem-alg-specs"/> the following
procedure, justified in <xref target="sec-fixed-info"/>, MUST be used to derive a string to
use as binding between the KEK and the communication parties.</t>
          <artwork><![CDATA[
//   Input:
//   algID     - the algorithm ID encoded as octet

fixedInfo = algID
]]></artwork>
        </section>
        <section anchor="kem-key-combiner">
          <name>Key combiner</name>
          <t>For the composite KEM schemes defined in <xref target="kem-alg-specs"/> the following
procedure MUST be used to compute the KEK that wraps a session key. The
construction is a one-step key derivation function compliant to <xref target="SP800-56C"/>
Section 4, based on KMAC256 <xref target="SP800-185"/>. It is given by the following
algorithm.</t>
          <artwork><![CDATA[
//   multiKeyCombine(eccKeyShare, eccCipherText,
//                   mlkemKeyShare, mlkemCipherText,
//                   fixedInfo, oBits)
//
//   Input:
//   eccKeyShare     - the ECC key share encoded as an octet string
//   eccCipherText   - the ECC ciphertext encoded as an octet string
//   mlkemKeyShare   - the ML-KEM key share encoded as an octet string
//   mlkemCipherText - the ML-KEM ciphertext encoded as an octet string
//   fixedInfo       - the fixed information octet string
//   oBits           - the size of the output keying material in bits
//
//   Constants:
//   domSeparation       - the UTF-8 encoding of the string
//                         "OpenPGPCompositeKeyDerivationFunction"
//   counter             - the fixed 4 byte value 0x00000001
//   customizationString - the UTF-8 encoding of the string "KDF"

eccData = eccKeyShare || eccCipherText
mlkemData = mlkemKeyShare || mlkemCipherText
encData = counter || eccData || mlkemData || fixedInfo

MB = KMAC256(domSeparation, encData, oBits, customizationString)
]]></artwork>
          <t>Note that the values <tt>eccKeyShare</tt> defined in <xref target="ecc-kem"/> and <tt>mlkemKeyShare</tt>
defined in <xref target="mlkem-ops"/> already use the relative ciphertext in the
derivation. The ciphertext is by design included again in the key combiner to
provide a robust security proof.</t>
          <t>The value of <tt>domSeparation</tt> is the UTF-8 encoding of the string
"OpenPGPCompositeKeyDerivationFunction" and MUST be the following octet sequence:</t>
          <artwork><![CDATA[
domSeparation := 4F 70 65 6E 50 47 50 43 6F 6D 70 6F 73 69 74 65
                 4B 65 79 44 65 72 69 76 61 74 69 6F 6E 46 75 6E
                 63 74 69 6F 6E
]]></artwork>
          <t>The value of <tt>counter</tt> MUST be set to the following octet sequence:</t>
          <artwork><![CDATA[
counter :=  00 00 00 01
]]></artwork>
          <t>The value of <tt>fixedInfo</tt> MUST be set according to <xref target="kem-fixed-info"/>.</t>
          <t>The value of <tt>customizationString</tt> is the UTF-8 encoding of the string "KDF"
and MUST be set to the following octet sequence:</t>
          <artwork><![CDATA[
customizationString := 4B 44 46
]]></artwork>
        </section>
        <section anchor="ecc-mlkem-generation">
          <name>Key generation procedure</name>
          <t>The implementation MUST independently generate the ML-KEM and the ECC component
keys. ML-KEM key generation follows the specification <xref target="FIPS-203"/> and the
artifacts are encoded as fixed-length octet strings as defined in
<xref target="mlkem-ops"/>. For ECC this is done following the relative specification in
<xref target="RFC7748"/>, <xref target="SP800-186"/>, or <xref target="RFC5639"/>, and encoding the outputs as
fixed-length octet strings in the format specified in
<xref target="tab-ecdh-cfrg-artifacts"/>, <xref target="tab-ecdh-nist-artifacts"/>, or
<xref target="tab-ecdh-brainpool-artifacts"/>.</t>
        </section>
        <section anchor="ecc-mlkem-encryption">
          <name>Encryption procedure</name>
          <t>The procedure to perform public-key encryption with a ML-KEM + ECC composite
scheme is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Take the recipient's authenticated public-key packet <tt>pkComposite</tt> and
   <tt>sessionKey</tt> as input</t>
            </li>
            <li>
              <t>Parse the algorithm ID from <tt>pkComposite</tt></t>
            </li>
            <li>
              <t>Extract the <tt>eccPublicKey</tt> and <tt>mlkemPublicKey</tt> component from the
algorithm specific data encoded in <tt>pkComposite</tt> with the format specified
in <xref target="mlkem-ecc-key"/>.</t>
            </li>
            <li>
              <t>Instantiate the ECC-KEM and the ML-KEM depending on the algorithm ID
according to <xref target="tab-mlkem-ecc-composite"/></t>
            </li>
            <li>
              <t>Compute <tt>(eccCipherText, eccKeyShare) := ECC-KEM.Encaps(eccPublicKey)</tt></t>
            </li>
            <li>
              <t>Compute <tt>(mlkemCipherText, mlkemKeyShare) := ML-KEM.Encaps(mlkemPublicKey)</tt></t>
            </li>
            <li>
              <t>Compute <tt>fixedInfo</tt> as specified in <xref target="kem-fixed-info"/></t>
            </li>
            <li>
              <t>Compute <tt>KEK := multiKeyCombine(eccKeyShare, eccCipherText, mlkemKeyShare,
mlkemCipherText, fixedInfo, oBits=256)</tt> as defined in <xref target="kem-key-combiner"/></t>
            </li>
            <li>
              <t>Compute <tt>C := AESKeyWrap(KEK, sessionKey)</tt> with AES-256 as per <xref target="RFC3394"/>
that includes a 64 bit integrity check</t>
            </li>
            <li>
              <t>Output <tt>eccCipherText || mlkemCipherText || len(C) || C</tt></t>
            </li>
          </ol>
        </section>
        <section anchor="decryption-procedure">
          <name>Decryption procedure</name>
          <t>The procedure to perform public-key decryption with a ML-KEM + ECC composite
scheme is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Take the matching PKESK and own secret key packet as input</t>
            </li>
            <li>
              <t>From the PKESK extract the algorithm ID and the <tt>encryptedKey</tt></t>
            </li>
            <li>
              <t>Check that the own and the extracted algorithm ID match</t>
            </li>
            <li>
              <t>Parse the <tt>eccSecretKey</tt> and <tt>mlkemSecretKey</tt> from the algorithm specific
data of the own secret key encoded in the format specified in
<xref target="mlkem-ecc-key"/></t>
            </li>
            <li>
              <t>Instantiate the ECC-KEM and the ML-KEM depending on the algorithm ID
according to <xref target="tab-mlkem-ecc-composite"/></t>
            </li>
            <li>
              <t>Parse <tt>eccCipherText</tt>, <tt>mlkemCipherText</tt>, and <tt>C</tt> from <tt>encryptedKey</tt>
encoded as <tt>eccCipherText || mlkemCipherText || len(C) || C</tt> as specified
in <xref target="ecc-mlkem-pkesk"/></t>
            </li>
            <li>
              <t>Compute <tt>(eccKeyShare) := ECC-KEM.Decaps(eccCipherText, eccSecretKey)</tt></t>
            </li>
            <li>
              <t>Compute <tt>(mlkemKeyShare) := ML-KEM.Decaps(mlkemCipherText, mlkemSecretKey)</tt></t>
            </li>
            <li>
              <t>Compute <tt>fixedInfo</tt> as specified in <xref target="kem-fixed-info"/></t>
            </li>
            <li>
              <t>Compute <tt>KEK := multiKeyCombine(eccKeyShare, eccCipherText, mlkemKeyShare,
mlkemCipherText, fixedInfo, oBits=256)</tt> as defined in <xref target="kem-key-combiner"/></t>
            </li>
            <li>
              <t>Compute <tt>sessionKey := AESKeyUnwrap(KEK, C)</tt>  with AES-256 as per
<xref target="RFC3394"/>, aborting if the 64 bit integrity check fails</t>
            </li>
            <li>
              <t>Output <tt>sessionKey</tt></t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="packet-specifications">
        <name>Packet specifications</name>
        <section anchor="ecc-mlkem-pkesk">
          <name>Public-Key Encrypted Session Key Packets (Tag 1)</name>
          <t>The algorithm-specific fields consists of:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing an ECC ephemeral public key in the
format associated with the curve as specified in <xref target="ecc-kem"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string of the ML-KEM ciphertext, whose length depends
on the algorithm ID as specified in <xref target="tab-mlkem-artifacts"/>.</t>
            </li>
            <li>
              <t>The one-octet algorithm identifier, if it is passed (in the case of a v3
PKESK packet).</t>
            </li>
            <li>
              <t>A variable-length field containing the wrapped session key:  </t>
              <ul spacing="normal">
                <li>
                  <t>A one-octet size of the following field;</t>
                </li>
                <li>
                  <t>The wrapped session key represented as an octet string, i.e., the output
of the encryption procedure described in <xref target="ecc-mlkem-encryption"/>.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Note that unlike most public-key algorithms, in the case of a v3 PKESK packet,
the symmetric algorithm identifier is not encrypted.  Instead, it is prepended
to the encrypted session key in plaintext.  In this case, the symmetric
algorithm used MUST be AES-128, AES-192 or AES-256 (algorithm ID 7, 8 or 9).</t>
        </section>
        <section anchor="mlkem-ecc-key">
          <name>Key Material Packets</name>
          <t>The algorithm-specific public key is this series of values:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing an EC point public key, in the
point format associated with the curve specified in <xref target="ecc-kem"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the ML-KEM public key, whose
length depends on the algorithm ID as specified in <xref target="tab-mlkem-artifacts"/>.</t>
            </li>
          </ul>
          <t>The algorithm-specific secret key is these two values:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string of the encoded secret scalar, whose encoding and
length depend on the algorithm ID as specified in <xref target="ecc-kem"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the ML-KEM secret key, whose
length depends on the algorithm ID as specified in <xref target="tab-mlkem-artifacts"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="composite-signature-schemes">
      <name>Composite Signature Schemes</name>
      <section anchor="building-blocks-1">
        <name>Building blocks</name>
        <section anchor="eddsa-signature">
          <name>EdDSA-Based signatures</name>
          <t>To sign and verify with EdDSA the following operations are defined:</t>
          <artwork><![CDATA[
(eddsaSignature) <- EdDSA.Sign(eddsaSecretKey, dataDigest)
]]></artwork>
          <t>and</t>
          <artwork><![CDATA[
(verified) <- EdDSA.Verify(eddsaPublicKey, eddsaSignature, dataDigest)
]]></artwork>
          <t>The public and secret key, as well as the signature MUST be encoded according
to <xref target="RFC8032"/> as fixed-length octet strings. The following table describes the
EdDSA parameters and artifact lengths:</t>
          <table anchor="tab-eddsa-artifacts">
            <name>EdDSA parameters and artifact lengths in octets</name>
            <thead>
              <tr>
                <th align="right">Algorithm ID reference</th>
                <th align="left">Curve</th>
                <th align="left">Field size</th>
                <th align="left">Public key</th>
                <th align="left">Secret key</th>
                <th align="left">Signature</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">35</td>
                <td align="left">Ed25519</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">64</td>
              </tr>
              <tr>
                <td align="right">36</td>
                <td align="left">Ed448</td>
                <td align="left">57</td>
                <td align="left">57</td>
                <td align="left">57</td>
                <td align="left">114</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="ecdsa-signature">
          <name>ECDSA-Based signatures</name>
          <t>To sign and verify with ECDSA the following operations are defined:</t>
          <artwork><![CDATA[
(ecdsaSignatureR, ecdsaSignatureS) <- ECDSA.Sign(ecdsaSecretKey,
                                                 dataDigest)
]]></artwork>
          <t>and</t>
          <artwork><![CDATA[
(verified) <- ECDSA.Verify(ecdsaPublicKey, ecdsaSignatureR,
                           ecdsaSignatureS, dataDigest)
]]></artwork>
          <t>The public keys MUST be encoded in SEC1 format as defined in section
<xref target="sec1-format"/>. The secret key, as well as both values <tt>R</tt> and <tt>S</tt> of the
signature MUST each be encoded as a big-endian integer in a fixed-length octet
string of the specified size.</t>
          <t>The following table describes the ECDSA parameters and artifact lengths:</t>
          <table anchor="tab-ecdsa-artifacts">
            <name>ECDSA parameters and artifact lengths in octets</name>
            <thead>
              <tr>
                <th align="right">Algorithm ID reference</th>
                <th align="left">Curve</th>
                <th align="left">Field size</th>
                <th align="left">Public key</th>
                <th align="left">Secret key</th>
                <th align="left">Signature value R</th>
                <th align="left">Signature value S</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">37</td>
                <td align="left">NIST P-256</td>
                <td align="left">32</td>
                <td align="left">65</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">32</td>
              </tr>
              <tr>
                <td align="right">38</td>
                <td align="left">NIST P-384</td>
                <td align="left">48</td>
                <td align="left">97</td>
                <td align="left">48</td>
                <td align="left">48</td>
                <td align="left">48</td>
              </tr>
              <tr>
                <td align="right">39</td>
                <td align="left">brainpoolP256r1</td>
                <td align="left">32</td>
                <td align="left">65</td>
                <td align="left">32</td>
                <td align="left">32</td>
                <td align="left">32</td>
              </tr>
              <tr>
                <td align="right">40</td>
                <td align="left">brainpoolP384r1</td>
                <td align="left">48</td>
                <td align="left">97</td>
                <td align="left">48</td>
                <td align="left">48</td>
                <td align="left">48</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="mldsa-signature">
          <name>ML-DSA signatures</name>
          <t>For ML-DSA signature generation the default hedged version of <tt>ML-DSA.Sign</tt>
given in <xref target="FIPS-204"/> is used. That is, to sign with ML-DSA the following
operation is defined:</t>
          <artwork><![CDATA[
(mldsaSignature) <- ML-DSA.Sign(mldsaSecretKey, dataDigest)
]]></artwork>
          <t>For ML-DSA signature verification the algorithm ML-DSA.Verify given in
<xref target="FIPS-204"/> is used. That is, to verify with ML-DSA the following operation is
defined:</t>
          <artwork><![CDATA[
(verified) <- ML-DSA.Verify(mldsaPublicKey, dataDigest, mldsaSignature)
]]></artwork>
          <t>ML-DSA has the parameterization with the corresponding artifact lengths in
octets as given in <xref target="tab-mldsa-artifacts"/>. All artifacts are encoded as
defined in <xref target="FIPS-204"/>.</t>
          <table anchor="tab-mldsa-artifacts">
            <name>ML-DSA parameters and artifact lengths in octets</name>
            <thead>
              <tr>
                <th align="right">Algorithm ID reference</th>
                <th align="left">ML-DSA</th>
                <th align="left">Public key</th>
                <th align="left">Secret key</th>
                <th align="left">Signature value</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">35, 37, 39</td>
                <td align="left">ML-DSA-65</td>
                <td align="left">1952</td>
                <td align="left">4000</td>
                <td align="left">3293</td>
              </tr>
              <tr>
                <td align="right">36, 38, 40</td>
                <td align="left">ML-DSA-87</td>
                <td align="left">2592</td>
                <td align="left">4864</td>
                <td align="left">4595</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="ecc-mldsa">
        <name>Composite Signature Schemes with ML-DSA</name>
        <section anchor="mldsa-sig-data-digest">
          <name>Signature data digest</name>
          <t>Signature data (i.e. the data to be signed) is digested prior to signing
operations, see <xref target="I-D.ietf-openpgp-crypto-refresh"/> Section 5.2.4. Composite
ML-DSA + ECC signatures MUST use the associated hash algorithm as specified in
<xref target="tab-mldsa-hash"/> for the signature data digest. Signatures using other hash
algorithms MUST be considered invalid.</t>
          <t>An implementation supporting a specific ML-DSA + ECC algorithm MUST also
support the matching hash algorithm.</t>
          <table anchor="tab-mldsa-hash">
            <name>Binding between ML-DSA and signature data digest</name>
            <thead>
              <tr>
                <th align="right">Algorithm ID reference</th>
                <th align="left">Hash function</th>
                <th align="left">Hash function ID reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">35, 37, 39</td>
                <td align="left">SHA3-256</td>
                <td align="left">12</td>
              </tr>
              <tr>
                <td align="right">36, 38, 40</td>
                <td align="left">SHA3-512</td>
                <td align="left">14</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="ecc-mldsa-generation">
          <name>Key generation procedure</name>
          <t>The implementation MUST independently generate the ML-DSA and the ECC
component keys. ML-DSA key generation follows the specification
<xref target="FIPS-204"/> and the artifacts are encoded as fixed-length octet strings as
defined in <xref target="mldsa-signature"/>. For ECC this is done following the relative
specification in <xref target="RFC7748"/>, <xref target="SP800-186"/>, or <xref target="RFC5639"/>, and encoding the
artifacts as specified in <xref target="eddsa-signature"/> or <xref target="ecdsa-signature"/> as
fixed-length octet strings.</t>
        </section>
        <section anchor="signature-generation">
          <name>Signature Generation</name>
          <t>To sign a message <tt>M</tt> with ML-DSA + EdDSA the following sequence of
operations has to be performed:</t>
          <ol spacing="normal" type="1"><li>
              <t>Generate <tt>dataDigest</tt> according to <xref target="I-D.ietf-openpgp-crypto-refresh"/>
Section 5.2.4</t>
            </li>
            <li>
              <t>Create the EdDSA signature over <tt>dataDigest</tt> with <tt>EdDSA.Sign()</tt> from
<xref target="eddsa-signature"/></t>
            </li>
            <li>
              <t>Create the ML-DSA signature over <tt>dataDigest</tt> with <tt>ML-DSA.Sign()</tt> from
<xref target="mldsa-signature"/></t>
            </li>
            <li>
              <t>Encode the EdDSA and ML-DSA signatures according to the packet structure
given in <xref target="ecc-mldsa-sig-packet"/>.</t>
            </li>
          </ol>
          <t>To sign a message <tt>M</tt> with ML-DSA + ECDSA the following sequence of
operations has to be performed:</t>
          <ol spacing="normal" type="1"><li>
              <t>Generate <tt>dataDigest</tt> according to <xref target="I-D.ietf-openpgp-crypto-refresh"/>
Section 5.2.4</t>
            </li>
            <li>
              <t>Create the ECDSA signature over <tt>dataDigest</tt> with <tt>ECDSA.Sign()</tt> from
<xref target="ecdsa-signature"/></t>
            </li>
            <li>
              <t>Create the ML-DSA signature over <tt>dataDigest</tt> with <tt>ML-DSA.Sign()</tt> from
<xref target="mldsa-signature"/></t>
            </li>
            <li>
              <t>Encode the ECDSA and ML-DSA signatures according to the packet structure
given in <xref target="ecc-mldsa-sig-packet"/>.</t>
            </li>
          </ol>
        </section>
        <section anchor="signature-verification">
          <name>Signature Verification</name>
          <t>To verify a ML-DSA + EdDSA signature the following sequence of operations
has to be performed:</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify the EdDSA signature with <tt>EdDSA.Verify()</tt> from <xref target="eddsa-signature"/></t>
            </li>
            <li>
              <t>Verify the ML-DSA signature with <tt>ML-DSA.Verify()</tt> from <xref target="mldsa-signature"/></t>
            </li>
          </ol>
          <t>To verify a ML-DSA + ECDSA signature the following sequence of operations has
to be performed:</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify the ECDSA signature with <tt>ECDSA.Verify()</tt> from <xref target="ecdsa-signature"/></t>
            </li>
            <li>
              <t>Verify the ML-DSA signature with <tt>ML-DSA.Verify()</tt> from <xref target="mldsa-signature"/></t>
            </li>
          </ol>
          <t>As specified in <xref target="composite-signatures"/> an implementation MUST validate both
signatures, i.e. EdDSA/ECDSA and ML-DSA, to state that a composite ML-DSA + ECC
signature is valid.</t>
        </section>
      </section>
      <section anchor="packet-specifications-1">
        <name>Packet Specifications</name>
        <section anchor="ecc-mldsa-sig-packet">
          <name>Signature Packet (Tag 2)</name>
          <t>The composite ML-DSA + ECC schemes MUST be used only with v6 signatures, as
defined in <xref target="I-D.ietf-openpgp-crypto-refresh"/>.</t>
          <t>The algorithm-specific v6 signature parameters for ML-DSA + EdDSA signatures
consists of:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing the EdDSA signature, whose length
depends on the algorithm ID as specified in <xref target="tab-eddsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string of the ML-DSA signature value, whose length
depends on the algorithm ID as specified in <xref target="tab-mldsa-artifacts"/>.</t>
            </li>
          </ul>
          <t>The algorithm-specific v6 signature parameters for ML-DSA + ECDSA signatures
consists of:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string of the big-endian encoded ECDSA value <tt>R</tt>, whose
length depends on the algorithm ID as specified in <xref target="tab-ecdsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string of the big-endian encoded ECDSA value <tt>S</tt>, whose
length depends on the algorithm ID as specified in <xref target="tab-ecdsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string of the ML-DSA signature value, whose length
depends on the algorithm ID as specified in <xref target="tab-mldsa-artifacts"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="key-material-packets">
          <name>Key Material Packets</name>
          <t>The composite ML-DSA + ECC schemes MUST be used only with v6 keys, as defined
in <xref target="I-D.ietf-openpgp-crypto-refresh"/>.</t>
          <t>The algorithm-specific public key for ML-DSA + EdDSA keys is this series of
values:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing the EdDSA public key, whose length
depends on the algorithm ID as specified in <xref target="tab-eddsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the ML-DSA public key, whose length
depends on the algorithm ID as specified in <xref target="tab-mldsa-artifacts"/>.</t>
            </li>
          </ul>
          <t>The algorithm-specific secret key for ML-DSA + EdDSA keys is this series of
values:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing the EdDSA secret key, whose length
depends on the algorithm ID as specified in <xref target="tab-eddsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the ML-DSA secret key, whose length
depends on the algorithm ID as specified in <xref target="tab-mldsa-artifacts"/>.</t>
            </li>
          </ul>
          <t>The algorithm-specific public key for ML-DSA + ECDSA keys is this series of
values:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing the ECDSA public key in SEC1
format, as specified in section <xref target="sec1-format"/> and with length specified in
<xref target="tab-ecdsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the ML-DSA public key, whose length
depends on the algorithm ID as specified in <xref target="tab-mldsa-artifacts"/>.</t>
            </li>
          </ul>
          <t>The algorithm-specific secret key for ML-DSA + ECDSA keys is this series of
values:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string representing the ECDSA secret key as a
big-endian encoded integer, whose length depends on the algorithm used as
specified in <xref target="tab-ecdsa-artifacts"/>.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the ML-DSA secret key, whose length
depends on the algorithm ID as specified in <xref target="tab-mldsa-artifacts"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="slh-dsa-1">
      <name>SLH-DSA</name>
      <section anchor="slhdsa">
        <name>The SLH-DSA Algorithms</name>
        <t>The following table describes the SLH-DSA parameters and artifact lengths:</t>
        <table anchor="slhdsa-artifact-lengths">
          <name>SLH-DSA parameters and artifact lengths in octets. The values equally apply to the parameter IDs of SLH-DSA-SHA2 and SLH-DSA-SHAKE.</name>
          <thead>
            <tr>
              <th align="right">Parameter ID reference</th>
              <th align="right">Parameter name suffix</th>
              <th align="left">SLH-DSA public key</th>
              <th align="left">SLH-DSA secret key</th>
              <th align="left">SLH-DSA signature</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">1</td>
              <td align="right">128s</td>
              <td align="left">32</td>
              <td align="left">64</td>
              <td align="left">7856</td>
            </tr>
            <tr>
              <td align="right">2</td>
              <td align="right">128f</td>
              <td align="left">32</td>
              <td align="left">64</td>
              <td align="left">17088</td>
            </tr>
            <tr>
              <td align="right">3</td>
              <td align="right">192s</td>
              <td align="left">48</td>
              <td align="left">96</td>
              <td align="left">16224</td>
            </tr>
            <tr>
              <td align="right">4</td>
              <td align="right">192f</td>
              <td align="left">48</td>
              <td align="left">96</td>
              <td align="left">35664</td>
            </tr>
            <tr>
              <td align="right">5</td>
              <td align="right">256s</td>
              <td align="left">64</td>
              <td align="left">128</td>
              <td align="left">29792</td>
            </tr>
            <tr>
              <td align="right">6</td>
              <td align="right">256f</td>
              <td align="left">64</td>
              <td align="left">128</td>
              <td align="left">49856</td>
            </tr>
          </tbody>
        </table>
        <section anchor="slhdsa-sig-data-digest">
          <name>Signature Data Digest</name>
          <t>Signature data (i.e. the data to be signed) is digested prior to signing
operations, see <xref target="I-D.ietf-openpgp-crypto-refresh"/> Section 5.2.4. SLH-DSA
signatures MUST use the associated hash algorithm as specified in
<xref target="tab-slhdsa-hash"/> for the signature data digest. Signatures using other hash
algorithms MUST be considered invalid.</t>
          <t>An implementation supporting a specific SLH-DSA algorithm and parameter MUST
also support the matching hash algorithm.</t>
          <table anchor="tab-slhdsa-hash">
            <name>Binding between SLH-DSA and signature data digest</name>
            <thead>
              <tr>
                <th align="right">Algorithm ID reference</th>
                <th align="left">Parameter ID reference</th>
                <th align="left">Hash function</th>
                <th align="left">Hash function ID reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">41</td>
                <td align="left">1, 2</td>
                <td align="left">SHA-256</td>
                <td align="left">8</td>
              </tr>
              <tr>
                <td align="right">41</td>
                <td align="left">3, 4, 5, 6</td>
                <td align="left">SHA-512</td>
                <td align="left">10</td>
              </tr>
              <tr>
                <td align="right">42</td>
                <td align="left">1, 2</td>
                <td align="left">SHA3-256</td>
                <td align="left">12</td>
              </tr>
              <tr>
                <td align="right">42</td>
                <td align="left">3, 4, 5, 6</td>
                <td align="left">SHA3-512</td>
                <td align="left">14</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="key-generation">
          <name>Key generation</name>
          <t>SLH-DSA key generation is performed via the algorithm <tt>SLH-DSA.KeyGen</tt> as
specified in <xref target="FIPS-205"/>, and the artifacts are encoded as fixed-length octet
strings as defined in <xref target="slhdsa"/>.</t>
        </section>
        <section anchor="signature-generation-1">
          <name>Signature Generation</name>
          <t>SLH-DSA signature generation is performed via the algorithm <tt>SLH-DSA.Sign</tt> as
specified in <xref target="FIPS-205"/>. The variable <tt>opt_rand</tt> is set to <tt>PK.seed</tt>. See
also <xref target="slhdsa-sec-cons"/>.</t>
          <t>An implementation MUST set the Parameter ID in the signature equal to the
issuing secret key Parameter ID.</t>
        </section>
        <section anchor="signature-verification-1">
          <name>Signature Verification</name>
          <t>SLH-DSA signature verification is performed via the algorithm <tt>SLH-DSA.Verify</tt>
as specified in <xref target="FIPS-205"/>.</t>
          <t>An implementation MUST check that the Parameter ID in the signature and in the
key match when verifying.</t>
        </section>
      </section>
      <section anchor="packet-specifications-2">
        <name>Packet specifications</name>
        <section anchor="signature-packet-tag-2">
          <name>Signature Packet (Tag 2)</name>
          <t>The SLH-DSA scheme MUST be used only with v6 signatures, as defined in
<xref target="I-D.ietf-openpgp-crypto-refresh"/> Section 5.2.3.</t>
          <t>The algorithm-specific v6 Signature parameters consists of:</t>
          <ul spacing="normal">
            <li>
              <t>A one-octet value specifying the SLH-DSA parameter ID defined in
<xref target="slhdsa-param-sha2"/> and <xref target="slhdsa-param-shake"/>. The values <tt>0x00</tt> and
<tt>0xFF</tt> are reserved for future extensions.</t>
            </li>
            <li>
              <t>A fixed-length octet string of the SLH-DSA signature value, whose length
depends on the parameter ID in the format specified in
<xref target="slhdsa-artifact-lengths"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="key-material-packets-1">
          <name>Key Material Packets</name>
          <t>The SLH-DSA scheme MUST be used only with v6 keys, as defined in
<xref target="I-D.ietf-openpgp-crypto-refresh"/>.</t>
          <t>The algorithm-specific public key is this series of values:</t>
          <ul spacing="normal">
            <li>
              <t>A one-octet value specifying the SLH-DSA parameter ID defined in
<xref target="slhdsa-param-sha2"/> and <xref target="slhdsa-param-shake"/>. The values <tt>0x00</tt> and
<tt>0xFF</tt> are reserved for future extensions.</t>
            </li>
            <li>
              <t>A fixed-length octet string containing the SLH-DSA public key, whose length
depends on the parameter ID as specified in <xref target="slhdsa-artifact-lengths"/>.</t>
            </li>
          </ul>
          <t>The algorithm-specific secret key is this value:</t>
          <ul spacing="normal">
            <li>
              <t>A fixed-length octet string containing the SLH-DSA secret key, whose length
depends on the parameter ID as specified in <xref target="tab-ecdsa-artifacts"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="migration-considerations">
      <name>Migration Considerations</name>
      <t>The post-quantum KEM algorithms defined in <xref target="kem-alg-specs"/> and the signature
algorithms defined in <xref target="sig-alg-specs"/> are a set of new public key algorithms
that extend the algorithm selection of <xref target="I-D.ietf-openpgp-crypto-refresh"/>.
During the transition period, the post-quantum algorithms will not be supported
by all clients. Therefore various migration considerations must be taken into
account, in particular backwards compatibility to existing implementations that
have not yet been updated to support the post-quantum algorithms.</t>
      <section anchor="key-preference">
        <name>Key preference</name>
        <t>Implementations SHOULD prefer PQ(/T) keys when multiple options are available.</t>
        <t>For instance, if encrypting for a recipient for which both a valid PQ/T and a
valid ECC certificate are available, the implementation SHOULD choose the PQ/T
certificate. In case a certificate has both a PQ/T and an ECC
encryption-capable valid subkey, the PQ/T subkey SHOULD be preferred.</t>
        <t>An implementation MAY sign with both a PQ(/T) and an ECC key using multiple
signatures over the same data as described in <xref target="multiple-signatures"/>.
Signing only with PQ(/T) key material is not backwards compatible.</t>
        <t>Note that the confidentiality of a message is not post-quantum secure when
encrypting to multiple recipients if at least one recipient does not support
PQ/T encryption schemes. An implementation SHOULD NOT abort the encryption
process in this case to allow for a smooth transition to post-quantum
cryptography.</t>
      </section>
      <section anchor="key-generation-strategies">
        <name>Key generation strategies</name>
        <t>It is REQUIRED to generate fresh secrets when generating PQ(/T) keys. Reusing
key material from existing ECC keys in PQ(/T) keys does not provide backwards
compatibility, and the fingerprint will differ.</t>
        <t>An OpenPGP (v6) certificate is composed of a certification-capable primary key
and one or more subkeys for signature, encryption, and authentication.
Two migration strategies are recommended:</t>
        <ol spacing="normal" type="1"><li>
            <t>Generate two independent certificates, one for PQ(/T)-capable
implementations, and one for legacy implementations. Implementations not
understanding PQ(/T) certificates can use the legacy certificate, while
PQ(/T)-capable implementations will prefer the newer certificate. This allows
having an older v4 or v6 ECC certificate for compatibility and a v6 PQ(/T)
certificate, at a greater complexity in key distribution.</t>
          </li>
          <li>
            <t>Attach PQ(/T) encryption and signature subkeys to an existing v6 ECC
certificate. Implementations understanding PQ(/T) will be able to parse and use
the subkeys, while PQ(/T)-incapable implementations can gracefully ignore them.
This simplifies key distribution, as only one certificate needs to be
communicated and verified, but leaves the primary key vulnerable to quantum
computer attacks.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="hashing-in-ecc-kem">
        <name>Hashing in ECC-KEM</name>
        <t>Our construction of the ECC-KEMs, in particular the inclusion of
<tt>eccCipherText</tt> in the final hashing step in encapsulation and decapsulation
that produces the <tt>eccKeyShare</tt>, is standard and known as hashed ElGamal key
encapsulation, a hashed variant of ElGamal encryption. It ensures IND-CCA2
security in the random oracle model under some Diffie-Hellman intractability
assumptions <xref target="CS03"/>. The additional inclusion of <tt>eccPublicKey</tt> follows the
security advice in Section 6.1 of <xref target="RFC7748"/>.</t>
      </section>
      <section anchor="sec-key-combiner">
        <name>Key combiner</name>
        <t>For the key combination in <xref target="kem-key-combiner"/> this specification limits
itself to the use of KMAC. The sponge construction used by KMAC was proven to
be indifferentiable from a random oracle <xref target="BDPA08"/>. This means, that in
contrast to SHA2, which uses a Merkle-Damgard construction, no HMAC-based
construction is required for key combination. Except for a domain separation it
is sufficient to simply process the concatenation of any number of key shares
when using a sponge-based construction like KMAC. The construction using KMAC
ensures a standardized domain separation. In this case, the processed message
is then the concatenation of any number of key shares.</t>
        <t>More precisely, for a given capacity <tt>c</tt> the indifferentiability proof shows
that assuming there are no weaknesses found in the Keccak permutation, an
attacker has to make an expected number of <tt>2^(c/2)</tt> calls to the permutation
to tell KMAC from a random oracle. For a random oracle, a difference in only a
single bit gives an unrelated, uniformly random output. Hence, to be able to
distinguish a key <tt>K</tt>, derived from shared keys <tt>K1</tt> and <tt>K2</tt> (and ciphertexts
<tt>C1</tt> and <tt>C2</tt>) as</t>
        <artwork><![CDATA[
K = KMAC(domainSeparation, counter || K1 || C1 || K2 || C2 || fixedInfo,
         outputBits, customization)
]]></artwork>
        <t>from a random bit string, an adversary has to know (or correctly guess) both
key shares <tt>K1</tt> and <tt>K2</tt>, entirely.</t>
        <t>The proposed construction in <xref target="kem-key-combiner"/> preserves IND-CCA2 of any of
its ingredient KEMs, i.e. the newly formed combined KEM is IND-CCA2 secure as
long as at least one of the ingredient KEMs is. Indeed, the above stated
indifferentiability from a random oracle qualifies Keccak as a split-key
pseudorandom function as defined in <xref target="GHP18"/>. That is, Keccak behaves like a
random function if at least one input shared secret is picked uniformly at
random. Our construction can thus be seen as an instantiation of the IND-CCA2
preserving Example 3 in Figure 1 of <xref target="GHP18"/>, up to some reordering of input
shared secrets and ciphertexts. In the random oracle setting, the reordering
does not influence the arguments in <xref target="GHP18"/>.</t>
      </section>
      <section anchor="sec-fixed-info">
        <name>Domain separation and binding</name>
        <t>The <tt>domSeparation</tt> information defined in <xref target="kem-key-combiner"/> provides the
domain separation for the key combiner construction. This ensures that the
input keying material is used to generate a KEK for a specific purpose or
context.</t>
        <t>The <tt>fixedInfo</tt> defined in <xref target="kem-fixed-info"/> binds the derived KEK to the
chosen algorithm and communication parties. The algorithm ID identifies
univocally the algorithm, the parameters for its instantiation, and the length
of all artifacts, including the derived key.</t>
        <t>This is in line with the Recommendation for ECC in section 5.5 of
<xref target="SP800-56A"/>. Other fields included in the recommendation are not relevant
for the OpenPGP protocol, since the sender is not required to have a key of
their own, there are no pre-shared secrets, and all the other parameters are
univocally defined by the algorithm ID.</t>
        <t>Furthermore, we do not require the recipients public key into the key combiner
as the public key material is already included in the component key derivation
functions.
Given two KEMs which we assume to be multi-user secure, we combine their outputs
using a KEM-combiner:</t>
        <artwork><![CDATA[
K = H(K1, C1, K2, C2), C = (C1, C2)
]]></artwork>
        <t>Our aim is to preserve multi-user security. A common approach to this is to add
the public key into the key derivation for K. However, it turns out that this is
not necessary here. To break security of the combined scheme in the multi-user
setting, the adversary has to distinguish a set of challenge keys</t>
        <t>K<em>_u = H(K1</em>_u, C1<em>_u, K2</em>_u, C2*_u)</t>
        <t>for users u in some set from random, also given ciphertexts <tt>C*_u = (C1*_u,
C2*_u)</tt>. For each of these K* it holds that if the adversary never makes a
query</t>
        <artwork><![CDATA[
H(K1*_u, C1*_u, K2*_u, C2*_u)
]]></artwork>
        <t>they have a zero advantage over guessing.</t>
        <t>The only multi-user advantage that the adversary could gain therefore consists
of queries to H that are meaningful for two different users u1 != u2 and their
associated public keys. This is only the case if</t>
        <artwork><![CDATA[
(c1*_u1, c2*_u1) = (c1*_u2, c2*_u2)
]]></artwork>
        <t>as the ciphertext values decide for which challenge the query is meaningful.
This means that a ciphertext collision is needed between challenges. Assuming
that the randomness used in the generation of the two challenges is
uncorrelated, this is negligible.</t>
        <t>In consequence, the ciphertexts already work sufficiently well as
domain-separator.</t>
      </section>
      <section anchor="slhdsa-sec-cons">
        <name>SLH-DSA Message Randomizer</name>
        <t>The specification of SLH-DSA <xref target="FIPS-205"/> prescribes an optional
non-deterministic message randomizer. This is not used in this specification,
as OpenPGP v6 signatures already provide a salted signature data digest of the
appropriate size.</t>
      </section>
      <section anchor="binding-hashes-in-signatures-with-signature-algorithms">
        <name>Binding hashes in signatures with signature algorithms</name>
        <t>In order not to extend the attack surface, we bind the hash algorithm used for
signature data digestion to the hash algorithm used internally by the signature
algorithm.</t>
        <t>ML-DSA internally uses a SHAKE256 digest, therefore we require SHA3 in the
ML-DSA + ECC signature packet, see <xref target="mldsa-sig-data-digest"/>. Note that we bind
a NIST security category 2 hash function to a signature algorithm that falls
into NIST security category 3. This does not constitute a security bottleneck:
because of the unpredictable random salt that is prepended to the digested data
in v6 signatures, the hardness assumption is not collision resistance but
second-preimage resistance.</t>
        <t>In the case of SLH-DSA the internal hash algorithm varies based on the
algorithm and parameter ID, see <xref target="slhdsa-sig-data-digest"/>.</t>
      </section>
    </section>
    <section anchor="additional-considerations">
      <name>Additional considerations</name>
      <section anchor="performance-considerations">
        <name>Performance Considerations for SLH-DSA</name>
        <t>This specification introduces both ML-DSA + ECC as well as SLH-DSA as PQ(/T)
signature schemes.</t>
        <t>Generally, it can be said that ML-DSA + ECC provides a performance in terms of
execution time requirements that is close to that of traditional ECC signature
schemes.
Regarding the size of signatures and public keys, though, ML-DSA has far greater
requirements than traditional schemes like EC-based or even RSA
signature schemes. Implementers may want to offer SLH-DSA for applications
where a higher degree of trust in the signature scheme is required. However,
SLH-DSA has performance characteristics in terms of execution time of the
signature generation as well as space requirements for the signature that are
even greater than those of
ML-DSA + ECC signature schemes.</t>
        <t>Pertaining to the execution time, the particularly costly operation in SLH-DSA
is the signature generation. In order to achieve short signature generation
times, one of the parameter sets with the name ending in the letter "f" for
"fast" should be chosen. This comes at the expense of a larger signature size.</t>
        <t>In order to minimize the space requirements of a SLH-DSA signature, a parameter
set ending in "s" for "small" should be chosen. This comes at the expense of a
longer signature generation time.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA will add the following registries to the <tt>Pretty Good Privacy (PGP)</tt>
registry group at https://www.iana.org/assignments/pgp-parameters:</t>
      <ul spacing="normal">
        <li>
          <t>Registry name: <tt>SLH-DSA-SHA2 parameters</tt>  </t>
          <t>
Registration procedure: SPECIFICATION REQUIRED <xref target="RFC8126"/>  </t>
          <t>
Values defined in this document, <xref target="slhdsa-param-sha2"/>.</t>
        </li>
        <li>
          <t>Registry name: <tt>SLH-DSA-SHAKE parameters</tt>  </t>
          <t>
Registration procedure: SPECIFICATION REQUIRED <xref target="RFC8126"/>  </t>
          <t>
Values defined in this document, <xref target="slhdsa-param-shake"/>.</t>
        </li>
      </ul>
      <t>Furthermore IANA will add the algorithm IDs defined in <xref target="kem-alg-specs"/> and
<xref target="sig-alg-specs"/> to the  registry <tt>Public Key Algorithms</tt>.</t>
    </section>
    <section anchor="changelog">
      <name>Changelog</name>
      <section anchor="draft-wussler-openpgp-pqc-01">
        <name>draft-wussler-openpgp-pqc-01</name>
        <ul spacing="normal">
          <li>
            <t>Shifted the algorithm IDs by 4 to align with the crypto-refresh.</t>
          </li>
          <li>
            <t>Renamed v5 packets into v6 to align with the crypto-refresh.</t>
          </li>
          <li>
            <t>Defined IND-CCA2 security for KDF and key combination.</t>
          </li>
          <li>
            <t>Added explicit key generation procedures.</t>
          </li>
          <li>
            <t>Changed the key combination KMAC salt.</t>
          </li>
          <li>
            <t>Mandated Parameter ID check in SPHINCS+ signature verification.</t>
          </li>
          <li>
            <t>Fixed key share size for Kyber-768.</t>
          </li>
          <li>
            <t>Added "Preliminaries" section.</t>
          </li>
          <li>
            <t>Fixed IANA considerations.</t>
          </li>
        </ul>
      </section>
      <section anchor="draft-wussler-openpgp-pqc-02">
        <name>draft-wussler-openpgp-pqc-02</name>
        <ul spacing="normal">
          <li>
            <t>Added the ephemeral and public key in the ECC key derivation function.</t>
          </li>
          <li>
            <t>Removed public key hash from key combiner.</t>
          </li>
          <li>
            <t>Allowed v3 PKESKs and v4 keys with PQ algorithms, limiting them to AES
symmetric ciphers.
for encryption with SEIPDv1, in line with the crypto-refresh.</t>
          </li>
        </ul>
      </section>
      <section anchor="draft-wussler-openpgp-pqc-03">
        <name>draft-wussler-openpgp-pqc-03</name>
        <ul spacing="normal">
          <li>
            <t>Replaced round 3 submission with NIST PQC Draft Standards FIPS 203, 204, 205.</t>
          </li>
          <li>
            <t>Added consideration about security level for hashes.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="contributors">
      <name>Contributors</name>
      <t>Stephan Ehlen (BSI)<br/>
Carl-Daniel Hailfinger (BSI)<br/>
Andreas Huelsing (TU Eindhoven)<br/>
Johannes Roth (MTG AG)</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC3394">
          <front>
            <title>Advanced Encryption Standard (AES) Key Wrap Algorithm</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="September" year="2002"/>
          </front>
          <seriesInfo name="RFC" value="3394"/>
          <seriesInfo name="DOI" value="10.17487/RFC3394"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="I-D.ietf-openpgp-crypto-refresh">
          <front>
            <title>OpenPGP</title>
            <author fullname="Paul Wouters" initials="P." surname="Wouters">
              <organization>Aiven</organization>
            </author>
            <author fullname="Daniel Huigens" initials="D." surname="Huigens">
              <organization>Proton AG</organization>
            </author>
            <author fullname="Justus Winter" initials="J." surname="Winter">
              <organization>Sequoia-PGP</organization>
            </author>
            <author fullname="Niibe Yutaka" initials="N." surname="Yutaka">
              <organization>FSIJ</organization>
            </author>
            <date day="4" month="January" year="2024"/>
            <abstract>
              <t>   This document specifies the message formats used in OpenPGP.  OpenPGP
   provides encryption with public-key or symmetric cryptographic
   algorithms, digital signatures, compression and key management.

   This document is maintained in order to publish all necessary
   information needed to develop interoperable applications based on the
   OpenPGP format.  It is not a step-by-step cookbook for writing an
   application.  It describes only the format and methods needed to
   read, check, generate, and write conforming packets crossing any
   network.  It does not deal with storage and implementation questions.
   It does, however, discuss implementation issues necessary to avoid
   security flaws.

   This document obsoletes: RFC 4880 (OpenPGP), RFC 5581 (Camellia in
   OpenPGP) and RFC 6637 (Elliptic Curves in OpenPGP).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-openpgp-crypto-refresh-13"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC5639">
          <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="NIST-PQC" target="https://csrc.nist.gov/projects/post-quantum-cryptography/post-quantum-cryptography-standardization">
          <front>
            <title>Post-Quantum Cryptography Standardization</title>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization/>
            </author>
            <author initials="D." surname="Moody" fullname="Dustin Moody">
              <organization/>
            </author>
            <author initials="Y." surname="Liu" fullname="Yi-Kai Liu">
              <organization/>
            </author>
            <date year="2016" month="December"/>
          </front>
        </reference>
        <reference anchor="NISTIR-8413" target="https://doi.org/10.6028/NIST.IR.8413-upd1">
          <front>
            <title>Status Report on the Third Round of the NIST Post-Quantum Cryptography Standardization Process</title>
            <author initials="G." surname="Alagic" fullname="Gorjan Alagic">
              <organization/>
            </author>
            <author initials="D." surname="Apon" fullname="Daniel Apon">
              <organization/>
            </author>
            <author initials="D." surname="Cooper" fullname="David Cooper">
              <organization/>
            </author>
            <author initials="Q." surname="Dang" fullname="Quynh Dang">
              <organization/>
            </author>
            <author initials="T." surname="Dang" fullname="Thinh Dang">
              <organization/>
            </author>
            <author initials="J." surname="Kelsey" fullname="John Kelsay">
              <organization/>
            </author>
            <author initials="J." surname="Lichtinger" fullname="Jacob Lichtinger">
              <organization/>
            </author>
            <author initials="C." surname="Miller" fullname="Carl Miller">
              <organization/>
            </author>
            <author initials="D." surname="Moody" fullname="Dustin Moody">
              <organization/>
            </author>
            <author initials="R." surname="Peralta" fullname="Rene Peralta">
              <organization/>
            </author>
            <author initials="R." surname="Perlner" fullname="Ray Perlner">
              <organization/>
            </author>
            <author initials="A." surname="Robinson" fullname="Angela Robinson">
              <organization/>
            </author>
            <author initials="D." surname="Smith-Tone" fullname="Daniel Smith-Tone">
              <organization/>
            </author>
            <author initials="Y." surname="Liu" fullname="Yi-Kai Liu">
              <organization/>
            </author>
            <date year="2022" month="September"/>
          </front>
          <seriesInfo name="NIST IR 8413" value=""/>
        </reference>
        <reference anchor="SP800-56C" target="https://doi.org/10.6028/NIST.SP.800-56Cr2">
          <front>
            <title>Recommendation for Key-Derivation Methods in Key-Establishment Schemes</title>
            <author initials="E." surname="Barker" fullname="Elaine Barker">
              <organization/>
            </author>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization/>
            </author>
            <author initials="R." surname="Davis" fullname="Richard Davis">
              <organization/>
            </author>
            <date year="2020" month="August"/>
          </front>
          <seriesInfo name="NIST Special Publication 800-56C Rev. 2" value=""/>
        </reference>
        <reference anchor="SP800-185" target="https://doi.org/10.6028/NIST.SP.800-185">
          <front>
            <title>SHA-3 Derived Functions: cSHAKE, KMAC, TupleHash, and ParallelHash</title>
            <author initials="J." surname="Kelsey" fullname="John Kelsey">
              <organization/>
            </author>
            <author initials="S." surname="Chang" fullname="Shu-jen Chang">
              <organization/>
            </author>
            <author initials="R." surname="Perlner" fullname="Ray Perlner">
              <organization/>
            </author>
            <date year="2016" month="December"/>
          </front>
          <seriesInfo name="NIST Special Publication 800-185" value=""/>
        </reference>
        <reference anchor="SP800-56A" target="https://doi.org/10.6028/NIST.SP.800-56Ar3">
          <front>
            <title>Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography</title>
            <author initials="E." surname="Barker" fullname="Elaine Barker">
              <organization/>
            </author>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization/>
            </author>
            <author initials="A." surname="Roginsky" fullname="Allen Roginsky">
              <organization/>
            </author>
            <author initials="A." surname="Vassilev" fullname="Apostol Vassilev">
              <organization/>
            </author>
            <author initials="R." surname="Davis" fullname="Richard Davis">
              <organization/>
            </author>
            <date year="2018" month="April"/>
          </front>
          <seriesInfo name="NIST Special Publication 800-56A Rev. 3" value=""/>
        </reference>
        <reference anchor="SP800-186" target="https://doi.org/10.6028/NIST.SP.800-186">
          <front>
            <title>Recommendations for Discrete Logarithm-Based Cryptography:  Elliptic Curve Domain Parameters</title>
            <author initials="L." surname="Chen" fullname="Lily Chen">
              <organization/>
            </author>
            <author initials="D." surname="Moody" fullname="Dustin Moody">
              <organization/>
            </author>
            <author initials="A." surname="Regenscheid" fullname="Andrew Regenscheid">
              <organization/>
            </author>
            <author initials="K." surname="Randall" fullname="Karen Randall">
              <organization/>
            </author>
            <date year="2023" month="February"/>
          </front>
          <seriesInfo name="NIST Special Publication 800-186" value=""/>
        </reference>
        <reference anchor="SEC1" target="https://secg.org/sec1-v2.pdf">
          <front>
            <title>Standards for Efficient Cryptography 1 (SEC 1)</title>
            <author>
              <organization>Standards for Efficient Cryptography Group</organization>
            </author>
            <date year="2009" month="May"/>
          </front>
        </reference>
        <reference anchor="FIPS-203" target="https://doi.org/10.6028/NIST.FIPS.203.ipd">
          <front>
            <title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2023" month="August"/>
          </front>
        </reference>
        <reference anchor="FIPS-204" target="https://doi.org/10.6028/NIST.FIPS.204.ipd">
          <front>
            <title>Module-Lattice-Based Digital Signature Standard</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2023" month="August"/>
          </front>
        </reference>
        <reference anchor="FIPS-205" target="https://doi.org/10.6028/NIST.FIPS.205.ipd">
          <front>
            <title>Stateless Hash-Based Digital Signature Standard</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2023" month="August"/>
          </front>
        </reference>
        <reference anchor="draft-driscoll-pqt-hybrid-terminology" target="https://datatracker.ietf.org/doc/html/draft-driscoll-pqt-hybrid-terminology">
          <front>
            <title>Terminology for Post-Quantum Traditional Hybrid Schemes</title>
            <author initials="F." surname="Driscoll" fullname="Florence Driscoll">
              <organization/>
            </author>
            <date year="2023" month="March"/>
          </front>
        </reference>
        <reference anchor="GHP18" target="https://doi.org/10.1007/978-3-319-76578-5_7">
          <front>
            <title>KEM Combiners</title>
            <author initials="F." surname="Giacon" fullname="Federico Giacon">
              <organization/>
            </author>
            <author initials="F." surname="Heuer" fullname="Felix Heuer">
              <organization/>
            </author>
            <author initials="B." surname="Poettering" fullname="Bertram Poettering">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="BDPA08" target="https://doi.org/10.1007/978-3-540-78967-3_11">
          <front>
            <title>On the Indifferentiability of the Sponge Construction</title>
            <author initials="G." surname="Bertoni" fullname="Guido Bertoni">
              <organization/>
            </author>
            <author initials="J." surname="Daemen" fullname="Joan Daemen">
              <organization/>
            </author>
            <author initials="M." surname="Peters" fullname="Michael Peters">
              <organization/>
            </author>
            <author initials="G." surname="Assche" fullname="Gilles van Assche">
              <organization/>
            </author>
            <date year="2008"/>
          </front>
        </reference>
        <reference anchor="CS03" target="https://doi.org/10.1137/S0097539702403773">
          <front>
            <title>Design and Analysis of Practical Public-Key Encryption Schemes Secure against Adaptive Chosen Ciphertext Attack</title>
            <author initials="R." surname="Cramer" fullname="Ronald Cramer">
              <organization/>
            </author>
            <author initials="V." surname="Shoup" fullname="Victor Shoup">
              <organization/>
            </author>
            <date year="2003"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 1626?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Daniel Huigens and Evangelos Karatsiolis for the early review and
feedback on this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
elClzv57B5VzZJygjzr9/PYrRf096Oe3HPRCmxphP0/C3v3dJ2Ev1j1q7Acs
2x3Hhbp8UPp4b7vNz+gP6rBXN5n1CYw1kDPLGCsfDFtzIQ0Nrft3zYafieF+
nobLGPHO9urVNEJmZ51tboTMZ2HQfkOQhB/VcBnjRhxTvNjGqpt58edpuIyh
7+/pBaLb6fR4u6uTXNTXnFtQn8yLg49ruB6jd1JrdLeqQTmK07gIJmO36WkN
lwmAdsjYrxvWuAwyyxsuEwztk1FuoKdv0/KGn0lgBKtYX3iEk/kcgqSh4XpC
xZ+MI2BqZx6eIGWajJVloqYW6lt3obXo3roL/R8janZWr6YRMjtPE74OZP4j
apZM5j+i5j+i5j+iJmz4UaLmWmVKa085F01JOOVep9D6B+ncdO0PqiCPrhxH
Bb3G2uPvnj3yUlNrh7sok89L63TzlSjVXKWYB4VnnNM2pXQ/jPRp54pqpGC6
4simaDup32ZeKvF7Q45GXDXyWv5SwQijEWDPAJFnU/xXV/PCHtcVw6856gUf
bUYYKLHdNLY7kbrdgIgZPqJB7JjQzXWu5kxl0cRQNR52yF1Mx59KmWLVqthJ
ZCwxTsex3I91eObFSn8nZxB8oXx+qr6E4x9ijPBimOrQbMvxJ9iTIbeH5kM/
azqyCf36tLwY8sgbmxw0Ng7RxgO+5GiNhi64h4zSnKcel2JYDDmuOHQ3c0iv
rvjVI6cxLOgIbqSc+/LnBa9leCW+VODYKDriu43Lzc2hrro1xD+HajxGx0XX
SftXcQYkBUV53lFpRWAGXBpUIDw1Cm4OXRr1D2lu9/iAL46EcsRwbRRW8zgp
xLvhPaxx+P3wA4Wmh9/btdx3eCnqQAx8SKhNJRMKAH0+U5IIBur3KFiwUEWV
FEd21jn8u9uxuLLdXg3V6QNHqtNA/n7AIDt4cIYTDvJFBYPRJ5Zyhsh1YCnw
6W7jp5oi+UPNbzfoiIfXk3pgSXu4ZB8USa/Yh/XBAzj0PZ4SUfApNHwMUBxU
prSJ7w0EA3jwxnxuQDD5o5tXEb/2+H4c6UPrOuHzSZ4oIHz49AlkH8Aq+jSy
FwHZR59I9sIn+0iTPayxgejx6W9H7wjX34Dauds/Dq2DivSRtM7hjc9I6Qia
34fO1wfCFxzTPXmj6NxYajX4KHPu82Lol/evh1Rn1hI4QcYvD0FnckxxB4u8
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
AQA=

-->

</rfc>
