<?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.27 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-kemeleon-00" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Kemeleon">Kemeleon Encodings</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-kemeleon-00"/>
    <author fullname="Felix Günther">
      <organization>IBM Research Europe - Zurich</organization>
      <address>
        <email>mail@felixguenther.info</email>
      </address>
    </author>
    <author fullname="Douglas Stebila">
      <organization>University of Waterloo</organization>
      <address>
        <email>dstebila@uwaterloo.ca</email>
      </address>
    </author>
    <author fullname="Shannon Veitch">
      <organization>ETH Zurich</organization>
      <address>
        <email>shannon.veitch@inf.ethz.ch</email>
      </address>
    </author>
    <date year="2025" month="April" day="11"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 80?>

<t>This document specifies Kemeleon encoding algorithms for encoding ML-KEM encapsulation keys and ciphertexts as random bytestrings.
Kemeleon encodings provide obfuscation of encapsulation keys and ciphertexts, relying on module LWE assumptions.
This document specifies a number of variants of these encodings, with differing failure rates, output sizes, and performance profiles.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ssveitch.github.io/draft-kemeleon/draft-irtf-cfrg-kemeleon.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-irtf-cfrg-kemeleon/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ssveitch/draft-kemeleon"/>.</t>
    </note>
  </front>
  <middle>
    <?line 86?>

<section anchor="intro">
      <name>Introduction</name>
      <t>ML-KEM <xref target="FIPS203"/> is a post-quantum key-encapsulation mechanism (KEM) recently standardized by NIST,
Many applications are transitioning from classical Diffie-Hellman (DH) based solutions to constructions based on ML-KEM.
The use of Elligator and related Hash-to-Curve <xref target="RFC9380"/> algorithms are ubiquitous in DH-based protocols where DH shares are required to be encoded as, and look indistinguishable from, random bytestrings.
For example, applications using Elligator include protocols used for censorship circumvention in Tor <xref target="OBFS4"/>, password-authenticated key exchange (PAKE) protocols <xref target="CPACE"/> <xref target="OPAQUE"/>, and private set intersection (PSI) <xref target="ECDH-PSI"/>.</t>
      <t>For the post-quantum transition, an analogous encoding for (ML-)KEM encapsulation keys and ciphertexts to random bytestrings is required.
This document specifies such an encoding, Kemeleon, for ML-KEM encapsulation keys and ciphertexts.
Kemeleon was introduced in <xref target="GSV24"/> for building an (post-quantum) "obfuscated" KEM whose encapsulation keys and ciphertexts are indistinguishable from random.
Beyond the original construction, this document additionally specifies variants that avoid the encoding failing or the use of large integer computations, or allow for a deterministic encoding.
Aside from these variants, it is notable that the Kemeleon encodings of encapsulation keys results in smaller representations than in the original ML-KEM specification.</t>
    </section>
    <section anchor="conventions">
      <name>Conventions and Definitions</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="notation">
      <name>Notation / ML-KEM Background</name>
      <t>A KEM consists of three algorithms:</t>
      <ul spacing="normal">
        <li>
          <t><tt>KeyGen() -&gt; (ek, dk)</tt>: A probabilistic key generation algorithm that, with no input, generates an encapsulation key <tt>ek</tt> and a decapsulation key <tt>dk</tt>.</t>
        </li>
        <li>
          <t><tt>Encaps(ek) -&gt; (c, K)</tt>: A probabilistic encapsulation algorithm that takes as input an encapsulation key <tt>ek</tt>, and outputs a ciphertext <tt>ct</tt> and shared secret <tt>K</tt>.</t>
        </li>
        <li>
          <t><tt>Decaps(dk, c) -&gt; K</tt>: A decapsulation algorithm that takes as input a decapsulation key <tt>dk</tt> and ciphertext <tt>c</tt>, and outputs a shared secret <tt>K</tt>.</t>
        </li>
      </ul>
      <t>The following variables and functions are adopted from <xref target="FIPS203"/>:</t>
      <ul spacing="normal">
        <li>
          <t><tt>q = 3329</tt>, <tt>n = 256</tt></t>
        </li>
        <li>
          <t><tt>Compress_d : x -&gt; round((2d/q)*x) mod 2d</tt> (Equation 4.7)</t>
        </li>
        <li>
          <t><tt>Decompress_d : y -&gt; round((q/2d)*y)</tt> (Equation 4.8)</t>
        </li>
        <li>
          <t>remaining parameters <tt>k</tt>, <tt>d_u</tt>, <tt>d_v</tt>, etc. are defined by the respective ML-KEM parameter set -- this document writes <tt>du</tt> and <tt>dv</tt> in place of <tt>d_u</tt>, <tt>d_v</tt> in pseudocode</t>
        </li>
      </ul>
      <t><tt>ML-KEM.KeyGen()</tt> (Section 7.1 <xref target="FIPS203"/>) produces an encapsulation key, <tt>ek</tt> and a decapsulation key, <tt>dk</tt>.
Encapsulation keys consist of byte-encoded vectors of coefficients in Z_q, where each coefficient is encoded in 12 bits, together with a 32-byte seed for generating the matrix <tt>A</tt>.
<tt>ML-KEM.Encaps(ek)</tt> (Section 7.2 <xref target="FIPS203"/>) produces ciphertexts consisting of byte-encoded compressed vectors of cofficients, where each coefficient in Z_q is compressed by a certain number of bits (depending on the ML-KEM parameter set).</t>
      <t>The following terms and notation are used throughout this document:</t>
      <ul spacing="normal">
        <li>
          <t><tt>msb(x)</tt> refers to the most significant bit of the value x</t>
        </li>
        <li>
          <t><tt>a[i]</tt> denotes the <tt>i</tt>th position of a vector <tt>a</tt> of coefficients</t>
        </li>
        <li>
          <t><tt>concat(x0, ..., xN)</tt>: returns the concatenation of bytestrings.</t>
        </li>
      </ul>
    </section>
    <section anchor="kemeleon">
      <name>Kemeleon Encoding</name>
      <t>At a high level, the constructions in this document instantiate the following functions:</t>
      <ul spacing="normal">
        <li>
          <t><tt>EncodePk(ek) -&gt; eek</tt> is the (possibly randomized) encoding algorithm that on input an encapsulation key, outputs an obfuscated encapsulation key or an error.</t>
        </li>
        <li>
          <t><tt>DecodePk(eek) -&gt; ek</tt> is the deterministic decoding algorithm that on input an obfuscated encapsulation key, outputs an encapsulation key.</t>
        </li>
        <li>
          <t><tt>EncodeCtxt(c) -&gt; ec</tt> is the (possibly randomized) encoding algorithm that on input a ciphertext, outputs an obfuscated ciphertext or an error.</t>
        </li>
        <li>
          <t><tt>DecodeCtxt(ec) -&gt; c</tt> is the deterministic decoding algorithm that on input an obfuscated ciphertext, outputs a ciphertext.</t>
        </li>
      </ul>
      <section anchor="common-func">
        <name>Common Functions</name>
        <t>The following function maps a vector of k*n coefficients modulo q to a large integer, rejecting if the most significant bit of the integer is 1.</t>
        <artwork><![CDATA[
VectorEncode(a):
   r = 0
   for i from 1 to k*n:
      r += q^(i-1)*a[i]
   if msb(r) == 1:
      return err
   else:
      return r
]]></artwork>
        <artwork><![CDATA[
VectorDecode(r):
   for i from 1 to k*n:
      a[i] = r % q
      r = r // q
   return a
]]></artwork>
        <t>The following algorithm samples an uncompressed pre-image of a coefficient <tt>c</tt> at random, where <tt>u</tt> is the decompressed value of <tt>c</tt>.
