<?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.7) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-kemeleon-01" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Kemeleon">Kemeleon Encodings</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-kemeleon-01"/>
    <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="2026" month="January" day="16"/>
    <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.</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 85?>

<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.
This document specifies a version of the Kemeleon encoding that avoids any failure probability, as well as an alternate version that trades some failure probability for smaller encoding size.</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((2^d/q)*x) mod 2^d</tt> (Equation 4.7)</t>
        </li>
        <li>
          <t><tt>Decompress_d : y -&gt; round((q/2^d)*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>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>EncodeEk(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>DecodeEk(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 length <tt>n</tt> of coefficients modulo <tt>q</tt> to a large integer.
Applying the technique from <xref target="ELL2"/>, where <tt>r</tt> is the large integer resulting from accumulating coefficients, we then choose <tt>m</tt> at random from <tt>[0,floor((2^(b+t)-r)/(q^n))]</tt>, where <tt>b = ceil(n*log2(q))</tt> and <tt>t</tt> is a security parameter, and return <tt>r + m*q^(n)</tt>.
Notably, the random value <tt>m</tt> need not be transmitted alongside the encoded values.
This results in encoded values whose statistical distance from uniform is at most <tt>2^-t</tt>.
Notably, this statistical distance is unconditional; we hence fix <tt>t=128</tt>.
This results in the encoding size increasing by <tt>t</tt> bits, i.e., 16 bytes.</t>
        <artwork><![CDATA[
VectorEncode(a):
   r = 0
   t = 128
   b = ceil(n*log2(q))
   for i from 1 to n:
      r += q^(i-1)*a[i]
   m <--$ [0,...,floor((2^(b+t)-r)/(q^(n)))]
   return r + m*q^n
]]></artwork>
        <artwork><![CDATA[
VectorDecode(r):
   r = r % q^n
   for i from 1 to 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>.
It must take as input values of <tt>u</tt> that are output from <tt>Decompress_d</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 if Compress_d(u - 2) == c:
         rand <--$ [-2,-1,0,1]
      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 u == 0:
         rand <--$ [-52,...,52]
      else if u <= 1560:
         rand <--$ [-51,...,52]
      else:
         rand <--$ [-52,...,51]
      return u + rand
   if d == 4:
      if u == 0:
         rand <--$ [-104,...,104]
      else if u <= 1456:
         rand <--$ [-103,...,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.
We treat each polynomial in <tt>t</tt> as a vector of <tt>n</tt> coefficient, for which we apply <tt>VectorEncode</tt>.
From this, we obtain <tt>k</tt> values that are then concatenated.</t>
        <artwork><![CDATA[
Kemeleon.EncodeEk(ek = (t, rho)):
   for i in range(k):
      r_i = VectorEncode(t[i])
   r = concat(r_1,...,r_k)
   return concat(r,rho)
]]></artwork>
        <artwork><![CDATA[
Kemeleon.DecodeEk(eek):
   r_1,..,r_k,rho = eek # rho and each r_i is fixed length
   t = []
   for i in range(k):
      t_i = VectorDecode(r_i)
      t.append(t_i)
   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 encapsulation keys can be applied.</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])
   v = Decompress_dv(c_2)
   for i from 1 to n:
      v[i] = SamplePreimage(dv,v[i],c_2[i])
   for i in range(k)
      r_i = VectorEncode(u[i])
   r_(k+1) = VectorEncode(v)
   r = concat(r_0,...,r_(k+1))
   return r
]]></artwork>
        <artwork><![CDATA[
Kemeleon.DecodeCtxt(r):
   r_0,...,r_(k+1) = r # each r_i is fixed length
   for i in range(k):
      u[i] = VectorDecode(r_i)
   v = VectorDecode(r_(k+1))
   c_1 = Compress_du(u)
   c_2 = Compress_dv(v)
   return (c_1,c_2)
]]></artwork>
      </section>
      <section anchor="properties">
        <name>Summary of Properties</name>
        <table anchor="summary-encoding">
          <name>Summary of Kemeleon Properties</name>
          <thead>
            <tr>
              <th align="left">Algorithm / Parameter</th>
              <th align="right">Output size (bytes)</th>
              <th align="right">Success probability</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Kemeleon - ML-KEM512</td>
              <td align="right">ek: 814, ctxt: 1172</td>
              <td align="right">ek: 1.00, ctxt: 1.00</td>
            </tr>
            <tr>
              <td align="left">Kemeleon - ML-KEM768</td>
              <td align="right">ek: 1204, ctxt: 1562</td>
              <td align="right">ek: 1.00, ctxt: 1.00</td>
            </tr>
            <tr>
              <td align="left">Kemeleon - ML-KEM1024</td>
              <td align="right">ek: 1594, ctxt: 1953</td>
              <td align="right">ek: 1.00, ctxt: 1.00</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="compressonly">
        <name>Smaller Outputs from Rejection Sampling</name>
        <t>In applications willing to incur some probability of failure in encoding, a variant of the encoding algorithm that does not add the additional <tt>m</tt> value can be used.
This results in smaller output sizes for public keys and ciphertexts.
However, in this case it is no longer feasible to parallelize the encoding of the <tt>k</tt> polynomials; these must be treated as a single vector of <tt>k*n</tt> coefficients in order to achieve a reasonable rate of rejection.
Therefore, this approach also requires arithmetic over larger integers (up to 1872B integers for ML-KEM1024).
In particular, the following algorithms can be used instead of <tt>VectorEncode</tt> and <tt>VectorDecode</tt> above.</t>
        <artwork><![CDATA[
VectorEncode(a,k):
   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,k):
   for i from 1 to k*n:
      a[i] = r % q
      r = r // q
   return a
]]></artwork>
        <t>The encoding algorithms for public keys should handle errors accordingly, returning an error if <tt>VectorEncode</tt> returns an error.
For ciphertexts, the second ciphertext component need not be decompressed, and rejection sampling can be used to retain uniformity instead.</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>
        <t>This variant of the encoding is as described in the original work <xref target="GSV24"/>, and has the following properties.</t>
        <table anchor="summary-alternate">
          <name>Summary of Alternate Encoding Properties</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>
          </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., 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 <tt>dk</tt>) or ciphertext (without <tt>dk</tt> or <tt>ek</tt>) 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,k+1)
   return r
]]></artwork>
        <t>Decoding is adapted analogously.</t>
        <artwork><![CDATA[
Kemeleon.DecodeCtxt(ec):
   w = VectorDecode(r,k+1)
   c_1,c_2 = w # c_1, c_2 are fixed length
   return (c_1,c_2)
]]></artwork>
      </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 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.
Algorithms required to perform large integer arithmetic may leak information via timing.
Additionally, 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.</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="18" month="December" year="2025"/>
            <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-17"/>
        </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="Yuchen Wang" initials="Y." surname="Wang">
              <organization>Ant Group</organization>
            </author>
            <author fullname="ChangWenting" initials="" surname="ChangWenting">
              <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 427?>

<?line 429?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to
<contact fullname="Michael Rosenberg"/>,
<contact fullname="John Mattsson"/>, and
<contact fullname="Stanislaw Jarecki"/>
for contributions to this document and helpful discussions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
PA+scBmb+R9YVEJ/KEgAAA==

-->

</rfc>
