<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-connolly-cfrg-xwing-kem-11" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="xwing">X-Wing: general-purpose hybrid post-quantum KEM</title>
    <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-xwing-kem-11"/>
    <author fullname="Deirdre Connolly">
      <organization>Selkie Cryptography</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="2026" month="September" day="23"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>post quantum</keyword>
    <keyword>kem</keyword>
    <keyword>PQ/T hybrid</keyword>
    <abstract>
      <?line 114?>

<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 120?>

<section anchor="intro">
      <name>Introduction</name>
      <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 these operations:</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>: returns a byte string of length <tt>n</tt> bytes produced by
a cryptographically-secure pseudorandom 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_internal(d, z)</tt>: Deterministic 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>.
It is the derandomized version of <tt>ML-KEM-768.KeyGen</tt>.
Note that <tt>ML-KEM-768.KeyGen_internal()</tt> returns the keys in reverse
order of <tt>GenerateKeyPair()</tt> defined below.
<tt>d</tt> and <tt>z</tt> are both 32 byte strings.</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>
              <t><tt>ML-KEM-768.Encaps(pk_M)</tt> <bcp14>MUST</bcp14> perform the encapsulation key check
of <xref target="MLKEM"/> §7.2 and raise an error if it fails.</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>
              <t><tt>ML-KEM-768.Decap(ct_M, sk_M)</tt> is NOT required  to perform the
decapsulation key check of <xref target="MLKEM"/> §7.3.</t>
            </li>
          </ul>
          <t>
To generate deterministic test vectors, we also use  </t>
          <ul spacing="normal">
            <li>
              <t><tt>ML-KEM-768.Encaps_internal(pk_M, m)</tt>: 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>. <tt>m</tt> is a 32 byte string.      </t>
              <t><tt>ML-KEM-768.Encaps_internal(pk_M)</tt> <bcp14>MUST</bcp14> perform the encapsulation key check
of <xref target="MLKEM"/> §7.2 and raise an error if it fails.</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 the u-coordinate of a point respectively, and returns
the 32 byte string representing the u-coordinate of their scalar multiplication.</t>
            </li>
            <li>
              <t><tt>X25519_BASE</tt>: the 32 byte string representing the standard base point
of Curve25519. In hexadecimal,
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>SHAKE256(message, outlen)</tt>: The extendable-output function (XOF)
with that name defined in Section 6.2 of <xref target="FIPS202"/>. Note that
outlen counts bits.</t>
            </li>
            <li>
              <t><tt>SHA3-256(message)</tt>: The hash with that name
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>32 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 expandDecapsulationKey(sk):
  expanded = SHAKE256(sk, 96*8) # expand sk to 96 bytes using SHAKE256
  (pk_M, sk_M) = ML-KEM-768.KeyGen_internal(expanded[0:32], expanded[32:64])
  sk_X = expanded[64:96]
  pk_X = X25519(sk_X, X25519_BASE)
  return (sk_M, sk_X, pk_M, pk_X)

def GenerateKeyPair():
  sk = random(32)
  (sk_M, sk_X, pk_M, pk_X) = expandDecapsulationKey(sk)
  return sk, concat(pk_M, pk_X)
]]></artwork>
        <t><tt>GenerateKeyPair()</tt> returns the 32 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(sk):
  sk_M, sk_X, pk_M, pk_X = expandDecapsulationKey(sk)
  return sk, concat(pk_M, pk_X)
]]></artwork>
          <t><tt>sk</tt> must be 32 bytes.</t>
          <t><tt>GenerateKeyPairDerand()</tt> returns the 32 byte secret encapsulation key
<tt>sk</tt> and the 1216 byte decapsulation key <tt>pk</tt>.</t>
          <t>Note <tt>GenerateKeyPair()</tt> is the same as <tt>GenerateKeyPairDerand(random(32))</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(
    ss_M,
    ss_X,
    ct_X,
    pk_X,
    XWingLabel
  ))
]]></artwork>
        <t>where XWingLabel is the following 6 byte ASCII string</t>
        <artwork><![CDATA[
XWingLabel = concat(
    "\./",
    "/^\",
)
]]></artwork>
        <t>In hexadecimal, 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>
        <t>Note that <tt>Encapsulate()</tt> may raise an error if the ML-KEM encapsulation
does not pass the check of <xref target="MLKEM"/> §7.2.</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>
          <t><tt>Encapsulate(pk)</tt> can be implemented as <tt>EncapsulateDerand(pk,random(64))</tt>.</t>
        </section>
      </section>
      <section anchor="decaps">
        <name>Decapsulation</name>
        <artwork><![CDATA[
def Decapsulate(ct, sk):
  (sk_M, sk_X, pk_M, pk_X) = expandDecapsulationKey(sk)
  ct_M = ct[0:1088]
  ct_X = ct[1088:1120]
  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 32 byte X-Wing decapsulation key resulting from <tt>GenerateKeyPair()</tt></t>
        <t><tt>Decapsulate()</tt> returns the 32 byte shared secret.</t>
        <section anchor="keeping-expanded-decapsulation-key-around">
          <name>Keeping expanded decapsulation key around</name>
          <t>For efficiency, an implementation <bcp14>MAY</bcp14> cache the result of <tt>expandDecapsulationKey</tt>.
This is useful in two cases:</t>
          <ol spacing="normal" type="1"><li>
              <t>If multiple ciphertexts for the same key are decapsulated.</t>
            </li>
            <li>
              <t>If a ciphertext is decapsulated for a key that has just been generated.
This happen on the client-side for TLS.</t>
            </li>
          </ol>
          <t>A typical API pattern to achieve this optimization is to have an
opaque decapsulation key object that hides the cached values.
For instance, such an API could have the following functions.</t>
          <ol spacing="normal" type="1"><li>
              <t><tt>GenerateKeyPair()</tt> returns an encapsulation key and an opaque
 object that contains the expanded decapsulation key.</t>
            </li>
            <li>
              <t><tt>Decapsulate(ct, esk)</tt> takes a ciphertext and an expanded decapsulation key.</t>
            </li>
            <li>
              <t><tt>PackDecapsulationKey(sk)</tt> takes an expanded decapsulation key,
 and returns the packed decapsulation key.</t>
            </li>
            <li>
              <t><tt>UnpackDecapsulationKey(sk)</tt> takes a packed decapsulation key, and returns
 the expanded decapsulation key. In the case of X-Wing this would
 be the same as a derandomized <tt>GenerateKeyPair()</tt>.</t>
            </li>
          </ol>
          <t>The expanded decapsulation key could cache even more computation,
such as the expanded matrix A in ML-KEM.</t>
          <t>Any such expanded decapsulation key <bcp14>MUST NOT</bcp14> be transmitted between
implementations, as this could break the security analysis of X-Wing.
In particular, the MAL-BIND-K-PK and MAL-BIND-K-CT binding
properties of X-Wing do not hold when transmitting the regular ML-KEM
decapsulation key.</t>
        </section>
      </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>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):
  # Extract 32-byte seed from variable-length ikm using SHAKE.
  sk = SHAKE256(ikm, 32*8)
  return GenerateKeyPairDerand(sk)
]]></artwork>
        <t>where the HPKE private key and public key are the X-Wing decapsulation
key and encapsulation key respectively.</t>
        <t><tt>Encap()</tt> is <tt>Encapsulate()</tt> from <xref target="encaps"/>, where an
ML-KEM encapsulation key check failure causes an HPKE <tt>EncapError</tt>.</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>
        <t>On ML-KEM encapsulation key check failure, the server <bcp14>MUST</bcp14>
abort with an illegal_parameter alert.</t>
      </section>
      <section anchor="use-in-x509-public-key-infrastructure">
        <name>Use in X.509 Public Key Infrastructure</name>
        <t>We use the OID 1.3.6.1.4.1.62253.25722 to identify X-Wing keys
as described below. In ASN.1 notation:</t>
        <artwork><![CDATA[
id-XWing OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
        dod(6) internet(1) private(4) enterprise(1) 62253 25722 }
]]></artwork>
        <section anchor="certificate">
          <name>Certificate</name>
          <t>In a X.509 certificate, the subjectPublicKeyInfo field
has the SubjectPublicKeyInfo type, which has the following ASN.1 syntax.</t>
          <artwork><![CDATA[
SubjectPublicKeyInfo  ::=  SEQUENCE  {
      algorithm         AlgorithmIdentifier,
      subjectPublicKey  BIT STRING
  }

AlgorithmIdentifier{ALGORITHM-TYPE, ALGORITHM-TYPE:AlgorithmSet} ::=
  SEQUENCE {
    algorithm   ALGORITHM-TYPE."&"id({AlgorithmSet}),
    parameters  ALGORITHM-TYPE.
                  "&"Params({AlgorithmSet}{@algorithm}) OPTIONAL
  }
]]></artwork>
          <t>An X-Wing encapsulation key <bcp14>MUST</bcp14> be encoded directly