The mapping is based on the <tt>Compress_d</tt>, <tt>Decompress_d</tt> algorithms from (Section 4.2.1 <xref target="FIPS203"/>).</t>
        <artwork><![CDATA[
SamplePreimage(d,u,c):
   if d == 10:
      if Compress_d(u + 2) == c:
         rand <--$ [-1,0,1,2]
      else:
         rand <--$ [-1,0,1]
      return u + rand
   if d == 11:
      if Compress_d(u + 1) == c:
         rand <--$ [0,1]
      else if Compress_d(u - 1) == c:
         rand <--$ [-1,0]
      else:
         rand = 0
      return u + rand
   if d == 5:
      if c == 0:
         rand <--$ [-52,...,52]
      else:
         rand <--$ [-51,...,52]
      return u + rand
   if d == 4:
      if c == 0:
         rand <--$ [-104,...,104]
      else:
         rand <--$ [-104,...,103]
      return u + rand
   else:
      return err
]]></artwork>
      </section>
      <section anchor="pk-encoding">
        <name>Encoding Encapsulation Keys</name>
        <t>The following algorithms encode ML-KEM encapsulation keys as random bytestrings.
<tt>rho</tt> is the public seed used to generate the public matrix <tt>A</tt> <xref target="FIPS203"/>.
This is already a random 32-byte string, so it is returned alongside the encoded value of <tt>t</tt>.
<tt>t</tt> is a vector of <tt>k</tt> polynomials with <tt>n</tt> coefficients, but in the following pseudocode <tt>t</tt> is treated as a vector of <tt>k*n</tt> coefficients.</t>
        <artwork><![CDATA[
Kemeleon.EncodePk(ek = (t, rho)):
   r = VectorEncode(t)
   if r == err:
      return err
   else:
      return concat(r,rho)
]]></artwork>
        <artwork><![CDATA[
Kemeleon.DecodePk(eek):
   r,rho = eek # rho is fixed length
   t = VectorDecode(r)
   return (t, rho)
]]></artwork>
        <t>While the encapsulation key encoding algorithm has some failure probability, the decoding algorithm can never fail.
Otherwise, a failure in decoding would provide a distinguishing factor between Kemeleon-encoded values and random bitstrings.</t>
      </section>
      <section anchor="ctxt-encoding">
        <name>Encoding Ciphertexts</name>
        <t>ML-KEM ciphertexts consist of two components: <tt>c_1</tt>, a vector of <tt>k</tt> polynomials with <tt>n</tt> coefficients mod <tt>2^du</tt>, and <tt>c_2</tt>, a polynomial with <tt>n</tt> coefficients mod <tt>2^dv</tt>.
The coefficients of these polynomials are not uniformly distributed, as a result of the compression step in encapsulation.
The following encoding function decompresses and recovers a random preimage of this compression step in order to recover the uniform distribution of coefficients.
Then, the same vector encoding step used for encapsulation keys is applied.
For the second ciphertext component, rejection sampling is performed to retain uniformity, rather than decompressing.</t>
        <artwork><![CDATA[
Kemeleon.EncodeCtxt(c = (c_1,c_2)):
   u = Decompress_du(c_1)
   for i from 1 to k*n:
      u[i] = SamplePreimage(du,u[i],c_1[i])
   r = VectorEncode(u)
   if r == err:
      return err
   for i from 1 to n:
      if c_2[1] == 0:
         return err with prob. 1/ceil(q/(2^dv))
   return concat(r,c_2)
]]></artwork>
        <artwork><![CDATA[
Kemeleon.DecodeCtxt(ec):
   r,c_2 = ec # c_2 is fixed length
   u = VectorDecode(r)
   c_1 = Compress_du(u)
   return (c_1,c_2)
]]></artwork>
      </section>
      <section anchor="no-rejection">
        <name>Non-Rejection Sampling Variant</name>
        <t>Applying a technique from <xref target="ELL2"/> (Section 3.4), the original <tt>Kemeleon</tt> construction can be adapted to avoid rejection sampling.
This results in larger output sizes, but the encoding algorithm never fails.
Applying the technique from <xref target="ELL2"/>, where <tt>r</tt> is the encoded vector before rejection occurs in <tt>VectorEncode</tt>, we then choose <tt>m</tt> at random from <tt>[0,floor((2^(b+t)-r)/(q^(k*n)))]</tt>, where <tt>b = log_2(q^(k*n))</tt> and <tt>t</tt> is a security parameter, and return <tt>r + m*q^(k*n)</tt>.
This variant results in encoded values whose statistical distance from uniform is at most <tt>2^-t</tt>.
This results in an increased output size of <tt>t</tt> bits, where <tt>t</tt> is the security parameter.
For example, with <tt>t=128</tt>, this increases the output size by 16 bytes.</t>
        <t>For encapsulation key encodings, one can immediately replace <tt>VectorEncode</tt> and <tt>VectorDecode</tt> calls with calls to the following algorithms.</t>
        <artwork><![CDATA[
VectorEncodeNR(a):
   r = 0
   t = sec_param # e.g. t = 128, 256, ...
   b = log_2(q^(k*n))
   for i from 1 to k*n:
      r += q^(i-1)*a[i]
   m <--$ [0,...,floor((2^(b+t)-r)/(q^(k*n)))]
   return r + m*q^(k*n)
]]></artwork>
        <artwork><![CDATA[
VectorDecodeNR(a):
   a = a % q^(k*n)
   for i from 1 to k*n:
      a[i] = r % q
      r = r // q
   return a
]]></artwork>
        <t>Notably, the random value <tt>m</tt> need not be transmitted alongside the encoded values.</t>
        <t>For ciphertext encodings, one must also avoid rejection sampling based on coefficients of the second component of the ciphertext.
