<?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.2 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-connolly-cfrg-xwing-kem-02" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="xwing">X-Wing: general-purpose hybrid post-quantum KEM</title>
    <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-xwing-kem-02"/>
    <author fullname="Deirdre Connolly">
      <organization>SandboxAQ</organization>
      <address>
        <email>durumcrustulum@gmail.com</email>
      </address>
    </author>
    <author fullname="Peter Schwabe">
      <organization>MPI-SP &amp; Radboud University</organization>
      <address>
        <email>peter@cryptojedi.org</email>
      </address>
    </author>
    <author initials="B. E." surname="Westerbaan" fullname="Bas Westerbaan">
      <organization>Cloudflare</organization>
      <address>
        <email>bas@cloudflare.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="26"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>post quantum</keyword>
    <keyword>kem</keyword>
    <keyword>PQ/T hybrid</keyword>
    <abstract>
      <?line 87?>

<t>This memo defines X-Wing, a general-purpose post-quantum/traditional
hybrid key encapsulation mechanism (PQ/T KEM) built on X25519 and
ML-KEM-768.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://dconnolly.github.io/draft-connolly-cfrg-xwing-kem/draft-connolly-cfrg-xwing-kem.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Crypto Forum Research Group mailing list (<eref target="mailto:cfrg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cfrg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/dconnolly/draft-connolly-cfrg-xwing-kem"/>.</t>
    </note>
  </front>
  <middle>
    <?line 93?>

<section anchor="intro">
      <name>Introduction</name>
      <section anchor="warning-ml-kem-768-has-not-been-standardised">
        <name>Warning: ML-KEM-768 has not been standardised</name>
        <t>X-Wing uses ML-KEM-768, which has not been standardised yet. Thus X-Wing
is not finished, yet, and should not be used, yet.</t>
      </section>
      <section anchor="motivation">
        <name>Motivation</name>
        <t>There are many choices that can be made when specifying a hybrid KEM:
the constituent KEMs; their security levels; the combiner; and the hash
within, to name but a few. Having too many similar options are a burden
to the ecosystem.</t>
        <t>The aim of X-Wing is to provide a concrete, simple choice for
post-quantum hybrid KEM, that should be suitable for the vast majority
of use cases.</t>
      </section>
      <section anchor="goals">
        <name>Design goals</name>
        <t>By making concrete choices, we can simplify and improve many aspects of
X-Wing.</t>
        <ul spacing="normal">
          <li>
            <t>Simplicity of definition. Because all shared secrets and cipher texts
are fixed length, we do not need to encode the length. Using SHA3-256,
we do not need HMAC-based construction. For the concrete choice of
ML-KEM-768, we do not need to mix in its ciphertext, see <xref target="secc"/>.</t>
          </li>
          <li>
            <t>Security analysis. Because ML-KEM-768 already assumes the Quantum Random
Oracle Model (QROM), we do not need to complicate the analysis
of X-Wing by considering stronger models.</t>
          </li>
          <li>
            <t>Performance. Not having to mix in the ML-KEM-768 ciphertext is a nice
performance benefit. Furthermore, by using SHA3-256 in the combiner,
which matches the hashing in ML-KEM-768, this hash can be computed in
one go on platforms where two-way Keccak is available.</t>
          </li>
        </ul>
        <t>We aim for "128 bits" security (NIST PQC level 1). Although at the
moment there is no peer-reviewed evidence that ML-KEM-512 does not reach
this level, we would like to hedge against future cryptanalytic
improvements, and feel ML-KEM-768 provides a comfortable margin.</t>
        <t>We aim for X-Wing to be usable for most applications, including
specifically HPKE <xref target="RFC9180"/>.</t>
      </section>
      <section anchor="not-an-interactive-key-agreement">
        <name>Not an interactive key-agreement</name>
        <t>Traditionally most protocols use a Diffie-Hellman (DH) style
non-interactive key-agreement.  In many cases, a DH key agreement can be
replaced by the interactive key-agreement afforded by a KEM without
change in the protocol flow.  One notable example is TLS <xref target="HYBRID"/>
          <xref target="XYBERTLS"/>.  However, not all uses of DH can be replaced in a
straight-forward manner by a plain KEM.</t>
      </section>
      <section anchor="auth">
        <name>Not an authenticated KEM</name>
        <t>In particular, X-Wing is not, borrowing the language of <xref target="RFC9180"/>, an
<em>authenticated</em> KEM.</t>
      </section>
      <section anchor="comparisons">
        <name>Comparisons</name>
        <section anchor="with-hpke-x25519kyber768draft00">
          <name>With HPKE X25519Kyber768Draft00</name>
          <t>X-Wing is most similar to HPKE's X25519Kyber768Draft00
<xref target="XYBERHPKE"/>. The key differences are:</t>
          <ul spacing="normal">
            <li>
              <t>X-Wing uses the final version of ML-KEM-768.</t>
            </li>
            <li>
              <t>X-Wing hashes the shared secrets, to be usable outside of HPKE.</t>
            </li>
            <li>
              <t>X-Wing has a simpler combiner by flattening DHKEM(X25519) into the
final hash.</t>
            </li>
            <li>
              <t>X-Wing does not hash in the ML-KEM-768 ciphertext.</t>
            </li>
          </ul>
          <t>There is also a different KEM called X25519Kyber768Draft00 <xref target="XYBERTLS"/>
which is used in TLS. This one should not be used outside of TLS, as it
assumes the presence of the TLS transcript to ensure non malleability.</t>
        </section>
        <section anchor="with-generic-combiner">
          <name>With generic combiner</name>
          <t>The generic combiner of <xref target="I-D.ounsworth-cfrg-kem-combiners"/> can be
instantiated with ML-KEM-768 and DHKEM(X25519). That achieves similar
security, but:</t>
          <ul spacing="normal">
            <li>
              <t>X-Wing is more performant, not hashing in the ML-KEM-768 ciphertext,
and flattening the DHKEM construction, with the same level of
security.</t>
            </li>
            <li>
              <t>X-Wing has a fixed 32 byte shared secret, instead of a variable shared
secret.</t>
            </li>
            <li>
              <t>X-Wing does not accept the optional counter and fixedInfo arguments.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="requirements-notation">
      <name>Requirements Notation</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>This document is consistent with all terminology defined in
<xref target="I-D.driscoll-pqt-hybrid-terminology"/>.</t>
      <t>The following terms are used throughout this document to describe the
operations, roles, and behaviors of HPKE:</t>
      <ul spacing="normal">
        <li>
          <t><tt>concat(x0, ..., xN)</tt>: returns the concatenation of byte
strings. <tt>concat(0x01, 0x0203, 0x040506) = 0x010203040506</tt>.</t>
        </li>
        <li>
          <t><tt>random(n)</tt>: return a pseudorandom byte string of length <tt>n</tt> bytes produced by
a cryptographically-secure random number generator.</t>
        </li>
      </ul>
    </section>
    <section anchor="base-crypto">
      <name>Cryptographic Dependencies</name>
      <t>X-Wing relies on the following primitives:</t>
      <ul spacing="normal">
        <li>
          <t>ML-KEM-768 post-quantum key-encapsulation mechanism (KEM) <xref target="MLKEM"/>:  </t>
          <ul spacing="normal">
            <li>
              <t><tt>ML-KEM-768.KeyGen()</tt>: Randomized algorithm to generate an
ML-KEM-768 key pair <tt>(pk_M, sk_M)</tt> of an encapsulation key <tt>pk_M</tt>
and decapsulation key <tt>sk_M</tt>.
Note that <tt>ML-KEM-768.KeyGen()</tt> returns the keys in reverse
order of <tt>GenerateKeyPair()</tt> defined below.</t>
            </li>
            <li>
              <t><tt>ML-KEM-768.Encaps(pk_M)</tt>: Randomized algorithm to generate <tt>(ss_M,
ct_M)</tt>, an ephemeral 32 byte shared key <tt>ss_M</tt>, and a fixed-length
encapsulation (ciphertext) of that key <tt>ct_M</tt> for encapsulation key
<tt>pk_M</tt>.</t>
            </li>
            <li>
              <t><tt>ML-KEM-768.Decap(ct_M, sk_M)</tt>: Deterministic algorithm using the
decapsulation key <tt>sk_M</tt> to recover the shared key from <tt>ct_M</tt>.</t>
            </li>
          </ul>
          <t>
To generate deterministic test vectors, we also use  </t>
          <ul spacing="normal">
            <li>
              <t><tt>ML-KEM-768.KeyGenDerand(seed)</tt>: Same as <tt>ML-KEM-768.KeyGen()</tt>,
but derandomized as follows.
<tt>seed[0:32]</tt> is used for <tt>d</tt> in line 1 of algorithm 12 from <xref target="MLKEM"/>
and <tt>seed</tt> is 64 bytes. <tt>seed[32:64]</tt> is used for <tt>z</tt> in line 1 of
algorithm 15.</t>
            </li>
            <li>
              <t><tt>ML-KEM-768.EncapsDerand(pk_M, seed)</tt>: Same as <tt>ML-KEM-768.Encaps()</tt>
but derandomized as follows.
<tt>seed</tt> is 32 bytes and used for <tt>m</tt> in line of 1 algorithm 16.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>X25519 elliptic curve Diffie-Hellman key-exchange defined in <xref section="5" sectionFormat="of" target="RFC7748"/>:  </t>
          <ul spacing="normal">
            <li>
              <t><tt>X25519(k,u)</tt>: takes 32 byte strings k and u representing a
Curve25519 scalar and curvepoint respectively, and returns
the 32 byte string representing their scalar multiplication.</t>
            </li>
            <li>
              <t><tt>X25519_BASE</tt>: the 32 byte string representing the standard base point
of Curve25519. In hex
it is given by <tt>0900000000000000000000000000000000000000000000000000000000000000</tt>.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>Note that 9 is the standard basepoint for X25519, cf <xref section="6.1" sectionFormat="of" target="RFC7748"/>.</t>
      <ul spacing="normal">
        <li>
          <t>Symmetric cryptography.  </t>
          <ul spacing="normal">
            <li>
              <t><tt>SHAKE128(message, outlen)</tt>: The extendable-output function (XOF)
defined in Section 6.2 of <xref target="FIPS202"/>.</t>
            </li>
            <li>
              <t><tt>SHA3-256(message)</tt>: The hash defined in Section 6.1 of <xref target="FIPS202"/>.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="x-wing-construction">
      <name>X-Wing Construction</name>
      <section anchor="encoding">
        <name>Encoding and sizes</name>
        <t>X-Wing encapsulation key, decapsulation key, ciphertexts and shared secrets are all
fixed length byte strings.</t>
        <dl>
          <dt>Decapsulation key (private):</dt>
          <dd>
            <t>2464 bytes</t>
          </dd>
          <dt>Encapsulation key (public):</dt>
          <dd>
            <t>1216 bytes</t>
          </dd>
          <dt>Ciphertext:</dt>
          <dd>
            <t>1120 bytes</t>
          </dd>
          <dt>Shared secret:</dt>
          <dd>
            <t>32 bytes</t>
          </dd>
        </dl>
      </section>
      <section anchor="key-generation">
        <name>Key generation</name>
        <t>An X-Wing keypair (decapsulation key, encapsulation key) is generated as
follows.</t>
        <artwork><![CDATA[
def GenerateKeyPair():
  (pk_M, sk_M) = ML-KEM-768.KeyGen()
  sk_X = random(32)
  pk_X = X25519(sk_X, X25519_BASE)
  return concat(sk_M, sk_X, pk_X), concat(pk_M, pk_X)
]]></artwork>
        <t><tt>GenerateKeyPair()</tt> returns the 2464 byte secret decapsulation key <tt>sk</tt>
and the 1216 byte encapsulation key <tt>pk</tt>.</t>
        <t>Here and in the balance of the document for clarity we use
the <tt>M</tt> and <tt>X</tt>subscripts for ML-KEM-768 and X25519 components respectively.</t>
        <section anchor="derive-key-pair">
          <name>Key derivation</name>
          <t>For testing, it is convenient to have a deterministic version
of key generation. An X-Wing implementation <bcp14>MAY</bcp14> provide the following
derandomized variant of key generation.</t>
          <artwork><![CDATA[
def GenerateKeyPairDerand(seed):
  (pk_M, sk_M) = ML-KEM-768.KeyGenDerand(seed[0:64])
  sk_X = seed[64:96]
  pk_X = X25519(sk_X, X25519_BASE)
  return concat(sk_M, sk_X, pk_X), concat(pk_M, pk_X)
]]></artwork>
          <t><tt>seed</tt> must be 96 bytes.</t>
          <t><tt>GenerateKeyPairDerand()</tt> returns the 2464 byte secret encapsulation key
<tt>sk</tt> and the 1216 byte decapsulation key <tt>pk</tt>.</t>
        </section>
      </section>
      <section anchor="combiner">
        <name>Combiner</name>
        <t>Given 32 byte strings <tt>ss_M</tt>, <tt>ss_X</tt>, <tt>ct_X</tt>, <tt>pk_X</tt>, representing the
