<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-connolly-cfrg-xwing-kem-10" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="xwing">X-Wing: general-purpose hybrid post-quantum KEM</title>
    <seriesInfo name="Internet-Draft" value="draft-connolly-cfrg-xwing-kem-10"/>
    <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="2026" month="March" day="02"/>
    <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/JitHlirll5Vr3Vhy7VU7SXqcsO4P++H7IDXun59uW9YOluuWA
cXX6uR5q/uqPny1bz3TeGQ9GHdWVX/bWN/hnMOInbnrW6k96qR69bOUM5qXl
2m64Ynsrttui+1L3y0n50hqPJrrFsL2WGmn1srn1djC6vhwNJkOObI7uh+OB
tT0YTXrPWtf6npP5y5a1YqRg1VKQ35mC/HPyeu28FlTrRvcnmoutp1uzrGqW
z051qdUou7J25Do50VOdLidEQn/q6HGxOhhdynG5iuNX4/GwfLm2JpfJoc6N
Xm0uW5MDa1WDa/+h5ZK/dDvl+GdpTNq47IyvJimt5I0m1r6rGLmnixTL8VzP
03tXq+ZWO4Pvt/L9s6tX4173WaulJuOrwUjkS6eWVUy63cp0tnRnlI+0tVnf
b04zW9XvfFZjDOaldab6eTq4W39tzulKhPkEUWejSTmedCe9P13K0dVs0Gs9
7uJEj/XIOsuublWqn2j/8GRv5ezE+oN1quhnkltv+sh9VHbG9/M9DqWZP2VG
079hoqKTaW+dPma3sdpetd4hTz1Kleo/GMaGKh+eXBzHZpfOC/Su57tNVfmn
bHqmmmJ/MOpx042xwdPtTddxEvnxIoztl+bmsRpdavTaqPX29na1M56sdvrj
tZHO1s5XTtubKxer3FBdX0WIP5pfLGsP/zZdDPrWuc6uUM3g8t5aWbHW03I8
UtnYOrvvj9WddTQYV5cd97W1tH52tOo8f1m3cjbUWafoZNUFg0Lm0smsfn2L
uWrqxo74sByZmgp/VoyMiBfnb1bOzZFSjzq6lPjT9GLOWacayfSIIbUwZ1Pj
irPjtb325ksrjl1/xXkpvbVanWaOlRj3VrZW81GnzLDCleGn8Url6yvoq9ep
5t9cNpj0S8LF+KoydolxdJ52CKqlXLO9d3JGH09ron/THU7ScrWP665eDm7W
5Ac5sia3rR3tnZ2vyk+rtLA6zIt59fwoJ0RYOMXu+opnnY3xDUXgwshHvUkl
1xUsTefWriqvLE632ndjkUva1SvHE7oaW9uTfiZXlj8+krhVG/TUqI9Mm6qL
TZQMYzLWosmm41J6mDMR7j08IHX83rkXnWFpfluVn5i79625ezjsIJ8wmQM1
HncyXU93X9+vtPuZGpaTbmVwh4wK9yp709H+d0wX90ucyu34MYr8WH7cfb9x
urf10pgLLp8SzlfG3bIxqhwTvhQHuHi/0T7dPdlvV5feTuNDZVpXw2u9cndP
wovCOLft5o7zg7PqBmlz7qbFS7lqb/1ovbpS0ogZwqjIYt+P0k7JJWebu4d7
7Z2n1aWHI+LFakdlI5OAMDx/LXC9ebU8e9PH8I11oYJe714Cba+T08zhwQqW
YHVKq6/JJcTgw/WDlY29o62V/ZXNc+LAwpGT/Wd/Wz1nq1X7+pLj+2eH737H
yB3XWxz6BgMnT1lnOpuMiPai6b3esNvJuOB+5VT/pnETLmAalebXh3K2Mi/y
/cbeftsc3329+XcM/tWqtT9SuqdHT58/YXJAl+z66dOHklw65ZWaDLucOTk9
Pt7+HdO3vWRh9g0YPL/S1m4FAEVd7weT//U//s8bbW1o3bcOBoNrkQDI5u+Y
ICPcUKN0UKqnz2+tLub5pyS0NVGjsX769DoCVJ3ye/Kby/KPzu+vWm/VqP+t
2+fT90hSdGuFhKfqhNdqnV9hyj3dG1i5Lgj2pVWJcNlSjxD1PJRe434QrQkr
rRpqAzgtvRCtetNotWSgJrp4bqWTTndscfbCDQInMeG8cqsVvHy1GiHelnd1
q/UDMWs8Ijaa2G59+aEjv37lxA+ETPKcqo/3pr98lVlp4BfQAmzav7eyqwEx
tbTGV2psZapvpXIi19btFeZQmox+LxahGtZgoj3ubQkAl5AJijce8280Aroj
Zdfu1dU3ulsdtpqE+W/Gf+TIFfmqdUug6PSXxbkENSGAMT0V+naVfHYj/Y4H
g2qkZacnINkaDE0qM1NQ3DCCRrS4X9oEFJT3KLS3aiZqqU5PnLzSm0QmrhuO
BjedXO5lAtkIlLcsbQ8JaJUwLHBCa4EbzWa+XAmqvBpMurnIqpx0xiYYcpMZ
wo2CTvTUbwMRQYvOJ5hHRsoqV41mtkwqsC4HcCF0Y/5FLRv33GRcrxlVo5pl
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
PZY0Bfl6aCy8oZiPu1ejwaRfRz1dFJ2MKJeZgtdT4SpThFLTbTVss8DwtKax
LLM0WG11KCZdw3tuB9WGI4CUs2rtFU0dTC9UGZodoAanVqOcR7s6X2255m71
YFPe/DWmFWVuN1lF1uV/qyA60GNK2c3yx3m1p2445Ey9vpV1Jd6vmK0X0pLs
02i11uUBNVlqs9ZP9kgwY+HUkhTqPQvVAqQszffqp5PqvbJV0iA/DNWnyVPQ
fZDKnvl6qGZrmhmFCFyYT3cikUW0VG2pyGSv7SST51TMUDKzb8T0sphLmvQh
cQmRf4/2PrnyZSrcSMWMuyp0zY2UADyWjXhVTfmbZkbfKOzjwyiiSwldVTF3
QZV1p99t0KfBE5VdPxVipo1+r42m0p8v+NOQJr/Ro0ePb/rDv9XnN5t4uoz8
nUlK3bayglLPbW41NmY2RZpGqsXtKalTi/DhCYXX6+nfiQqVNVXergWpm102
1UZTc9VyqzK+B4rvKZjGnbU+27MqPiNbzuXq73TYbKMwk5GtS73OeGxWKMe3
uGtrMRZVWzOMGKqRpiOtrispPNyOPJPb6sNNewZBzj9GY/Sz+KhNWj3p0gKo
DTHOjp5rsNmYfDVgCGaX/3ToTX1+pC+lr1oYraesijj9pjR7I2XT27Q2W3JN
WXTqOGD2/ZlngqSKV6hML3Ig0efHMy2P/qL1KU4R2j07WhVczWFTuMIfyydO
VhtuZKenPFYsspzGEO4r58qk5WxH+1OF32a3+LTwLFVrOpVC02JRoiGR84Bj
/qrOdc/gDRjlXfUQpeeu1DUTifSSOZt9VM1IuGe+SrraFBinRVYuWKadn+I5
ePDN8tE8754qpC5hT+PkXJWhkeFTeb/VXP8k8pyv1FW4ohbSQ1pkZm2kK1jt
63K9zZsk8xQtmlt9lTU7s2lamZ2cqrK8uv228KuPqw3oaPp+gEDqvmucKHpd
2AH75ObZl8KmpuSsnAyHgxGIdp3rmmlWZilHms4bGzLbbqWfo6YMdMT0+FuY
j9x1hHIrmDC3qNghCjT7rWsnk82RzqpX87xpov+xrBDUcrOj4i/TZUqTfKeZ
rjWn1UcCXp01i2fBCf+hZhc2nh73n2S5j9W5PNetiactlYqAq01Y4JBuV1+q
7l+IgGQKs2GwSy8LwrlYDezEqsKHKRHv9YuRqtaW6MLsi5eN59LT8d6WCHI1
XHVWff4PXTfwVt0gcl0BPFXwKO7nw4VEj9mmvWr3ieQ48/Dz9OnmusjWyVdM
pck63njVJhLvbbWPzve299qn1suXP1tfMLXBkvO86ahDDJp/KnzJez59SC0f
5Evh8yp29vVY7qpdd8l/bulqV2Gn1HLCTMOqpvG18nqB0psS/M0T2dpUxFQt
q2x2vFbAxMCjaQg2mzEZHcn6qk6XZ09dIi8+WK6fAmkunKG4SkKleXK8LgQ8
2YoRjXXWfv2mfbTZtqwvtQxmG0WaP9O9EHuN/EbL9cUPp2BZG3vn1tn56d7R
DpdAC5+4+cv6wc7x6d757uHK+fuT9rK1+PvL6S1nevxVhtmaG2c1zPlBLt69
+uwPzzr50peFRp7XpdLGnstHd00NYPaHhk7khvJBY1/+NO3963Or2RVpZmts
YP07pcqmAlA9ugW86YwQX/e+Nd2UU+tPdFyVT6eyXZ2rys4ELlo83jxvT6Vu
xnD+nchjtkILgTGPSKnHOlxSrSriyHqTjGOm0+dzWKLadlA/QHDZN6bdH8ty
tux4Nn4/N646iKXyCoEaqXzjVnOOLlvzN1aRu5Snlf6tfuJNfftu03Fz/3yX
371rNs0aJk3jyjRwjKYaNNtJa+ebWaPxXtmv+m3nnYt33ylq1yOQmG/W5eoh
zlnwdNFuOiSVylpJTehPZoCj1dqQ+ClLhPKcS/U8nKDb6YLidJeuHDnu6/Wy
2UjBsFt1Bpf90UESVJstxMoeXmhsccFRm32Mj/68rU6IWw6ncHJ9MfIstPQ4
KtV/Tt5sHOxtkvXer/5B/H4q7anfz3v9N29tPH3h9ieCwtyfL396Yuirc7Hh
+7fzp4kdXxfE8PCieSda2jw+Ol/fO6rC63f+LMxt2vTvmt/fMUMjXzVG/+lE
thrM/vxi/2qtz040M5XrZfc0//zyi/uyhsGzSf/i/Drnhv/gdH+/Kv8Fynww
w1adDN6ZJ7rlTUtmi823i3vyRMEj11tuVQ/tTE1jwRgWKiojdWsNsrEeNxvA
GirV+ha3mAsz/2SgexQIng5y3+p9ZgTfi2mzx4c368d1K4JvffnBPGMsWMs8
2dOVxdoZx6i3uXcKs7g6O1JllPqlGfXab6dsNScXN0tM72Ikh+YxIvI2MFC6
qls2D1xXPwWOW7VuCKR5jFcWplJ57jXX5vkvU32pN90PzMPMBhNWRRwpKWxu
rs8qFPOP07dSKcPOHrJ86uL5h4CbRYJLNVzZ3NqdXtda2PjXkCfzwovpcxRP
DKDe2p+B8zvmYdO6CNo8xtqkqtb25LdOqa47K8fXqjeQB+yk4jF75VHzVNts
rC/naHBr+hgZWbp+xq16kC2vn/BpFGWqKaYxQ1+mT9u15PUIhjPMCjn1Ip20
d92Xp3XqplRhnhsCHdzoVvVwyOLrJeYrjiYdjueeyW626dTvpzA1uIorNS8/
mZWEWq0zwMjcw7nI08iwqB4DtxarR9KsKY09WepJHzX/t4pUraXz461jeY6k
fmKzfjnDoHjeFOHliXnZBPhF3vzy9Wujd7OLetq9PBEza3h585zeFg+dmO5W
rIP2+v5sRA8OPLxi2tD8saal3eOjhYbmfn9wftrM3KGqFeFjEjaFqS43bHlQ
vbtA7GHu6TlTpG8tyHN5UZjLD96uU/WxKrtUqzf+fP1qXhiyfrT+OGaZesPD
Z6Jkh7wux+XaSF/Kg1Ej8/IAfSvEc2TCqqj92bTEN+NU5bNWdc/IbHd9K5jZ
7GSs6OnPVhXgXsjLncxzRqEfKWtpKIBYP+eO6n1SLxv3a1lHC9sh5QD2Mt07
Kb8Pr6fbLM3117NrpS5jfusP+O20sTZzaGHKrdbC+w/G/4A4zg/OWkdKAoN5
A6C1hFLOqpJRc+y51QhnWZ6LNFutL5v7zVaRnFhStha2l4f1c7SiPxMR/wGp
bulq952pVcxLd4uGV473zcH3RkT1q9V0bo4d/S2xyfKk/GTOzb030YTq6Yts
5qIrku70q+TYLJpVVLNn3vRlqmCq7DtflyuL7ZSN/GuiWJrXackCT7WqM4cV
lo73tp5Pm20anDt/vsH5qrzUmpOJDBa2vsIdFQAxDwfLm5Se1e/dSVV2bZxo
saov8eekfmlFtbtb3hqlrV+qZ9X2O+Nfl6ZvW5SHcCVArsorGMzb/dYaOZrW
1qrN4ted8Zp5p2KvyyiQ2F31qLH0tVl1sjMYXHb1j6X1y4ZBdGdnB7N+6nc5
SvOX5rq11FxUlt21tDtI5YWT/bXqxQ96jQH15YzpcfXK9LIzqLqZvaRQutrc
O918upvZKwvXss4o664NJ93umh85z6t2ftnudDs4wpM3c25wNhiPOwy0mbEZ
xemkHNf3z14xOSqfbGQ0uRyszV/1vDV9OO3lbFm4SleDrjxo9nHFtj/OP+E2
nr7yqXo5iDXu9Or3zljWLfDDLMiY8cjQ6teA3q1Ir08OanbVmmCAtfFIM0Ul
AWStuq2Rz/GIMTzZxkDOrIzK6ofnYoKHkhP6ekVeT1M9hb3w6sUvP5ytyJGv
c/XiZjNQtXd3Ko7myaTZW5Fm+XihUQlIJ/fjK9kc1CyRq8VL/q3avzR7JVX1
9hwpL71sdcYPXhOQw/8H9wZ/rnTK+g0Bgnuum/cDzJYpwJeSFkeTviikAjSV
tQ6r1Ze/IpR366fCzr41uhlwrMap5kZqBHlPG4srdqv1Q5GllCzME5TTN75M
5B0o1QP3UrpphtU8sl5NodL8lqAsCUgGglcoeHhvng0rZru2VuU5MrNK3u0u
S/utH2gOMt4ZNoe5qwoPucFtpomWLDJKwRwApsqs02l+l+c0up10et74VfNL
FU5ai9sq09GzZ88eccs/r649Orb2n39+cIw7V+sXlyylP/65/+Oylf744/O5
Y1Z9qCUvgQAhymPCS7P+n1s//2yFzblmMqtX+k5eefXwwvTH+W2bP7a++8BC
s79s4aGFWjyr5ZW61n8xTy/Idat55xKpLlWrcT8n4fN6Y6vZryNbeowc66cT
5h9KCP1fl+uTpspTmhgmN5fXTz+VIM3KmUoZqxdLXLjc/NZsWJvbyG2GYHb8
mA1LF08+k9Cs/c0mPSduc1Tk57n1yB62+Z0tUHLvwoA4YG4Ec0xHM7dRyexT
MtuUTPsX9XDqu+fk7xnxTw2KO60Xc79dzP1GW3O/yXhnvy1sObasqSrrZzf+
1u7DBUHpqaRC/+G54bU5YaBmbRsPdy02mn24bVE2Lj6xb7Ga15wh6CcNQUTx
8CKRa92CkffMQpnvktHq3E7Fbxnog82LjzS3oHazP1GUzunW97bZLUgtG1dS
E7z+0Cqv521S2n6wx66Rz8NNdr/TgK+b2c6ExEVLpg0jvm8I57GPMpwFmXxX
dn+tV+OaNn5nxjI3/fdlrKEwh59+ohdACClBub5VGXcYtFpifJIZfvzznZ38
iM7NT/aPP3lOpfpcS3ZfSstF7y4nPY790vnV+vd/t+KfOibRdczT/rKKbB7S
sP53azjfyJl5xHSpsZ1UjFLed75U64327F+tPzBcP24OeI454rjR/JH/Y+q2
9XBmo6yKd9oaFZk8rGn91/8MVs0YLqqndB/Z7YJtzh2fNMfNCdmh8WAW5vhk
epwbzJE7Rzyb/71l6zP/fubf8laJGibLFif52zY/2FXTBiLMJIeilq0VR/6f
vneb/mVb8dK19cc/WvjZHyxnFj+l7f/8mSumhzpF3SOCmzVhBufJ4Iy5ywgX
zn02A+ZcNerFDkz700PrpgWs5bM7OyYHl9Z/Wq/03hzeqC5dmb90Qw4ubfy0
sXipGCKtrHB+emxTbvekp9mAtqpjKwvHTO9bD3vfND1tPuzpTgg0t7zggsWD
S/z9Ez8uXv+5vn5l/vrP1fUO13/2zF8POnGNQNY5tfGgfyPmpTZn5PwLa0mc
8ierba5qHOfbmvyWFivFiQaNKluNh5hxunQwHNwuyUXDFfnr+WxQtRuZjeJL
S3ILhoZbi6lJ5HjCu2dhr46qTdSrPh9QVu/trd/CJa8eWzN/y3X1ndb53NsT
LH6tq4UGUNZPIM9fYXZ2jvTK7B2e04euqo2o9QDM3iv5ExVJ5qbK13FcxG6U
h05o+0FgR6EdxIGn88hLYzvxilAXaRbHOnVUqFVWqJAjbtgqr/817QzlBQba
db0w9QIVZ66feknq2Eo5nuupJFSJkyg303kc+7Ydep6KUjtyPIf/i8zxUzcN
UifJisyTzZUqKJSjEjfzk0IE4Gm7yD07D1MndJwsUWkSekEe2XEYuZHy0yh3
ndzzXd/XYZiENOQEqZfSlKsipuAmReikdhKmbhRpZXuRF3t+lKgwDYIw15Hr
OYWmnUIlNM8EMjtMEmXbTqwCN/AkGttOKnNO7CBTsRMGkaeDULm5q+0w0kka
uXEUeF7KpFXiRUDllFaV76fyNkQfcSYJIpLQZtuer7Tn6BC5OJHt+mg5Sb0s
yLwkDv04SArtpH6WRE6k7CjzbD8J0rxIk1jZDMvNsiIIM5py3DjMdBHYvkOP
2st8n9mHKafdLPJpyoltF8XkcZokvh3GtkpzL1ZOEAVF7kZpEOfKFijopYXK
PJch0F8cMgfEEGSOQuFxEqc0YntZFsapxjw8P9TaVgWzCr3QdX3l+HGmXCXb
lZVj+6HnoKzIRvZJik4iO9PoIo58dBRnfhbaKlG6QBh2FiXIXOvMd1WQeyHy
LQI/ME1pjCihNzv1VJZ6oj8OoX3tK7QbxmGukJqKvSTK7FirIgnj2HUwLe0X
UapyP1e+oLbUDmxHMyaMutCRZwdeFke2g+WHoZN5no3OC838cu07vsImlcIh
aNlNPTp1dKKYhojdDoI4il3fzlRuF76dBwXCz4s4QMdAmyTSrkpEAV7opW5s
IxtV5IETZrkb2IErug4laQS+l7mBEzGdLLd1aOsM3wg920ZsvhvgFC5mixHp
yBHfUqk4Ja6RaDQUhliEFxjAkARBksR5FKbicypOAzunpUD5eaQw0tR3cwzD
93Pm6gcRclWx7cNC0StXJC4hgJHQVM783EjHLmPnb9CUikNUXKR5EoaoRpwg
cjPb94vYSzM7jzMbi41DF+0GKJ8LIiWVp9hNMLvC8YIYU0GFnkcLmfLpANko
D1dNXTsOIiJRqkKVYbrMOwqDxI18DymkWug+JupEkeNnqe/gAmmUugVxJSB8
+IUdOgH2jxdkeZIp4pcb5piGnYYBhkjoKHTgFgTPWIms4kg7vu+HrgrzVBzW
jfEiri4K4g79ERkSwht6zXHCoghczCfCNokHxIQ4tIsgNq9u91IcOUtCbNSX
4cdYFO6DMkLfxqBdW/lhhP3mbux7Toy1BYmXO+glTW0ML9DEklgwIC6VhYSz
OCbcFZhXVKQRNhc5bhp7ca7RbEboSwvm7KdZEdpenGWp9jxicxE4KsBuY5lg
oRPbjr0scUS1ue/lKM8JCrw0tDO3yInetooV/qHy0NcBzpemcRzhRTrVpASG
FUdi7bFKMIw8c5lpmmhsmFAXRbFDA46fJFmIWzEO1ykA3pmb5BLtoiTGYBVm
RcOqyGzRoB0wbK2JdoGPTrI0wVC90M9D1w8xap/QpjHHkNCcZH6QxahYJy6e
GQWIjGiWMadAYju/kVmQj2NHkevTLVElVTosiFKuW2DbDpP1fC8pYmzQswmB
bpwTyQj1iU8U1L4JfYEmfZDncj8OCw9VF4ld2LEd5eS7vMgxbuxDJ4FfOMTI
gPSQ2TYBzXcUSRJrsDVGLKOKUpJSwtWJrbJAI4RYk4NsEoaDDTppEOW0nChF
lMFl+JsIS+zkPyJmFhYRVhwJ7CHCMt+kSOMsx4sJ/mEhXpYTtkPfydBzihaI
i4njMNlUixUmrkpjskeakhu8JDBNIVQnyQsHV/WDmLYYrEShIikkgjhhFGPr
KCLXxFTfITVlcR5KwEwxZhtPzB0vTCpjwCcDO3HiIE8Tx9WuRgMpaZB8bkCA
G2UkLmBE4otbKFKG7Xm4N7kceaV4aGKiaEFcZzh4QYDMRJHKcVUOuUGiHjZJ
kwTvDILEdYHG6HzNXeiRedvYmcZIxNpzYlBMCHAy38OkGRtjYRAeHggGybzY
ASQ4AdkTQ/F1EiEfOs6Vi0qUQ6AjWCRiDBg4xlZgw27kAQmIfyRNbBITi7WX
k4sN4iC6y7DDnERPImfgES4oUY18D1CRUZHZFDMgHebkFAK5nYARSIkIxclR
g2PHRWGnBdaHZSuNXIvUlfgXJo7vgLqKyMCPhHEHMfKN8sB1Y1e+DaQxulwG
WiDfwsGkBY6AKIAPEQ6AlWa2l+sglZicgEiMteui8OIELJTjaknskwls/BY5
SVgiwXhuDsgikGUyWdu3dREKCDKlGAl4WepoLUHBtv008RxwAUNQWoMo0DaB
RZAPgUjH2BSAgjjjaE9cOSAxYn8ELRPwkKqX461pnLuh7YQkYOUWUQDGc0Ia
IJH6WBomS9rUofK9gEyRuq1MCCExUSlkkUv8IJQQ7picBgxiD4yx8ByXsEyG
tcnbAc5IRsFpGWyEeEnuXkGAMUIhm5ObA4++8ZscrcXAFdsn3GqbvK2ICGEA
yGS8+GJUxGmhGYBTSEpwsAcFshLxACfTjKzjAsqUBKQiVoXvu2EQuL4Ew8R2
NRkRYWERTpYT4FOskLgekbfxNMf3tBK/VXbmg9NCT3NDYgPaMgkjOeixYMZF
5JIBwA0SubOMpKsJtTZ5MPSJYsQBoB7gyowKg3VISR4Ii6OYCtpJ8ZY0sn1N
L4RkPDctbAyYPB1j+XSH/uOc5I9xx7HKIsnoLvkm8fPEy7zIxv5zyXf0DxLl
gIPy/RyL8lzE5dGHcrUgsjQ0sMrJCtcuQpxaYpyPbWJi4D1lS7YgApC8AwOA
UnAVQmQGEfjEU0WqIkFomF4O9HCcGPMnXjAymaCdA5XiTG7OSB2gN1I2cRXz
TLSbEZAdAozkL5A5YZ35prkPAhekkGIKZJTIWCVwLI0Th15lTGlOgsnBMDhL
gNMxo4JYDBjjRo9QjCnj1EryGdCG2FD4CRLWgYF3MAzgPzNH0MCDgvBKLCsI
jeT6OHKDnLBmS7sgvEyHmqgM4IndXBIlUY8UX4jYM8HcaUFAxmrAHoRoH5BO
AkXEvgTGBPgTKPKOI/aZpCQg8i34jlMK546IN67wIkCXBtdD6SSNeMQ3vBWk
Q0aDCAp2Ksj4gWCiROw0B3JFGJSnvDwhHMB9Afix5AMJhr4di38B5GF4jo4F
rkQC8zBAIj8aKlCei7CRF0PlBkEcMXZN2CgIyrGYqB/BgWgihqABKYGACkJF
iynxEChC7MBaAnRAWInCKI3Iq6iJhI4AgRtuBPfR8vI5aAs4nBwWw9mIJ04g
ZBIcnRsOCK0LkFvg2HBCcpLLv34EflHQMCwuEICeEqBFg5g6SvEjomYGoAgS
EjYJAoblQ2vgtYhVICIOCEgW1aDBrCD7CMgkloDqEk+CTJREISr1Sf954nKP
n0RwhlhAOAaD/9tgtTRC7AVBXS4kxIM3ET4y8WGxhAjzsSw3j0iisJsQBkj2
jWxhpCBBshpQSttEFQ2+D4jsMQQ6JbJEQYhZB5q2YT0wS+CNpGG0AylIbRw8
IbeQuDMbg4FIevgb6ZIYhWPZWF8G0hFTi2BGBQxA3B1eE3GnOE6mYY4xpANy
Aqgn/weC2RxXrIyohafiRqRBIoSgltgBPxCbCckZ+RXWQWZMErH2PM01WS4k
l5GJEU8EiUmgMo4YbYaKUESEZBMfIhjoVAGpMhdIDAMhVoBrATSF+KATF/gV
fhkJf83IsAHKTjF7GKlIDbZuh/gEc4LIkdBy3DLFiXGEDAvNoMyFDo3YbQRA
SLXhQQRsZeMSwnxcl8gLBGaIDNCFxARoMYIP29A0jBJaQb7A1LwgCmWCdkwu
cJGczD6NgQ+gjIRoQOYF38NmtWu7pCxirwM891LYnABb4k8s0S0XtJBKmggA
/6g7QwmpxF3iCD6RAa5IZ46PReHZSsAhzF5lwH+SO/TROCDD8MgsWI00Bb3C
VbHrTIQDZyLfBRAWQfekcheGKe5fZA5sPRFkTJrEcVOAO2w4kYSDtMREAfk+
p7DiAASJUIHjQApYdCY+B8mAP4BPAuIfbCQFoaVwOxRJJCbgF7pwJPiJrELm
hlGBYW0CdxZgA0L7PCh+5kIJCHeen/kK7YP7NNkbUp8Js0anYSKsLA1MvAJ1
R0CvJCCS6sSH5QB5wAc5YAZuCjAIC3K/oKUoAtWK+YPvPAidrwWKI9KERCFQ
GDfHG/OceB1rVOMkcAVYIhCWhBBpwSVERpJJbtyS8JrlsQC8OMDrdAKud01t
guDigBoLFOdIk0BfmDiWAsjEDoBkBa7kBzaqghWhoUijPGwRsEOaJQ0w8lw0
CP9JXe0ErbLaRU70LgCqyCUubNGY5EIXdCSlrAjEJ3YKb8xwUOG1TuEIIM1A
qB4M0G/NSo6EG3hjXighQYRPXcCkUhQPWQM6kVMTrBmv0Q6pIM0cDBmGRNoQ
NERgrkuO/3Q7puRIZiHfBwDGgFQDto/FtX0perkgCXIMKEL8N7TBJ8JaYN++
bTtSfcPlMqgBOUPQNWInGsBTwFEJoQKYghQIH4AzmoZAyNg0MZJUAAfH4mD2
Nh2nToHCGXcIYRRT9dGHIwZUUXv8x8WnYi1YKLExWtwGG+M/8CnpmIAYJaR2
j7ARwgFTQjE2baoBENgEWmpL1cfJJep5YWBDl0ISGHdgr7mDZlPzTw6kogvG
HQSYkQeiZbpxIkZReEQxhVMDTBg2YEvMNbTdAtGTGoQawLOQGS0BYJUUZbSb
QJjIiposInZpgg1YFYrrZ6K6CBbP5PA90K2DPoBmvuPm/ByBsEmChOmYtBFk
GFjg4iuhhDBYoPhiARLzhPGnKdlZgBqEREnoy8NEoAh5HjcJPAmMRPxEE0zy
FP7tgn+BkOIbhDSJW4R+EDyR2/fJjARaph/jKQRPAUQA8AiUAQLDETIvSTyo
YSSlaiGHgrCJwLGJEAr5gxsZHLRDMoYLhAEPB4BeQFfGAMl9Uswl52IkNrgb
LEdG8wDPaD4IowhFGF8k1vphzFSAM2GSkVNB0pBA6KIfyZct6Y14SOgC0UAm
mRPDUjFAHPYgFDb3g6qUTb4n3SGURBA5AkhDpkS+Yk4hNAf2CUVPAI6+FEPh
GRk0xvWJiwDSJLKLCK4vTbmYbOJKEQ/4kdAkwBH6CTJykQPpjdyXSp2eRv0w
iiHIUC+CMXncE7aDCoE8wt/o1wlymUGuuCqOgEA2MIkMwXBJ36DFVIpgfpaK
XovcAWGKU6GZHJeBrZLhxBjAobgF1IwsAvYJAo2FSuESu8xJz3AUFyaBESRC
7gE9oAA8wk8dpAbpihFjbModMK44Jc3CXQtCpEALsAH4E0VHoQNrCYkK0FDS
C5HaQfzEJIdAn8eEUhAitDuVyICRCNQWfAVog46A9Z0E/gbVkdI/M0cocHNy
G0laKsKYFAggAYPTJFiTxOxLNUDFBBLYIsov3KrwCMpImatChK5GikkhdR74
kYBrO4UTa2I2zgV2Bdg72JOx9tyTLIEhpkiUGGTndgoUjeKY6KNd2AVIEzAt
5UhiWwFAAQ3B2qD9EA7kB0MLTWpFX34qFBRK5KWRZAT6VQAmMExc+C641LET
oWDkQuFuHuk3iQuHICJLMi4uHRtZFeD6DIZD0HHFqkOoIJ7tg0MZGtw+Ra65
cPkCHEnQlhqR3B0AcNAjXgaNSJWpP0sNG4yDowYuY4IfCqLGixJyAFEdYIGT
uaRwTDfGgpXrkh+ZjAoUxAEMG4YmXpG7ETbsOICSkFHyFNMEfTNXBaaX2pJw
KeiXSoGryNB2sLckiATzh4ErhD/IjDHQC1bqZQL8IF8ebfC/lBUB85BLwm2I
wyY+URtGjw/SHzTflyCAWgtgjynPuqRwpVAjtDGWgo6C56c4bUgeAqz5UeRj
0HgAySGWUggxJfOgaBxMcrioHSiylSQvhQ2S26FLkBHxZuAYXD4QmB4qJhiB
nGV1hGyIl6AxFAkspNOcy0BWWFXkmjSROKQbMCxiIBshS2hzJLzYhggCRpCQ
J4QRxAje0yRcKZXKWg8hBRrv4gWmoOKK9xJvcjIW8scn4FV2JvAd3xd6E0gJ
G4UX5C6sD6DIzQXTj4Dr4BMnR8sGshHqmT1G72YR2cAVjBkCBDAE7rPxkAjn
Jn0IEcRASSXcnGAlwhBBnkWCIYnYA1f7YGwNFABlkUPAF7hM4QEmXQw1poMc
qk4Oi9EM6o4hQihcEiH8hNBPKrKl7O/LYoUAJdIJMd8DVOWkyDDLTekyCqRU
o3B9oVfQVkcqNgm2KAUrImygNFgyMmxVlBwUoHsiEiYZF7RAnpcI6sjCDagh
JM9wpytrhARjOxL85tjYviOYhwSlDJDMJLgT5LAn+AKOGAvMjqUwiocnimQn
i4REN4h6SJqDWHtA3NhUqMS5GLKBHxXP4mpYNz8DC8BoKeYisBPsmGuwgaA1
2A0kQOofDAmshdEDz2FukdTVJXllKZyF8EDkIBfgcERiOEwAq0RyiRvCprQU
CRFgHPseooiJH+605OhEUiYjm+fcLNSbbODLSmGWSXGxsMmaWZ4UYDSSalJI
4ghioIovVTkYi9aR1kWN9exCqFIIvHfA+iGQJZHFVYiDEAyIdpw6CTpzyAo6
lXY8N69KjlkiiyDwUZfkSxxM0hTgDLdRioQJEZA4IAaGlTNgz4u0rFL42AdB
VIHwSWdeteCakAtldRXCifNzGUFEOcKmSenYU0YiR/lgIZkzgROZYDqZ1DSQ
qAJ7+bkrXBKeAuEhySUaIIrdupKUyYAqyyUzSamEISdSFtG2b8Tmiy1C42x6
xksZrVctbcayMk0si/AGmEQkC5L4tMjBy1NPQxR1JnEd/y40NBTaR7IDb+KK
BWgvDJThkoHtMkpoKLmTSO1C6IkWRDxiI1ICqyH/golKmskwNDmRiF6JizAo
QhQOZAuFL+iTwI3bSHGXbAV8wgwiMrOOgKkO4Ah1AsxCKYZFsrwbyZ6AKIZC
ZkQ3mEEcVvonGKsQwCXL9BkYKSPr59oXW00wajzTBg7DSmDFiSQYjJlYkQOX
HEZH0kVzvvFbsqn2FCReloNxTdCGdgtypw3GYAowcACLlO4FZ8OZEbZDZpFS
bOymGDp+Z/IBDk/+y6VMgqVC7YMIiAfdREJJKGU12ZCAoqB5UqaJ8FJ+IriD
YHIIHkDNLyQwaQVKBCMCLmKiuBFlLKg81kzKCdAubZPxslDoEi7ohjYsytZR
CuCENEC5ck+ZGgXjF+MD0gHoYNtEanwJDhwJEyPSFRBeoitEIFKRL0kCD4Uy
CRgjSsN5CRpioqGU6nMbBgxMSn3bSwSAFi40JtfMwUc4tBPktlQYGJwm7Qdg
u1SqIEUKCpP8IxMkwSJam9CA2yAFWGMSkxeVZE5PCoVcqjFK8YlQMhTxF5+H
igCIE/JRmgOHjTEkov6CPhyAF3ZCRg6RQk4IIKrK0qQNJwNCxUCaSLBAIpUC
WT3ISJvgNxvjlgkibjc2H51KorigC1kZyhQjjUCVYQbVgqrHuZIiJtiNEWdK
uwSYVAkVIFqQMlKzbgSblc0oQHACuw6BlXiZGyZpLKQsF08ApOLPUUpaBAqj
WSnRxVJ3D3PZGhNFRlaBAJhQ1i1jKRC4MB1cBWtwAFSyVyEjLxcIChuWOowi
ViqHVJxLnSSNyRu2rtY1iAAwZ/I3VxSRG8iyuA2gK7RkJQRka2AXwclBj45D
MkfwxtYkWSFwD+SpRFaykYLQitcGkagiSm3uxc1SW7ggtKUAlIL2fdmKQ0Sy
8Rq/krCQMhgsycMsA/tFUWEhN5VCPqDK9jFUTCSR9CAbmjJZftRKVlPdTEoj
Um33MWIfy8baY8BRWtVz8FPRHzCyCKGMuCJBNZBCfyB1YAGkAAUIJTQVWAwo
KJwEIAEWVbTsO2A+sStP4IAnW3hkFwVAEl9jFoQeB2aSgydSLxKKCdOOhfdC
3gCCkHqli8whxUimCI3j4GEe7DVKCpKZS3wAtSbCJjWYNkd9hLzEAVkGGTkD
Hg68JsOkKMZ1IDm4NXjVAHSCk0QfsfNIllUcMjBcU5CrxGf6VuQM2d9QwM/A
j1AXj5TtCsiS5T78oqo/A7BCbBuUXESJFNAD2Y3g4e4FsFjF2iyuYQDEPsG8
spJrS47FPwClhKissMGzYgy4gZEsDCDG2n0pDgFaiszwO1AvApLCgXAeApN0
5WIgmamyBAGE3APwi9jxmCKWIohNLCwwSdk/AxAi4+pUFQ6B0tQkwhzSBqOO
yaFgYNkwkksZmWSGDCKzBgQoC7S4f0hOJZEWBC7ucZAhyQA8hkH5iJ1YJSAp
xrME/UNmbOEhYCM4QiwmSlQKab+wsSK/gIdEQjVkywPMk3SVmVW3hHhXgKdB
SZHsHvKA4FFi44VAKkdKSmIMLpQ2Q0dS74JrI3j4KVlM+vaVlFgLXSQI0Qa8
MT5G79o5vkPXvsK6BfKYlCq70LBhqaQ4MbGZJJ4yMS1R3bVhtpgwxqR9iJvW
YcFYkzglPYIEiQLAareQbWwm42D3hOem5FhA05kdeJbwKzGAvACCxegjGLED
noJPoDEoVCAylpVGH4AuOz5IuvZcyVEXsgkxlvVhVAsLcDXYiHCd+oXCumTp
jUwAS4WVy0YJO89lKxkIx+aHpCk5/tPtmJIjvuALphB+C5ALXaZIeBIcBQmI
hTTCKJQS2wJnQHQwroDIikaYIVhRvC4xvBvGGYGDIJCIn4wYy5InNzOoFOYj
VU9sLgWxQc4CKYnKppowkpJxREhEbmFmUit2BOsjOQPECtQTAMVSRaAgviZm
0mgvIdO6sZTbYL65wywholLbxjbhEY5ral+COUgTXMp9UmqEMfqR5CcoRCor
8GR1lEVWkYFLQvYALZmsLWVSzk1kkVYZskw+zmSvEY4L3AqkEEAmzQVfyHJN
nsiKSAAzALDEUg2wM0Ex5Ku0KGgfUABtSc3CoCeLCzgU5Aog6ueZzkgwsogD
HxVqK/v+EmJdmqeScUSSKUgVzyVZIzkEn5p1M7CrwB3b1BxoBU1BqfNEcjXJ
iIgGaohsp4jiXGzD6CEADZCvbFCXsCtkIdE0i/F0H9CPziBAQSx00VNcGfpa
2KjsgWV+eV5oBoeDS43TcVJCRZwGoWx2AwWaLRlcKwV+crCLAgPZWqME9UhV
D5oN1LYZLGYAl1QChGIgOZlcqmo+fAHIZ5utPoVU2ODs5FEdgewDEBmuDCcj
vhJBI+CMlDGTDOJFziYjZuTP3FfAnxgeX4CqqmVwYmOSyt4Owo8mqsWhzqUK
ihFmkdlamggAS+1Ye5IjUIsrsJpIEstOEAK5SnxTciSuyzjDgs4YPKkeqCTc
LJPvxCJ8UEYqlTHHi1wRpx/JUqFrNgHAWLxCCqLKMcvgmEtqk7yknq8JYlqD
gpFsmklVBiOJZG8w1BWagEJ17sqOQYFqnip82VwJLTPbK0BFkZB9AXsxMF+K
10rYuuxlBRfi3VInEZZok6XiMMQTpVSDVWGSyFB2hUgSczypEmg/lRoeYUEW
ZV2boUHuYk+WElE8YSbIElXEYNIi9F3JgIGnJKXRUwLHMvVnR+oYImcIGkEx
KOwcYWGOZC7ShCmLeIAePwJOcSP8yheMGwrD89KU2+Nq35ewPVvWaVPJhU7o
FgUZAfPJjRViqRg1yQouH2kIO36FrYSZLGgAw8hEUuM35dmscOMI9ORD0wop
lEUCGsCaslonXmfbAfzLD2UnA7GsiGWdymOI4EACUQjLwLxFg6G4gytMWpb4
zWJlJDGQSwLgmmdzl+zuJXgwIaGMZLRc8o/sjYkzDw/IHbOVGo+A8EP3paIr
US+XEyoEUgdSryaWIGLIRJSR8n3SVyrhEUZGpNZ2LNYKzjDrscSxCFhJMEVr
gZuJK4duFkp5EfbnMR34JWFDdicqjeWA3cjUrqzd2FAdnMM3W15TGGREAIE5
FwFRBdcXSuwyGIUUMFlCaCyb3E0OwZcdgYbQH3JJFiipeOvAYFJZ8QfvAr0E
xLgRLAJPdl1Yq7Aj3xWOLVBAyRaemIhC3x62RhyRxOULRyBfyASDQPhjIWU/
Kd0R9xPJDamMEB4olQiwuBdzH+FXKkNSyM1kJy1zRZZYfpKkhgrIehN2Ixuw
4HgwHj+UDb4RRuVLRZ3JAGgFf2SuJ3vXFMwWkhNGKgehkavw0Misa/j4LsAC
RUAwQPE5DMITIO9j7UkKKioKFyINagP+h8pBiIWXuVDnVFbNc0GxieE64nKG
r2G58ixCKFszZOUpCDzQaCig1U3gd5HsHpJNl7JvUDbixjJKW0J8YJZIEtkc
jeyRXS5xCUQp8UiTTGyyNcQehxTeEeGhqNZHo7nvSE3Z84XUBMzGFZxFnID9
kVXNrn/ofm7nsrHSLjAhpEgicAljBHUoBQwVH/VkqRLSQdgH4DpFAsAzK+qB
7AmRRaKYGRYMNxWcCanD5qUQhyAxF9AeuYzoLPVGzBJ2Fnr4VeQwQym1CsV0
bCJTasMmZInclaqV7URhTC5PHNmbw/DdgqYIyditsBgl0CPEzmLZAiwaMzvY
U4CAqZXJZlCyL3AXK8BGAyIS/SNrZcv2J9kLJOkNoOBq2dElG0B9qWomsFsR
uy/lZpdRoEah2eTIAHHRvmHKWQFog4HIgr7U+EhvXJ/7kQa5E7FzrgSRGsxA
2sZjRH0FAckW7i2UMSkkuWbgLdmdo4TmOSE5s5ASLbNzpiVHrD0BGceM2iXs
ZwQoEFHiSfGfMCrPeiTEHpSap/KAA0kykKcNiGIM0QHL2ykxxWyBlzU/YIcv
pXWUBw4m23mFlAsKUHRKeiP9J7LrD6ydyopzRGKtSo527mqpeBcOFoIUfISF
MuhckZZFulpop5iu7AeBShcCacBi2ityIHYKY0rMdrsoIP8pyVHQMEg+LFYW
1kICAZA3yxNNCogVBpZL3LSllOAyjwLPZuJCve0EHzNASvapgdMA0jH+mPvg
ZlkelzVb9ODhALIw7EPNGYHUzSRf0miGk+ShcGj8x5Q7UtmfE3oJHEeRdVKA
Cfbh5PgJRphLrC5c2TrG74lHLoHqIrNc1kETjVpxvMg85KgdncqjI8KdHLwo
IoW4EZoBahB5lAOqQ19SCvJIgBhUngLa4hjUgHclQN5CQrepXuZEVSHnAHYl
y49m8zBWJdlaniLKZasezN1LQikfubSUyYKOCqUICxj2BamK/kmyYJpCwXag
FYHrBGg5iNCfeI0tdTh5SCdiOmkie31gIRrmGpqVN3AjplNU26LoR0tZOdfC
jAMSi/gjgVBBnGNMPZRHkpACYR4l2LLUp5kLGUMQFVZP4jErNPBBqYI4UaBj
KaEBAyFnGBAsWAC4VHnI6lo2ERLnQRxBISsnskQHMcmFiYoFmYV8KDceoUjs
sAcfFeTotCDLZbI+7mXK90nBIGEQrmIoeGyMloEtBtoBvoghofEVkLk8j0Jn
9BAXXii7WTFUMqks3XpgKSiDFiaSCjElxwGnyMNCjrBjeXghN4vTymzN8D1Z
uoQkO6kjZUp83wbnueQF2AZ+pMwShidlY3Il7pBAwoOMvrmk2h6MPQEevFAw
N4PwHdm3H8JnnNTs60q8AgXA7YEpUpMR8yQ2pVkOn3DA/mbLamqMATeWfW5Z
IFtYI35JtFSEyZ4MwhfGnBV4DCYHlHQESmlh7yGIU56pgZzJAqSMCmJt9rhB
GCLZVa/liS0l2SaI5aELT5Cg5wTCGBAcWBXdkszIxTQE5AUtJImJvApVoTEC
FXIiAkHOkaQ8gAZFJ7ZHwnBD4pysPOQpSUqsVypLgPOExJADliODX6NCqGcR
yBNtso4YOFgOIC+WLYO4B0Ah0zCUOJX9AC66zCRMaPrnkGzdkM2B2jwu4hU+
vBeh4lmA3Vi2mwgng0QzOCwtkh2niTz7EtuesCYZMk4NlnWIIEUMcaxWECJM
GTYGN48xQ9mXnZNMwN6AHygSWZPIBdP3nIQxykM+5L6EX2W3H/DMCeVhDrNT
gaAEEtSyjxvcI/End23Zep4K9mEiwA0irQP+BbwXGLvsgkY6EgHRn9CsMBX8
6mNPRAAYJQ5WAG1C+FoiCzTEWtm64BDLfBXKUxqxLQ94qFD2//iyXwmDJGhp
YqJMUMOsCMiO4BmVeDH/Ef8dm+iRSsKgU0A44ZmkL5tSZY3DxgVsQpZwKmIS
hmrWNaSiQSRAo8QRwg3hF5EAHDTmaQoZPsZAEpVHlwBg6CUMc66XZ6MwSdwP
FzW7hWQlh99yM+0slUwN94aW54nUGmRBtwCEJcwuLHyommy2im0wuGyKIMMj
ZN83+ydCm3xSyJKrL8tYELMkwU0FIfriO/Aswokjm1TxlEweSskJuvJkEKgI
LeHV6FcmqFxZaoZRyA4CobQx3sjtsUs6xeeyDONIBe2DRqROkeeywTQqCIYJ
wNXHUPPYMYtcqSz6ZIDQVENX/UxL3RP4BIgKUD15FZtLY9nU78gB+CeBAi1I
UQRKBKIiARsyE4ay2gcZhTt4kul9j1wFrik0aM4LQX1R6CayhmS2gPt2CkzI
BaCTivB6+FlqsjNDwGvDXJgRzkPvWhZrTMgnUBbCdAn4OpN6ZIr32YhfHgsg
V8gziDahE3po6oQZYN8W1yX32wURRqexqYKiaXwOcdhgWKTI7ZEUM2OgNUQy
lPgX5zqT6oDZG5dhl5IbHIiJ7AaTfce5Jqpg2KALLeuLEE5HmfK9y0DBMZi3
DSzFw3BJCXaRMQapFHie35Qck4A8ggHFsldDHtHJpbydEwEK0r7s0YSYSOFL
HlGVWraoEzQpm6kQbdGaPrfdvlPyTgp5e8Vk7gX91Ws8Zy+Hb7410bwcdvqS
yQcfNDZPes+/DMr6KFzuf/2P/9spPq7W3a7In432zt6RdXK693b9XF5K+N4c
bR1uvd5cf71+u/X6/cH+7fuNjfWdraDjbtzvDtp76+sb65eH7Y3X73c316/3
N29vj7Yu49ft073z7Y0377bvLj+0dq7KbPfUL6pe2kdbj/swg3g0EvMm4LmB
7O21na31o43LcrRx2W6vvz/pHbzf3dOXx5sbh+311Hn9qnM5OP6wsb3z/s14
+P5geOnurCfvb053X6jxq1aPfK9ep4evDzau3J2j/ZNB53V6f/Xq3XHe3t1P
d19lkyB79c77cDfc2XfVxr3+8H4zuj96f7D96kVvvddqt49vJuGbm73t4eX+
1tXem7fdT97nTN186h0dEqJPzibgs+OTD/7R1f7a1e32iQ52Bl17vffGvig+
BK2j9dPPdna+kQ+uJhednh9vd6Ji9+h8u3dVrjm3Uejf9nYP1l9l+yrbufm8
fRacH1xNdo/fR8Pf0t+6WWu43d7wr+4iu317d/JpR8XX2xtRsj8+bW9/epUO
Tz58aB8nSWe9v7V5Hrc/3awfnxx1J0fZ2aeTvfVyZ7/l3Bznw4Mz331/f+AE
6+PLcCMabh+/+2APL19t3Y+uX1yeuOnuXu4duZ+y26M0bL/1e8fnlwf9nZv+
1V7r5vTo/W87p7fHl28c+8Pg5PLdYdh1B/vt7XEv6lzlW8mrt+Hm7dbhh1fF
a//YBfBeRe7mhz1ncNDbffVb693+p3w97fjd7k5xfXVqT7zbN5P7ve6+c3vT
Pnp9dlr27k/6H9pXr476yZudqwv3OL4eDIKJd7N7cqvd1ofs7N3Effv+/uT0
TUdlk7uD0dHRcX+7e3gIIst+i7fO3oZ7461rVfaCrY0tb/T+VH++/hBs3x3u
3KlRa//4NPEu9tz3/tvdD1fXNxh1Obz9FOmd+6S8vb4PBvf7R7c3J+Vub2uw
cbD1qjc5j8L3vbdrZ/7xVn7YKg8mb/3j2523G+Xuh7yXxW+PgY3vzy/29frw
bemeeh19+GFbn3Yu4xfyfMbg9PyFqzbb29sbcX571Fo/utLRxXqU7ty/2/X6
e6dn+ej1dedNf/2Df9BtvyiH12k3716+nhwf3owHzqt27378+ur4RjHj3t5O
6/W6ftW+Hdx2r8/enx28H65NhvsHm0P7pD048l7df46TD+7a9nvvMH1Vnl0N
e97e6Yft2413zoW6iN+8jlqXqvfb6cZ+pNc2isP7/OJd9/rUO1/P328f7xSf
b28vd9vFzlr77VW0Ge2/f91X92o78N522sdnn1+8enveuto81G/f3928eX1/
6p/cvRvnO3sXa/tv+sN31yreeeEXw7vk9asX7cPTrfL4GrvI21v2h/DV/d5Z
e9I5aV3sTHqvh+m+f7S3exO/P+kcFifj7FQN3h/nO4eld7d9tRW8efXpbLi1
tz76sPlb8CY++nC3f7uzbr+5Ga23xp/f64PkKP+8d6UwpPw8Hmy8O9nxnNvx
wefTneOzznDjbfv4KL7bap8NB2lPDzfevc56etC5fX/9aqP1Nri92Ls5nThX
t5OTcvjm4lX39s3FtnP8YbK+lb7KB8G7c3vn7LVz97pcP+4cHaQbu5jBgeuN
Dorx9W4rmRy2t8vbo+DN4PpgfXD16rf1m4u353vv4g+fbm8uY33R3R6//hB/
ut5PDi5vP9wP89dpdyMs9y9eJe8OvdZmu5ftFK/2o+12ZAfr4cUFDtPunYIH
JpMPuxu3XufV5fb9Xfhb5/Lz+t6Fui+2f3t3fBiow55qv41bL9Lei/X+/eXe
m42L7l3Wdd60N8NX3f72pPzkbh5tH7sb6dXbo9sy3UuPzw+Oojfbl5+G3c93
LyaTd+Wp2zr/cH5SHHZfp7d5NLo43DhIx/v3G6/3j3dPr9uT8vP92+3tbmej
yHbfO1edvQs3ff9q5/B977cPR+3rt5N2S3dO3Vv16jZ+e9a9b+/Z293Ryf3O
dXB1e3D8Sfcui3553NOfUu9At3df9NdfdC72Dv3Ns7dXgxdefnfbWi9O/dG7
t/5Ob/3603i7C2+46I1H7bP9050D58PO1dtXa3nntb02HG6+G5xuafvt5+vJ
/WDrVdvZuHqjW8dXh7/1P7++ue9/eDuefJpcbQ86u8fliw9rb3/r7+ycJzfe
JLnwg56/eVB8/tQZX7zeH2n39fZv3rbjXbxqvbgp7l4kG447OmoDWU5Pe6f3
l8Uk1J/v3t3fOO8PIz08PL7b3JgUW8Nx7p6/uMz15c8/zyW0B6mqyeXVa1kP
q7eofvnBvJS1flOw+e5g3rmz6teIlo/f4/rly0UY21+/mhfENJ8zMy+j//fN
4622ZdLk2R+r1xCal8PK+1YBJ7Pv5PR0L9WjlXSQ3y+5zwEUS4C259aoVHnZ
WQLDBH7y3BpeZyVXtwySkV9WkiUOl71OTy854fN6QOWSLV/eeeIdr9VbYZna
Vnt772hP3p9/Zu0dniCUvXPrfH3nzHxRwgxY3gZrtS9Ojk/Pz6z1g4N/a7W4
Un6TV+rILKYfdDED2j49PpTDs8/P9KevHpfOPcuiwV/2VrZWrwaTsqvvV7og
qHIl65UywFGnetnZvFi+/fmgJz4b1NxtTV+ivhSIZOWTTp2yV8pvw+vO3VLU
SAc5zW6qBcZIvjmDJcdOjPie/ELPl6/Lc19FWLbODvcO2yub6ydnM/l8o2k7
qYRjvvfhuI0g/kk5/CNiqKWgnhqn7S4FMfO3MAUxjuoDBvJW7Om0Wv/KL0NZ
/8zHof7mV3taaFqtTOcws+ZqnDKKubE305LDJ+un64f4xGm7/liCOTjV/BmT
HF7XLZvPYLzZPzRXD8wrmJV5c+PMOrh82tGWtfF+9m2IrzKPaVOzHqYjfHqA
qEYu6g/qMHU7IohJC0S8p0fPHTXWX/nOnZvt03M5v/LmbH2nbX2BpbT71Wv6
5c18ZrRiF2+GuZJPkDRvp16U7pmuX+g/KkxpN+2Urda+aWr2JsPDxlzrj1E9
5W/IbaHlZevLfPgpzXgWjjylZ2tmBsvyGZFvTWJOX9MZ4K4W/uq0WmeHhOBN
xi/n5i41Xcx6WP2DidVy4bQz8lKdJ/iJLNGkpEy+l9DV+aV5nTPZ6Hjr2FLT
o9V7eDerz9V1B5et1h+tn36SEbXzznggH7czr4T+6SfrxLwc3Rrp3qD5CG5Z
v3Ed55H5Deovgkzfx6horZCXlz96bXTzHu/q7cRnHXmDcvWys2zQ70N776u3
nU1fUb1iR/KO63ZXvngn5Na8Mbn+JEn9CVFr7puo5nWOT31jXT6l2ejlwfsg
pxP6HaMKpbX1XF7M3J/mctPF+UC+lZpdWdt7qJDAv1x9yMm8mt3qTyRVizxS
eVmzMYTZV0fkHcZayboQF8xdaj4+bv3gRn/XHFaszcFIvlNmnRBdr2Tz9Eju
Dv7+6QXSyja4pdQ35hsZ4/vhoBJhbTTyTYM1+eKivLhxOOjMvf6/eVG/vCN8
ZN68Pffa/dVGcDLXUf0ObHGT+TKIjNb5+0frS5tir9X77erPRDzx7VvzUcX6
gyKj6iXUuRnQifkiR/e+erG3TKDWniev4JbX/BOqKh3Y5lsa4gtd807o+iXo
XLNqrZfyTd3RPbYu32cWDUtlxnwrSD4YhyjS7oAxDOa+QdOyGt+o30LaU9fy
rc/76bdRssqy5EuOM1thjAhQi6XJWuJq88GBupH6q9T3c9+EGVnM0SRkWjT7
gQqMpHwpbxW/Fc9i/iUq1J+1lYSV1VXvPa9um01iX2eZupbjvfqrwTR3e6XN
F1GqITpubDWv865s23wt3IxT1113buRLpUOV1Z+sqb5LM8C8aA6hpYPxVfVR
cbk79tzmK4ryUVnzJti57934Tmh8yrzd1Yih1jBtgWoFeQ8ml1d18EUyg75u
PiWMsprv9YiqRpPyamqn5uMdUyM3h7cG/R9FTaNr883R6usWSjqcfhSC2FTI
d4c61dfJzYfJx1cjGYH52g7Zt32+bd40q/vlpKy+alEy+qXj9KYjELf6XJB8
HVXe3Dhtu+EIz/9+//CMyRITJW58/5Oj9Xf7xp2heVVxrSgJSNX3VeWskYiA
qsvq8yhTUZn345cGpFgLoYFZHcm7ec0nKeSN2Pd6/Hsm4Dbmb3ZsqnK+1Gl6
b5vXGcsgM/PW/6e+2NV8aX3h8sef5PkdScBpJi6v4F34YoCapZzDTpnpblf1
NUq1tEmvHQTEtYir+tzCVILVxwO+9XmBhdi++BHAj7MPh9TvXZ9/yfnH3zEp
E9/W0d1w6pP1G0LnvoFsYuhtw2rz5otK9edSrAfSX6rV9bz6VHo5qOL04kVN
5GpZjeOibXnPNGpWWWY8eDBf+54NZ9W8rvgHd7X1/wAcSZ312bcAAA==

-->

</rfc>