using the ASN.1 type XWingPublicKey.</t>
          <artwork><![CDATA[
XWingPublicKey ::= OCTET STRING
]]></artwork>
          <t>The X-Wing encapsulation key is mapped to a subjectPublicKey (a
value of type BIT STRING) as follows: the most significant bit of
the OCTET STRING value becomes the most significant bit of the BIT
STRING value, and so on; the least significant bit of the OCTET
STRING becomes the least significant bit of the BIT STRING.</t>
          <t>The id-XWing identifier <bcp14>MUST</bcp14> be used as the algorithm field in
the SubjectPublicKeyInfo to identify an X-Wing encapsulation key.</t>
          <t>The contents of the parameters component <bcp14>MUST</bcp14> be absent.</t>
        </section>
        <section anchor="private-key">
          <name>Private key</name>
          <t>Below we replicate part of the definition of OneAsymmetricKey
from <xref target="RFC5958"/>.</t>
          <artwork><![CDATA[
OneAsymmetricKey ::= SEQUENCE {
  version                  Version,
  privateKeyAlgorithm      SEQUENCE {
  algorithm                PUBLIC-KEY.&id({PublicKeySet}),
  parameters               PUBLIC-KEY.&Params({PublicKeySet}
                             {@privateKeyAlgorithm.algorithm})
                                OPTIONAL}
  privateKey               OCTET STRING (CONTAINING
                             PUBLIC-KEY.&PrivateKey({PublicKeySet}
                               {@privateKeyAlgorithm.algorithm})),
  attributes           [0] Attributes OPTIONAL,
  ...,
  [[2: publicKey       [1] BIT STRING (CONTAINING
                             PUBLIC-KEY.&Params({PublicKeySet}
                               {@privateKeyAlgorithm.algorithm})
                               OPTIONAL,
  ...
}
]]></artwork>
          <t>When storing an X-Wing decapsulation key in a OneAsymmetricKey,
the privateKey OCTET STRING contains the raw octet string encoding
the X-Wing decapsulation key.</t>
          <t>The id-XWing identifier <bcp14>MUST</bcp14> be used as the algorithm field in
the OneAsymmetricKey to identify an X-Wing decapsulation key.</t>
          <t>The publicKey component <bcp14>MUST</bcp14> be absent.</t>
        </section>
      </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, 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 anchor="binding-properties">
        <name>Binding properties</name>
        <t>Some protocols rely on further properties of the KEM.
X-Wing satisfies the binding properties MAL-BIND-K-PK and MAL-BIND-K-CT
(TODO: reference to proof).
This implies <xref target="KSMW"/> X-Wing also satisfies</t>
        <ul spacing="normal">
          <li>
            <t>MAL-BIND-K,CT-PK</t>
          </li>
          <li>
            <t>MAL-BIND-K,PK-CT</t>
          </li>
          <li>
            <t>LEAK-BIND-K-PK</t>
          </li>
          <li>
            <t>LEAK-BIND-K-CT</t>
          </li>
          <li>
            <t>LEAK-BIND-K,CT-PK</t>
          </li>
          <li>
            <t>LEAK-BIND-K,PK-CT</t>
          </li>
          <li>
            <t>HON-BIND-K-PK</t>
          </li>
          <li>
            <t>HON-BIND-K-CT</t>
          </li>
          <li>
            <t>HON-BIND-K,CT-PK</t>
          </li>
          <li>
            <t>HON-BIND-K,PK-CT</t>
          </li>
        </ul>
        <t>In contrast, ML-KEM on its own does not achieve
MAL-BIND-K-PK, MAL-BIND-K-CT, nor MAL-BIND-K,PK-CT. <xref target="SCHMIEG"/></t>
      </section>
    </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>25722 = 25519 + 203 = 0x647a (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>32</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>25722 = 25519 + 203 = 0x647a (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>N</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>
      <t>Finally, for the ASN.1 module in {asn1}, IANA is requested to assign
an object identifier (OID) for the module identifier (TBD) with a
Description of "id-mod-XWing-kem-2024".</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="X680" target="https://www.itu.int/rec/T-REC-X.680">
          <front>
            <title>Information Technology -- Abstract Syntax Notation One (ASN.1): Specification of basic notation</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="ITU-T Recommendation" value="X.680"/>
          <seriesInfo name="ISO/IEC" value="8824-1:2021"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5958">
          <front>
            <title>Asymmetric Key Packages</title>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>This document defines the syntax for private-key information and a content type for it. Private-key information includes a private key for a specified public-key algorithm and a set of attributes. The Cryptographic Message Syntax (CMS), as defined in RFC 5652, can be used to digitally sign, digest, authenticate, or encrypt the asymmetric key format content type. This document obsoletes RFC 5208. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5958"/>
          <seriesInfo name="DOI" value="10.17487/RFC5958"/>
        </reference>
      </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="Flo 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://nvlpubs.nist.gov/nistpubs/fips/nist.fips.203.pdf">
          <front>
            <title>FIPS 203: 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="14" month="May" year="2024"/>
            <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-03"/>
        </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="21" month="July" year="2025"/>
            <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 and adds a
   "Comment" column to all active registries that do not already have a
   "Comment" column.  Finally, it updates the registration request
   instructions.

   This document updates RFC 8447.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tls-rfc8447bis-15"/>
        </reference>
        <reference anchor="SCHMIEG" target="https://eprint.iacr.org/2024/523">
          <front>
            <title>Unbindable Kemmy Schmidt: ML-KEM is neither MAL-BIND-K-CT nor MAL-BIND-K-PK</title>
            <author initials="S." surname="Schmieg">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="KSMW" target="https://eprint.iacr.org/2024/1233">
          <front>
            <title>Binding Security of Implicitly-Rejecting KEMs and Application to BIKE and HQC</title>
            <author initials="J." surname="Kraemer">
              <organization/>
            </author>
            <author initials="P." surname="Struck">
              <organization/>
            </author>
            <author initials="M." surname="Weishaupl">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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 712?>

<section anchor="implementations">
      <name>Implementations</name>
      <ul spacing="normal">
        <li>
          <t>Platform  </t>
          <ul spacing="normal">
            <li>
              <t>Apple <eref target="https://developer.apple.com/documentation/cryptokit/xwingmlkem768x25519">CryptoKit</eref></t>
            </li>
          </ul>
        </li>
        <li>
          <t>C  </t>
          <ul spacing="normal">
            <li>
              <t>Google's <eref target="https://github.com/google/boringssl/blob/main/include/openssl/xwing.h">BoringSSL</eref></t>
            </li>
          </ul>
        </li>
        <li>
          <t>Go  </t>
          <ul spacing="normal">
            <li>
              <t>Cloudflare's <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>
            <li>
              <t><eref target="https://github.com/RustCrypto/KEMs/tree/master/x-wing">RustCrypto x-wing</eref></t>
            </li>
            <li>
              <t><eref target="https://github.com/orion-rs/orion">Orion</eref></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 expandDecapsulationKey(seed):
    expanded = hashlib.shake_256(seed).digest(length=96)
    pkM, skM = mlkem.KeyGen(expanded[0:64], mlkem.params768)
    skX = expanded[64:96]
    pkX = x25519.X(skX, x25519.BASE)
    return skM, skX, pkM, pkX

def GenerateKeyPairDerand(seed):
    assert len(seed) == 32
    skM, skX, pkM, pkX = expandDecapsulationKey(seed)
    return seed, pkM + pkX

def Combiner(ssM, ssX, ctX, pkX):
    return hashlib.sha3_256(
        ssM +
        ssX +
        ctX +
        pkX +
        XWingLabel
    ).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) == 32
    ctM = ct[0:1088]
    ctX = ct[1088:1120]
    skM, skX, pkM, pkX = expandDecapsulationKey(sk)
    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[
draft-schwabe-cfrg-kyber/kyber.py
]]></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     7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26
sk     7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26
pk
  e2236b35a8c24b39b10aa1323a96a919a2ced88400633a7b07131713fc14b2b5b19cfc3d
  a5fa1a92c49f25513e0fd30d6b1611c9ab9635d7086727a4b7d21d34244e66969cf15b3b
  2a785329f61b096b277ea037383479a6b556de7231fe4b7fa9c9ac24c0699a0018a52534
  01bacfa905ca816573e56a2d2e067e9b7287533ba13a937dedb31fa44baced4076992361
  0034ae31e619a170245199b3c5c39864859fe1b4c9717a07c30495bdfb98a0a002ccf56c
  1286cef5041dede3c44cf16bf562c7448518026b3d8b9940680abd38a1575fd27b58da06
  3bfac32c39c30869374c05c1aeb1898b6b303cc68be455346ee0af699636224a148ca2ae
  a10463111c709f69b69c70ce8538746698c4c60a9aef0030c7924ceec42a5d36816f545e
  ae13293460b3acb37ea0e13d70e4aa78686da398a8397c08eaf96882113fe4f7bad4da40
  b0501e1c753efe73053c87014e8661c33099afe8bede414a5b1aa27d8392b3e131e9a70c
  1055878240cad0f40d5fe3cdf85236ead97e2a97448363b2808caafd516cd25052c5c362
  543c2517e4acd0e60ec07163009b6425fc32277acee71c24bab53ed9f29e74c66a0a3564
  955998d76b96a9a8b50d1635a4d7a67eb42df5644d330457293a8042f53cc7a69288f17e
  d55827e82b28e82665a86a14fbd96645eca8172c044f83bc0d8c0b4c8626985631ca87af
  829068f1358963cb333664ca482763ba3b3bb208577f9ba6ac62c25f76592743b64be519
  317714cb4102cb7b2f9a25b2b4f0615de31decd9ca55026d6da0b65111b16fe52feed8a4
  87e144462a6dba93728f500b6ffc49e515569ef25fed17aff520507368253525860f58be
  3be61c964604a6ac814e6935596402a520a4670b3d284318866593d15a4bb01c35e3e587
  ee0c67d2880d6f2407fb7a70712b838deb96c5d7bf2b44bcf6038ccbe33fbcf51a54a584
  fe90083c91c7a6d43d4fb15f48c60c2fd66e0a8aad4ad64e5c42bb8877c0ebec2b5e387c
  8a988fdc23beb9e16c8757781e0a1499c61e138c21f216c29d076979871caa6942bafc09
  0544bee99b54b16cb9a9a364d6246d9f42cce53c66b59c45c8f9ae9299a75d15180c3c95
  2151a91b7a10772429dc4cbae6fcc622fa8018c63439f890630b9928db6bb7f9438ae406
  5ed34d73d486f3f52f90f0807dc88dfdd8c728e954f1ac35c06c000ce41a0582580e3bb5
  7b672972890ac5e7988e7850657116f1b57d0809aaedec0bede1ae148148311c6f7e3173
  46e5189fb8cd635b986f8c0bdd27641c584b778b3a911a80be1c9692ab8e1bbb12839573
  cce19df183b45835bbb55052f9fc66a1678ef2a36dea78411e6c8d60501b4e60592d1369
  8a943b509185db912e2ea10be06171236b327c71716094c964a68b03377f513a05bcd99c
  1f346583bb052977a10a12adfc758034e5617da4c1276585e5774e1f3b9978b09d0e9c44
  d3bc86151c43aad185712717340223ac381d21150a04294e97bb13bbda21b5a182b6da96
  9e19a7fd072737fa8e880a53c2428e3d049b7d2197405296ddb361912a7bcf4827ced611
  d0c7a7da104dde4322095339f64a61d5bb108ff0bf4d780cae509fb22c256914193ff734
  9042581237d522828824ee3bdfd07fb03f1f942d2ea179fe722f06cc03de5b69859edb06
  eff389b27dce59844570216223593d4ba32d9abac8cd049040ef6534
eseed
  3cb1eea988004b93103cfb0aeefd2a686e01fa4a58e8a3639ca8a1e3f9ae57e235b8cc87
  3c23dc62b8d260169afa2f75ab916a58d974918835d25e6a435085b2
ct
  b83aa828d4d62b9a83ceffe1d3d3bb1ef31264643c070c5798927e41fb07914a273f8f96
  e7826cd5375a283d7da885304c5de0516a0f0654243dc5b97f8bfeb831f68251219aabdd
  723bc6512041acbaef8af44265524942b902e68ffd23221cda70b1b55d776a92d1143ea3
  a0c475f63ee6890157c7116dae3f62bf72f60acd2bb8cc31ce2ba0de364f52b8ed38c79d
  719715963a5dd3842d8e8b43ab704e4759b5327bf027c63c8fa857c4908d5a8a7b88ac7f
  2be394d93c3706ddd4e698cc6ce370101f4d0213254238b4a2e8821b6e414a1cf20f6c12
  44b699046f5a01caa0a1a55516300b40d2048c77cc73afba79afeea9d2c0118bdf2adb88
  70dc328c5516cc45b1a2058141039e2c90a110a9e16b318dfb53bd49a126d6b73f215787
  517b8917cc01cabd107d06859854ee8b4f9861c226d3764c87339ab16c3667d2f49384e5
  5456dd40414b70a6af841585f4c90c68725d57704ee8ee7ce6e2f9be582dbee985e038ff
  c346ebfb4e22158b6c84374a9ab4a44e1f91de5aac5197f89bc5e5442f51f9a5937b102b
  a3beaebf6e1c58380a4a5fedce4a4e5026f88f528f59ffd2db41752b3a3d90efabe46389
  9b7d40870c530c8841e8712b733668ed033adbfafb2d49d37a44d4064e5863eb0af0a08d
  47b3cc888373bc05f7a33b841bc2587c57eb69554e8a3767b7506917b6b70498727f16ea
  c1a36ec8d8cfaf751549f2277db277e8a55a9a5106b23a0206b4721fa9b3048552c5bd5b
  594d6e247f38c18c591aea7f56249c72ce7b117afcc3a8621582f9cf71787e183dee0936
  7976e98409ad9217a497df888042384d7707a6b78f5f7fb8409e3b535175373461b77600
  2d799cbad62860be70573ecbe13b246e0da7e93a52168e0fb6a9756b895ef7f0147a0dc8
  1bfa644b088a9228160c0f9acf1379a2941cd28c06ebc80e44e17aa2f8177010afd78a97
  ce0868d1629ebb294c5151812c583daeb88685220f4da9118112e07041fcc24d5564a99f
  dbde28869fe0722387d7a9a4d16e1cc8555917e09944aa5ebaaaec2cf62693afad42a3f5
  18fce67d273cc6c9fb5472b380e8573ec7de06a3ba2fd5f931d725b493026cb0acbd3fe6
  2d00e4c790d965d7a03a3c0b4222ba8c2a9a16e2ac658f572ae0e746eafc4feba023576f
  08942278a041fb82a70a595d5bacbf297ce2029898a71e5c3b0d1c6228b485b1ade509b3
  5fbca7eca97b2132e7cb6bc465375146b7dceac969308ac0c2ac89e7863eb8943015b243
  14cafb9c7c0e85fe543d56658c213632599efabfc1ec49dd8c88547bb2cc40c9d38cbd30
  99b4547840560531d0188cd1e9c23a0ebee0a03d5577d66b1d2bcb4baaf21cc7fef1e038
  06ca96299df0dfbc56e1b2b43e4fc20c37f834c4af62127e7dae86c3c25a2f696ac8b589
  dec71d595bfbe94b5ed4bc07d800b330796fda89edb77be0294136139354eb8cd3759157
  8f9c600dd9be8ec6219fdd507adf3397ed4d68707b8d13b24ce4cd8fb22851bfe9d63240
  7f31ed6f7cb1600de56f17576740ce2a32fc5145030145cfb97e63e0e41d354274a079d3
  e6fb2e15
ss     d2df0522128f09dd8e2c92b1e905c793d8f57a54c3da25861f10bf4ca613e384

seed     badfd6dfaac359a5efbb7bcc4b59d538df9a04302e10c8bc1cbf1a0b3a5120ea
sk     badfd6dfaac359a5efbb7bcc4b59d538df9a04302e10c8bc1cbf1a0b3a5120ea
pk
  0333285fa253661508c9fb444852caa4061636cb060e69943b431400134ae1fbc0228724
  7cb38068bbb89e6714af10a3fcda6613acc4b5e4b0d6eb960c302a0253b1f507b596f088
  4d351da89b01c35543214c8e542390b2bc497967961ef10286879c34316e6483b644fc27
  e8019d73024ba1d1cc83650bb068a5431b33d1221b3d122dc1239010a55cb13782140893
  f30aca7c09380255a0c621602ffbb6a9db064c1406d12723ab3bbe2950a21fe521b160b3
  0b16724cc359754b4c88342651333ea9412d5137791cf75558ebc5c54c520dd6c622a059
  f6b332ccebb9f24103e59a297cd69e4a48a3bfe53a5958559e840db5c023f66c10ce2308
  1c2c8261d744799ba078285cfa71ac51f44708d0a6212c3993340724b3ac38f63e82a889
  a4fc581f6b8353cc6233ac8f5394b6cca292f892360570a3031c90c4da3f02a895677390
  e60c24684a405f69ccf1a7b95312a47c844a4f9c2c4a37696dc10072a87bf41a2717d45b
  2a99ce09a4898d5a3f6b67085f9a626646bcf369982d483972b9cd7d244c4f49970f766a
  22507925eca7df99a491d80c27723e84c7b49b633a46b46785a16a41e02c538251622117
  364615d9c2cdaa1687a860c18bfc9ce8690efb2a524cb97cdfd1a4ea661fa7d08817998a
  f838679b07c9db8455e2167a67c14d6a347522e89e8971270bec858364b1c1023b82c483
  cf8a8b76f040fe41c24dec2d49f6376170660605b80383391c4abad1136d874a77ef73b4
  40758b6e7059add20873192e6e372e069c22c5425188e5c240cb3a6e29197ad17e87ec41
  a813af68531f262a6db25bbdb8a15d2ed9c9f35b9f2063890bd26ef09426f225aa1e6008
  d31600a29bcdf3b10d0bc72788d35e25f4976b3ca6ac7cbf0b442ae399b225d9714d0638
  a864bda7018d3b7c793bd2ace6ac68f4284d10977cc029cf203c5698f15a06b162d6c8b4
  fd40c6af40824f9c6101bb94e9327869ab7efd835dfc805367160d6c8571e3643ac70cba
  d5b96a1ad99352793f5af71705f95126cb4787392e94d808491a2245064ba5a7a30c0663
  01392a6c315336e10dbc9c2177c7af382765b6c88eeab51588d01d6a95747f3652dc5b5c
  401a23863c7a0343737c737c99287a40a90896d4594730b552b910d23244684206f0eb84
  2fb9aa316ab182282a75fb72b6806cea4774b822169c386a58773c3edc8229d85905abb8
  7ac228f0f7a2ce9a497bb5325e17a6a82777a997c036c3b862d29c14682ad325a9600872
  f3913029a1588648ba590a7157809ff740b5138380015c40e9fb90f0311107946f28e596
  2e21666ad65092a3a60480cd16e61ff7fb5b44b70cf12201878428ef8067fceb1e1dcb49
  d66c773d312c7e53238cb620e126187009472d41036b702032411dc96cb750631df9d994
  52e495deb4300df660c8d35f32b424e98c7ed14b12d8ab11a289ac63c50a24d52925950e
  49ba6bf4c2c38953c92d60b6cd034e575c711ac41bfa66951f62b9392828d7b45aed377a
  c69c35f1c6b80f388f34e0bb9ce8167eb2bc630382825c396a407e905108081b444ac8a0
  7c2507376a750d18248ee0a81c4318d9a38fc44c3b41e8681f87c34138442659512c4127
  6e1cc8fc4eb66e12727bcb5a9e0e405cdea21538d6ea885ab169050e6b91e1b69f7ed34b
  cbb48fd4c562a576549f85b528c953926d96ea8a160b8843f1c89c62
eseed
  17cda7cfad765f5623474d368ccca8af0007cd9f5e4c849f167a580b14aabdefaee7eef4
  7cb0fca9767be1fda69419dfb927e9df07348b196691abaeb580b32d
ct
  c93beb22326705699bbc3d1d0aa6339be7a405debe61a7c337e1a91453c097a6f77c1306
  39d1aaeb193175f1a987aa1fd789a63c9cd487ebd6965f5d8389c8d7c8cfacbba4b44d2f
  be0ae84de9e96fb11215d9b76acd51887b752329c1a3e0468ccc49392c1e0f1aad61a73c
  10831e60a9798cb2e7ec07596b5803db3e243ecbb94166feade0c9197378700f8eb65a43
  502bbac4605992e2de2b906ab30ba401d7e1ff3c98f42cfc4b30b974d3316f331461ac05
  f43e0db7b41d3da702a4f567b6ee7295199c7be92f6b4a47e7307d34278e03c872fb4864
  7c446a64a3937dccd7c6d8de4d34b9dea45a0b065ef15b9e94d1b6df6dca7174d9bc9d14
  c6225e3a78a58785c3fe4e2fe6a0706f3365389e4258fbb61ecf1a1957715982b3f18444
  24e03acd83da7eee50573f6cd3ff396841e9a00ad679da92274129da277833d0524674fe
  ea09a98d25b888616f338412d8e65e151e65736c8c6fb448c9260fa20e7b2712148bcd3a
  0853865f50c1fc9e4f201aee3757120e034fd509d954b7a749ff776561382c4cb64cebcb
  b6aa82d04cd5c2b40395ecaf231bde8334ecfd955d09efa8c6e7935b1cb0298fb8b6740b
  e4593360eed5f129d59d98822a6cea37c57674e919e84d6b90f695fca58e7d29092bd70f
  7c97c6dfb021b9f87216a6271d8b144a364d03b6bf084f972dc59800b14a2c008bbd0992
  b5b82801020978f2bdddb3ca3367d876cffb3548dab695a29882cae2eb5ba7c847c3c71b
  d0150fa9c33aac8e6240e0c269b8e295ddb7b77e9c17bd310be65e28c0802136d086777b
  e5652d6f1ac879d3263e9c712d1af736eac048fe848a577d6afaea1428dc71db8c430edd
  7b584ae6e6aeaf7257aff0fd8fe25c30840e30ccfa1d95118ef0f6657367e9070f3d97a2
  e9a7bae19957bd707b00e31b6b0ebb9d7df4bd22e44c060830a194b5b8288353255b5295
  4ff5905ab2b126d9aa049e44599368c27d6cb033eae5182c2e1504ee4e3745f51488997b
  8f958f0209064f6f44a7e4de5226d5594d1ad9b42ac59a2d100a2f190df873a2e141552f
  33c923b4c927e8747c6f830c441a8bd3c5b371f6b3ab8103ebcfb18543aefc1beb6f776b
  bfd5344779f4aa23daaf395f69ec31dc046b491f0e5cc9c651dfc306bd8f2105be7bc7a4
  f4e21957f87278c771528a8740a92e2daefa76a3525f1fae17ec4362a2700988001d8600
  11d6ca3a95f79a0205bcf634cef373a8ea273ff0f4250eb8617d0fb92102a6aa09cf0c3e
  e2cad1ad96438c8e4dfd6ee0fcc85833c3103dd6c1600cd305bc2df4cda89b55ca237a3f
  9c3f82390074ff30825fc750130ebaf13d0cf7556d2c52a98a4bad39ca5d44aaadeaef77
  5c695e64d06e966acfcd552a14e2df6c63ae541f0fa88fc48263089685704506a21a0385
  6ce65d4f06d54f3157eeabd62491cb4ac7bf029e79f9fbd4c77e2a3588790c710e611da8
  b2040c76a61507a8020758dcc30894ad018fef98e401cc54106e20d94bd544a8f0e1fd05
  00342d123f618aa8c91bdf6e0e03200693c9651e469aee6f91c98bea4127ae66312f4ae3
  ea155b67
ss     f2e86241c64d60f6649fbc6c5b7d17180b780a3f34355e64a85749949c45f150

seed     ef58538b8d23f87732ea63b02b4fa0f4873360e2841928cd60dd4cee8cc0d4c9
sk     ef58538b8d23f87732ea63b02b4fa0f4873360e2841928cd60dd4cee8cc0d4c9
pk
  36244278824f77c621c660892c1c3886a9560caa52a97c461fd3958a598e749bbc8c7798
  ac8870bac7318ac2b863000ca3b0bdcbbc1ccfcb1a30875df9a76976763247083e646ccb
  2499a4e4f0c9f4125378ba3da1999538b86f99f2328332c177d1192b849413e655101289
  73f679d23253850bb6c347ba7ca81b5e6ac4c574565c731740b3cd8c9756caac39fba7ac
  422acc60c6c1a645b94e3b6d21485ebad9c4fe5bb4ea0853670c5246652bff65ce8381cb
  473c40c1a0cd06b54dcec11872b351397c0eaf995bebdb6573000cbe2496600ba76c8cb0
  23ec260f0571e3ec12a9c82d9db3c57b3a99e8701f78db4fabc1cc58b1bae02745073a81
  fc8045439ba3b885581a283a1ba64e103610aabb4ddfe9959e7241011b2638b56ba6a982
  ef610c514a57212555db9a98fb6bcf0e91660ec15dfa66a67408596e9ccb97489a09a073
  ffd1a0a7ebbe71aa5ff793cb91964160703b4b6c9c5390842c2c905d4a9f88111fed5787
  4ba9b03cf611e70486edf539767c7485189d5f1b08e32a274dc24a39c918fd2a4dfa946a
  8c897486f2c974031b2804aabc81749db430b85311372a3b8478868200b40e043f7bf4a1
  c3a08b0771b431e342ee277410bca034a0c77086c8f702b3aed2b4108bbd3af471633373
  a1ac74b128b148d1b9412aa66948cac6dc6614681fda02ca86675d2a756003c49c50f06e
  13c63ce4bc9f321c860b202ee931834930011f485c9af86b9f642f0c353ad305c66996b9
  a136b753973929495f0d8048db75529edcb4935904797ac66605490f66329c3bb36b8573
  a3e00f817b3082162ff106674d11b261baae0506cde7e69fdce93c6c7b59b9d4c759758a
  cf287c2e4c4bfab5170a9236daf21bdb6005e92464ee8863f845cf37978ef19969264a51
  6fe992c93b5f7ae7cb6718ac69257d630379e4aac6029cb906f98d91c92d118c36a6d161
  15d4c8f16066078badd161a65ba51e0252bc358c67cd2c4beab2537e42956e08a39cfccf
  0cd875b5499ee952c83a162c68084f6d35cf92f71ec66baec74ab87e2243160b64df54af
  b5a07f78ec0f5c5759e5a4322bca2643425748a1a97c62108510c44fd9089c5a7c14e57b
  1b77532800013027cff91922d7c935b4202bb507aa47598a6a5a030117210d4c49c17470
  0550ad6f82ad40e965598b86bc575448eb19d70380d465c1f870824c026d74a2522a799b
  7b122d06c83aa64c0974635897261433914fdfb14106c230425a83dc8467ad8234f086c7
  2a47418be9cfb582b1dcfa3d9aa45299b79fff265356d8286a1ca2f3c2184b2a70d15289
  e5b202d03b64c735a867b1154c55533ff61d6c296277011848143bc85a4b823040ae025a
  29293ab77747d85310078682e0ba0ac236548d905a79494324574d417c7a3457bd5fb525
  3c4876679034ae844d0d05010fec722db5621e3a67a2d58e2ff33b432269169b51f9dcc0
  95b8406dc1864cf0aeb6a2132661a38d641877594b3c51892b9364d25c63d637140a2018
  d10931b0daa5a2f2a405017688c991e586b522f94b1132bc7e87a63246475816c8be9c62
  b731691ab912eb656ce2619225663364701a014b7d0337212caa2ecc731f34438289e0ca
  4590a276802d980056b5d0d316cae2ecfea6d86696a9f161aa90ad47eaad8cadd31ae3cb
  c1c013747dfee80fb35b5299f555dcc2b787ea4f6f16ffdf66952461
eseed
  22a96188d032675c8ac850933c7aff1533b94c834adbb69c6115bad4692d8619f90b0cdf
  8a7b9c264029ac185b70b83f2801f2f4b3f70c593ea3aeeb613a7f1b
ct
  0d2e38cbf17a2e2e4e0c87a94ca1e7701ae1552e02509b3b00f9c82c39e3fd435b05b912
  75f47abc9f1021429a26a346598cd6cd9efdc8adc1dbc35036d0290bf89733c835309202
  232f9bf652ea82f3d49280d6e8a3bd3135fb883445ab5b074d949c5350c7c7d6ac59905b
  dbfce6639da8a9d4b390ecc1dd05522d2956f2d37a05593996e5cb3fd8d5a9eb52417732
  e1ebf545588713b4760227115aab7ada178dadbca583b26cfedba2888a0c95b950bf07f7
  50d7aa8103798aa3470a042c0105c6a037de2f9ebc396021b2ba2c16aba696fbac3454dc
  8e053b8fa55edd45215eeb57a1eab9106fb426b375a9b9e5c3419efc7610977e72640f9f
  d1b2ec337de33c35e5a7581b2aae4d8ee86d2e0ebf82a1350714de50d2d788687878a196
  44ae4e3175e8d59dc90171b3badeff65aeaf600e5e5483a3595fdeb40cbafcbd040c29a2
  f6900533ae999d24f54dfcef748c30313ca447cdddfa57ad78eaa890e90f3f7bf8d11696
  8a5713cc75fd0408f36364fa265c5617039304eaeac4cbee6fc49b9fe2276768cdbec2d7
  3a507b543cc028dc1b154b7c2b0412254c466a94a8d6ea3a47e1743469bd45c08f54cf96
  5884be3696e961741ede16e3b1bc4feb93faaef31d911dc0cb3fa90bcda991959a9d2cbc
  817a5564c5c01177a59e9577589ea344d60cf5b0aa39f31863febd54603ca87ad2363c76
  6642a3f52557bcd9e4c05a87665842ba336b83156a677030f0bad531a8387a1486a599ca
  a748fcea7bdc1eb63f3cdb97173551ab7c1c36b69acbbdb2ff7a1e7bc70439632ddc67b9
  7f3da1f59b3c1588515957cb8a2f86ab635ce0a78b7cdf24eac3445e8fc8b79ba04da9e9
  03f49a7d912c197a84b4cfabc779b97d24788419bcf58035db99717edb9fd1c1df8c4005
  f700eabba528ddfcbaeda6dd30754f795948a34c9319ab653524b19931c7900c4167988a
  f52292fe902e746b524d20ceffb4339e8f5535f41cf35f0f8ea8b4a7b949c5d2381116b1
  46e9b913a83a3fa1c65ff9468c835fe4114554a6c66a80e1c9a6bb064b380be3c95e5595
  ec979bf1c85aa938938e3f10e72b0c87811969e8ab0d83de0b0604c4016ac3a015e19514
  089271bdc6ebf2ec56fab6018e44de749b4c36cc235e370da8466dbdc253542a2d704eb3
  316fd70d5d238cb7eaaf05966d973f62c7ef43b9a806f4ed213ac8099ea15d61a9024441
  60883f6bf441a3e1469945c9b79489ea18390f1ebc83caca10bdb8f2429877b52bd44c94
  a228ef91c392ef5398c5c83982701318ccedab92f7a279c4fddebaa7fe5e986c48b7d813
  5b3fe4cd15be2004ce73ff86b1e55f8ecd6ba5b8114315f8e716ef3ab0a64564a4644651
  166ebd68b1f783e2e443dbccadfe189368647629f1a12215840b7f1d026de2f665c2eb02
  3ff51a6df160912811ee03444ae4227fb941dc9ec4f31b445006fd384de5e60e0a5061b5
  0cb1202f863090fc05eb814e2d42a03586c0b56f533847ac7b8184ce9690bc8dece32a88
  ca934f541d4cc520fa64de6b6e1c3c8e03db5971a445992227c825590688d203523f5271
  61137334
ss     953f7f4e8c5b5049bdc771d1dffada0dd961477d1a2ae0988baa7ea6898d893f

]]></artwork>
    </section>
    <section anchor="example-of-use-in-x509">
      <name>Example of use in X.509</name>
      <t>The following are the encodings of the X-Wing keypair with private key  <tt>0001…1f</tt>.</t>
      <artwork><![CDATA[
-----BEGIN PRIVATE KEY-----
MDQCAQAwDQYLKwYBBAGD5i2ByHoEIAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ
GhscHR4f
-----END PRIVATE KEY-----
]]></artwork>
      <artwork><![CDATA[
-----BEGIN PUBLIC KEY-----
MIIE1DANBgsrBgEEAYPmLYHIegOCBMEAb1QJigoOZBFGYUtpYLpg2GA9YvRH+atJ
m0e9aQbMQLBh2GNKPoiQbyhJWOdEHKbHJcu5cJW3ZxpGK2aByeZYC7yNYLFJ+mAm
EEOvu6UvIFpgKDhIUVlq3zcavqmNM0c4PSu2c0OPZ4NhK/hwFPe5Gol0AmU0XfZ5
NARz0cTBdohuXim48Fi7fHNTFmhs/1w764wmHLAJcKacGvzFS5TLhuHOY7pjbjlc
pFEB4hx70EwxPqGa8kFB79KtREFqJbpPZZEO99iAnDCT8EqvAOPNluNcSqPIAsGK
1vOdpLS42YyL15Atg6B7pFOWZ0pgJDyrk+gP2bHId3N2qcwNb6EV4mOTgLnGvnhI
vRNYjGRwOgU10ZoPgWM6l2oKEFtm7ihdD9JV6CwDMZJfQ4O278dh72CZI1oLmHJj
WKqdAbi4llGfkhR0u3wUuyIlK1wvENQSRsmyPnZEhJNn9UGhX2O8koo5u3vHPwe2
ZcSWu2VYyPRUiacuxLrNNOnFlMM4cbcj8DSV6ItDkasm5DBD3rYRezkZ5FxMGxar
KOR93XI2Y4VHZhkvwYBspwq7eGy9swky5oyKNwvPsHmDoBLDJmuT76YmV/S4ODdM
sLuV4OwGVBsHZdmc8VO8a5YTXKeApVs2R3ieMZFeRig8+ce7boRT+2aCEFFB8dwN
ANhe7XA7bGyWH3nIRSdrQkiUnAZ4LlE+spkbldlgQuOMvto1JEmytQhOvaUiamIG
QAeJEwowlkSYSLYp/upKLCp0PEoN3Jyz89Z2/FY3MbJsShpm3IRZFwBW1XaX8UQ7
gamjRBK7e/BfMydXWlkR3TAdYFOGfzwwgHEfG/EVh7C7KYQnayaF53ViEOSz+JVT
hCMeVYxvUQyR4PxWtdGIX/KUnpWka8G+4fpx9QJ+EMRDsOkdD9dED0Z6JyISEuiP
XGumQpbK4NIHv8YPiMfPtcRaoYOdGMs3xFhD5UJqSpDIArZCj5U8NZxKwGA0UvrA
tzYeL9NdzIhakhRdT8oBWPG31wtLzRGOSipBVEON8xDESpobmepBWQcmeoiwYkJB
V5wXIvRu1hwuPspUXJlwUXF1OZuADbJdo5WT0GSQ1xQsAOiNLbBH6YmL23rLftkH
9uMEFswN5UokLAohJjAvXVTIW8Zqwvg8eXlFtQZ8qkK9LgwZypdQblB6sKXJ9WM3
CEmcGfJK7FE705A6XXO27EmR98cuuZHBw3iJgFyx6jigzAIXayfFjWOM5aMmaEV8
+bm+AnygIUBXlxcl1UEC6JlnFusq2CNFO2BbhVNwsbIbOTLN7UFgqplzx+uuWsR2
TZTPfMlQbwd7rXMBLbtKyBQKOHRkEuszyVFFliBfcHY1hiIX2bYJGMYmjZNEkVuE
eiR2waJw8VSlyEI0FlrPyGk5hwLOqemgfnsOmeqb3LeEH+nA+iXIM4CSVho+3dxw
AfR4rWV4GmAkqtFl2baXmtrESKRGL1ZGhVJ/diQ0/ppCWoRDe0VzkuyoDJE1BhUe
OhMjnzQvynZVtuquhFoiHOs+Z/VjnGGT9v3u9X45m4CLfzqitXQKre2QFj3F13XJ
+vfx+9B12rNE6dfRRmRygfu6ezxWyv1YM7epMOxCBufDptd2T+gdeg==
-----END PUBLIC KEY-----
]]></artwork>
    </section>
    <section anchor="asn1">
      <name>ASN.1 Module</name>
      <t>This appendix includes the ASN.1 module <xref target="X680"/> for X-Wing.</t>
      <sourcecode markers="true"><![CDATA[
XWing-KEM-2024
   { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
     pkcs-9(9) smime(16) modules(0) id-mod-XWing-kem-2024(TBD) }

DEFINITIONS IMPLICIT TAGS ::= BEGIN

-- EXPORTS ALL;

IMPORTS

  KEM-ALGORITHM
    FROM KEMAlgorithmInformation-2023  -- [I-D.housley-lamps-cms-kemri]
       { iso(1) identified-organization(3) dod(6) internet(1)
         security(5) mechanisms(5) pkix(7) id-mod(0)
         id-mod-kemAlgorithmInformation-2023(109) }

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


-- XWing KEM Algorithm

id-XWing OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
           dod(6) internet(1) private(4) enterprise(1) 62253 25722 }

XWingPublicKey ::= OCTET STRING

kema-XWing KEM-ALGORITHM ::= {
   IDENTIFIER id-XWing
   PARAMS ARE absent
   PUBLIC-KEYS { pk-XWing }
   UKM ARE optional
   SMIME-CAPS { IDENTIFIED BY id-XWing } }

pk-XWing PUBLIC-KEY ::= {
  IDENTIFIER id-XWing
  -- KEY no ASN.1 wrapping --
  PARAMS ARE absent
  -- PRIVATE-KEY no ASN.1 wrapping --
  CERT-KEY-USAGE {keyEncipherment} }


-- Updates for the KEM-ALGORITHM Set from rfc5990bis

KeyEncapsulationMechanism ::=
   AlgorithmIdentifier { KEM-ALGORITHM, {KEMAlgorithms} }

KEMAlgorithms KEM-ALGORITHM ::= { kema-XWing, ... }


-- Updates for the SMIME-CAPS Set from RFC 5911

SMimeCapsSet SMIME-CAPS ::= {kema-XWing.&smimeCaps, ... }

END
]]></sourcecode>
    </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-07">
        <name>Since draft-connolly-cfrg-xwing-kem-07</name>
        <ul spacing="normal">
          <li>
            <t>Elaborate on relation between randomized and derandomized functions.</t>
          </li>
          <li>
            <t>Update implementations section.</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-06">
        <name>Since draft-connolly-cfrg-xwing-kem-06</name>
        <ul spacing="normal">
          <li>
            <t>Add asn.1 module.</t>
          </li>
          <li>
            <t>To match FIPS 202, we request number of bits from SHAKE-256 instead