ML-KEM-768 shared secret, X25519 shared secret, X25519 ciphertext
(ephemeral public key) and X25519 public key respectively, the 32 byte
combined shared secret is given by:</t>
        <artwork><![CDATA[
def Combiner(ss_M, ss_X, ct_X, pk_X):
  return SHA3-256(concat(
    XWingLabel,
    ss_M,
    ss_X,
    ct_X,
    pk_X
  ))
]]></artwork>
        <t>where XWingLabel is the following 6 byte ASCII string</t>
        <artwork><![CDATA[
XWingLabel = concat(
    "\./",
    "/^\",
)
]]></artwork>
        <t>In hex XWingLabel is given by <tt>5c2e2f2f5e5c</tt>.</t>
      </section>
      <section anchor="encaps">
        <name>Encapsulation</name>
        <t>Given an X-Wing encapsulation key <tt>pk</tt>, encapsulation proceeds as follows.</t>
        <artwork><![CDATA[
def Encapsulate(pk):
  pk_M = pk[0:1184]
  pk_X = pk[1184:1216]
  ek_X = random(32)
  ct_X = X25519(ek_X, X25519_BASE)
  ss_X = X25519(ek_X, pk_X)
  (ss_M, ct_M) = ML-KEM-768.Encaps(pk_M)
  ss = Combiner(ss_M, ss_X, ct_X, pk_X)
  ct = concat(ct_M, ct_X)
  return (ss, ct)
]]></artwork>
        <t><tt>pk</tt> is a 1216 byte X-Wing encapsulation key resulting from <tt>GeneratePublicKey()</tt></t>
        <t><tt>Encapsulate()</tt> returns the 32 byte shared secret <tt>ss</tt> and the 1120 byte
ciphertext <tt>ct</tt>.</t>
        <section anchor="derandomized">
          <name>Derandomized</name>
          <t>For testing, it is convenient to have a deterministic version
of encapsulation. An X-Wing implementation <bcp14>MAY</bcp14> provide
the following derandomized function.</t>
          <artwork><![CDATA[
def EncapsulateDerand(pk, eseed):
  pk_M = pk[0:1184]
  pk_X = pk[1184:1216]
  ek_X = eseed[32:64]
  ct_X = X25519(ek_X, X25519_BASE)
  ss_X = X25519(ek_X, pk_X)
  (ss_M, ct_M) = ML-KEM-768.EncapsDerand(pk_M, eseed[0:32])
  ss = Combiner(ss_M, ss_X, ct_X, pk_X)
  ct = concat(ct_M, ct_X)
  return (ss, ct)
]]></artwork>
          <t><tt>pk</tt> is a 1216 byte X-Wing encapsulation key resulting from <tt>GeneratePublicKey()</tt>
            <tt>eseed</tt> <bcp14>MUST</bcp14> be 64 bytes.</t>
          <t><tt>EncapsulateDerand()</tt> returns the 32 byte shared secret <tt>ss</tt> and the 1120 byte
ciphertext <tt>ct</tt>.</t>
        </section>
      </section>
      <section anchor="decaps">
        <name>Decapsulation</name>
        <artwork><![CDATA[
def Decapsulate(ct, sk):
  ct_M = ct[0:1088]
  ct_X = ct[1088:1120]
  sk_M = sk[0:2400]
  sk_X = sk[2400:2432]
  pk_X = sk[2432:2464]
  ss_M = ML-KEM-768.Decapsulate(ct_M, sk_M)
  ss_X = X25519(sk_X, ct_X)
  return Combiner(ss_M, ss_X, ct_X, pk_X)
]]></artwork>
        <t><tt>ct</tt> is the 1120 byte ciphertext resulting from <tt>Encapsulate()</tt>
          <tt>sk</tt> is a 2464 byte X-Wing decapsulation key resulting from <tt>GenerateKeyPair()</tt></t>
        <t><tt>Decapsulate()</tt> returns the 32 byte shared secret.</t>
      </section>
      <section anchor="use-in-hpke">
        <name>Use in HPKE</name>
        <t>X-Wing satisfies the HPKE KEM interface as follows.</t>
        <t>The <tt>SerializePublicKey</tt>, <tt>DeserializePublicKey</tt>,
<tt>SerializePrivateKey</tt> and <tt>DeserializePrivateKey</tt> are the identity functions,
as X-Wing keys are fixed-length byte strings, see <xref target="encoding"/>.</t>
        <t><tt>DeriveKeyPair()</tt> is given by</t>
        <artwork><![CDATA[
def DeriveKeyPair(ikm):
  return GenerateKeyPairDerand(SHAKE128(ikm, 96))
]]></artwork>
        <t>where the HPKE private key and public key are the X-Wing decapsulation
key and encapsulation key respectively.</t>
        <t>The argument <tt>ikm</tt> to <tt>DeriveKeyPair()</tt> <bcp14>SHOULD</bcp14> be at least 32 octets in
length.  (This is contrary to <xref target="RFC9180"/> which stipulates it should be
at least Nsk=2432 octets in length.)</t>
        <t><tt>Encap()</tt> is <tt>Encapsulate()</tt> from <xref target="encaps"/>.</t>
        <t><tt>Decap()</tt> is <tt>Decapsulate()</tt> from <xref target="decaps"/>.</t>
        <t>X-Wing is not an authenticated KEM: it does not support <tt>AuthEncap()</tt>
and <tt>AuthDecap()</tt>, see <xref target="auth"/>.</t>
        <t>Nsecret, Nenc, Npk, and Nsk are defined in <xref target="iana"/>.</t>
      </section>
      <section anchor="use-in-tls-13">
        <name>Use in TLS 1.3</name>
        <t>For the client's share, the key_exchange value contains
the X-Wing encapsulation key.</t>
        <t>For the server's share, the key_exchange value contains
the X-Wing ciphertext.</t>
      </section>
    </section>
    <section anchor="secc">
      <name>Security Considerations</name>
      <t>Informally, X-Wing is secure if SHA3 is secure, and either X25519 is
secure, or ML-KEM-768 is secure.</t>
      <t>More precisely, if SHA3-256, SHA3-512, SHAKE-128, and SHAKE-256 may be
modelled as a random oracle, then the IND-CCA security of X-Wing is
bounded by the IND-CCA security of ML-KEM-768, and the gap-CDH security
of Curve25519, see <xref target="PROOF"/>.</t>
      <t>The security of X-Wing relies crucially on the specifics of the
Fujisaki-Okamoto transformation used in ML-KEM-768: the X-Wing
combiner cannot be assumed to be secure, when used with different
KEMs. In particular it is not known to be safe to leave
out the post-quantum ciphertext from the combiner in the general case.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests/registers a new entry to the "HPKE KEM Identifiers"
registry.</t>
      <dl>
        <dt>Value:</dt>
        <dd>
          <t>TBD (please)</t>
        </dd>
        <dt>KEM:</dt>
        <dd>
          <t>X-Wing</t>
        </dd>
        <dt>Nsecret:</dt>
        <dd>
          <t>32</t>
        </dd>
        <dt>Nenc:</dt>
        <dd>
          <t>1120</t>
        </dd>
        <dt>Npk:</dt>
        <dd>
          <t>1216</t>
        </dd>
        <dt>Nsk:</dt>
        <dd>
          <t>2464</t>
        </dd>
        <dt>Auth:</dt>
        <dd>
          <t>no</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This document</t>
        </dd>
      </dl>
      <t>Furthermore, this document requests/registers a new entry to the TLS
Named Group (or Supported Group) registry, according to the procedures
in <xref section="6" sectionFormat="of" target="TLSIANA"/>.</t>
      <dl>
        <dt>Value:</dt>
        <dd>
          <t>TBD (please)</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>X-Wing</t>
        </dd>
        <dt>DTLS-OK:</dt>
        <dd>
          <t>Y</t>
        </dd>
        <dt>Recommended:</dt>
        <dd>
          <t>Y</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This document</t>
        </dd>
        <dt>Comment:</dt>
        <dd>
          <t>PQ/T hybrid of X25519 and ML-KEM-768</t>
        </dd>
      </dl>
    </section>
    <section anchor="todo">
      <name>TODO</name>
      <ul spacing="normal">
        <li>
          <t>Which validation do we want to require?</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.driscoll-pqt-hybrid-terminology">
          <front>
            <title>Terminology for Post-Quantum Traditional Hybrid Schemes</title>
            <author fullname="Florence D" initials="F." surname="D">
              <organization>UK National Cyber Security Centre</organization>
            </author>
            <date day="7" month="March" year="2023"/>
            <abstract>
              <t>   One aspect of the transition to post-quantum algorithms in
   cryptographic protocols is the development of hybrid schemes that
   incorporate both post-quantum and traditional asymmetric algorithms.
   This document defines terminology for such schemes.  It is intended
   to be used as a reference and, hopefully, to ensure consistency and
   clarity across different protocols, standards, and organisations.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-driscoll-pqt-hybrid-terminology-02"/>
        </reference>
        <reference anchor="I-D.ounsworth-cfrg-kem-combiners">
          <front>
            <title>Combiner function for hybrid key encapsulation mechanisms (Hybrid KEMs)</title>
            <author fullname="Mike Ounsworth" initials="M." surname="Ounsworth">
              <organization>Entrust Limited</organization>
            </author>
            <author fullname="Aron Wussler" initials="A." surname="Wussler">
              <organization>Proton AG</organization>
            </author>
            <author fullname="Stavros Kousidis" initials="S." surname="Kousidis">
              <organization>BSI</organization>
            </author>
            <date day="31" month="January" year="2024"/>
            <abstract>
              <t>   The migration to post-quantum cryptography often calls for performing
   multiple key encapsulations in parallel and then combining their
   outputs to derive a single shared secret.

   This document defines a comprehensible and easy to implement Keccak-
   based KEM combiner to join an arbitrary number of key shares, that is
   compatible with NIST SP 800-56Cr2 [SP800-56C] when viewed as a key
   derivation function.  The combiners defined here are practical split-
   key PRFs and are CCA-secure as long as at least one of the ingredient
   KEMs is.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ounsworth-cfrg-kem-combiners-05"/>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>FIPS 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author initials="" surname="National Institute of Standards and Technology">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="MLKEM" target="https://csrc.nist.gov/pubs/fips/203/ipd">
          <front>
            <title>FIPS 203 (Initial Draft): Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
            <author initials="" surname="National Institute of Standards and Technology">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC9180">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="K. Bhargavan" initials="K." surname="Bhargavan"/>
            <author fullname="B. Lipp" initials="B." surname="Lipp"/>
            <author fullname="C. Wood" initials="C." surname="Wood"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9180"/>
          <seriesInfo name="DOI" value="10.17487/RFC9180"/>
        </reference>
        <reference anchor="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="HYBRID">
          <front>
            <title>Hybrid key exchange in TLS 1.3</title>
            <author fullname="Douglas Stebila" initials="D." surname="Stebila">
              <organization>University of Waterloo</organization>
            </author>
            <author fullname="Scott Fluhrer" initials="S." surname="Fluhrer">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Shay Gueron" initials="S." surname="Gueron">
              <organization>University of Haifa and Amazon Web Services</organization>
            </author>
            <date day="12" month="February" year="2020"/>
            <abstract>
              <t>   Hybrid key exchange refers to using multiple key exchange algorithms
   simultaneously and combining the result with the goal of providing
   security even if all but one of the component algorithms is broken.
   It is motivated by transition to post-quantum cryptography.  This
   document provides a construction for hybrid key exchange in the
   Transport Layer Security (TLS) protocol version 1.3.

   Discussion of this work is encouraged to happen on the TLS IETF
   mailing list tls@ietf.org or on the GitHub repository which contains
   the draft: https://github.com/dstebila/draft-stebila-tls-hybrid-
   design.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-stebila-tls-hybrid-design-03"/>
        </reference>
        <reference anchor="XYBERHPKE">
          <front>
            <title>X25519Kyber768Draft00 hybrid post-quantum KEM for HPKE</title>
            <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="May" year="2023"/>
            <abstract>
              <t>   This memo defines X25519Kyber768Draft00, a hybrid post-quantum KEM,
   for HPKE (RFC9180).  This KEM does not support the authenticated
   modes of HPKE.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-westerbaan-cfrg-hpke-xyber768d00-02"/>
        </reference>
        <reference anchor="XYBERTLS">
          <front>
            <title>X25519Kyber768Draft00 hybrid post-quantum key agreement</title>
            <author fullname="Bas Westerbaan" initials="B." surname="Westerbaan">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Douglas Stebila" initials="D." surname="Stebila">
              <organization>University of Waterloo</organization>
            </author>
            <date day="24" month="September" year="2023"/>
            <abstract>
              <t>   This memo defines X25519Kyber768Draft00, a hybrid post-quantum key
   exchange for TLS 1.3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-tls-westerbaan-xyber768d00-03"/>
        </reference>
        <reference anchor="TLSIANA">
          <front>
            <title>IANA Registry Updates for TLS and DTLS</title>
            <author fullname="Joseph A. Salowey" initials="J. A." surname="Salowey">
              <organization>Venafi</organization>
            </author>
            <author fullname="Sean Turner" initials="S." surname="Turner">
              <organization>sn3rd</organization>
            </author>
            <date day="23" month="January" year="2024"/>
            <abstract>
              <t>   This document updates the changes to TLS and DTLS IANA registries
   made in RFC 8447.  It adds a new value "D" for discouraged to the
   recommended column of the selected TLS registries.

   This document updates the following RFCs: 3749, 5077, 4680, 5246,
   5705, 5878, 6520, 7301, and 8447.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-rfc8447bis-08"/>
        </reference>
        <reference anchor="PROOF" target="https://eprint.iacr.org/2024/039">
          <front>
            <title>X-Wing: The Hybrid KEM You’ve Been Looking For</title>
            <author initials="M." surname="Barbosa">
              <organization/>
            </author>
            <author initials="D." surname="Connolly">
              <organization/>
            </author>
            <author initials="J." surname="Duarte">
              <organization/>
            </author>
            <author initials="A." surname="Kaiser">
              <organization/>
            </author>
            <author initials="P." surname="Schwabe">
              <organization/>
            </author>
            <author initials="K." surname="Varner">
              <organization/>
            </author>
            <author initials="B. E." surname="Westerbraan">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 538?>