Therefore, the new ciphertext encoding must decompress and <tt>VectorEncodeNR</tt> the second component of the ciphertext.
This more significantly increases the size of the encoded ciphertext.</t>
        <artwork><![CDATA[
Kemeleon.EncodeCtxtNR(c = (c_1,c_2)):
   u = Decompress_du(c_1)
   for i from 1 to k*n:
      u[i] = SamplePreimage(du,u[i],c_1[i])
   v = Decompress_dv(c_2)
   for i from 1 to n:
      v[i] = SamplePreimage(dv,v[i],c_2[i])
   w = [u,v] # treat u,v as a singular vector of (k+1)*n coefficients
   r = VectorEncodeNR(w) # this call should use k+1 rather than k when accumulating to a large integer
   return r
]]></artwork>
        <artwork><![CDATA[
Kemeleon.DecodeCtxtNR(r):
   w = VectorDecodeNR(r)
   u,v = w # u, v are fixed length
   c_1 = Compress_du(u)
   c_2 = Compress_dv(v)
   return (c_1,c_2)
]]></artwork>
      </section>
      <section anchor="faster">
        <name>Faster Arithmetic Variant</name>
        <t>OPEN ISSUE: Is the faster variant of interest? If so, the following can be extended with a complete description.</t>
        <t>Observing that <tt>q = 3329 = 13*2^8+1</tt>, a variant of <tt>Kemeleon</tt> with faster integer arithmetic can be specified.