of number of bytes. #27</t>
          </li>
          <li>
            <t>Update implementations section.</t>
          </li>
          <li>
            <t>Correct PEM header. #25</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-05">
        <name>Since draft-connolly-cfrg-xwing-kem-05</name>
        <ul spacing="normal">
          <li>
            <t>Fix several typos.</t>
          </li>
          <li>
            <t>Change HPKE/TLS codepoint requests to the memorable 25519 + 203.</t>
          </li>
          <li>
            <t>Add instruction for use in X.509. #21</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-04">
        <name>Since draft-connolly-cfrg-xwing-kem-04</name>
        <ul spacing="normal">
          <li>
            <t>Note that ML-KEM decapsulation key check is not required.</t>
          </li>
          <li>
            <t>Properly refer to FIPS 203 dependencies. #20</t>
          </li>
          <li>
            <t>Move label at the end. As everything fits within a single block of SHA3-256,
this does not make any difference.</t>
          </li>
          <li>
            <t>Use SHAKE-256 to stretch seed. This does not have any security or performance
effects: as we only squeeze 96 bytes, we perform a single Keccak permutation
whether SHAKE-128 or SHAKE-256 is used. The effective capacity of the sponge
in both cases is 832, which gives a security of 416 bits. It does require
less thought from anyone analysing X-Wing in a rush.</t>
          </li>
          <li>
            <t>Add HPKE codepoint.</t>
          </li>
          <li>
            <t>Don't mark TLS entry as recommended before it has been through the