<section anchor="implementations">
      <name>Implementations</name>
      <ul spacing="normal">
        <li>
          <t>Go  </t>
          <ul spacing="normal">
            <li>
              <t><eref target="https://github.com/cloudflare/circl/pull/471">CIRCL</eref></t>
            </li>
            <li>
              <t><eref target="https://github.com/FiloSottile/mlkem768">Filippo</eref></t>
            </li>
          </ul>
        </li>
        <li>
          <t>Rust  </t>
          <ul spacing="normal">
            <li>
              <t><eref target="https://github.com/rugo/xwing-kem.rs]">xwing-kem.rs</eref>      </t>
              <t>
Note: implements the older <tt>-00</tt> version of this memo at the time of
writing.</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="S-spec">
      <name>Machine-readable specification</name>
      <t>For the convenience of implementors, we provide a reference specification
in Python. This is a specification; not production ready code:
it should not be deployed as-is, as it leaks the private key by its runtime.</t>
      <section anchor="xwingpy">
        <name>xwing.py</name>
        <artwork><![CDATA[
# WARNING This is a specification of X-Wing; not a production-ready
# implementation. It is slow and does not run in constant time.

# Requires the CryptoDome for SHAKE, and pytest for testing. To install, run
#
#   pip install pycryptodome pytest

import binascii
import hashlib

import mlkem
import x25519

XWingLabel = br"""
                \./
                /^\
              """.replace(b'\n', b'').replace(b' ', b'')

assert len(XWingLabel) == 6
assert binascii.hexlify(XWingLabel) == b'5c2e2f2f5e5c'

def GenerateKeyPairDerand(seed):
    assert len(seed) == 96
    pkM, skM = mlkem.KeyGen(seed[0:64], mlkem.params768)
    skX = seed[64:96]
    pkX = x25519.X(skX, x25519.BASE)
    return skM + skX + pkX, pkM + pkX

def Combiner(ssM, ssX, ctX, pkX):
    return hashlib.sha3_256(
        XWingLabel +
        ssM +
        ssX +
        ctX +
        pkX
    ).digest()

def EncapsulateDerand(pk, eseed):
    assert len(eseed) == 64
    assert len(pk) == 1216
    pkM = pk[0:1184]
    pkX = pk[1184:1216]
    ekX = eseed[32:64]
    ctX = x25519.X(ekX, x25519.BASE)
    ssX = x25519.X(ekX, pkX)
    ctM, ssM = mlkem.Enc(pkM, eseed[0:32], mlkem.params768)
    ss = Combiner(ssM, ssX, ctX, pkX)
    return ss, ctM + ctX

def Decapsulate(ct, sk):
    assert len(ct) == 1120
    assert len(sk) == 2464
    ctM = ct[0:1088]
    ctX = ct[1088:1120]
    skM = sk[0:2400]
    skX = sk[2400:2432]
    pkX = sk[2432:2464]
    ssM = mlkem.Dec(skM, ctM, mlkem.params768)
    ssX = x25519.X(skX, ctX)
    return Combiner(ssM, ssX, ctX, pkX)
]]></artwork>
      </section>
      <section anchor="x25519py">
        <name>x25519.py</name>
        <artwork><![CDATA[
# WARNING This is a specification of X25519; not a production-ready
# implementation. It is slow and does not run in constant time.

p = 2**255 - 19
a24 = 121665

BASE = b'\x09' + b'\x00'*31

def decode(bs):
    return sum(bs[i] << 8*i for i in range(32)) % p

def decodeScalar(k):
    bs = list(k)
    bs[0] &= 248
    bs[31] &= 127
    bs[31] |= 64
    return decode(bs)

# See rfc7748 §5.
def X(k, u):
    assert len(k) == 32
    assert len(u) == 32

    k = decodeScalar(k)
    u = decode(u)
    x1, x2, x3, z2, z3, swap = u, 1, u, 0, 1, 0

    for t in range(255, -1, -1):
        kt = (k >> t) & 1
        swap ^= kt
        if swap == 1:
            x3, x2 = x2, x3
            z3, z2 = z2, z3
        swap = kt

        A = x2 + z2
        AA = (A*A) % p
        B = x2 - z2
        BB = (B*B) % p
        E = AA - BB
        C = x3 + z3
        D = x3 - z3
        DA = (D*A) % p
        CB = (C*B) % p
        x3 = DA + CB
        x3 = (x3 * x3) % p
        z3 = DA - CB
        z3 = (x1 * z3 * z3) % p
        x2 = (AA * BB) % p
        z2 = (E * (AA + (a24 * E) % p)) % p

    if swap == 1:
        x3, x2 = x2, x3
        z2, z3 = z3, z2

    ret = (x2 * pow(z2, p-2, p)) % p
    return bytes((ret >> 8*i) & 255 for i in range(32))
]]></artwork>
      </section>
      <section anchor="mlkempy">
        <name>mlkem.py</name>
        <artwork><![CDATA[
# WARNING This is a specification of Kyber; not a production ready
# implementation. It is slow and does not run in constant time.

# Requires the CryptoDome for SHAKE. To install, run
#
#   pip install pycryptodome pytest
from Crypto.Hash import SHAKE128, SHAKE256

import io
import hashlib
import functools
import collections

from math import floor

q = 3329
nBits = 8
zeta = 17
eta2 = 2

n = 2**nBits
inv2 = (q+1)//2 # inverse of 2

params = collections.namedtuple('params', ('k', 'du', 'dv', 'eta1'))

params512  = params(k = 2, du = 10, dv = 4, eta1 = 3)
params768  = params(k = 3, du = 10, dv = 4, eta1 = 2)
params1024 = params(k = 4, du = 11, dv = 5, eta1 = 2)

def smod(x):
    r = x % q
    if r > (q-1)//2:
        r -= q
    return r

# Rounds to nearest integer with ties going up
def Round(x):
    return int(floor(x + 0.5))

def Compress(x, d):
    return Round((2**d / q) * x) % (2**d)

def Decompress(y, d):
    assert 0 <= y and y <= 2**d
    return Round((q / 2**d) * y)

def BitsToWords(bs, w):
    assert len(bs) % w == 0
    return [sum(bs[i+j] * 2**j for j in range(w))
            for i in range(0, len(bs), w)]

def WordsToBits(bs, w):
    return sum([[(b >> i) % 2 for i in range(w)] for b in bs], [])

def Encode(a, w):
    return bytes(BitsToWords(WordsToBits(a, w), 8))

def Decode(a, w):
    return BitsToWords(WordsToBits(a, 8), w)

def brv(x):
    """ Reverses a 7-bit number """
    return int(''.join(reversed(bin(x)[2:].zfill(nBits-1))), 2)

class Poly:
    def __init__(self, cs=None):
        self.cs = (0,)*n if cs is None else tuple(cs)
        assert len(self.cs) == n

    def __add__(self, other):
        return Poly((a+b) % q for a,b in zip(self.cs, other.cs))

    def __neg__(self):
        return Poly(q-a for a in self.cs)
    def __sub__(self, other):
        return self + -other

    def __str__(self):
        return f"Poly({self.cs}"

    def __eq__(self, other):
        return self.cs == other.cs

    def NTT(self):
        cs = list(self.cs)
        layer = n // 2
        zi = 0
        while layer >= 2:
            for offset in range(0, n-layer, 2*layer):
                zi += 1
                z = pow(zeta, brv(zi), q)

                for j in range(offset, offset+layer):
                    t = (z * cs[j + layer]) % q
                    cs[j + layer] = (cs[j] - t) % q
                    cs[j] = (cs[j] + t) % q
            layer //= 2
        return Poly(cs)

    def RefNTT(self):
        # Slower, but simpler, version of the NTT.
        cs = [0]*n
        for i in range(0, n, 2):
            for j in range(n // 2):
                z = pow(zeta, (2*brv(i//2)+1)*j, q)
                cs[i] = (cs[i] + self.cs[2*j] * z) % q
                cs[i+1] = (cs[i+1] + self.cs[2*j+1] * z) % q
        return Poly(cs)

    def InvNTT(self):
        cs = list(self.cs)
        layer = 2
        zi = n//2
        while layer < n:
            for offset in range(0, n-layer, 2*layer):
                zi -= 1
                z = pow(zeta, brv(zi), q)

                for j in range(offset, offset+layer):
                    t = (cs[j+layer] - cs[j]) % q
                    cs[j] = (inv2*(cs[j] + cs[j+layer])) % q
                    cs[j+layer] = (inv2 * z * t) % q
            layer *= 2
        return Poly(cs)

    def MulNTT(self, other):
        """ Computes self o other, the multiplication of self and other
            in the NTT domain. """
        cs = [None]*n
        for i in range(0, n, 2):
            a1 = self.cs[i]
            a2 = self.cs[i+1]
            b1 = other.cs[i]
            b2 = other.cs[i+1]
            z = pow(zeta, 2*brv(i//2)+1, q)
            cs[i] = (a1 * b1 + z * a2 * b2) % q
            cs[i+1] = (a2 * b1 + a1 * b2) % q
        return Poly(cs)

    def Compress(self, d):
        return Poly(Compress(c, d) for c in self.cs)

    def Decompress(self, d):
        return Poly(Decompress(c, d) for c in self.cs)

    def Encode(self, d):
        return Encode(self.cs, d)

def sampleUniform(stream):
    cs = []
    while True:
        b = stream.read(3)
        d1 = b[0] + 256*(b[1] % 16)
        d2 = (b[1] >> 4) + 16*b[2]
        assert d1 + 2**12 * d2 == b[0] + 2**8 * b[1] + 2**16*b[2]
        for d in [d1, d2]:
            if d >= q:
                continue
            cs.append(d)
            if len(cs) == n:
                return Poly(cs)

def CBD(a, eta):
    assert len(a) == 64*eta
    b = WordsToBits(a, 8)
    cs = []
    for i in range(n):
        cs.append((sum(b[:eta]) - sum(b[eta:2*eta])) % q)
        b = b[2*eta:]
    return Poly(cs)

def XOF(seed, j, i):
    h = SHAKE128.new()
    h.update(seed + bytes([j, i]))
    return h

def PRF1(seed, nonce):
    assert len(seed) == 32
    h = SHAKE256.new()
    h.update(seed + bytes([nonce]))
    return h

def PRF2(seed, msg):
    assert len(seed) == 32
    h = SHAKE256.new()
    h.update(seed + msg)
    return h.read(32)

def G(seed):
    h = hashlib.sha3_512(seed).digest()
    return h[:32], h[32:]

def H(msg): return hashlib.sha3_256(msg).digest()

class Vec:
    def __init__(self, ps):
        self.ps = tuple(ps)

    def NTT(self):
        return Vec(p.NTT() for p in self.ps)

    def InvNTT(self):
        return Vec(p.InvNTT() for p in self.ps)

    def DotNTT(self, other):
        """ Computes the dot product <self, other> in NTT domain. """
        return sum((a.MulNTT(b) for a, b in zip(self.ps, other.ps)),
                   Poly())

    def __add__(self, other):
        return Vec(a+b for a,b in zip(self.ps, other.ps))

    def Compress(self, d):
        return Vec(p.Compress(d) for p in self.ps)

    def Decompress(self, d):
        return Vec(p.Decompress(d) for p in self.ps)

    def Encode(self, d):
        return Encode(sum((p.cs for p in self.ps), ()), d)

    def __eq__(self, other):
        return self.ps == other.ps

def EncodeVec(vec, w):
    return Encode(sum([p.cs for p in vec.ps], ()), w)
def DecodeVec(bs, k, w):
    cs = Decode(bs, w)
    return Vec(Poly(cs[n*i:n*(i+1)]) for i in range(k))
def DecodePoly(bs, w):
    return Poly(Decode(bs, w))

class Matrix:
    def __init__(self, cs):
        """ Samples the matrix uniformly from seed rho """
        self.cs = tuple(tuple(row) for row in cs)

    def MulNTT(self, vec):
        """ Computes matrix multiplication A*vec in the NTT domain. """
        return Vec(Vec(row).DotNTT(vec) for row in self.cs)

    def T(self):
        """ Returns transpose of matrix """
        k = len(self.cs)
        return Matrix((self.cs[j][i] for j in range(k))
                      for i in range(k))

def sampleMatrix(rho, k):
    return Matrix([[sampleUniform(XOF(rho, j, i))
            for j in range(k)] for i in range(k)])

def sampleNoise(sigma, eta, offset, k):
    return Vec(CBD(PRF1(sigma, i+offset).read(64*eta), eta)
               for i in range(k))

def constantTimeSelectOnEquality(a, b, ifEq, ifNeq):
    # WARNING! In production code this must be done in a
    # data-independent constant-time manner, which this implementation
    # is not. In fact, many more lines of code in this
    # file are not constant-time.
    return ifEq if a == b else ifNeq

def InnerKeyGen(seed, params):
    assert len(seed) == 32
    rho, sigma = G(seed)
    A = sampleMatrix(rho, params.k)
    s = sampleNoise(sigma, params.eta1, 0, params.k)
    e = sampleNoise(sigma, params.eta1, params.k, params.k)
    sHat = s.NTT()
    eHat = e.NTT()
    tHat = A.MulNTT(sHat) + eHat
    pk = EncodeVec(tHat, 12) + rho
    sk = EncodeVec(sHat, 12)
    return (pk, sk)

def InnerEnc(pk, msg, seed, params):
    assert len(msg) == 32
    tHat = DecodeVec(pk[:-32], params.k, 12)
    rho = pk[-32:]
    A = sampleMatrix(rho, params.k)
    r = sampleNoise(seed, params.eta1, 0, params.k)
    e1 = sampleNoise(seed, eta2, params.k, params.k)
    e2 = sampleNoise(seed, eta2, 2*params.k, 1).ps[0]
    rHat = r.NTT()
    u = A.T().MulNTT(rHat).InvNTT() + e1
    m = Poly(Decode(msg, 1)).Decompress(1)
    v = tHat.DotNTT(rHat).InvNTT() + e2 + m
    c1 = u.Compress(params.du).Encode(params.du)
    c2 = v.Compress(params.dv).Encode(params.dv)
    return c1 + c2

def InnerDec(sk, ct, params):
    split = params.du * params.k * n // 8
    c1, c2 = ct[:split], ct[split:]
    u = DecodeVec(c1, params.k, params.du).Decompress(params.du)
    v = DecodePoly(c2, params.dv).Decompress(params.dv)
    sHat = DecodeVec(sk, params.k, 12)
    return (v - sHat.DotNTT(u.NTT()).InvNTT()).Compress(1).Encode(1)

def KeyGen(seed, params):
    assert len(seed) == 64
    z = seed[32:]
    pk, sk2 = InnerKeyGen(seed[:32], params)
    h = H(pk)
    return (pk, sk2 + pk + h + z)

def Enc(pk, seed, params):
    assert len(seed) == 32

    K, r = G(seed + H(pk))
    ct = InnerEnc(pk, seed, r, params)
    return (ct, K)

def Dec(sk, ct, params):
    sk2 = sk[:12 * params.k * n//8]
    pk = sk[12 * params.k * n//8 : 24 * params.k * n//8 + 32]
    h = sk[24 * params.k * n//8 + 32 : 24 * params.k * n//8 + 64]
    z = sk[24 * params.k * n//8 + 64 : 24 * params.k * n//8 + 96]
    m2 = InnerDec(sk, ct, params)
    K2, r2 = G(m2 + h)
    ct2 = InnerEnc(pk, m2, r2, params)
    return constantTimeSelectOnEquality(
        ct2, ct,
        K2,                 # if ct == ct2
        PRF2(z, ct),        # if ct != ct2
    )
]]></artwork>
      </section>
    </section>
    <section anchor="test-vectors-todo-replace-with-test-vectors-that-re-use-ml-kem-x25519-values">
      <name>Test vectors # TODO: replace with test vectors that re-use ML-KEM, X25519 values</name>
      <artwork><![CDATA[
seed
  7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef263cb1eea9
  88004b93103cfb0aeefd2a686e01fa4a58e8a3639ca8a1e3f9ae57e235b8cc873c23dc62
  b8d260169afa2f75ab916a58d974918835d25e6a435085b2
sk
  24c59d1c7603e7b74bc7aa1bc2cb3a214b3cfaebb63bd85b65408427c498ba394371bb27
  1f92a3b506b81d54a95a7c0ddfbaa1519553d6f3cd5a601b7db6b0e91a5149468f1f68ad
  26478bf3c6670e093ac4c49e7a90ba46595de94c50e04129a811a841b39534a87f0ae7b1
  116553e20c9a566b9b8ff7c7e728b8b201893403a4f252a55230874c256b897834cda349
  807b25cbd75a30867bfb80328200017f1cb70b56cc546b65d3dc9cdb45107cf10dba3496
  19043ac35c0b9546309a239039813ed5c40f353a5e8e42193564496112bda56cb38c081d
  f252ae9c2c7e441a062e92a7c8da7a240c9952d86b5f1bb6a53b38a5ac0a54a84b43f12d
  a1d0525655684a12090b60b28b0c628db092015547d1070af5d6192e639636615d03c654
  bb90008ca15b784119f6178a00d7bef4a54a274ac922e55c61a3a8840aa258639484a3bc
  e2e43b6c969b11275631daa129a61ea0e2939f0877e1a110c8a44b24c54fbb07a958db9f
  eeca1eb52b086c87bf43a9b02a5b2c4762117c3a99ae4c4e2eaa7a33b9a714737215c103
  17514f6c4299ef92acd64c4858e85ce737a801890022d7381f3540230c0c8ef50a848a28
  b09ba0bf8b50619c905751601d7629767449c9c0b2bae321f438a77f412a55e45ecab4b3
  9053c6561801c639be6495be8fa144ef6029af663407ca9181946de5f3aec7236343ab3b
  c5a38a09c01b412baf0afb23f9e9b8f2b40810f2ce4ffbcdbfd87972323e98065160bcba
  34b3afd6c25b664745fca99a9ea75cef019d768485ec23336d9b39e4d05d8d587b30633d
  4f69ade5753a39680235e44f27995da96798f3a85e184a9fad19320829629f4140417bb7
  dbf5851ab79258134146d088452774991a087a1c2beaea89f218087ba774ae253b494c27
  750b1de04b44d953c5e47ab10f65205ee212f9c30391e5299553954916873a0b41164543
  e801c0b099cb44f48995675823c10b40f4bbac9177a558ca0c30765c2aabfd6a4da54c84
  13e33902d63f064330f0464982429de2604cd03b4de84a9f821a5470423a40a964dcc418
  63363d77b02c3127304f942ee71c98c643a427533ef300104948b825277953aaabfd8555
  88f75a77d199a213ad348116e9e539f6d37068a551c710548b7a2c7ee95f9cd9b3483332
  673cc44bcb18a778a49455c768e0b340f81102ac6b76b064057151ef101ae143787f5485
  53558df8035a3ce00c9c43cda43142cca39034b09a7e6089867b4c64980a69ecab2e6818
  724c35cb909d5d45bc6a349c71b306567664adc0cc8ef698049b4b4b432dd0f69fac0758
  0f77c4f79b22bb90cb97b341880716853431694c9120f6724ad58d57127fced999ff6229
  a5d4c3c240129cc812acc73698f949d8e73661f2528262bfccfa5cdf5a2104649806e295
  ea161217083365aa26cee6ae2f1356e8e1c5cefcc85703447ef1160a1b4a0e8c017b1738
  02c66c88ab70d39a6c96c1569d5a86245a7eeb087d682219080768745b44bf244f65b567
  b2658dbae6962ba52b322118e214cfadd7cf3502582dc9cafba952a9637ad36007102597
  78d99d23f8235da90791604b4f0a4f7640680f59b633d93dfb84282ba54c674b115684a4
  1bc331b659a61a04883d0c5ebbc0772754a4c33b6a90e52e0678ce06a0453ba8a188b15a
  496bae6a24177b636d12fbb088f2cd9504ac200231473031a31a5c62e46288fb3edb858b
  21bc0ea59a212fd1c6dba09e920712d068a2be7abcf4f2a3533443ee1780dd419681a960
  cd90af5fcaab8c1552ef25572f157a2bbb934a18a5c57a761b54a45d774ac6bc593583a1
  bcfc4dcd0cca87ab9cff463dc5e80ebbb501d18c8b39e324dbd07ca06cbf75ba33297abc
  c7aabdd5b308401ba387f533f3927b51e91380f5a59b119e354835ab182db62c76d6d85f
  a63241743a52012aac281222bc0037e2c493b4777a99cb5929aba155a006bc9b461c365f
  a3583fac5414b403af9135079b33a10df8819cb462f067253f92b3c45a7fb1c1478d4091
  e39010ba44071019010daa15c0f43d14641a8fa3a94cfaa2a877ae8113bbf8221ee13223
  376494fb128b825952d5105ae4157dd6d70f71d5bd48f34d469976629bce6c12931c88ca
  0882965e27538f272b19796b251226075b131b38564f90159583cd9c4c3c098c8f06a267
  b262b8731b9e962976c41152a76c30b502d0425635357b43cd3a3ecef5bc9910bb89ca9e
  91ba75e8121d53c2329b5222df12560d242724523ff60b6ead310d99954d483b91383a72
  6a937f1b60b474b22ea5b81954580339d81c9f47bab44a3fe0c833a7dba1f5b33a5a2a45
  9812645c6537c2317163d71b7bd7a4a5459a28a1c28659aad9a1ca9a99a363062d453355
  108445a673438e77624e73757c1a84d031cf0fb24b1187aafbe6738e9abaf5b42b004b1f
  a0d96426d3c5324235dd871e7a89364d335ebb6718ad098154208b143b2b43eb9e5fd881
  6c5225d494b40809b2459903c6486a1db9ac3414945e1867b5869c2f88cf9edc0a216681
  804578d34923e5a353babba923db907725b384e74e66987292e007e05c6766f267f839b7
  617c55e28b0fa2121da2d037d6830af9d869e1fb52b0cb645fe221a79b2a46e41980d346
  71ccc58d8756054b2cca7b13715a05f3925355cca838ab8d2425255f61135727167ad6bc
  b0632ebf86384b950ad21088c292b4a4fcc0e59c42d3f77fac85cd9f5cb049b3a29505a9
  84c4c6ac98ca3d0a8f30d2b1bd9815b94b27051b40ffc3455a668b9e141428611b280c1b
  8f2b55f6eb04e10c68f1340ef1582115f10ee2b785b7ebb0ec3a0c61670cf48107b594cd
  6e238e0d68961b47983b87879771519d2b7c21681cd494b420f03d004bb06eeb54f9c080
  c2f2aff6759074d5b3a3b11c73f1af6dc874eeec254d5409fceaa90ff66d90b6930a540f
  d1d9be1844af1d861ff96a611a414a6c61a78fb2a78e74383ab05ebc73855a818a627242
  d523a3e2a35ab4285b4a2564f76772aaf8cdc9f87c65f1b4b5819905fb4f9ea59166fbbd
  b201c5eefc0df7418ca211b5b079a511b8b94429847b537fbed82d57632d63e815d8212d
  8a280d43328604a6c4d2c1887e7ab061f120a0168db2f4735369b193780f0aeb381ff265
  3f3b46e206afe77a7e814c7716a1b166727dd2a0b9a7d8aeace425da63977f8103457c9f
  438a2676c10e3a9c630b855873288ee560ca05c37cc7329e9e502cfac918b9420544445d
  4cfa93f56ee922c7d660937b5937c3074d62968f006d1211c60296685953e5def3804c2d
  ad5c36180137c1df12f31385b670fde5cfe76447f6c4b5b50083553c3cb1eea988004b93
  103cfb0aeefd2a686e01fa4a58e8a3639ca8a1e3f9ae57e235b8cc873c23dc62b8d26016
  9afa2f75ab916a58d974918835d25e6a435085b2e56f17576740ce2a32fc5145030145cf
  b97e63e0e41d354274a079d3e6fb2e15
pk
  1bc331b659a61a04883d0c5ebbc0772754a4c33b6a90e52e0678ce06a0453ba8a188b15a
  496bae6a24177b636d12fbb088f2cd9504ac200231473031a31a5c62e46288fb3edb858b
  21bc0ea59a212fd1c6dba09e920712d068a2be7abcf4f2a3533443ee1780dd419681a960
  cd90af5fcaab8c1552ef25572f157a2bbb934a18a5c57a761b54a45d774ac6bc593583a1
  bcfc4dcd0cca87ab9cff463dc5e80ebbb501d18c8b39e324dbd07ca06cbf75ba33297abc
  c7aabdd5b308401ba387f533f3927b51e91380f5a59b119e354835ab182db62c76d6d85f
  a63241743a52012aac281222bc0037e2c493b4777a99cb5929aba155a006bc9b461c365f
  a3583fac5414b403af9135079b33a10df8819cb462f067253f92b3c45a7fb1c1478d4091
  e39010ba44071019010daa15c0f43d14641a8fa3a94cfaa2a877ae8113bbf8221ee13223
  376494fb128b825952d5105ae4157dd6d70f71d5bd48f34d469976629bce6c12931c88ca
  0882965e27538f272b19796b251226075b131b38564f90159583cd9c4c3c098c8f06a267
  b262b8731b9e962976c41152a76c30b502d0425635357b43cd3a3ecef5bc9910bb89ca9e
  91ba75e8121d53c2329b5222df12560d242724523ff60b6ead310d99954d483b91383a72
  6a937f1b60b474b22ea5b81954580339d81c9f47bab44a3fe0c833a7dba1f5b33a5a2a45
  9812645c6537c2317163d71b7bd7a4a5459a28a1c28659aad9a1ca9a99a363062d453355
  108445a673438e77624e73757c1a84d031cf0fb24b1187aafbe6738e9abaf5b42b004b1f
  a0d96426d3c5324235dd871e7a89364d335ebb6718ad098154208b143b2b43eb9e5fd881
  6c5225d494b40809b2459903c6486a1db9ac3414945e1867b5869c2f88cf9edc0a216681
  804578d34923e5a353babba923db907725b384e74e66987292e007e05c6766f267f839b7
  617c55e28b0fa2121da2d037d6830af9d869e1fb52b0cb645fe221a79b2a46e41980d346
  71ccc58d8756054b2cca7b13715a05f3925355cca838ab8d2425255f61135727167ad6bc
  b0632ebf86384b950ad21088c292b4a4fcc0e59c42d3f77fac85cd9f5cb049b3a29505a9
  84c4c6ac98ca3d0a8f30d2b1bd9815b94b27051b40ffc3455a668b9e141428611b280c1b
  8f2b55f6eb04e10c68f1340ef1582115f10ee2b785b7ebb0ec3a0c61670cf48107b594cd
  6e238e0d68961b47983b87879771519d2b7c21681cd494b420f03d004bb06eeb54f9c080
  c2f2aff6759074d5b3a3b11c73f1af6dc874eeec254d5409fceaa90ff66d90b6930a540f
  d1d9be1844af1d861ff96a611a414a6c61a78fb2a78e74383ab05ebc73855a818a627242
  d523a3e2a35ab4285b4a2564f76772aaf8cdc9f87c65f1b4b5819905fb4f9ea59166fbbd
  b201c5eefc0df7418ca211b5b079a511b8b94429847b537fbed82d57632d63e815d8212d
  8a280d43328604a6c4d2c1887e7ab061f120a0168db2f4735369b193780f0aeb381ff265
  3f3b46e206afe77a7e814c7716a1b166727dd2a0b9a7d8aeace425da63977f8103457c9f
  438a2676c10e3a9c630b855873288ee560ca05c37cc7329e9e502cfac918b9420544445d
  4cfa93f56ee922c7d660937b5937c3074d62968f006d1211c60296685953e5dee56f1757
  6740ce2a32fc5145030145cfb97e63e0e41d354274a079d3e6fb2e15
eseed
  badfd6dfaac359a5efbb7bcc4b59d538df9a04302e10c8bc1cbf1a0b3a5120ea17cda7cf
  ad765f5623474d368ccca8af0007cd9f5e4c849f167a580b14aabdef
ct
  718ad10318b367fc4390f63147fa5250ef61b65384a563f2c7951b2d45881fcf9f446ddd
  4443417eed0c001e635a994cda366f118bdd1cf0be0417abd1b615cc669e1b949280e28f
  52d3d5035c6420ff6c943421ee7589e681828c95942d4f9968f32b9ad30cccff0d98fa84
  b187164530dc83f9cde75ab1958c22dbff8af921c9ebc678a658b69663f72e7c1632b6ac
  8ddcbc6c8a06c3316b1aefdd07989ef944fc51406e12db6865344e03f447520d50c93fab
  1513d80cbc836950e2b52f424bb46155ba4c2e21ec5dff762bf7e92e54e0fb7618e73072
  607ba03b1de16f109e22dd5832a7eadfeb2ef00244bbaf930106cbcd2ab008f468de6d98
  632e9e225091a010e361ce751d633e6c37ba2530bca6fbe9d2e5348e4e168e154922992a
  ef45a265ec649ce21480504b609ad5f1b0b094b74d55aaea60b8f71398cd9340802e9141
  5937ffaa482c6678f8421c63583e8acd8d00bf285b52a26fa577aed109acd94ef7559554
  aa378f87283a7ee94af98e21a6fbac8802336ff980e15e498042a8148b69e1d8aab0b712
  6d0b885f9a57c1ea83efcce8dccfee076dbc2f9c074525ed4e7472c3e09a9f1c50ff5111
  50159c1be7730686c04e46368e37f2e8c82b8436463445b0edaefab876731497abcc563b
  1978eac34cf73b5b213549d1f74271d48f6a085155acd8d7db739ce6e70ad25ee636231e
  4151725d55ea781d483e54850e1ebda401276616e7a62b22efa2e3098a006dfacaa1fca5
  4ade6a119f3a215b523210164a7f299d2c7b8ad8a637bc1fba56de28ffa800b522246dbe
  c7148ced56ed292c7d92004065598bc573dd30259d84b6d923d2769ce260cdab0ad17673
  ef7388c020b8e8bcd055232a7240fe2fa4fcbeadbc46366aa47729f5502dbfee8a623ab8
  ec6f6020013aeff975f255b597a11eed1335457b9903da42a27a39fdb0edbb11742e4e52
  1c833b7952d3fd28f428eecb6f78b99ff0a5eb097793f78f1a70612811766fcbe0f9aa3c
  a4afd8a364f5584333d8a4cdc096a3762ea6cce70dfa42967f5a7c2dbef688b37885fa26
  220dc800bcb1ae83d35ffca54a6dabba730764d60b1a4a506206efa380d7d1d89069778b
  082bb92396af4547024797797e01c927c78c9f70750ef2002dfe1516baa4f165a3176942
  d35d9527f4b33505484130cd573f9d4a1f1e6656aff881aab482fb3d6151ab02f7626703
  3f3feb9718fbfed05a9b69a8d817a7e4a41efbe3ffeb355d1013778f14d4c30c92a38619
  0fa23b388feddc635b22d8fa4998b65d483cd3b595553092123e144c49d91ddc2f7a88f3
  ef1ad2b0b19636bc3f50f61ea5157c73a1a5b956349b6cdf3ff50ec9ef7cbc1137b27d78
  39276a3ed4e778c505206669686ef038b5808117fedf60ef3598e8ed1db1e5ad64f04af3
  8e60e82fe04bc75594fd9fcd8bb79237adb9c9ffd3dc2c907345f874aec7055576a32263
  486120ff62ad690a988919e941d33ed93706f6984032e205084cc46585b5aef035c22ddb
  b3b0ba04e83f80c1b06b4975f00207b357550d24405189412ea6a83ad56c4873f499fdbd
  c761aa72
ss     2fae7214767890c4703fad953f5e3f91303111498caa135d77cde634151e71b5

seed
  aee7eef47cb0fca9767be1fda69419dfb927e9df07348b196691abaeb580b32def58538b
  8d23f87732ea63b02b4fa0f4873360e2841928cd60dd4cee8cc0d4c922a96188d032675c
  8ac850933c7aff1533b94c834adbb69c6115bad4692d8619
sk
  89722dd1c8829af93f6e5405ecd93a5aaabcb9264aafc363d731bb4f276021b0c0682636
  3022ae1e85acc6679ccb583a37ba4d30e0564ae6421ab1b5c2374a058cb6bca4050ce15e
  d5c51bcc90be82454b332aa21069623d8a8b393a2c2b6cb5bffc55ae369614a77d9bc982
  d47496ab21239bb7691ac65494225889b7b45ba10b0aac10c3c41fa7a4a51fa14d3e92bb
  d364be59ba7d9d4592944968e97a2d947868a0624a97a9c8ad226d81a12a17777eafaa6d
  e30436a5c743003078d830734ec97e6a625f6d9c10f9da3f956b5583578478e6311f2778
  9d6188ede84510442c9f556696378faa622b1e935be62c733da96b023c31b2ba6abfbc5c
  748088251042d46559bf132d2a43b7690cb4666722ebc53849843125f9a900aa476af424
  b7b410f18300f048ce26dc7f35b50f7eb5bccf23c95b7c0064e92662eb22927359df1b9a
  ce43ce014384ae68822f4c3f64583643355c6746290d224a70c818158884e2aa8f15e187
  09100848255c277144f051ab8b40775c297cafb238cdb70e8ce687c9e195d0823b390341
  e245852ca99c079211161a79409247ae721a59b358ef097ed8dc386f982d36a9220c3511
  eacb3674f671f171afb0d14f0890c0c7f77d06f7c61ca83a15974083e72678f180f35c1a
  aa633166d429432599f9d9432fe791318ab14a3988496a14c2417e03990136e91aa3a817
  085abbc4aa0c38a45e7e009f3577739172396f7b7e61734eaacc5b484971e9a9384b58aa
  dff9307a98222a3813f9269fe793b7ef582ab8c36feaf447d3136285f76d5f4631413567
  73650441e092dc73bcf483cb1f2944016936db2a34b743830cb890e85660acd077ea51c0
  7e664df7ab803c9b0c96e143b4f5788311a841b76be728aea60270104564575bb723f51d
  acaab5e379c3cdd97bdac84ad6738587bcbbdf1c66a0da65f87a673f840e1d7c5a722a26
  5568429ae36cdde9cd54ac3d4a94c4c6508361984e1c211771998641816fa392a4ffb976
  64381a84900eb52502f04816a3d70090b55ee2d3b7f3d459af4008ec8c1b19c08d1284b6
  fdc81508647ecb9b45e65c084d456f9fa87a68f26bc05b4e8415887b602ff28b28e41263
  7ff9019a90ac21c7c4ae9670a538a2bd2604616689b034c33cb1cc9d634eb37c8d4d46bc
  40e335582b539d3215bf70960cc1c0b11011449c2a09265101f55366dc0213a641128851
  76c3a223b19cf6951b5968452aa7b839370646db5eee1893346a58c116133dbc8fc1c5ac
  34e04cda171b041c0133563a682855a9cb18896c6179ac2eac83c70547942e54b2e133a6
  f68450f4f4b14bda3af5f129b3e292c6a676aa0b7a045c7251e315ca3707ff23bec349a9
  50d49718560b2ff66cbd49c848b4036c2186a0315c4e6a32f3035207a48651891f50ec6c
  0eb19d13e90457611e0c7ccdf012a3e19412d8c1563f1ab22b39859b27a7bcac72cbf2c8
  3c666deb401e4239603645872b997673b6205d97cdd68b0a782742e62c24ad746261085d
  e3c95f49dbb8172c05f3f2414e63652c3b358d603e867173e03203af06a26bb0bfc0b521
  118b6fd99613a160829b04475374b8214859bcc316f4e06a84f264ec3cb513f66b71ac3a
  3d135aa589198cb02113cc17e13a0f15fc1d3d734966c3751a74ac27c781323043e36389
  dca9a2af6508bdba0260662691426d1d8899cd77736c21b17eb3a31fc118154264e2b10e
  22c506b7803b1f4b25d178b688b641d0943185107eed18b228e8b68753a8d75a77f29b5b
  5e97abd028354ce4cd6961797a757c4ff44aeea2c0a16cbfdcb07314fb3e64d7c26a4c9e
  5782a2ee198d73e7bf05eb85bd420cee20ac24c36613d6bd0c53133443527c32bd0f8b3b
  3be9918c7caea71748de6bacfa27710845ad0b528c087349e9faa3c83869e1d0ac926797
  4dba1dc3434976f60b59d443bad51e87d974c9f747b76017bd17021c24246a9987db1b31
  8562bf665b41fb153c0ba675cac593b990ce595a7851fa18ea345bf20c3524862532544e
  05e5c69daa0dc4f2b24704338e29144d653657d47a20f39ed2b1174cb3120ed1590e4ac9
  32579dc2da9f12f6c07ec7a31963208faa5c758615713965b9d5661860cfe5652d74231d
  2ce9b696ea9e45305a28d84c082709d2238bbc849b6b3cac64b78b532995af6b4ce9880f
  9149a5ae083320624e3b54851d48a6f24266258a0a14d342e4ca3133c33c5e16ad91b22d
  521100076527cefc5f0417b332463c5c5c52dc4b00a2d29959109244d2810839a310cb1d
  f282503d5cbf3f0cbe3e68873407b7e5e960ca214709919b65301da2b3a7e488205a3a9c
  5f24cd61d18c757040b14a4e80e8c09e74a9a71265ed213a91da6d7a8655de3b4a83125e
  e2e66cb673733e3717d99023a6683712767ab2da9b54a26dd3b695a80b54226a1a967b08
  c3f76e679914470803bc6805a6b4b1b78261259acd8f703dd10ba6e8e1a00dd94e774113
  d13103253cb70edab948c38072629b949261b7c439445bc498444e86b6a9a7da8b153038
  0bf2939532a8e7ea84ea0b5c6db5335e826aa0325b536ccc21d943890b2c2a5c44f33768
  2355867be87965175f2dbbb0aba89f9311b0873a15db6a4128682a8bca019a04a351a0ce
  646868f9bbb6f8d0bea3db0865f1239b16c93ca09d19857d747abfc846b27dd77ee5d405
  fab5ce949635e7d34ec1b9546aea75df571cfed74b7112218e4153e7f6a7a3a910ec4c11
  1576b3bb27c29852746e645fa501b0642678aefa2209c745939a2ab000033862b88e7011
  e7e25ec1e3cd379b54bc457a85d9af0680160c57b3a4e90308bc28b8da13ac0c563c55b3
  9a88bd90b51f691525e50a260a0507a2174447ea93f5d5acec6c16a5d7909e275f612c9f
  283310e8124d28f18000f811fb929e03f30d1472644851bcb73c4af6b095acd7328a072b
  e9187a836a15307c6076210c9b410493505bc4814e3c327386796c5932c8cab7a695b97c
  ac24561b2a9657c3157531ba3cba699b6424fda24cc6c72edac1a6bf091b87c3c594c917
  d24a1126f998aee120ae372a27a268a0c76ab8f84957f461e7c04dd2d59f0f217d9e0700
  8990533b16bbc125b2737a1a7e1cc1ed7c47e8f8464ba78c5d3298f2dc7d0be944ad2990
  7ec774ad1b1f1485b114a9a9b93c488c89c0c7609f2bf9533c2929f667bca8b68999e340
  54597cf83ba7450b237188c3364172c1351bd349a699672d31b9598bab79a18b3d8cb25f
  5f53c0b22bfa065690a16184db4f9731cea1a08f5876ec187e7b1ae79c593415d068838e
  5ce0bf2c28b1e389ae4a768f871b2761a29178a51845eb0b939f0ee9ef58538b8d23f877
  32ea63b02b4fa0f4873360e2841928cd60dd4cee8cc0d4c922a96188d032675c8ac85093
  3c7aff1533b94c834adbb69c6115bad4692d8619c7dd2bf4e3b5b93f77f4576d55d30073
  9e75e14084b0bc85620499bf468ae161
pk
  3d135aa589198cb02113cc17e13a0f15fc1d3d734966c3751a74ac27c781323043e36389
  dca9a2af6508bdba0260662691426d1d8899cd77736c21b17eb3a31fc118154264e2b10e
  22c506b7803b1f4b25d178b688b641d0943185107eed18b228e8b68753a8d75a77f29b5b
  5e97abd028354ce4cd6961797a757c4ff44aeea2c0a16cbfdcb07314fb3e64d7c26a4c9e
  5782a2ee198d73e7bf05eb85bd420cee20ac24c36613d6bd0c53133443527c32bd0f8b3b
  3be9918c7caea71748de6bacfa27710845ad0b528c087349e9faa3c83869e1d0ac926797
  4dba1dc3434976f60b59d443bad51e87d974c9f747b76017bd17021c24246a9987db1b31
  8562bf665b41fb153c0ba675cac593b990ce595a7851fa18ea345bf20c3524862532544e
  05e5c69daa0dc4f2b24704338e29144d653657d47a20f39ed2b1174cb3120ed1590e4ac9
  32579dc2da9f12f6c07ec7a31963208faa5c758615713965b9d5661860cfe5652d74231d
  2ce9b696ea9e45305a28d84c082709d2238bbc849b6b3cac64b78b532995af6b4ce9880f
  9149a5ae083320624e3b54851d48a6f24266258a0a14d342e4ca3133c33c5e16ad91b22d
  521100076527cefc5f0417b332463c5c5c52dc4b00a2d29959109244d2810839a310cb1d
  f282503d5cbf3f0cbe3e68873407b7e5e960ca214709919b65301da2b3a7e488205a3a9c
  5f24cd61d18c757040b14a4e80e8c09e74a9a71265ed213a91da6d7a8655de3b4a83125e
  e2e66cb673733e3717d99023a6683712767ab2da9b54a26dd3b695a80b54226a1a967b08
  c3f76e679914470803bc6805a6b4b1b78261259acd8f703dd10ba6e8e1a00dd94e774113
  d13103253cb70edab948c38072629b949261b7c439445bc498444e86b6a9a7da8b153038
  0bf2939532a8e7ea84ea0b5c6db5335e826aa0325b536ccc21d943890b2c2a5c44f33768
  2355867be87965175f2dbbb0aba89f9311b0873a15db6a4128682a8bca019a04a351a0ce
  646868f9bbb6f8d0bea3db0865f1239b16c93ca09d19857d747abfc846b27dd77ee5d405
  fab5ce949635e7d34ec1b9546aea75df571cfed74b7112218e4153e7f6a7a3a910ec4c11
  1576b3bb27c29852746e645fa501b0642678aefa2209c745939a2ab000033862b88e7011
  e7e25ec1e3cd379b54bc457a85d9af0680160c57b3a4e90308bc28b8da13ac0c563c55b3
  9a88bd90b51f691525e50a260a0507a2174447ea93f5d5acec6c16a5d7909e275f612c9f
  283310e8124d28f18000f811fb929e03f30d1472644851bcb73c4af6b095acd7328a072b
  e9187a836a15307c6076210c9b410493505bc4814e3c327386796c5932c8cab7a695b97c
  ac24561b2a9657c3157531ba3cba699b6424fda24cc6c72edac1a6bf091b87c3c594c917
  d24a1126f998aee120ae372a27a268a0c76ab8f84957f461e7c04dd2d59f0f217d9e0700
  8990533b16bbc125b2737a1a7e1cc1ed7c47e8f8464ba78c5d3298f2dc7d0be944ad2990
  7ec774ad1b1f1485b114a9a9b93c488c89c0c7609f2bf9533c2929f667bca8b68999e340
  54597cf83ba7450b237188c3364172c1351bd349a699672d31b9598bab79a18b3d8cb25f
  5f53c0b22bfa065690a16184db4f9731cea1a08f5876ec187e7b1ae79c593415c7dd2bf4
  e3b5b93f77f4576d55d300739e75e14084b0bc85620499bf468ae161
eseed
  f90b0cdf8a7b9c264029ac185b70b83f2801f2f4b3f70c593ea3aeeb613a7f1b1de33fd7
  5081f592305f2e4526edc09631b10958f464d889f31ba010250fda7f
ct
  f98f274dc74db1798915be81f089fbf792116ec03539b6c02cfbe649267f100df0ef51ec
  6e51fd4a9b75cc2f1806d470b56984df3d368e4d09be4b4ffd59907e11b2d4497b7dd2b6
  1afb3cc52a6ea661f2c6495a7f5fbef3dfac143f65bc9f6eb48d548df01d6a0bb52dab84
  fda5e92f7a223289ec4e45cf76d47ab3a79086481f4bb4e95cd69bfdf388762e775bf63b
  9694f72ca5a90883be5b8ac08c1737d5eced830466e9426fe5bec61bc63f1962358b66cb
  3d8fdd5dfa887b0da5f15c8868bafce3d998b85ab34ced43ac9b9869c84c59fb2f094ddc
  a1dee97db9a941c3cc319401d9db08569d8eb248ec2ff51e7e18c22d810bf512c28d5d71
  9c4bf5237bac6d14ec33b673453cb0129f31a0b532240ac257d7813370c7addd3ec957a1
  034b8e4c539506c7827a82e37f5b2405236c914783c35a8aaeaacdea194d699dcfd6d040
  27cbfcac58e3157a16c20b11dfaf6256ae3037252baac3a25f3d1f7e3f14dd231fc50db2
  f8788575799e6be241717e9634456be9eb04989cdf312dddd8a24939ebb90de0f5b006d5
  9b2b19350dce76a415230f49374fa45ced3eed165cc92ed1d6e17c233f36030a61cb610b
  93a55d939c9c7e964f9086ccdb41b8638f14f9202cdb9f1e3ffac235ccda32a92a71e851
  88297cdba4a309e085c56826bb6121462ac6ee36beb9ee72c824294b6026c60d478f17dd
  082cca6d6d7a3e86dbe5f7fc9bbc2a07873c686e53f9040aa60dce89b179643741457f5d
  e371c8aaf41eceee8e1a1b324666572322499731242ee48134eb6dfb8961b06b5a04c586
  c6a9113a9c161f36806a284e03b01940286b2de59689607b2b64b46d6fc2ba044c9a42c5
  cb600cfd6ca0bdf4915a47fe02d71b8fcc27f0f17c78a300c6345ccc2f77a438772f4297
  f7b2160aec93e4c8c72c0dbe67868753c18491861a1c1b96eaae07023436602fbb6f2bfb
  161a5f778bb3086c2255423a8c51052833f6b63ed2cc732a7e2c4d36123471b451b64083
  0421fd4edc83a9527d91203aa7e41867e3a7dfd5610aa20646738754883935af2b09cb24
  d93a332c9671e6a00cc29a6346de406f5fb28fe84f0b0d3a43c98213bfc2eb2802f1ca07
  1c560a705edceb262c44c2fd2e9e5caf0bf9eafc6be84c8a00d4bfd57e2468254e4560aa
  6e8d62ff72c55c403ce5a8e8c87cb4d7f693344918138a8f1621107492d8c0a8c74ae773
  23f7e1fa84220da14a9ae978b207aa692e2ba13ee5ed924c75e472e1b77cc496519704ab
  87bde2ac15fdde0184d799288b60873b7f85a113b5b8d76a5237f26586ef2cb5cb940c9c
  5a4789267575ed223fdb9d7ed57a390076857d3c0207360a3d039e4f7961dfe25d8e7c03
  4df6ec0503b5589a89911e54d4831b5cc9ed0abc66143b5482d35dec97ed94e65ba7d013
  126348960804ec2f19463b8daaa9927c05eecae3bb58b2575fcec762c14cd7d27f51e05a
  ec3ddf00e90dafcf91d31ac09eaad73d675504798170b703667d2175a37b40e4b7809056
  b1c1ca3062cdb98b0ba79b61c1c3f692b6e75940077ab7aea8649f38e34406282704f108
  0208a15c
ss     d482dd1a592f072109a0d8a86991ca6bd5bab25f13e788377fc34506f508ffdd

seed
  1368ec2967fc84ef2ae9aff268e0b1700affc6820b523a3d917135f2dff2ee06bfe72b31
  24721d4a26c04e53a75e30e73a7a9c4a95d91c55d495e9f51dd0b5e9d83c6d5e8ce803aa
  62b8d654db53d09b8dcff273cdfeb573fad8bcd45578bec2
sk
  f58497af7a5854c214be50bd9694011740619f4042d1a9b5e3d813bf419c9e70b6b6e339
  17644378d7a097047c1be007b9973f3ec7c2c1c7af23726160db834503bc5381625ab08e
  c831b60a04c54a360d2222ab0918358e84a038c41775456f7c6c1de0f27d5b538a9e8091
  1484cb96d17b52825410661cc43a576669a92cb7b97b97aa0e7b55a0589bc1295000a09b
  dfa5236a737a95a7029d2a5f4429494ee4b1299613fb76a573092915f6c37d472beea0b9
  3b082eb546b4ad268fc0fa9eedc8a19faab8a857ad09e24b042374ce9566e3b3ba33bc06
  441781f74421d00bcf0598103d9620fe0b35ab904c3676c3e970525c7507917850ff99ae
  4eb57eeaf4b0615097a1e970de6aa9ba609fe8ac11fdfa4e7c4cb90a30c03cb8baeb5033
  cb6ba6c755bdaca4c9448bcc24188991a659adfbc219b3ca16258f3c0b8791846cd9e8b1
  7ed33f97b1bfebeaa93628421a348596a72ed8a248219779cedb38f9fb0f064a4bf89a0c
  5dd485564c30ab16bc83d19fc9257467598ef713cff3a0470f4983db6540e52a7667fc27
  85c031e989601972b2ca61c97218c6470498679523c5957ccd0b4f30836429287d47204d
  8a32ad0c3c01c38611537a417e28284d58b1dc415f8cc6025ba1603073206e9372bcd125
  d94311eb2966fa9ac48ea68fb889c292585901796118949545a77ad8129d3c989f0f0449
  77d35ce9b715695b61e46aaf74fb9b753a489842592514c2c41b1e3a22621a5369ff4a19
  6702b2805cba6f945209a22613ec254937bc65fb40371b26f808cac5fa66437603fe175f
  4f039ebef88e2e3757692718229a7167780f032666e9f35a1f316c278270891057390a1b
  552b9b53e92ce6325b12a8475768a5eaba388b5b4740a4b4867705c74caa54eb139d47b1
  6b845fd6c97a01138509aa3cb34232504a4609850f464b27d3a6c792a2a326f78ea75083
  7ffb36349405442bcb7914be2bd482f4686cebf96c38fa67db608953039eb5446a26968a
  a0f023499261bc29356547612a472d9dd135e8744649656995178ad2b38d80850b180b6e
  6c255a0aba7e8c656fe782a63f48bde8cc5899351e308a3d48e5322a7b8b48ec1c99395d
  9cc39d381146846567ed0143c6c1682cd06faa64467a00919c53a374281b86e6744569c0
  eb1b099bea5b5c8a9e8024498ad70fc2cab20bd67a72073901a3bae643619342aa01071c
  3992428dea1755d870cbb86315b2bea4a6753359216e939f7d1aaaf0903b82fba7228a4a
  15f0779de2a19056c4e0b066e98b2a99865df3825caca00a1313c2e8a66cb8165fbebbc7
  fefb9e2e0916f4d753bb354b1cdb0ec61840ae14a0b0a6b89419cbcd4c2cc9fa8df8da7b
  ef4a829e17b996461b499ca051b5989b17738b158057342454745051e7b01aa5a8971181
  c4d44e20f3950873aa1a436cf7255328dc73f312119395213ec852dcbc9d0634c722b259
  3e154746402a3d289b3abb14a8d70494b761c3f66242f06cc534a761c19cee82a41ea7a3
  08fb580a19762ea34f2f931cc3fca3a7484b0c0023ea2285dc1b04a46489ea5a673a5a4d
  5db5745b72704670487c1c1c61f06184d1be1fb8c770857cfb03c5c3575181cb7f54eb8b
  8c8b6a200a0ef6b66eec364c0015ceb802081800ab5bd1150ba20e5d2c6012d70fe700a5
  6c101752242397627c89156f667a28ffc32c56d20abe3834d2a05a0390c7f2a893d64127
  fb772ae12468a1f6260af39066ab7ecf694db179436c54a707092a87aa22a274691ee008
  3e7a98a6d2c633d6c0f13a1542b094e7505d8dd92063b3972dd036a2e68ca9d2af000da3
  28b27fb55178b3794d41755a4dd32abde2cf2d93a5c59605e372114bfbbbc44304536533
  d1aaad9d385f82278576840cb1f340c0d53db7b0c8cf3794d2f0ba99267ef5d01064c99f
  3aca71aaa2cbb85011c6687472e20419680441cb0c7bc70aaf1361797b1c2f5a5c60c100
  86d981299bbfc2c15d77f4077c40500938bbb2e52aef37c3d516148d5ac84e216e056861
  6ea476fde89685578f8df91281b648d1359bbd53768f27596f3b3845293d698b3a1ae278
  5e0190be513cf950234399a51487073671736a0c4479672595b2b07a7c3b1143a2fa46cf
  383a183e0880e580793e5892349600cd6c3adb903e078c31d7d50a90c573453778426757
  8d35a6982b61098190befc3185020d2c175df7b1acec91c3d5fc6f7cd298f878bd2ab814
  e7ca340ae21377f79a2f73cf219c7f9e85649d089356cc082f655d72e8035128b910b44c
  e7833abc11348305943b049a9d6b7df1f98af6c5bf9a6214f073ab28f1492748574881cd
  f160139e60307d32086515bb93c502e6c20106801c095380d82467b9d56b72f566830a74
  72aaaba8dbbd755c262704af12475febf3cb6268289bdaab09997b8c309dfb436927e734
  7dcbba3f772b85e753493417cb134c3604410399238da584d1c495c0793fc5e9583f8797
  e97c9d45e63c1fd42ee7c5aaf9cc901748c87438c91d6964fcab436c6c0b74b34c6a35aa
  f688ace32a869411ca57cc3bb0455d981a16b655984ad90bf7c3add506b6821248cc5221
  5da27310fb57738254c8730241e2281c3b18728a12c458b8af8c2c3b500bed5c749e9979
  b4c44f116aa971b043a8b77b62f7a2fc9621ae71763fb0a43758b40e09aae6f574f93266
  1372a7bc120331c34800ed2113203eeb180905d89a88a4cc48d8c3acf19f44ba00b8466e
  1ddc0fe1e3554ac059a9fa2b11807173f1190dea271119c087c605dc8b945fb069bfb159
  c464a28758c1822b2c1e5a8ba0779833c6937c9c02ca61285c67557dd958e00840fd1c59
  9095409dc6caf13360a8d5a1d864a903c429b3054ee83448a1f71beb70a93dccae8e69a0
  485b47df44202d931e2c99316a23a4e396b7c704b832a0b855106f29c20c3c447ad39176
  b77186cfb94b3e973d415636a0950284f50efa9248bb1643e793cc7a6c343395a8a245b6
  69b32821f2b80214481ca4416d9009dd3174c4cbb29da7386a7404b21a72ce5a295deb62
  712a3fb01c927b9b2e73d95aa65c3e92169c72662d7ccab10c8a369d50b90a74c41d590d
  bc4ac104a147855131b1da730116bc17e430599a8d64999d9450b237002fa1021237dbbf
  a096a95ea0542ca7937b7c1971b53ce82087d7e114e446b81265cfd540176cd069deb988
  6fa45bd2f3464e7cc908cac220e642fd3610f18aac2b594192bb7a72a64ffe156e77ac8f
  576a0511b9768798c79590d8d37f58628ef69837335bfa984cde027d87d45cf83e597b70
  5d3130d6210e9d974bab5643cdf4d1cc7c8282ffe68f827e0cac9926bfe72b3124721d4a
  26c04e53a75e30e73a7a9c4a95d91c55d495e9f51dd0b5e9d83c6d5e8ce803aa62b8d654
  db53d09b8dcff273cdfeb573fad8bcd45578bec241c2f9459a0447d7f7ae5f1e8dc1cf4e
  76cdd9add2eba7768b4ac7abb269b07e
pk
  8c8b6a200a0ef6b66eec364c0015ceb802081800ab5bd1150ba20e5d2c6012d70fe700a5
  6c101752242397627c89156f667a28ffc32c56d20abe3834d2a05a0390c7f2a893d64127
  fb772ae12468a1f6260af39066ab7ecf694db179436c54a707092a87aa22a274691ee008
  3e7a98a6d2c633d6c0f13a1542b094e7505d8dd92063b3972dd036a2e68ca9d2af000da3
  28b27fb55178b3794d41755a4dd32abde2cf2d93a5c59605e372114bfbbbc44304536533
  d1aaad9d385f82278576840cb1f340c0d53db7b0c8cf3794d2f0ba99267ef5d01064c99f
  3aca71aaa2cbb85011c6687472e20419680441cb0c7bc70aaf1361797b1c2f5a5c60c100
  86d981299bbfc2c15d77f4077c40500938bbb2e52aef37c3d516148d5ac84e216e056861
  6ea476fde89685578f8df91281b648d1359bbd53768f27596f3b3845293d698b3a1ae278
  5e0190be513cf950234399a51487073671736a0c4479672595b2b07a7c3b1143a2fa46cf
  383a183e0880e580793e5892349600cd6c3adb903e078c31d7d50a90c573453778426757
  8d35a6982b61098190befc3185020d2c175df7b1acec91c3d5fc6f7cd298f878bd2ab814
  e7ca340ae21377f79a2f73cf219c7f9e85649d089356cc082f655d72e8035128b910b44c
  e7833abc11348305943b049a9d6b7df1f98af6c5bf9a6214f073ab28f1492748574881cd
  f160139e60307d32086515bb93c502e6c20106801c095380d82467b9d56b72f566830a74
  72aaaba8dbbd755c262704af12475febf3cb6268289bdaab09997b8c309dfb436927e734
  7dcbba3f772b85e753493417cb134c3604410399238da584d1c495c0793fc5e9583f8797
  e97c9d45e63c1fd42ee7c5aaf9cc901748c87438c91d6964fcab436c6c0b74b34c6a35aa
  f688ace32a869411ca57cc3bb0455d981a16b655984ad90bf7c3add506b6821248cc5221
  5da27310fb57738254c8730241e2281c3b18728a12c458b8af8c2c3b500bed5c749e9979
  b4c44f116aa971b043a8b77b62f7a2fc9621ae71763fb0a43758b40e09aae6f574f93266
  1372a7bc120331c34800ed2113203eeb180905d89a88a4cc48d8c3acf19f44ba00b8466e
  1ddc0fe1e3554ac059a9fa2b11807173f1190dea271119c087c605dc8b945fb069bfb159
  c464a28758c1822b2c1e5a8ba0779833c6937c9c02ca61285c67557dd958e00840fd1c59
  9095409dc6caf13360a8d5a1d864a903c429b3054ee83448a1f71beb70a93dccae8e69a0
  485b47df44202d931e2c99316a23a4e396b7c704b832a0b855106f29c20c3c447ad39176
  b77186cfb94b3e973d415636a0950284f50efa9248bb1643e793cc7a6c343395a8a245b6
  69b32821f2b80214481ca4416d9009dd3174c4cbb29da7386a7404b21a72ce5a295deb62
  712a3fb01c927b9b2e73d95aa65c3e92169c72662d7ccab10c8a369d50b90a74c41d590d
  bc4ac104a147855131b1da730116bc17e430599a8d64999d9450b237002fa1021237dbbf
  a096a95ea0542ca7937b7c1971b53ce82087d7e114e446b81265cfd540176cd069deb988
  6fa45bd2f3464e7cc908cac220e642fd3610f18aac2b594192bb7a72a64ffe156e77ac8f
  576a0511b9768798c79590d8d37f58628ef69837335bfa984cde027d87d45cf841c2f945
  9a0447d7f7ae5f1e8dc1cf4e76cdd9add2eba7768b4ac7abb269b07e
eseed
  e770d01efde86e721a3f7c6cce275dabe6e2143f1af18da7efddc4c7b70b5e345db93cc9
  36bea323491ccb38a388f546a9ff00dd4e1300b9b2153d2041d205b4
ct
  137d93a41362f50229305c688633ded3c474cf399858d60e668ca77d04fd869168a235d5
  e177eed970cd8c4b8a8bcad3ba1bdf3cef0d697b2c1a1e9a4259cce54248d5f47b59e93f
  ca20799888ec7ee44efd7414bfc71a543648bea1edd9da0234a3af27dcfe4854792caae4
  6a3dcce1eb31cf4d5d8b85855fe1ba7dd94b188ffec719354d43c445960766e26f17561a
  5ec3872bfa9cfa370a00ac6bb9e196bb57a9f1fd0577d664077b81558565e50b0f2964c8
  e0093353618de2f2f6d5999c1d27279032f788cb3cf59c127e7c7e029787111226454355
  d06c81b2affbd099493c34704bb8f0759c4ce568cf721239014b1f00e808b5dc76ea4fe1
  20408c7e510e27832921b022000f9dabdac2e5bcb47060efd1a169e4eefa80ed6fbd1f94
  473c2038d742df4e286bbcb854281aa28c283f81d8d8c0324b5d354e8b6e2c5e28d5b39a
  88a790f926c7b5270630c5087990f7ce5afe2fc9e327ed33f760c8d3ea520d9c01960dd3
  60566647820c98c859052ea770c5efbed12b0e7536a409562e2fbb0cd6ce67011f6233c6
  23239f1ed44035963ca9470c439a7e588226307be4cf7a6e27766a28730843a6865c9a8d
  53f66e8ab121ff234fa3dd0cfc9736b40fb8bb3e64919ec4a5de20282928f60260c63a81
  439e0658339437b3f1735f38c9481d7edc344ef6dd34d93e0ee013a93cdc8a7207b9d796
  65bee8a768934c2b386f47d85891fd316aaa378af13c8892099075b75cc8d9ce0419ce57
  f0f55ea0aeea03fcce14e3a4c766ed09fe4577c6cb9372d00e95c86b41989d6e6ff2359a
  579b66f76a5a1bf41b2c1f53db1e8b49d822455ea4afe8198b5e7f039263e10885d38d3b
  fa0ee727cc4ff2769f9ed0abc08a3e77f8bc65a7a75b7b0fc74c2a9027e94f1757acaff4
  ee5e6e28c0b0238a5435712ea1c055d79e0558a2d149ecfb8d129e19c2d9aef804b3e49e
  6f60ab43c5254f81a9cccbb3bed13a67f436159b0cf5c7134d6d5a577bcea4f8648eb07b
  728b0864ec8751576c6fc302a76831d1672daaa2e17c5991efca743cf55d64ca59e8feed
  a59ec52099d7bfb00a3ccde4084825145f022d89a126519f7904eb7ec4db0b08e70d7d67
  bf18e537476b4ce97b2ad1c84c0630ba053a13affff42ecea695c080942df74369a23f93
  a1f397f14dce28acbedb6a90e7a0a6423c277254b71be2d887386915e5924e85f1c65218
  2f8c0db076364a97d7acaf0f238c912fd56403593a8b2526884737790a887d9a8382fab3
  d2967803d0a1e62b610289af4ea26c66ef29c4832a4b48ffa225d5be2401656753a9ed00
  c45a057efc666abaecfaeef972643de281f5d6a6ef43ed2fbba963a95c8d36461323d51d
  18f92e58e4de1b4edd1d93ba14ea6adc3b8b63e71d0edc92555f3f962e68fbf42a0fc04c
  b7da107203468589655f1b3b979ccc2efee6f10f0ec631c040e4436b8acaa4716708bf96
  d2db8108a36117d10664cb2a3e3af672a10b0de5c2a284e6b9de37533bd181bc14fa0490
  35d5050b5526ba59f893a1778103b6e2d946090c0eba049e5c1ad843a3121d539564866a
  f5647437
ss     1e037823ddbf1875756d86a3374b2d2347d5b7f3c84d229ecc5960523cdaa8b4

]]></artwork>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
    <section anchor="change-log">
      <name>Change log</name>
      <ul empty="true">
        <li>
          <t><strong>RFC Editor's Note:</strong> Please remove this section prior to publication of a
final version of this document.</t>
        </li>
      </ul>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-01">
        <name>Since draft-connolly-cfrg-xwing-kem-01</name>
        <ul spacing="normal">
          <li>
            <t>Add list of implementations.</t>
          </li>
          <li>
            <t>Miscellaneous editorial improvements.</t>
          </li>
          <li>
            <t>Add Python reference specification.</t>
          </li>
          <li>
            <t>Correct definition of <tt>ML-KEM-768.KeyGenDerand(seed)</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-00">
        <name>Since draft-connolly-cfrg-xwing-kem-00</name>
        <ul spacing="normal">
          <li>
            <t>A copy of the X25519 public key is now included in the X-Wing
decapsulation (private) key, so that decapsulation does not
require separate access to the X-Wing public key. See #2.</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAA8bA2YAA+y963Ycx5W2+b+uoppeXwugADAj8sy23E2RkqVP1qFFuS0v
mm1GRkSSZQJVUFWBFOVRr7mN+Tf/5j6+S5krmeeNzDoBoCT3YaZnLcrLYCEr
Mg479n73uyN2BE5PTyfr2fo83p/e+fb0D7P58/vT53Eel+789PJqeblYxemL
N91yFqZ8Xp9+d+Xm66uL6WcffX5n4rpuGV/dn37/mvcm3q3j88Xyzf3pbN4v
JpOw8HN3QcVh6fr1qV/M54vz8zenvl8+P02vnL6MF6eZnayuuovZajVbzNdv
Lnnh06+/+Xg6/dXUna8W9Gs2D/Ey8mO+vnMyvRPDbL1Yzty5fvn0wYf8s1jy
iZfuTOZXF11c3p8EOnN/ajNbnGb5qa0mNL+K89XV6v50vbyKE7qdT9wyuvub
V18vli+fLxdXlzx5uHxzuV5MP14sry7uTF7GN3wZ7k+mp0kK01EK+p0h6J+v
/vneN6OgJq/i/CpSeHp7bdPpMMo7X8dVdEv/YvpbldMXF252zheS0D/N4ro/
Wyyf67lK8fzFen25un/vnorp0exVPNsUu6cH94YK7/1jVJE/n89W6w9Umep4
Plu/uOqoJWxm4t5PTozeOUeKq/Vey9t3z4bqzmaLn67lp789e7G+OL8zmbir
9YvFUvKl0em0vzo/H1TnUZwtwzJOH47vp68ZrZvPfnBrFOb+9LGbh27x/YN/
Tt/FQYThClH75dVqfXV+dfFPz/X0zC8uJjeb+Cqu43L62L947bp4S/2ff/Xp
6eOvpn8//drRzlWY/n6O3Jer2frNfouXquaffJrpv6CimpNta7M5avfh2Udn
0z8gz7jsnJtf68aHbnX9y8N+PDyn8Z55j/vNdm71T377zTDE+WJ5wUuvkg5+
/fFDa0x7fzKRVe598enpo7OwnK08cj29/G59OmjvKT24mCHsxfM3m2KLq/kK
A1i/GKZPVktD3QyYWKnMx59+9RhTu586tnbL5xGd2ajM/NX55VW3OpujjGfP
F6/u6YOe3NNr97749PE3Z/p0Rg1nl6EfKhkg6T19IStmmj95cJpPH6+ZbYcp
Mm3Li6t1ks0psoth+olbvZjy9eSj79eghevO4+mXVzS1nn58NfcquXov1b5V
t/Tf6fjvOE1fpDrd+fTT+YpuXK3jdNFvG16phek30b8YRMS7n/8OMLx97H61
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
t/klurhXHvoCt9jTzfSwKu631dP/auUcGMPF1SotyLUjDJzdVNuxvz+nvDeJ
rZR3elN5b9HyQXmHteFhNe6vv9qsuaElv01O8Tph2FBz/fut/oW5pn81Sv69
7pP3NvWvL1uN6nz70x1mT452scKAogNo7VnE7vE1UrJHGibj0K7B/777v7/T
to1IhuBlqsGeKHzZTPH9nRZsXeE46cmXfitr+J0jhhqI9S4GSlVtoqHxk6rk
w/GoJcP+2q6KDYvYRcDjpD54/PDTT8epGfq+99IH0/0O3fnT2b07Q2t37v3r
n/g4NjaQoWut7QhR6W20ve3LWPpRXQ69W3LL/L7VGLcFg9sB87oHAh88VrE6
oNfbidg1FjGnJHdZFaO7fIkhG9MUe0bLMz25L73X43iL85HYd/Ydb7NvzdH1
IoMVAzSDRqRQ9hBo9iPjVAlf/5wepf7spmqIOfX9Hszwrp5tIAQRDhvGO+N+
q7yxBjFrvhvCzA3IfJUMBqhRrDN5ti/ka4hz65KzrH8PZDaUZbK3pQ0uPBs9
0qM9qP9PcD4Ho/xlvmdyaD0HvmdDhG/XuW3oiNZufc3froBxL6j9r1fBg3g3
7iL2/19p5bM4+Mq0Io6v3K4QHOrr7X7yP6i1QzrQIcoNDvTHnZbsCkQkJAKQ
lEPCkujWUo6safbmm2d6cl9NPx3oh4qupEe2yDbPvh2e6QmPmbedeqXHqJF4
wNNBSz4/1IDDXm0p0Q2NGujKtTn9Wb0Y5hohbVzSVor76SzX5/cQXgaGknRl
R2c2G1M3WMrbdGXH7unQ/qB/iSYMfuz3q5RCoBX6bUC5ouVVPxt3QtP2uPbv
0k5R73w8dFKKeJ89jjrmAJZs1Vd06BHqe/P5ZK/0ED3q8cD+99/Y/245UGel
uqwVOWwAa3Uycau9gG+1ywc7vSWI3eRabYNoReA0quBgL1Tac/77qr5favby
Yp//3E5ctysSlD6B6B5ym61wxxh6SBVBCntMbjPw21Rjsil/K7jsh0Qp2XDc
u5w+ozNpLfbmuMc9MYDGrafnUbmCqM7Cr7VCMJtPNslz06O0QzV4rfXSLd+o
vr00jDHzCq91mRRS2+u7tMTJtvYvVi8/kC3v2tgk6B1vEG6cj+vueVxMHWnX
OI17xa9Zw1h8xC8VP8guuTUx5b46vd0lXl1dXi6WiO8B5TY9SwFyerJpfKNh
KaVF7Xyx4fRf0Fd+yovqLYaeZvdgLZMA0G1ymUbLVOKBOctHzqANsnORhPdW
gzWfbPY3/rxdHX3lzq/SPtpa6VyTPfW5oShnu2qxO/jFv6vag6SOX+2yFx+O
2YLD9iDuI6U4im2nxIJzBSe7aRh3z2Z9CiZ2TwZxxZlS4Daxzmw12Xx5uEKw
fYuefJ6yGJbRz1YpDhprTvmew6fS2PTps49OsdKhoeFXJRReuDdS1pTeeD6s
fLvN5t4ipVUmKQ3LHZ9+8ej04cMHu+S+/cTeSbe4moddutdthffTETfu+bm7
PH346JNtucnBGu5G1dJJge2O7i0dGLcQ/fLKz1La27iZuEmoW42LNJOPr/4y
W7mXs9MvX7qLhVJ9lPEynsXhpU1+za6v9/fQabJNaPFuPmbbDCk1Ycw12MxZ
yt5OlaXd7G3ez0SJ2mlpepcHNtJj1fdyrryBsSrXpwwGcORVnAzb1Id5+fvO
OJn/fnboZpVqTOxPGXtJeXUs46biJru8vi+/jN9dweFX95bxuTbnlymBNb7G
zNYDIqqFO1v/+WlyXvjV5erOZHhnmRav/0WWlVY2v/nw0fToUtgYAcAhmZ3H
o3wn0y8OVkH1AJPeLpnq98uX29XVVP7ldmGWXwVU6ff5gt++jmMy2tD0/tiA
hf1k2/W/Y9zg1uQLp7lPZwanRxjq4wFDN8+OpxspnCgJZ7EMY1LomNDoY0Bd
VpODbZ5qTNrSRCWlf7v4HsVhHVGH0g7E+Ij3T7/8LD38Y5IEenGhrfiw9+wn
pCOSqE/pu70Dlcnotmc59uwkrfN/8+WjL5UF8YfkHMHTWRjsKixSSq4bYr/l
kFf0j5Ph/Efn/MukmQeR3UoV/XYxbH08efjp1w9/9/Roc0BoPPHIoO7tTtzd
87OlP7+HQz6/V9TmeHz149n5jFm59WW+WzxerNez83jv4vxlvGAkx2r466vV
enx/d0Jyubq1kuXV88W9g1Kp6WED//4uYB3Y5uJcu/LPTrPs2X4S5Hp7OGfI
i56uZxdxs/35GrwbjhUgps+V6TaPp8qNH1LANmnDYwzz+FRPftxzqJvIe1it
3nZos8O8O5Kx3OjEYaVS0K/erF8oEt8QI3dY5B8SgF3uju8Mqfs6lnB/suNG
I2qGeHm+eJNczulsNaYnCupebpITd4QRl6LzBMuruUQyUIck7bPLgbz+G0L5
w4Ovv/j0i9++rXc7XzH00+31NAnyDXUcriyA0gmXV0QBQ7LGNt38SgnYQ7Zf
0uixW5t8uWEIQyLMo8XFkPidvO7g+C7fpD3+frdEcqZ8gJT1eH5+ovonv6I6
4sHZ5eYxbw1bgkE1DlVMlLMuygbiu5WfzTa/a3/ufNZtv0+qvfnl+2S+k8NF
xG55586d7XGyzX9/Ort349m9f/3TtWe8eTZmTR917/1p/t7JtHvvveO9Z9Px
0UQZqHgsceCjXfvH0w8+mFab7zaDOXsRv9d5m+sFu/f2Vyvfm/ySfYPpdK/h
9FQ1tdW4LpviZ4XYSVCbfa3dLsLJ+AVO212sEkakRd6XN/cVVJ2eDlI++5YQ
nLh6/G2z7LONqtTq+6me9/WeAvDPh4+T6wvUKVJPgXoq9u04rrGiccbP4Lb5
n7VMvZ2jvWl+f/uQ6g5++3bvNxrY+01d0b/HZ2H2HJ07Op78otWzA4nHrcjx
0te+u3yZvkj+fJyN66tuG5leX3bTwtst627DEPamIN46BRr19UKS61hDkvdO
JxjvUVKUvZW2t6nFtcW3GzN3oAFpfU2TzteTn1pyOpCaXw9SEym6rt6DQBMj
GodyfaVqI6HrS1XT0QwO1qq2en5tsWozK9dXq6YHcmMw9CgtLH7+VnndNBj6
dyCmnxRn8gHJLQx1/I1+Ib30X+cXLhmcvXuXVmATAK+zxXTQ96qcTKSPwt/3
/vR91r6HGqRP2Xt3czNoAxE9PvSoWx0aPFEHz57Mnk5//etpc3eW3MkspQAq
mNUuyPH0f0wv9yt5nNJwjjbq1ElPdS8FT8YHT7Kn07+X7jSbB7lJT4yt95/8
b1tLHruz6+UQIMfpsvfKbJn+r/+rPEt9+PYIgLi6qcqDukL2rz2/2jxPX7yk
r9dGkZ5fbZ/zQnryvZGx8//8ZPoD//7Av6vXTtNwdTLlS35m6UM2VJ0c8U5y
TNTJ9NTo/8ebc+K0r5Xyo5fT3/xmiun9/dTs0FN1/+sHlNg+IhAfWkRwuypS
53J1Lqm7enjw3Q+pw3w39PqwgVT/9tGDVAPa8oPdPdPDowd3Hwzzvnn84VD0
dL/oh3p49OHdDw+LShGp5ZTvt88e6vVcLe069Gh4dnrwLLX+6HrrD1NLD6+3
xNsf6JX3KXD48Iifd/l4WP6HsfzpfvkfhvKG8j/k6ce1RmwSyAO++vBa+0nM
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
on5p/CvQKa0P7WvevXvNRk5DkdtKpAMatzx+f7pJJXwxHRMJ31Lq7TVskg5/
+MkaquLtNWwSdy+2k3yLIAaxo+hLmwR/oel8sRG5vS7zi1TyVpH/JNnZrSSt
bWp/+0BtX//vV2mDdy3NoPy2aFpM+SGd2z65XvTvdkW3GUTTb/bunJsOxzju
by7CHvMo9kukW6+W8XR3Xf/2Qo90hm41JiJJ8Wip7ltvO1fEpukbW4fKVFlR
llldZWVT5jHUeddkbd5Xse9808TOuCo637uKJ7bKfWdidPrrL02TZUXX5ibL
fd9lLsY+WFc1VcxM7wpXNrFxeZW33jXOxLxvXSzraPOya7xv6tzbPPhK4++a
YKvMVK3rne3r0nWtqaggtHXRmqbJy2DLWLkiL7Om7Oxk9ZK3bOHLNhhP3/NY
d3XR+do503nru9xZU3R0zMWuq/Iu8FpVFllT2NoXbdO5vC3y2nRdSqY0fWtd
3pVZ1TUmlIVrS1f7LIS+o0aEWZZ5qPrch9LR0a4OXdVlsTWuNEVbVE1v+qpx
krCtirrpKFpVdRYRpfMFLcbatRmCr8q2DLGl63xZGNu6xhjXFKbL2zIvXFP3
iLLu5FaNqWg32sy3rqyqru2avq99HWvbdE1nM9O0eZHlruhtaV1Z2jxr6sLb
kmG0dZMXPri8SJOV1Z0tfRcQLoWquuuZ59w2NssyU/fGd3XWlZX3ZVEhqcDU
tD50RWmy2vcmC51qUlq4abOCQeWlz7qW0nnWOpu3Wd42BgUqfZH1eZm7Mjax
sKbNy6rgTWNsFxgGc9P4DClTVep2RCMZU1EYl1U2MhG1b4KrnS0YeFva0FRd
2TNVqETO2650PnNMUlN0Rd4bq6qcCVnJwMuyagpnbIa0q6xDUBk61oQua5FX
WRZ1YESZ60t0v7UR/azyqjJlQI3REGljpyvpGs/EdzUzY9q+MnXjsizUXewL
NW3rwvnW2liWvjIud01TZM7ZsqHCgh7knZ+IiMUi7yrfVm2HAOqyyk1Ao5j2
ykSXRdvmbc+k1dE4YzLfuKLopNhF33UZOoMRdK1OHsVIh2JX2o7pw3y6nllo
u4x576wv6soaU3seYWYoHC07ZJjnXetqU9R5bU3psVXNYI3W9pUvbNtGab4P
Fa80stjSR8q6RrqVZdYCCI1hPosM5fJ0MPZlhuQbZ0VyEGvnsq5vZDum9W1W
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
JnmweekAAA==

-->

</rfc>
