<?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.21 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-veitch-kemeleon-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.24.0 -->
  <front>
    <title abbrev="Kemeleon">Kemeleon Encodings</title>
    <seriesInfo name="Internet-Draft" value="draft-veitch-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="2024" month="November" day="29"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 74?>

<t>This document specifies Kemeleon encoding algorithms for encoding ML-KEM public keys and ciphertexts as random bytestrings.
Kemeleon encodings provide obfuscation of public 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-kemeleon.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-veitch-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 80?>

<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 public keys and ciphertexts to random bytestrings is required.
This document specifies such an encoding, Kemeleon, for ML-KEM public keys and ciphertexts.
Kemeleon was introduced in <xref target="GSV24"/> for building an (post-quantum) "obfuscated" KEM whose public 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 public 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; (pk, sk)</tt>: A probabilistic key generation algorithm that, with no input, generates a public key <tt>pk</tt> and a secret key <tt>sk</tt>.</t>
        </li>
        <li>
          <t><tt>Encaps(pk) -&gt; (c, K)</tt>: A probabilistic encapsulation algorithm that takes as input a public key <tt>pk</tt>, and outputs a ciphertext <tt>ct</tt> and shared secret key <tt>K</tt>.</t>
        </li>
        <li>
          <t><tt>Decaps(sk, c) -&gt; K</tt>: A decapsulation algorithm that takes as input a secret key <tt>sk</tt> and ciphertext <tt>c</tt>, and outputs a shared secret key <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 a public key, <tt>pk</tt>, (termed an encapsulation key in <xref target="FIPS203"/>) and a private key, <tt>sk</tt>, (decapsulation key).
Public 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(pk)</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(pk) -&gt; epk</tt> is the (possibly randomized) encoding algorithm that on input a public key, outputs an obfuscated public key or an error.</t>
        </li>
        <li>
          <t><tt>DecodePk(epk) -&gt; pk</tt> is the deterministic decoding algorithm that on input an obfuscated public key, outputs a public 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 Public Keys</name>
        <t>The following algorithms encode ML-KEM public 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(pk = (t, rho)):
   r = VectorEncode(t)
   if r == err:
      return err
   else:
      return concat(r,rho)
]]></artwork>
        <artwork><![CDATA[
Kemeleon.DecodePk(epk):
   r,rho = epk # rho is fixed length
   t = VectorDecode(r)
   return (t, rho)
]]></artwork>
      </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 public 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 public 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(ec):
   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 public 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">Pk 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="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., not using the original key <tt>K</tt> to derive randomness and for other purposes).</t>
        <t>The randomness used to encode a public key <bcp14>MAY</bcp14> be stored alongside the corresponding secret key, if it is subsequently needed.