IETF consensus process. (Obviously the authors recommend X-Wing.)</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-03">
        <name>Since draft-connolly-cfrg-xwing-kem-03</name>
        <ul spacing="normal">
          <li>
            <t>Mandate ML-KEM encapsulation key check, and stipulate effect
on TLS and HPKE integration.</t>
          </li>
          <li>
            <t>Add provisional TLS codepoint. (Not assigned, yet.)</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-connolly-cfrg-xwing-kem-02">
        <name>Since draft-connolly-cfrg-xwing-kem-02</name>
        <ul spacing="normal">
          <li>
            <t>Use seed as private key.</t>
          </li>
          <li>
            <t>Expand on caching decapsulation key values.</t>
          </li>
          <li>
            <t>Expand on binding properties.</t>
          </li>
        </ul>
      </section>
      <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:
H4sIAAAAAAAAA9W92XbcSJauee9PgVaszqBCHDAPqoqs5OAcxFEkJVGKjEoZ
AAPpQZ/kcOcgtXKd1+i7vurzHvUo50n62wbAB5JSZmRmda/WipBIDDbs8f+3
GYCVlZXWuDPu6pfWs4uVd53+5UvrUvf1SHVXhpPRcFBq6+o+HXVyi5/HK58m
qj+e9Kz99uGzlkrTkb55ad3dcl8rU2N9ORjdv7Q6/WLQauWDrK96NJyPVDFe
yQb9/qDbvV/JitHlirll5Vr3VhynVU7SXqcsO4P++H7IDXun59uW9YOluuWA
cXX6uR5q/uqPny1bz3TeGQ9GHdWVX/bWN/hnMOInbnrW6k96qR69bOUM5qXl
2m64Yicrrtei+1L3y0n50hqPJrrFsL2WGmn1srn1djC6vhwNJkOObI7uh+OB
tT0YTXrPWtf6npP5y5a1YqRg1VKQ35mC/HPyeu28FlTrRvcnmoutp1uzrGqW
z051qdUou7J25Do50VOdLidEQn/q6HGxOhhdynG5iuNX4/GwfLm2JpfJoc6N
Xm0uW5MDa1WDa/+h5ZK/dDvl+GdpTNq47IyvJimt5I0m1r6rGLmnixTL8VzP
03tXq+ZWO4Pvt/L9s6tX4173WaulJuOrwUjkS6eWVUy63cp0tnRnlI+0tVnf
b04zW9XvfFZjDOaldaa71x2uMDK+HKnhVXWVroSZTxB6NpqU40l30vvTpRxd
zQa91uPOTvRYj6yz7OpWpfqJng5P9lbOTqw/WKcqTweT3HrTRwOjsjNe6HEo
zfwpM+P5DWMV7Ux76/QxwI3V9qr1DsnqUapU/8EwNlT58OTiODa7dF5gAXq+
21SVf8qmZ6op9gejHjfdGGs83d50HSeRHy/C2H5pbh6r0aVGw42Cb29vVzvj
yWqnP14b6WztfOW0vblyscoN1fVVrPij+cWy9vB008Wgb53r7AolDS7vrZUV
az0txyOVja2z+/5Y3VlHg3F12XFfW0vrZ0erzvOXdStnQ511ik5WXTAoZC6d
zOrXt5irpg7trNiuOTI1Gv6sGBkROc7frJybI6UedXQpkajpxZyzTjWS6RFN
amHOpsYVZ8dre+3Nl1Ycu/6K81J6a7U6zRwrMe6tbK3mo06ZYY8rw0/jlcrr
V9BXr1PNv7lsMOmXBI7xVWX2Eu3oPO0QXku5Znvv5Iw+ntZE/6Y7nKTlah8n
Xr0c3KzJD3JkTW5bO9o7O1+Vn1ZpYXWYF/Pq+VFOiLBwj931Fc86GytmTAjD
yEe9SSXXFSxN59auKq8sTrfad2ORS9rVK8cTuhpb25N+JleWPz6SuFUb9NSo
j0ybqotNlAxjMtaiyabjUnqYMxHuPTwgifzeuRedYWl+W5WfmLv3rbl7OOwg
nzCZAzUedzJdT3df36+0+5kalpNuZXCHjAr3KnvT0f53TBf3S5zK7fgxivxY
ftx9v3G6t/XSmAsunxLYV8bdsjGqHBO+FAe4eL/RPt092W9Xl95O40NlWlfD
a71yd0/qi8I4t+3mjvODs+oGaXPupsVLuWpv/Wi9ulISihnCqMhi34/STskl
Z5u7h3vtnafVpYcj4sVqR2Ujk4owPH8tIOnOqeXZmz6Gb6wLFfR69xJoe52c
Zg4PVrAEq1NafU1WIQYfrh+sbOwdba3sr2yeEwcWjpzsP/vb6jlbrdrXlxzf
Pzt89ztG7rje4tA3GDgZi1STTUZEe9H0Xm/Y7WRccL9yqn/TuAkXMI1K8+tD
OVuZF5l/Y2+/bY7vvt78Owb/atXaHynd06Onz58wOUBMdv306UNJLp3ySk2G
Xc6cnB4fb/+O6dtesjD7BhaeX2lrt4KCoq73g8n/+h//5422NrTuWweDwbVI
AIzzd0yQEW6oUToo1dPnt1YXM/5TEtqaqNFYP316HQGqTvk9+c1l+Ufn91et
t2rU/9bt8+l7JCm6tULCU3XCa7XOrzDlnu4NrFwXBPvSqkS4bKlH2HoeVK9x
P9jWhJVWDbqBnpZeiFa9abRaMqATXTy30kmnO7Y4e+EGgZOYcF651QpevlqN
EG/Lu7rV+oGYNR4RG01st7780JFfv3LiB0ImeU7Vx3vTX77KrDRADGgBSu3f
W9nVgJhaWuMrNbYy1bdSOZFr6/YKcyhNRr8Xi1ANfzDRHve2BIpLyATPG4/5
NxoB55Gya/fq6hvdrQ5bTcL8N+M/cuSKfNW6JVB0+sviXIKaEMCYngp9u0o+
u5F+x4NBNdKy0xO4bA2GJpWZKShuGEEoWtwvbQIKynsU2ls1E7VUpydOXulN
IhPXDUeDm04u9zKBbATKW5a2hwS0ShgWOKG1wJJmM1+uBFVeDSbdXGRVTjpj
Ewy5yQzhRkEseuq3gYigRecTzCMjZZWrRjNbJhVYlwNYEbox/6KWjXtuMq7X
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
Kf89ljQF+XpoLLyhmI+7V6PBpF9HPV0UnYwol5mC11PhKlOEUtNtNWyzwPC0
prEsszRYbXUoJl3De24H1YYjgJSzau0VTR1ML1QZmh2gBqdWo5xHuzpfbbnm
bvVgU978NaYVZW43WUXW5X+rIDrQY0rZzfLHebWnbjjkTL2+lXUl3q+YrRfS
kuzTaLXW5VE1WWqz1k/2SDBj4dSSFOo9C9UCpCzN9+qnk+q9slXSID8M1afJ
U9B9kMqe+XqoZmuaGYUIXJhPdyKRRbRUbanIZK/tJJPnVMxQMrNvxPSymEua
9CFxCZF/j/Y+ufJlKtxIxYy7KnTNjZQAPJaNeFVN+ZtmRt8o7OPDKKJLCV1V
MXdBlXWn323Qp8ETlV0/FWKmjX6vjabSny/405Amv9GjR49v+sO/1ec3m3i6
jPydSUrdtrKCUs9tbjU2ZjZFmkaqxe0pqVOL8OEJhdfr6d+JCpU1Vd6uBamb
XTbVRlNz1XKrMr4Hiu8pmMadtT7bsyo+I1vO5ervdNhsozCTka1Lvc54bFYo
x7e4a2sxFlVbM4wYqpGmI62uKyk83I48k9vqw017BkHOP0Zj9LP4qE1aPenS
AqgNMc6Onmuw2Zh8NWAIZpf/dOhNfX6kL6WvWhitp6yKOP2mNHsjZdPbtDZb
ck1ZdOo4YPb9mWeCpIpXqEwvciDR58czLQ8Bo/UpThHaPTtaFVzNYVO4wh/L
J05WG25kp6c8YCyynMYQ7ivnyqTlbEf7U4XfZrf4tPAsVWs6lULTYlGiIZHz
gGP+qs51z+ANGOVd9RCl567UNROJ9JI5m31UzUi4Z75KutoUGKdFVi5Ypp2f
4jl48M3y0TzvniqkLmFP4+RclaGR4VN5v9Vc/yTynK/UVbiiFtJDWmRmbaQr
WO3rcr3NmyTzFC2aW32VNTuzaVqZnZyqsry6/bbwq4+rDeho+n6AQOq+a5wo
el3YAfvk5tmXwqam5KycDIeDEYh2neuaaVZmKUeazhsbMttupZ+jpgx0xPT4
W5iP3HWEciuYMLeo2CEKNPutayeTzZHOqlfzvGmi/7GsENRys6PiL9NlSpN8
p5muNafVRwJenTWLZ8EJ/6FmFzaeHvefZLmP1bk8162Jpy2VioCrTVjgkG5X
X6ruX4iAZAqzYbBLLwvCuVgN7MSqwocpEe/1i5Gq1pbowuyLl43n0tPx3pYI
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
4TaevvKpejmINe706vfOWNYt8MMsyJjxyNDqF4LerUivTw5qdtWaYIC18Ugz
RSUBZK26rZHP8YgxPNnGQM6sjMrqh+digoeSE/p6RV5PUz2FvfDqxS8/nK3I
ka9z9eJmM1C1d3cqjubJpNlbkWb5eKFRCUgn9+Mr2RzULJGrxUv+rdq/NHsl
VfX2HCkvvWx1xg9eE5DD/wf3Bn+udMr6DQGCe66b9wPMlinAl5IWR5O+KKQC
NJW1DqvVl78ilHfrp8LOvjW6GXCsxqnmRmoEeU8biyt2q/VDkaWULMwTlNM3
vkzkHSjVA/dSummG1TyyXk2h0vyWoCwJSAaCVyh4eG+eDStmu7ZW5Tkys0re
7S5L+60faA4y3hk2h7mrCg+5wW2miZYsMkrBHACmyqzTaX6X5zS6nXR63vhV
80sVTlqL2yrT0bNnzx5xyz+vrj06tvaff35wjDtX6xeXLKU//rn/47KV/vjj
87ljVn2oJS+BACHKY8JLs/6fWz//bIXNuWYyq1f6Tl559fDC9Mf5bZs/tr77
wEKzv2zhoYVaPKvllbrWfzFPL8h1q3nnEqkuVatxPyfh83pjq9mvI1t6jBzr
pxPmH0oI/V+X65OmylOaGCY3l9dPP5UgzcqZShmrF0tcuNz81mxYm9vIbYZg
dvyYDUsXTz6T0Kz9zSY9J25zVOTnufXIHrb5nS1Qcu/CgDhgbgRzTEczt1HJ
7FMy25RM+xf1cOq75+TvGfFPDYo7rRdzv13M/UZbc7/JeGe/LWw5tqypKutn
N/7W7sMFQemppEL/4bnhtTlhoGZtGw93LTaafbhtUTYuPrFvsZrXnCHoJw1B
RPHwIpFr3YKR98xCme+S0ercTsVvGeiDzYuPNLegdrM/UZTO6db3ttktSC0b
V1ITvP7QKq/nbVLafrDHrpHPw012v9OAr5vZzoTERUumDSO+bwjnsY8ynAWZ
fFd2f61X45o2fmfGMjf992WsoTCHn36iF0AIKUG5vlUZdxi0WmJ8khl+/POd
nfyIzs1P9o8/eU6l+lxLdl9Ky0XvLic9jv3S+dX693+34p86JtF1zNP+sops
HtKw/ndrON/ImXnEdKmxnVSMUt58vlTrjfbsX60/MFw/bg54jjniuNH8kf9j
6rb1cGajrIp32hoVmTysaf3X/wxWzRguqqd0H9ntgm3OHZ80x80J2aHxYBbm
+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
+pLJBx80Nk96z78MyvooXO5//Y//2yk+rtbdrsifjfbO3pF1crr3dv1cXkr4
3hxtHW693lx/vX679fr9wf7t+42N9Z2toONu3O8O2nvr6xvrl4ftjdfvdzfX
r/c3b2+Pti7j1+3TvfPtjTfvtu8uP7R2rsps99Qvql7aR1uP+zCDeDQS8ybg
uYHs7bWdrfWjjctytHHZbq+/P+kdvN/d05fHmxuH7fXUef2qczk4/rCxvfP+
zXj4/mB46e6sJ+9vTndfqPGrVo98r16nh68PNq7cnaP9k0HndXp/9erdcd7e
3U93X2WTIHv1zvtwN9zZd9XGvf7wfjO6P3p/sP3qRW+912q3j28m4Zubve3h
5f7W1d6bt91P3udM3XzqHR0Sok/OJuCz45MP/tHV/trV7faJDnYGXXu998a+
KD4EraP10892dr6RD64mF52eH293omL36Hy7d1WuObdR6N/2dg/WX2X7Ktu5
+bx9FpwfXE12j99Hw9/S37pZa7jd3vCv7iK7fXt38mlHxdfbG1GyPz5tb396
lQ5PPnxoHydJZ72/tXketz/drB+fHHUnR9nZp5O99XJnv+XcHOfDgzPffX9/
4ATr48twIxpuH7/7YA8vX23dj65fXJ646e5e7h25n7LbozRsv/V7x+eXB/2d
m/7VXuvm9Oj9bzunt8eXbxz7w+Dk8t1h2HUH++3tcS/qXOVbyau34ebt1uGH
V8Vr/9gF8F5F7uaHPWdw0Nt99Vvr3f6nfD3t+N3uTnF9dWpPvNs3k/u97r5z
e9M+en12WvbuT/of2levjvrJm52rC/c4vh4Mgol3s3tyq93Wh+zs3cR9+/7+
5PRNR2WTu4PR0dFxf7t7eAgiy36Lt87ehnvjrWtV9oKtjS1v9P5Uf77+EGzf
He7cqVFr//g08S723Pf+290PV9c3GHU5vP0U6Z37pLy9vg8G9/tHtzcn5W5v
a7BxsPWqNzmPwve9t2tn/vFWftgqDyZv/ePbnbcb5e6HvJfFb4+Bje/PL/b1
+vBt6Z56HX34YVufdi7jF/J8xuD0/IWrNtvb2xtxfnvUWj+60tHFepTu3L/b
9fp7p2f56PV1501//YN/0G2/KIfXaTfvXr6eHB/ejAfOq3bvfvz66vhGMePe
3k7r9bp+1b4d3Havz96fHbwfrk2G+webQ/ukPTjyXt1/jpMP7tr2e+8wfVWe
XQ173t7ph+3bjXfOhbqI37yOWpeq99vpxn6k1zaKw/v84l33+tQ7X8/fbx/v
FJ9vby9328XOWvvtVbQZ7b9/3Vf3ajvw3nbax2efX7x6e9662jzUb9/f3bx5
fX/qn9y9G+c7exdr+2/6w3fXKt554RfDu+T1qxftw9Ot8vgau8jbW/aH8NX9
3ll70jlpXexMeq+H6b5/tLd7E78/6RwWJ+PsVA3eH+c7h6V3t321Fbx59els
uLW3Pvqw+VvwJj76cLd/u7Nuv7kZrbfGn9/rg+Qo/7x3pTCk/DwebLw72fGc
2/HB59Od47POcONt+/govttqnw0HaU8PN969znp60Ll9f/1qo/U2uL3Yuzmd
OFe3k5Ny+ObiVff2zcW2c/xhsr6VvsoHwbtze+fstXP3ulw/7hwdpBu7mMGB
640OivH1biuZHLa3y9uj4M3g+mB9cPXqt/Wbi7fne+/iD59uby5jfdHdHr/+
EH+63k8OLm8/3A/z12l3Iyz3L14l7w691ma7l+0Ur/aj7XZkB+vhxQUO0+6d
ggcmkw+7G7de59Xl9v1d+Fvn8vP63oW6L7Z/e3d8GKjDnmq/jVsv0t6L9f79
5d6bjYvuXdZ13rQ3w1fd/vak/ORuHm0fuxvp1duj2zLdS4/PD46iN9uXn4bd
z3cvJpN35anbOv9wflIcdl+nt3k0ujjcOEjH+/cbr/ePd0+v25Py8/3b7e1u
Z6PIdt87V529Czd9/2rn8H3vtw9H7eu3k3ZLd07dW/XqNn571r1v79nb3dHJ
/c51cHV7cPxJ9y6Lfnnc059S70C3d1/01190LvYO/c2zt1eDF15+d9taL079
0bu3/k5v/frTeLsLb7jojUfts/3TnQPnw87V21dreee1vTYcbr4bnG5p++3n
68n9YOtV29m4eqNbx1eHv/U/v7657394O558mlxtDzq7x+WLD2tvf+vv7Jwn
N94kufCDnr95UHz+1BlfvN4faff19m/etuNdvGq9uCnuXiQbjjs6agNZTk97
p/eXxSTUn+/e3d847w8jPTw8vtvcmBRbw3Hunr+4zPXlzz/PJbQHqarJ5dVr
WQ+rt6h++cG8lLV+U7D57mDeubPq14iWj9/j+uXLRRjbX7+aF8Q0nzMzL6P/
983jrbZl0uTZH6vXEJqXw8r7VgEns+/k9HQv1aOVdJDfL7nPARRLgLbn1qhU
edlZAsMEfvLcGl5nJVe3DJKRX1aSJQ6XvU5PLznh83pA5ZItX9554h2v1Vth
mdpWe3vvaE/en39m7R2eIJS9c+t8fefMfFHCDFjeBmu1L06OT8/PrPWDg39r
tbhSfpNX6sgsph90MQPaPj0+lMOzz8/0p68el849y6LBX/ZWtlavBpOyq+9X
uiCociXrlTLAUad62dm8WL79+aAnPhvU3G1NX6K+FIhk5ZNOnbJXym/D687d
UtRIBznNbqoFxki+OYMlx06M+J78Qs+Xr8tzX0VYts4O9w7bK5vrJ2cz+Xyj
aTuphGO+9+G4jSD+STn8I2KopaCeGqftLgUx87cwBTGO6gMG8lbs6bRa/8ov
Q1n/zMeh/uZXe1poWq1M5zCz5mqcMoq5sTfTksMn66frh/jEabv+WII5ONX8
GZMcXtctm89gvNk/NFcPzCuYlXlz48w6uHza0Za18X72bYivMo9pU7MepiN8
eoCoRi7qD+owdTsiiEkLRLynR88dNdZf+c6dm+3Tczm/8uZsfadtfYGltPvV
a/rlzXxmtGIXb4a5kk+QNG+nXpTuma5f6D8qTGk37ZSt1r5pavYmw8PGXOuP
UT3lb8htoeVl68t8+CnNeBaOPKVna2YGy/IZkW9NYk5f0xngrhb+6rRaZ4eE
4E3GL+fmLjVdzHpY/YOJ1XLhtDPyUp0n+Iks0aSkTL6X0NX5pXmdM9noeOvY
UtOj1Xt4N6vP1XUHl63WH62ffpIRtfPOeCAftzOvhP7pJ+vEvBzdGuneoPkI
blm/cR3nkfkN6i+CTN/HqGitkJeXP3ptdPMe7+rtxGcdeYNy9bKzbNDvQ3vv
q7edTV9RvWJH8o7rdle+eCfk1rwxuf4kSf0JUWvum6jmdY5PfWNdPqXZ6OXB
+yCnE/odowqltfVcXszcn+Zy08X5QL6Vml1Z23uokMC/XH3Iybya3epPJFWL
PFJ5WbMxhNlXR+QdxlrJuhAXzF1qPj5u/eBGf9ccVqzNwUi+U2adEF2vZPP0
SO4O/v7pBdLKNril1DfmGxnj++GgEmFtNPJNgzX54qK8uHE46My9/r95Ub+8
I3xk3rw999r91UZwMtdR/Q5scZP5MoiM1vn7R+tLm2Kv1fvt6s9EPPHtW/NR
xfqDIqPqJdS5GdCJ+SJH9756sbdMoNaeJ6/gltf8E6oqHdjmWxriC13zTuj6
Jehcs2qtl/JN3dE9ti7fZxYNS2XGfCtIPhiHKNLugDEM5r5B07Ia36jfQtpT
1/Ktz/vpt1GyyrLkS44zW2GMCFCLpcla4mrzwYG6kfqr1Pdz34QZWczRJGRa
NPuBCoykfClvFb8Vz2L+JSrUn7WVhJXVVe89r26bTWJfZ5m6luO9+qvBNHd7
pc0XUaohOm5sNa/zrmzbfC3cjFPXXXdu5EulQ5XVn6ypvkszwLxoDqGlg/FV
9VFxuTv23OYrivJRWfMm2Lnv3fhOaHzKvN3ViKHWMG2BagV5DyaXV3XwRTKD
vm4+JYyymu/1iKpGk/Jqaqfm4x1TIzeHtwb9H0VNo2vzzdHq6xZKOpx+FILY
VMh3hzrV18nNh8nHVyMZgfnaDtm3fb5t3jSr++WkrL5qUTL6peP0piMQt/pc
kHwdVd7cOG274QjP/37/8IzJEhMlbnz/k6P1d/vGnaF5VXGtKAlI1fdV5ayR
iICqy+rzKFNRmffjlwakWAuhgVkdybt5zScp5I3Y93r8eybgNuZvdmyqcr7U
aXpvm9cZyyAz89b/p77Y1XxpfeHyx5/k+R1JwGkmLq/gXfhigJqlnMNOmelu
V/U1SrW0Sa8dBMS1iKv63MJUgtXHA771eYGF2L74EcCPsw+H1O9dn3/J+cff
MSkT39bR3XDqk/UbQue+gWxi6G3DavPmi0r151KsB9JfqtX1vPpUejmo4vTi
RU3kalmN46Jtec80alZZZjx4MF/7ng1n1byu+Ad3tfX/ACqIodbjtwAA

-->

</rfc>
