<?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-ietf-openpgp-pqc-00" 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-ietf-openpgp-pqc-00"/>
    <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-ietf-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 anchor="draft-wussler-openpgp-pqc-04">
        <name>draft-wussler-openpgp-pqc-04</name>
        <ul spacing="normal">
          <li>
            <t>Added Johannes Roth as author</t>
          </li>
        </ul>
      </section>
      <section anchor="draft-ietf-openpgp-pqc-00">
        <name>draft-ietf-openpgp-pqc-00</name>
        <ul spacing="normal">
          <li>
            <t>Renamed draft</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)</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 1633?>

<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:
H4sIAAAAAAAAA+19a3fbxrXod/yKuc6HSi1JS9TTvid3VdbDVhUniqgkzerJ
LSFyRKICAQYApSi2//vdj3kDICnbaXLuqlbrSADmtWe/95493W43qpIqlS/F
s8u8rLrfLuKsWszEcfE4r/JJEc+njyLJxDdzmV2+vnwWxTc3hbzHz7899l6M
4kpO8uLxJTy9zaNonI+yeAYdj4v4tuomsrrt5vDxfDLvzn8edbe2onJxM0vK
Msmz6nEOX56fXp9F0PdOFBcyfilKOYoe8uJuUuSL+UvxtazwL/ED/JNkE/Ea
H0d38hGejqF1Vskik1X3BAeM7mW2kC8jIVTrH17D7zyO34EQszhJXwo1ub/i
THt5MYEXcTGawlKnVTUvXz5/jt/ho+Re9vRXz/HB85sifyjlc9XF82fQtpDz
3Gk7Sarp4qY3ymfPHSg8Z+A4T55FUbyopnkBU+9CNwLAWb4Ug564yBdlMk5K
esigHVTxfZGX/iuY1EvxanBOf4zyRVbhpryWxSzOHumh5AWX3Lp3p1r/9aZM
ejeLbNwbS2/wv/XEVV5NnYH/lk/jLJOlfU6jvr1+LY5erxz4X6p1r4DWf51V
k3DAsx4srZDZr3fSGfQsTu9y/8VTRr3F5r1SNW8a9qgnfliUZSoLZ9SjIs+8
xzTmJUwdnofDDh6S6ldZpHE2doeOoY+/PnAfvaSKoiyH6VWARy8j+O7q7Pjg
YPdQ/364tdPXv+/svNg1z7f7+/T7efek59HTiKi1W8jbQpZT+AZJMBhhb3/n
Bf3+9fngugvU+5JmWMXFRFYvhcbTUVmMellSVr1Jfv98XuT/kqOqfD5H5vAz
Mwc1HDOH9jddwK9sHBfj5FeYSJ7xcMxs2nnNoKGRIQj66ar/qk37qieOpzIz
D3nXvkrSR/d50OikJ97m+fgxaHWyKCvgae6roOGPPeh6ETT7MelexIl5MQZO
CH3JkZzdyEL0t7b3NdzPr7qHu9s7zaAf5wlxlO2t3v5W//A5NuidX/WwRXcx
H2+7EAQ4VQugP+AyRSUAFaupFNfTpBgDTQINi/yWHmEn64Mb8Xoky3I12F/3
xFEaT5JRAIvXefGvOPPf1YF/NM/DHTuJs0Sm7pt6s+McML6oNbxPxv6roOW3
Pex9ErT7dvGYTd0XQavrxlYA4qWtgFdeyLSUIWoBx8zoTdyCWX9DzBpNAf8m
tSX+LR7lN/XXQQ/HgNRJmtZaH8dF6r/5XNRw1ROXsojTKg6aXslMBq8am6ZZ
bbZX8WPwJmh5hNLoBn6todARwCaNw7f1xQ5mIIy713kmm3Gw9v6jmcBAzivN
Bfp9elHKIpElMmhNWUSi51cC6RwZxeDycGuru7ffwqEb2cTgsqcaFX2XTVxJ
0DhmEmicyBukAiDhY/cEJnHPj95KoPJxibocvjkFrn2TJuUUGlViMJrKmVyD
HZz2xKu4uKvt5mkaJ4AK3rvPwcCvekT3ZYg8QCLAzZx3vA9HiwkgM27C1rJN
GMzlKIlTcbkAEIwYPgqsAMn7nujb/dk+3Hv6/kAjd3f+NHhz1N0RtBtyLM4W
2QjHhPWN4M3FaUdcvD067ojrxTyVb+Jy2hHArsVlDISVyhSf/Gn13qxkSbKF
vAe4M3UWOJguuv+SmffuY6m7SVZ+xAYhXB3KOfoYyjkqdlZQzmWcFN0fklK2
U4r4rkTL4iQpR4WspPgqn8QFcBNf7P7x6ImY6gR+vQux5AgwLQtf1lt/H4Mh
l8r7sDWqh3kavv5Eap4XSYq4cvhxxHzExLzjEvP+xxDzvkfMPsaUhDJ1ROi+
ikugdRcdXgrY1zSZV8lIHC+KeylOcjAcMiL0GbQuyjXI/N+rCCPCyInMSsD7
ZFwTxONCPjR8EHRyAZ2g/pmmQQcXcYFI57zjnT+TN8UiLh6Rk+98HKMgXXxw
erzdvOGlHE1ox+GX7e59vzcf37q7/ExrzLy/p7e3yShBBuCp1dtiA4YQ25vP
mvaNTci1OtIuCg2AtzGufesFLuLs/HLQ7W/t6H7Xwl1s1INGvWSuN0Wt7G0+
XqSy+1VcAR5KhabE6LJRPC8XqdYXgCjBQJyZBahu/EWaZX5NzWArzjPAqWoB
tACmiV08CrRr6DPL03yikS2U2jvOenc/Zr27a673JJkkFUx2kEwyMLAK+Xut
cu9jVrlXXyXaiTIFk06gtvCHWSX7vcYFsMc8Tbvzn6vu9PGmSMZd4HazhDto
YckxLKmIR3foS9FeuHE+ej6tZunztTp2CfraPmYh79rK10U8TtSa31A366vE
ZyDU1DQC7naW5sDeRtJ/rwm8GE0NmF6/udw+XCmZtre2Dp6/ODjs7nR3tl90
D/b34Pe9fx64y7w4fQs28gwsI5AmznhGiq5ay+sEjNBQupzJMfDfUe6/rTd+
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
5XD2XvT/AEA11oeGCQEA

-->

</rfc>