See <xref target="randomness-security"/> for relevant discussion on keeping this randomness secret.</t>
      </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">pk: 781, ctxt: 877</td>
              <td align="right">pk: 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">pk: 1156, ctxt: 1252</td>
              <td align="right">pk: 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">pk: 1530, ctxt: 1658</td>
              <td align="right">pk: 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">pk: 797, ctxt: 1140</td>
              <td align="right">pk: 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">pk: 1172, ctxt: 1514</td>
              <td align="right">pk: 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">pk: 1546, ctxt: 1889</td>
              <td align="right">pk: 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">pk: 781, ctxt: 877</td>
              <td align="right">pk: 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">pk: 1156, ctxt: 1252</td>
              <td align="right">pk: 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">pk: 1530, ctxt: 1658</td>
              <td align="right">pk: 0.53, ctxt: 0.47</td>
              <td align="right">Smaller int (475B) arithmetic</td>
            </tr>
          </tbody>
        </table>
      </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>
      <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.</t>
      <section anchor="randomness-security">
        <name>Randomness Sampling</name>
        <t>Both public 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 public keys or ciphertexts may leak information about the use of Kemeleon encodings, as might the overhead of the encoding itself.</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 395?>



  </back>
  <!-- ##markdown-source:
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
VzBLEFGmmwZkK2mF1YWHVPyTS/KLmzz+cApWgSKcQLkIRsAqCkFT0txuKIIo
jy8ztHr06ZT+PGIlqDfjk8x4GU+SOMmjjaKIa5IMiqrA2Odfo2TNmgZVxlun
5Mdhep+2VKzj3v+eH6WhruOHEQmb+SEp4ook7/+GH41UGW9JNwnOz2aY4KQI
rITh6ZVNmvRYt+RcveDf5qI0Hmj9zYuo6mdlgSpmt2S0bjU9okIWlf1oxmD8
VZPOkypwpQeq//jjD+snua6SZstty1JkgiC/RT/IHQcKFfRodZCWF18T9s1r
dvtrK7B77RfkH+g9SCA/k7TZ69esV3SVNk6Sohc8FLzWkkhKDHKUKDHP4CtU
0MIgNmH/xm4Lwui521Uv9AquWqEqglL6QpZipK5BLKULx187mLkTrhyc6fKB
wxhURil4HhiGmaFxZjiRrpTggjdUxSxIfS6FZhS7pF8tQRXBChMmDSvVVOJG
Efp2nH4NUGjpXsmNXSRc7qLld7KOp5gKUflSSls5L/GmXLyVsW9YX8rRGxRF
bbld9q1t/yv7ZPc6W51ep/9Zt5pyber5uSpzmp/6VGjprael9xQtxvRExspw
++nhROBT29DW8DTxuwbtHr3YWrPYbr9DAXD3OZzb7dX6PkHAznMJ6G3tyFnx
9znCK3pvP0FEg1WTvUurg3MsArbGm+8Ibz5szm/sPCqsOEhD2RVAayyqNR8S
DJNpXFii7i/xpQJKcZGBmh1KoGlakq4BUjE9TLjrE6jTSxbIVS6L1DjW1SXF
AALsYQx6qBZV1L0q3iAlTJsOVam+jADIaACtwmWE0OlSSZqQ8jAaVsJCh42y
NK82lWwrExCmZ05BtirE1BZ5UZtR+4wcZTkG5IEJtBD9wNZ2GSIqoSNta11M
SPUg+2d7fw0Mkw7NXkaCgowKzlGLU1cQgBdsk4iibY6De2wy5NEkladwaUFh
EU2MgJDvZlVDD41kASEccMLUUa2DDRmFjLF3scwA4oj4OYC7/9KjdP3PylYm
zsP+r36mk31M1JcTlUO/MnKhA02lsTilMimgBALAHpFPnjQDtVFxOAmgXtzv
KLVRxc8cRuQxiUKPSPmctLCSmDo1Wy4rvjnqMcKj0Ac5Xky3A0rzmuuopVY1
citz2Viek1MlX41XhWR9Zl7sQ+cTVWW/zuuKFP55LqKCVLlCcdhiOh2yVjqz
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
f7KMzi5rUtIyerVX7Ke3s1Vu1NkqN4rfdd71t9fzzlhKySmX0l7BpN5ub+d5
K+282n/WSkpOuZR2Sn3Y33/1vJX29/r/71I6uW6W0jpL2nlVqh3hMHal76/L
LfW3d9fzzliqKqU1ttQ3luqvLLW9+7ylqmJaY0y7htkSoqsutbO3shQhPqEc
sF2G+xzzFY65MO6fim8GoEGv2VnMVLm+w0Dqa532EvSz4Njzouhh1c8+bBbB
Q382l3//AodMJz7C+HiiLK3WvLU7irO1nylULtdXLrepXEXhH30bzvxEbk4f
/SYS3GqA0jg73VNc/5kcQtEsoBqKrKhSbTojRFFW9k/PjuzDw4Nyb1hLSfnf
CbTVPnXRd7Vc5IF+OYQ+8lmKoKCzABgrBKswe1lG3+Jc5WGzKaJbb2I6Svp6
PrbyWUfDt44JN+67OXUY04qTNXcQyk7tIhdoEIX8gmFEEGyeFqiilozqnRjL
8khd+jY++FHAMF/BrpRVFR53V29VDKwjbkBk1RmEAj0JdQ9VHm6UlgWEJWsR
xg0Lg6y7AHh3GfCw9pmRnlcCNPouqk6lEvA1lA5LXMFG7EP6xJbT92qbqXxt
Sld/yKS6k0nZnupeNzHjo60gFTwcw7mQQHVZL09wVLKgoO6qiDoyPSjEoQ1C
F3sibOI3nsTFd6AGWHOsy+Ian+ajcQvaPHuuVLwFEr4lC7l7w4oPi0kShbvQ
X1Q1UQrezoLJVPWjk/Mpd/2Vconihbx8e3pwdlBzb/Uvgacu1VZUT9fTn9Gq
D1hHrndjWf8NhJbemZhCAAA=

-->

</rfc>