First, the encoding rejects any polynomial with a coefficient equal to <tt>q-1 = 3328</tt>.
This ensures that all arithmetic can be computed with values modulo <tt>q-1 = 13*2^8</tt>.
Then, note that rather than accumulating values to a large integer mod <tt>q^(k*n)</tt>, it is only required to accumulate values to an integer mod <tt>13^(k*n)</tt>, while keeping track of the 8 lower order bits of each coefficient.
The output size of the encoding does not change, but this results in an increased rejection rate.</t>
        <t>In particular, <xref target="fast-succ-prob"/> gives success probabilities for encapsulation key and ciphertext encodings:</t>
        <table anchor="fast-succ-prob">
          <name>Success probabilities for faster Kemeleon encoding</name>
          <thead>
            <tr>
              <th align="left">Parameter</th>
              <th align="right">ek success probability</th>
              <th align="right">ctxt success probability</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ML-KEM-512</td>
              <td align="right">0.49</td>
              <td align="right">0.45</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-768</td>
              <td align="right">0.29</td>
              <td align="right">0.25</td>
            </tr>
            <tr>
              <td align="left">ML-KEM-1024</td>
              <td align="right">0.53</td>
              <td align="right">0.47</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="comparison">
        <name>Summary of Encodings</name>
        <table anchor="summary-encoding">
          <name>Summary of Kemeleon Variants, NR = No Reject, FT = Faster</name>
          <thead>
            <tr>
              <th align="left">Algorithm / Parameter</th>
              <th align="right">Output size (bytes)</th>
              <th align="right">Success probability</th>
              <th align="right">Additional considerations</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Kemeleon - ML-KEM512</td>
              <td align="right">ek: 781, ctxt: 877</td>
              <td align="right">ek: 0.56, ctxt: 0.51</td>
              <td align="right">Large int (750B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">Kemeleon - ML-KEM768</td>
              <td align="right">ek: 1156, ctxt: 1252</td>
              <td align="right">ek: 0.83, ctxt: 0.77</td>
              <td align="right">Large int (1150B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">Kemeleon - ML-KEM1024</td>
              <td align="right">ek: 1530, ctxt: 1658</td>
              <td align="right">ek: 0.62, ctxt: 0.57</td>
              <td align="right">Large int (1500B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">KemeleonNR - ML-KEM512</td>
              <td align="right">ek: 797, ctxt: 1140</td>
              <td align="right">ek: 1.00, ctxt: 1.00</td>
              <td align="right">Large int (1123B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">KemeleonNR - ML-KEM768</td>
              <td align="right">ek: 1172, ctxt: 1514</td>
              <td align="right">ek: 1.00, ctxt: 1.00</td>
              <td align="right">Large int (1498B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">KemeleonNR - ML-KEM1024</td>
              <td align="right">ek: 1546, ctxt: 1889</td>
              <td align="right">ek: 1.00, ctxt: 1.00</td>
              <td align="right">Large int (1872B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">KemeleonFT - ML-KEM512</td>
              <td align="right">ek: 781, ctxt: 877</td>
              <td align="right">ek: 0.49, ctxt: 0.45</td>
              <td align="right">Smaller int (235B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">KemeleonFT - ML-KEM768</td>
              <td align="right">ek: 1156, ctxt: 1252</td>
              <td align="right">ek: 0.29, ctxt: 0.25</td>
              <td align="right">Smaller int (355B) arithmetic</td>
            </tr>
            <tr>
              <td align="left">KemeleonFT - ML-KEM1024</td>
              <td align="right">ek: 1530, ctxt: 1658</td>
              <td align="right">ek: 0.53, ctxt: 0.47</td>
              <td align="right">Smaller int (475B) arithmetic</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="considerations">
      <name>Additional Considerations for Applications</name>
      <t>This section contains additional considerations and comments related to using Kemeleon encodings in different applications.</t>
      <section anchor="deterministic">
        <name>Deterministic Encoding</name>
        <t>The randomness used in <tt>Kemeleon</tt> ciphertext encodings <bcp14>MAY</bcp14> be derived in a deterministic manner.
To do so, following a call to <tt>Encap</tt> which returns a KEM key <tt>K</tt> and a ciphertext <tt>c</tt>, the following steps can be taken:</t>
        <ul spacing="normal">
          <li>
            <t>Using a key derivation function (KDF), derive from the key <tt>K</tt> a new key <tt>K'</tt> and a seed for randomness <tt>rnd</tt>.</t>
          </li>
          <li>
            <t>The seed <tt>rnd</tt> can be used to generate the randomness required when encoding the ciphertext <tt>c</tt>.</t>
          </li>
          <li>
            <t>Use <tt>K'</tt> in place of <tt>K</tt> wherever applicable in the remainder of the protocol/system.</t>
          </li>
          <li>
            <t>Upon any call to <tt>Decap</tt>, apply the same KDF to derive the new key <tt>K'</tt>, as required.</t>
          </li>
        </ul>
        <t>Deriving a new KEM key for use in the remainder of a system is crucial in order to ensure key separation (i.e., the implementation <bcp14>MUST NOT</bcp14> use the original key <tt>K</tt> to derive randomness and for other purposes).</t>
        <t>The randomness used to encode an encapsulation key <bcp14>MAY</bcp14> be stored alongside the corresponding decapsulation key, if it is subsequently needed.
See <xref target="randomness-security"/> for relevant discussion on keeping this randomness secret.</t>
      </section>
      <section anchor="hash-to-curve">
        <name>Relation to Hash-to-Curve</name>
        <t>While the functionality of Kemeleon is similar to hash-to-curve <xref target="RFC9380"/> (mapping arbitrary byte strings to public keys/ciphertexts), the applications where hash-to-curve is used do not immediately follow in the KEM-based setting because having such an encapsulation key (without dk) or ciphertext (without dk or ek) does not appear to provide the same functionality, since it is not clear how to continue working with the element in the same way that can be done with an elliptic curve point.</t>
      </section>
      <section anchor="direct-generation">
        <name>Modifying ML-KEM Algorithms</name>
        <t>In applications that <em>only</em> require Kemeleon-encoded values <em>and</em> where the underlying ML-KEM implementation can be modified, the ciphertext encoding algorithm (and ML-KEM encapsulation/decapsulation algorithms) <bcp14>MAY</bcp14> be adapted as follows for improved efficiency.
In particular, the compression step in the ML-KEM encapsulation algorithm can be omitted, and therefore, the decompression step in the Kemeleon algorithm can be omitted.
In the implementation of ML-KEM, the compression step (lines 22-23 of Algorithm 14 <xref target="FIPS203"/>) and corresponding decompression step (lines 3-4 of Algorithm 15 <xref target="FIPS203"/>) can be omitted from the encapsulation/decapsulation algorithms in ML-KEM.
In this case, the Kemeleon encoding algorithm for ciphertexts would omit the <tt>Decompress</tt> and <tt>SamplePreimage</tt> steps and immediately apply <tt>VectorEncode</tt>:</t>
        <artwork><![CDATA[
Kemeleon.EncodeCtxt(c = (c_1,c_2)):
   w = [c_1,c_2] # treat c_1,c_2 as a singular vector of (k+1)*n coefficients
   r = VectorEncode(w) # this call should use k+1 rather than k when accumulating to a large integer
   return r
]]></artwork>
        <t>Decoding is adapted analogously.</t>
        <artwork><![CDATA[
Kemeleon.DecodeCtxt(ec):
   w = VectorDecode(r)
   c_1,c_2 = w # c_1, c_2 are fixed length
   return (c_1,c_2)
]]></artwork>
        <t>Naturally, these algorithms can use <tt>VectorEncodeNR</tt>, <tt>VectorDecodeNR</tt>, if the non-rejecting variant is desirable.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>This section contains additional security considerations about the Kemeleon encodings described in this document.</t>
      <section anchor="assumptions">
        <name>Computational Assumptions</name>
        <t>In general, the obfuscation properties of the Kemeleon encodings depend on module LWE assumptions similar to those underlying the IND-CCA security of ML-KEM; see <xref target="GSV24"/> for the detailed security analysis of the original Kemeleon encoding.
In particular, the notions of public key and ciphertext uniformity capture the indistinguishability of Kemeleon-encoded encapsulation keys and ciphertexts from random bitstrings, respectively.
Both require the module LWE assumption to hold in order for Kemeleon to maintain its uniformity properties.
Furthermore, distinguishing a pair of a Kemeleon-encoded encapsulation key and a Kemeleon-encoded ciphertext from uniformly random bitstrings also reduces to a module LWE assumption.</t>
      </section>
      <section anchor="randomness-security">
        <name>Randomness Sampling</name>
        <t>Both encapsulation key and ciphertext encodings in the original Kemeleon encoding are randomized.
The randomness (or seed used to generate randomness) used in Kemeleon encodings <bcp14>MUST</bcp14> be kept secret.
In particular, public randomness enables distinguishing a Kemeleon-encoded value from a random bytestring:
Decoding the value in question and re-encoding it with the public randomness will yield the original value if it was Kemeleon-encoded.</t>
      </section>
      <section anchor="timing-security">
        <name>Timing Side-Channels</name>
        <t>Beyond timing side-channel considerations for ML-KEM itself, care should be taken when using Kemeleon encodings, in particular those with a non-zero failure probability.
Rejecting and re-generating encapsulation keys or ciphertexts may leak information about the use of Kemeleon encodings, as might the overhead of the encoding itself.
Additionally, the algorithms required to perform big integer arithmetic may leak information via timing.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS203">
          <front>
            <title>Module-lattice-based key-encapsulation mechanism standard</title>
            <author>
              <organization/>
            </author>
            <date month="August" year="2024"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.203"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="ELL2" target="https://eprint.iacr.org/2014/043">
          <front>
            <title>Elligator Squared: Uniform Points on Elliptic Curves of Prime Order as Uniform Random Strings</title>
            <author initials="M." surname="Tibouchi" fullname="Mehdi Tibouchi">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
        </reference>
        <reference anchor="GSV24" target="https://eprint.iacr.org/2024/1086">
          <front>
            <title>Obfuscated Key Exchange</title>
            <author initials="F." surname="Günther" fullname="Felix Günther">
              <organization/>
            </author>
            <author initials="D." surname="Stebila" fullname="Douglas Stebila">
              <organization/>
            </author>
            <author initials="S." surname="Veitch" fullname="Shannon Veitch">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OBFS4" target="https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/HEAD/doc/obfs4-spec.txt">
          <front>
            <title>obfs4 (The obfourscator)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="CPACE">
          <front>
            <title>CPace, a balanced composable PAKE</title>
            <author fullname="Michel Abdalla" initials="M." surname="Abdalla">
              <organization>Nexus - San Francisco</organization>
            </author>
            <author fullname="Björn Haase" initials="B." surname="Haase">
              <organization>Endress + Hauser Liquid Analysis - Gerlingen</organization>
            </author>
            <author fullname="Julia Hesse" initials="J." surname="Hesse">
              <organization>IBM Research Europe - Zurich</organization>
            </author>
            <date day="14" month="October" year="2024"/>
            <abstract>
              <t>   This document describes CPace which is a protocol that allows two
   parties that share a low-entropy secret (password) to derive a strong
   shared key without disclosing the secret to offline dictionary
   attacks.  The CPace protocol was tailored for constrained devices and
   can be used on groups of prime- and non-prime order.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cpace-13"/>
        </reference>
        <reference anchor="OPAQUE">
          <front>
            <title>The OPAQUE Augmented PAKE Protocol</title>
            <author fullname="Daniel Bourdrez" initials="D." surname="Bourdrez">
         </author>
            <author fullname="Hugo Krawczyk" initials="H." surname="Krawczyk">
              <organization>AWS</organization>
            </author>
            <author fullname="Kevin Lewi" initials="K." surname="Lewi">
              <organization>Meta</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="21" month="November" year="2024"/>
            <abstract>
              <t>   This document describes the OPAQUE protocol, an augmented (or
   asymmetric) password-authenticated key exchange (aPAKE) that supports
   mutual authentication in a client-server setting without reliance on
   PKI and with security against pre-computation attacks upon server
   compromise.  In addition, the protocol provides forward secrecy and
   the ability to hide the password from the server, even during
   password registration.  This document specifies the core OPAQUE
   protocol and one instantiation based on 3DH.  This document is a
   product of the Crypto Forum Research Group (CFRG) in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-opaque-18"/>
        </reference>
        <reference anchor="ECDH-PSI">
          <front>
            <title>PSI based on ECDH</title>
            <author fullname="wangyuchen" initials="" surname="wangyuchen">
              <organization>Ant Group</organization>
            </author>
            <author fullname="Chang" initials="" surname="Chang">
              <organization>Ant Group</organization>
            </author>
            <author fullname="Yufei Lu" initials="Y." surname="Lu">
              <organization>Ant Group</organization>
            </author>
            <author fullname="Cheng Hong" initials="C." surname="Hong">
              <organization>Ant Group</organization>
            </author>
            <author fullname="Jin Peng" initials="J." surname="Peng">
              <organization>Ant Group</organization>
            </author>
            <date day="21" month="October" year="2024"/>
            <abstract>
              <t>   This document describes Elliptic Curve Diffie-Hellman Private Set
   Intersection (ECDH-PSI).  It instantiates the classical Meadows
   match-making protocol with standard elliptic curves and hash-to-curve
   methods.  In ECDH-PSI, data items are encoded to points on an
   elliptic curve, and masked by the private keys of both parties.
   After collecting the mutually masked datasets from both parties, a
   participant computes their intersection and outputs the corresponding
   original data items as result.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ecdh-psi-00"/>
        </reference>
      </references>
    </references>
    <?line 441?>



  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8Vc63bbSHL+z6foyMkJ6SFIkZJsmVnvjCzJYx3bktaSZ87u
HK8JAk0SEQhQuEjiaLTPkgfJr+TF8lV1o9EAQVmTzdn4zBmRuHRX1/Wr6mo6
jtPKgiyUI7H1Xi5kKONIHEde7AfRLN1quZNJIm+sm1stz83kLE5WIxFE07jV
8mMvchcYwE/caeYESTZ1vGkyc670K872divNJ4sgTYM4ylZLPHvy6fKtEM+E
G6YxRg8iXy4l/hdlW12xJf0gi5PADenLycEb/IkTfMJLW61nIsoXE5mMWj4o
GeG7F0epjNI8HYksySWugOId/HET6Y7EwafjA3y5jZOrWRLny5H4+UfxM75h
ieJHutJqBcuEX06z4fb2q+1h60qu8IIPSqNMJpHMnCNaXquVZm7kf3XDOMIy
VjJtLYOR+CWLva5I4yRL5DTFp9WCPnxptW5klDORwsxNXxQXqkTg8sINQnrk
B3nnLpah7Hnxgq67iTcfiXmWLdNRv2/d7GM4DB1k83wCPqbpjQwyb95Xsrgy
QhMiBLPSDM8UoxTP9tTbvSCuvdXfJNDePFuEW62Wm2fzGHIQDsYXYpqHodKE
tzIM7sSP//2fUTaXCd+Mk5kbBb+6GVQATH3zUXySqaR1ieM8iZdSOOIveRJ4
c35cKk7Q/3+Y0mizXPJgPaV0a1MexfksdFNxkclJELoNc36OghuZpEG2EvFU
/Ax2JGEc27P5qXr5h/xW3+15bsNcF3M3imAnPzH/GqY6vnzXsJhUvdZTbP8B
C+nJbP5rD0+1ojhZ4OUbqApeeXtyfjHc3sGqzk56g+3ei+3hfv/05OKyR3d6
uIWHPr09fLWzv80vHH/4MBzxXIUxH4dhMHNhReLiOocd+MyAKaYR53EQZakg
Q8dDyyzwxGGe3MiU+HKeBAspzhJfJgLsLN75BKWPF+BuovwCT+UmM5lZarnE
zawXuF7SAz/6w+3Bbn97d4cfZlsVdIm/GtXhf47+K+BSYMQfe+IymMS5Nw/M
DcV58VHO/aC8i9s/Xvw03K2s/WwyzVPyUr54L1fi+M4D42fyiTQPd/uD7f0X
FaKHTyD6ba+q8CXRDdaw9vZRr6K55ctNer329kXP1sXy5Zqitsh2bD0TZ2/e
XlSZF0+m6a5oX84lfYzzhDgZJ51G7sFzhO6kh/vLJP536WXMw2wZ990oCxwP
TjlO0nmw7C/DfDZzJ6F0ssSN0iU8ZdoPVwkWlfh9pz8J40n/3fHBUR/hpM9E
OOlSer3sDj7XcRzhTlK86uHb5TxIBR7LF3AJgp4KpgG018QvqeMXogsCFbzb
IhVYeHn94wfn/fFH+u4u0zxkqxXw+KmAmgsvWEJOmbyDkYDziVL9yYr8J6t/
r7U2VSrAgZvAZ66x9tGQsKdvz9EViQxXRBYeWMR+Hkrx4edjTJ3miyW9hgk3
rdnVwZCmunERMtmypwKalsqSuq64BRuEH0ynkpYgpvBIeSKxOKwK0TXPljnG
DX6lb0TgUiasK5EnaWnTIJQggyWxCHw/lC3EJcTGBAR7vLb7ZwF9fWi1NHvv
77Ufe3gQAZG6jNPMgTeKsnxBrHCqzFlIMtQgXYg2Xu+ALVCgLFwJDrlu4oM6
H3IQ5Am7rY9utBLuchkGitsphXvB6hXQd15mAsl5sJ8UD4XiCOsPpPNOhiFW
JtpH7zpi4qYYNY3DXA2SxYwngAU8dUE9APrUskgWUuTgLthcelniGeTIXued
m86dLHbYq4IN2lODDZZCErH5JLjOAXXyFHYsjt45ai7wG3giDlNxCyWRuEGx
I5HqpUTiHTh0onSiZYxvrhYcotYVRvODNAMH8gBvwuyYE91GXX5LlqEQRbfK
zzwlHpZrDCIvzH1p0ZcTuWRapalDtROoKXAPCxXrusT9+3t2NQ8PXbGENAha
OeRO6SnlqqEPIEO5atE+P3h/3LEmur///vD84PD49Ylz1CsRibd0PQm+4vbZ
+cGfPtfvx0v3Opc0K+t0EtxgLpHKDHQhwqdSqW77/OKkQ4McH0II+MLDSM+f
O8s0eHiA4hOXQG5Vh0tlownwH2DhjKRpPA3xpg3F6TzR30Cm6zIi6ymkvtkV
pIiIREUxd9c4xC6T8WSnZ7m3W5c0Uxk5ZARh3t9zwAXPacxJHoTK04KJNms6
Yis2YXhL0MS381i5pG/6XCh5swJr3vRab+QqxlskENjTLADjK1bbxS2bS67v
s5jckNyJYZnxmNncxUM3caDGLMUHN8meWQlfW31IYZA1aAbPCxQO36lMhvMU
TBLfMntc4Uuo2SKIaDGeGbfXOkgpVvCalKsuSOmKICN5R3HGy2bKaO6GkNMc
XuAn8jBjj5IuQAtITABzMEmkqaRB2TIr/NP6obmjfECPvPxhHGlrVrI6klMs
SH2/f+aVdx9a7BvJksnAU7H18fPFJeVw9FecnvHnT8d/+nzy6fiIPl+8O/jw
wXxo6Scu3p19/nBUfirfPDz7+PH49Ei9jKuicqm19fHgz1vK1rfOzi9Pzk4P
PmyphVa0geIEO0/2AuBNxg605cvUS4KJ0vQ3h+f/9R+DXWj8P8GBDweDV+xo
6Mv+4CVZALxzpGaLI+iV+gqerlpwo8htaBQIQEBEQYZMt0twIp3Ht5Egvw7m
Pv+FOPNlJP4w8ZaD3T/qC7TgysWCZ5WLzLP1K2svKyY2XGqYxnCzcr3G6Sq9
B3+ufC/4bl38w/cwIiR4g/3v/9hqkUqdxkoVRb9Quzeux9k5mHn/LNK3oVAH
7DvItmFCGtokUlqRFEjWEWMg/R9l1O4I54+iLa+6wr/qjJH7UwyZuIDOygJJ
N2cykoma3ozCdqZRUhRDcDDpbvEkBd5o3dTEWF6NWfxk52s3/atxjyg75vdA
k6LNg19uoqw6fJUwAO8ryWCUCdtMjdZGRnOEuEq3KsZepohlKIE/0oPeg3GK
yiNeQNsH5zwm9D3TWF3XN6jawIWagwcla3Q20MSuZBqTLyUPzP4RDlG5oGke
eSXmc/14SRbM7tRCnUozrsVrsbMzfIVJxxE+D/dejOn6Ifw2vGL61RcjcUdL
ZvVrt4d+/7rz/K5DYFwM/bFoHyOq8ZJ2ey87mlv22yvr7ev+0O88X3Wqr+3T
awkVAhiXLt0ECRohEDEmqY39r7n6c4M/MvN6vDCfPK3CvOSqMd+SEAtApbYa
Mw5jGmDzqqO7hbDAsbGfKyGM/ZsxOaVlCNhEtmTPyzdSmeNtAMpWa6zxbmFZ
WNCFxksvewObzwzUCCE020n3UUPpaks5Xo9k2uqJUEJDTgF1b0AGwCZd92IJ
SO8FMlIR7y9fr7saNUsXeMi6T1G1GAFPDoZiElC8zWLktHhDGb8rdoYOzQaO
amxb+AvIjaSA/DlBPj8+ANEFj0obr3BpuIFLNtrRi2SUUVtnoWP1JZsVb14q
c4JWbI0BLYJHwLxQQittJC6Itqq/6iyUltmkYZ01syR0o0yy8NkqsaH54Kjj
fDaHlVfVUpnlIp2078CuRE7JDBCPmbnAkEhDZxFDEKwE1Ol8Fi4gzKW4o5fd
X4IvY+gSJpUp3xwHY0gPEDQoMm9XMw1Pj+uqQmOA8QA57bvtruj1el1xd0pu
Gf4nTyI1pnpCRiaZr+RNCGNrFXPErqJISrGLfOI8mM1FKG9k2C0GtZLLNWwS
RJTtZgHlKVmF1cbnKf7xlPL8qggskmwsUIQTFE+DCTCJAsyUOHcayiLKjXOW
timsdEsvHYkS0jfEH06ChUySOCkiiiawoLAksAqLffltwh6bukLj2t1eya3D
7C5rq/Amvb+bW5YZb+KSFfWa2cMUSUWS93/DnkaqrKukuQTqFwsM8NYEUkLy
dMkhPXuo23mhfPB+y7Q0LdjE1fOo6oW5hBWLazJpt5orUamLyoQ0YjD9psEX
GRa4MgDVf/vb31o/8bxKmm23w6XLBEF9mz6Qsw4UChjQ7CCtKNYm4rvX4vqv
7cAZdJ6T96DrIIG8UNIRr1+LgXmUPQBJii7IMJW1OwlTYpGjRIlxRt+ggiYG
sYn4F3FtCKPv/b66oGdw1QxVEZTST7lYw7oGsZQOHn+dYOHOpHJ/dkAA5hJQ
GaXgRdgY55bG2cGGHS3BA2+syl2Q+pKFZpXD2OuWIIpghA2LxpXqK3HDBMbd
3rAGILR0L3hh54nkVbT9bt71FFMhKp+ltF3wElfKydu5+E4MWY7eyBTBebni
D47zz+IXZ9Dd7g66wy/6ri3Xpie/VGVO49MzFVoGm2kZPEaLNTyRsfa68/jr
ROBjy9DW8DjxexbtHl3Y3jDZ3rBL4XHvKZzbG9SefYSA3acSMNje5VHx9ynC
M0/vPEJEg1WTvbPVwTmacF4Fpe8JlN4/W145RXBY85OWzisU91jZrXlvYZzM
Y2OXy3wSIgQwFlWgKjZZqf1ACUptu9LFQiq+h4l0fQKAekqDcnla2rvWhSfF
DqqHhDHooTKVKYlVfENG+Dcbq9J+GQ+QzwCGhasIgdSlEjah6nE0rgSJrpjk
WVGBKrlXph9Cj5yBbFWcqU3yvDai9iAFIutZ8AgG0UYsBFs7ZcCoBJKsozUz
IUWEJjw5FmgQmXRp9DIuGDIqIEhNTo+CAFwQz4goWuY0uMMiQxnNMt7DywyF
JrZY4aFYjZrv53kQGhnVMFkDiJlTDSpeSLMFZMoQ2aprYkHtJURmEQHDJvxW
r3VGCdNtkNKOgRkI4jSv3sZ56Js9MaR9ZTVX1VVZkhOZ3UoZGRztVLRM5RWF
iSBLKZG3ZaKHVi4FDAM8ZVuntr6GhItBxm3MCVIckQqNEO++Dqg28XvVmSsF
4+Ff/VxXNjDQkAcqX/3Gmzc60lZumo08mwLKr5D3IPTz1jxgKzE3CWBR0u8q
S1E14AJHFUGZtCLN5JIkVdGVXs2LlfXvAvZZ+ECLBReonaL0KEsdttWsVupp
TxtzYwHtcqj3VVldNxmYdeh0q2rfl0V5lfCPLERkSOUZzH5Ug7slP0W7W7SH
UuzmpKCiWpwy6mCwKlFPuETjH70xqlwxDJKSab0AtiB45jmvy7W5xkX/Jg+l
UhJyUdC9LtRG+6gcl2w4ldP9zjfwZa7wZR1G5V26gcEH+NNp9ID50zxgfe7I
DuJfh78MvqxFcvO+MgDyNj0x6HsyCNvX/Tapfsd2bsajEi82etQib9IuFc+S
S/XgUeljg0fNmz0qeIIbhxab84qnLYRioMEpvNQnoxgXhWL8pLZvuHbtGMWh
GgBUjjf3XZFJbx4F17ksCpXUtfPwUOLind5up1vdlBkX6x5XCgfskCdU+XS5
8kmpFu9ereusxgDWrhCnZEltz3+SZ9Wtr9L5l44fVmjWQw9vWJHJLxKDY6ql
O5AOTZIWtbHn5QlTN7b1Ej70lmMbVjyPaf9wvLASGTXtGIB6GsZx0oY2tSff
ZR0n6fTbyPZgGp1O58vYEDSBsMN49nVo7urCaIFj4BDyhFrETN2rq90d68MY
eaRYPNcvjzVv9d6dzeNaIFN7nylVyCilh2DJ13FzBS+h8IBEQ6ZyYgQFJxuv
S4937jzAIk7DShlqTKaLmnq9mRHA+sJqO/8qPGWvB8P9sd4+LeZRI9hzTVZi
8ELBVr03vhl70KZoJFljgwX8JpW2qNYiVRW6Km8lDdtQofhuWARe9VHXCptQ
d0OZ4PTTWqGA4BUY8pV5AZ8he7MeX8Tiu7RBwCVBenJdYf43hYaFSfwoNXlU
Vy3nU9G15ppDuTYXhLpUV9CPP07l7yxEnPJmtIaH2vRUIkDmGFFyQohkottv
EAizxxOIQmuswFtTl0UOG6Du4I2OraxENGAmE9mLcG6wkFUHuyQjIUekFhbJ
2yaCFCllKLdVtNCw8e+YMyDQB+O0il4wh6qtFQZtM65SwduAJKAP/3AscVMb
/abNAfMxtHDTPPZN90aNPSzGvsVTv+Tdmy8wUk4FBb4oiEuQCu4msbB6++o7
GF1VH5rQDrh026ERGaXSDn0653yF+jswRgXDXfG+vnARoBbs3ij2rVU2bbN9
FLRgbl0nvK0hEr7D4uoSS29BYN4Fdwnv19HMJtiicNChJYubx+HMWzelvZ0D
9p6Sqs0lkpnyPWCYs/PjU3FycfH5eCROlIKqeybygfncSiHT7HtxMkWC2a25
aA1YoL3U5u8Xm22kNiGikVCtF0vddHI2SWVyo2AGhG72cMlF7zwf/nX/O52n
lfNbSInH1hQWNWS3XKEmpWgDonQgSNKsW8U/yuGQta/WsrhqbVVe57gBnRhf
OwNF6H4RuOlYQiKLBiNo2jodqn+oYIkGDLqIrkdUax4XORDteqkRbUWtaKge
Zl1RVcJZAJii24j7V+zGQjOYtIeKqqMMdswwt1yEuJKSy8TUqHtV+K99BNBb
wpuc+vFuIzUu1bYsVQpawzMVgfix5LYooXoEC8j6CDoqYwaVy6BWJxHBH/Ce
HEcXeJWUxElzz3MoLwEWnwU3qpXOI09flkaoW6wxr6w3N5gwNmq1fhPnZveU
/v0m5FXD2CvcoLpF8y2MMnKsf3jYafo3wo3mO3QLo6hSiLM3GCpa1v5t93Zf
Nd5Q9/bsUV6+2N84yvCRUYaVUQbbw91No+ztPELLS4xyPxLPqvJTPeyvty42
ik87hbVeuq0H9oYX+WLhJnw+xJyBUhtjUJsg5YTuN3FgMqN+VcC/iTNLf9sM
jzt0eZ2gFV0+MF2Jqijl67akdF3q31SA0e+6bKmF4YWjpaIVhLV1JF7uD7qs
nSOx//KluQz5vCiu4/MAlz8Ubka0X+5tv+nYrq5xIq1DesTBoBxxMNwbmon2
d8qJQEFlIrz0lJm0nhUz7e1sm5le7O2bmV4MrSXVZ9rbbpjpHyyj0081KWkZ
vXpp1jPY3Tbr7G2X68TnOuuGO5tZZ82kxFQI6aXh0WBvsPu0mXZf7T9pJiWm
Qki7pTrs77962kz7L4f/70J6e9kspE2GtPuq1DpysuJCd+3ykoY7e5t5Z01V
ldIGUxpaUw3XptrZe9pUVTFtsKU9y2rJXVen2n25NhW581T5X1PALx268cvG
tn8yDdPQoNfiNBaqLNcVIPW1Brbs120/e1j1sxQTDuwjD9zPbD3xoI8bFScF
cJcqvqnVUV733a5KARecjRZHQoCe1GmKhjZu2jfhgzncm2xRo3Y6jirNIFan
UaVLRO9EquQ8omDDtXAqqFklxAacIj4e/JlgKBYA7MNv1NvWF24UUb3oMgYI
Y2xvlV5UAkXolzdLxwQFAe2KPiqX+3e5FfR90QNY7wWtZgpUyE8LcEwtphE3
PH1O1XQ0FNOqIJjZoWi/P3rb6eplmM76cmZO79W3fy0IMS1+FtvGSeRzS+zl
XPcA8pWCoMZNWOt1A6I5aywVuVIGUI0VtCapyKn0ZL4fq/IdVV21OtBJAL1b
qppIfdW7xzvA+pBMP12BdQsed0l9eEhcjGy4vXeszvesyk0U8Ixua6YVRZCC
S7yZVB48aR3RY0oK9FghWGIgZc5NBILHTBW3Iia5RymUvQ2k8iMeJpVUjlOy
DHqyp/QioPxwURxdEEV3PE9YqZQXgi6XY0mFe4apSMDp0jJPlnEKbNZrNhqm
i3ehGxuttcGkyNzXqlxenFCXbqxaKRuaXYOpTrnSHDnuda5OuFEJjVh8Iem8
WEmPU5Rt9XkbuBN5QwmvH6RerrbWeGSdd3E2VK5G9VMrN/JJajKwutoBtWdz
/d2j7w/2lnJhXm6oz00b/0VLCBYBVWAwYmWEypG3dtE75CbI/RJy41bjAeeV
uoeBdun61k6t3gupHElTde3qbIEWG3wTpYd2kVl5lUIzKeXQx/1kxmnyBAIi
TZq7rNfWEaqazNuUnFMnq3/VEdXCpXWL7lCzo0lV9TkQWqPeCjemV+Fsl8pZ
MH9z9kd4Ib04B/HqQCLIzSX/hgFvr1OpgLNjZRzFCnnkW3elqgPaZflUT1V1
CyytOPKteLeks+BKQT7CU01X1vHYg7KXBcEGPsDLnPLsxAOn0xXh8KRfqZbw
tXAbG7f2v9KvKGhxqj1gWG1oT1+zfL2YBVEZ0EZ3zaU2bFy1yeyb+m/6G441
IFvTxl1srLmp1iGFFUAT5Eg9qLpu4a169arCph13q6l601kPvcZYFdDVzlNW
LVJbW8q1sY1lbhqPKW3wqbBqRdcG2tt0eicVw6Ez3KGHy/yXT0dZDe4K+tQ8
4Ibhdpzd2mB71cGqxJcR/WmSJK4UB3ZPoqLUm2ouPnJUXB1ntfpFVCsLkaFa
Hstat96tqpaxxxrA0C3bFanIW93tGv2ulgAuhutLZUFcX/i7i+L/gJL4UdEd
RNuchYEVZ2bDVX1bo2Gnv14zL3fxdQvALXcAUKZFLGmonDdXwk9dXKXDoV3d
cGMpEukhcaG+5dOt7lPyFd3UHMHflZ3ORZGa2vxlGiSE5vj4wEWxJ1vLSu6f
mbD/hPTD7OzW85BJnG88Olo56Vg5gWDaw4tDrZjioPwpAhBn/TDBA9mWign6
eIP98wdL+l2XhItvGqs2UkIHTzb/9oGNMjLeRrdCBY15cnrkHB4elHww/uzf
CL/XTizr9noXAMcvXyEtXKWBodOgyjWCG909AjaTirdLLFOvDJdNQnQgNMt1
4KuddA7qQMsEziecnLbOSFsNc13r4BhZ2RugYBOfVQ9+A+MZ1cWhX8J1Yp/h
B+4SzOf2JyrpW6srxd5rvc0T8hsLjl+1JkAXfAx0lvDt1eqUbe1Bi8N2K4U5
zWExQu0nA7TzISz2WI1L14C5xNGmzef+WRM2Vxx9+tbA2tHrhnCUFGkJnUbp
1dOUdpxs6AkuH+qYCkCD1XEeNaHEa5mZNKGm2VqVrWllpI5grgmyGeUpgbjr
Xc6jMhSUB7tAKNKhVMVxbrkp60CIvQbyrpN1GyBerQIZ1n4RQI/LGRf9kkGd
SiXnS/gXTHEB1+kc0g/mSPq9iWcZX7aFrH9zQD1Ontbx1ON1z2v92gJ0T4ZT
hCMSqA6pRVlDRdFNZaEuFwWMOLTv09uPFGB+lUnc1MTba30yoUfz0TrB2OBF
anhngfQByceVML8WRAIxwUT/BkITwWDxIpjN1XPU3TmXrr+2j6dY0msdWL/J
oDO9Mujae5G64xKGPGvazm2k9yZwtaQ40p4cnB7Uomz9d4SoLzqK1ZOuV9Tf
+AdvJq531Wr9Dz0TwOwrTwAA

-->

</rfc>
