<?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.24 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-longa-cfrg-frodokem-00" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="FrodoKEM">FrodoKEM: key encapsulation from learning with errors</title>
    <seriesInfo name="Internet-Draft" value="draft-longa-cfrg-frodokem-00"/>
    <author fullname="Patrick Longa">
      <organization>Microsoft</organization>
      <address>
        <email>plonga@microsoft.com</email>
      </address>
    </author>
    <author fullname="Joppe W. Bos">
      <organization>NXP Semiconductors</organization>
      <address>
        <email>joppe.bos@nxp.com</email>
      </address>
    </author>
    <author fullname="Stephan Ehlen">
      <organization>Federal Office for Information Security (BSI)</organization>
      <address>
        <email>stephan.ehlen@bsi.bund.de</email>
      </address>
    </author>
    <author fullname="Douglas Stebila">
      <organization>University of Waterloo</organization>
      <address>
        <email>dstebila@uwaterloo.ca</email>
      </address>
    </author>
    <date year="2025" month="March" day="17"/>
    <workgroup>CFRG</workgroup>
    <keyword>FrodoKEM</keyword>
    <keyword>PQC</keyword>
    <abstract>
      <?line 162?>

<t>This internet draft specifies FrodoKEM, an IND-CCA2 secure Key Encapsulation Mechanism (KEM).</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-longa-cfrg-frodokem/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="github.com/dstebila/frodokem-internet-draft"/>.</t>
    </note>
  </front>
  <middle>
    <?line 166?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>FrodoKEM <xref target="Frodo17"/> is a conservative yet practical post-quantum key encapsulation
mechanism (KEM) whose security derives from cautious parameterizations of the
well-studied learning with errors problem, which in turn has close
connections to conjectured-hard problems on generic, "algebraically
unstructured" lattices.</t>
      <t>As a key encapsulation mechanism, FrodoKEM is a three-tuple of
algorithms (<em>KeyGen</em>, <em>Encapsulate</em>, <em>Decapsulate</em>):</t>
      <ul spacing="normal">
        <li>
          <t><em>KeyGen</em> takes no inputs, requires randomness, and outputs a private
  key and a public key;</t>
        </li>
        <li>
          <t><em>Encapsulate</em> takes as input a public key, requires randomness, and
  outputs a ciphertext and a shared secret;</t>
        </li>
        <li>
          <t><em>Decapsulate</em> takes as input a ciphertext and a private key, and
  outputs a shared secret.</t>
        </li>
      </ul>
      <t>These algorithms are assembled as a two-pass protocol that allows two
parties, A and B, to derive a shared secret in an interactive fashion.
Assume that party A is responsible for the <em>KeyGen</em> and <em>Decapsulate</em>
operations, and that party B is responsible for <em>Encapsulate</em>.
In the first pass, after receiving or retrieving party A's public key,
party B produces a ciphertext with the <em>Encapsulate</em> operation.
In the second pass, party A uses its secret key and the ciphertext
to execute the <em>Decapsulate</em> operation.
The shared secret produced by this protocol can then be used to establish
a secure communication channel using a symmetric-key algorithm.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <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="overview">
      <name>Overview</name>
      <t>The core of FrodoKEM is a public-key encryption scheme called FrodoPKE,
whose IND-CPA security is tightly related to the hardness of a corresponding
learning with errors problem. Here we briefly recall the scientific lineage
of these systems. See the surveys <xref target="Mic10"/>, <xref target="Reg10"/> and <xref target="Pei16"/> for further details.
The seminal works of Ajtai <xref target="Ajt96"/> (published in 1996) and Ajtai–Dwork <xref target="AD97"/>
(published in 1997) gave the first cryptographic constructions whose
security properties followed from the conjectured worst-case hardness of
various problems on point lattices in R^n. In subsequent years, these works
were substantially refined and improved. Notably, in work published in 2005,
Regev <xref target="Reg09"/> defined the learning with errors (LWE) problem, proved the
hardness of (certain parameterizations of) LWE assuming the hardness of
various worst-case lattice problems against quantum algorithms, and defined
a public-key encryption scheme whose IND-CPA security is tightly related to
the hardness of LWE.</t>
      <t>Later on, in work published in 2011, Lindner and Peikert <xref target="LP11"/> gave a more
efficient LWE-based public-key encryption scheme that uses a square public
matrix A of dimension n with integer coefficients modulo q, instead of an
oblong rectangular one.</t>
      <t>The FrodoPKE scheme described in this document is an instantiation and
implementation of the Lindner–Peikert scheme <xref target="LP11"/> with some modifications,
such as: pseudorandom generation of the public matrix A from a small seed,
more balanced key and ciphertext sizes, and new LWE parameters.</t>
      <section anchor="chosen-ciphertext-security">
        <name>Chosen-Ciphertext Security</name>
        <t>FrodoKEM achieves IND-CCA security by way of a transformation of the
IND-CPA-secure FrodoPKE. In work published in 1999, Fujisaki and Okamoto
<xref target="FO99"/> gave a generic transform from an IND-CPA PKE to an IND-CCA PKE, in
the random-oracle model. At a high level, the Fujisaki–Okamoto (FO) transform
derives encryption coins pseudorandomly, and decryption regenerates these
coins to re-encrypt and check that the ciphertext is well-formed. In 2016,
Targhi and Unruh <xref target="TU16"/> gave a modification of the Fujisaki–Okamoto transform
that achieves IND-CCA security in the quantum random-oracle model (QROM) by
adding an extra hash.
In 2017, Hofheinz, Hovelmanns, and Kiltz <xref target="HHK17"/> gave several variants of the
Fujisaki–Okamoto and Targhi–Unruh transforms that in particular convert an
IND-CPA-secure PKE into an IND-CCA-secure KEM, and analyzed them in both the
classical and quantum random-oracle models, even for PKEs with non-zero
decryption error. Jiang et al. <xref target="JZC_18"/> show how to prove security of one of
these variant FO transforms in the QROM without requiring the extra hash from
Targhi–Unruh. FrodoKEM is constructed from FrodoPKE using a slight variant
of Jiang et al.'s transform that includes additional values in hash
computations to reduce the risk of multi-target attacks.</t>
      </section>
    </section>
    <section anchor="notation">
      <name>Notation</name>
      <t>We describe the symbols and abbreviations used throughout this document.</t>
      <ul spacing="normal">
        <li>
          <t>Z represents the set of integers and Z_q represents the set of integers
modulo q.</t>
        </li>
        <li>
          <t>⌊ x ⌉ is     the rounding of x to the nearest integer. If
x = y + 1/2 for some y in Z, then ⌊ x ⌉ = y + 1.</t>
        </li>
        <li>
          <t>r^(i) is a 16-bit bit string.</t>
        </li>
        <li>
          <t>(r^(0), r^(1), ..., r^(t-1)) is a sequence of t 16-bit bit strings r^(i).</t>
        </li>
        <li>
          <t>AES128(k, a) denotes the 128-bit AES128 output under key k for a 128-bit
input a.</t>
        </li>
        <li>
          <t>SHAKE128(x, y) and SHAKE256(x, y) denote the y first bits of SHAKE128
and SHAKE256 (resp.) output for input x.</t>
        </li>
        <li>
          <t>Matrices are represented in capitals with no italics (e.g., A and C).
For an n1 * n2 matrix C, its (i,j)th coefficient (i.e., the entry in the
ith row and jth column) is denoted by C[i,j], where 0 &lt;= i &lt; n1 and
0 &lt;= j &lt; n2. The transpose of matrix C is denoted by C^T.</t>
        </li>
      </ul>
      <t>AES128 and SHAKE are specified in <xref target="FIPS197"/> and <xref target="FIPS202"/>, respectively.</t>
    </section>
    <section anchor="parameters">
      <name>Parameters</name>
      <t>The FrodoKEM parameters are implicit inputs to the FrodoKEM algorithms
defined in the next sections. A FrodoKEM parameter set specifies the
following:</t>
      <ul spacing="normal">
        <li>
          <t>A positive integer D &lt;= 16 that defines the modulus parameter q = 2^D.</t>
        </li>
        <li>
          <t>Positive integers n, nHat specifying matrix dimensions. It holds that n,
nHat ≡ 0 mod 8.</t>
        </li>
        <li>
          <t>A positive integer B &lt;= D specifying the number of bits encoded in each
matrix entry.</t>
        </li>
        <li>
          <t>A positive integer lenA specifying the bitlength of seeds for the
generation of the matrix A.</t>
        </li>
        <li>
          <t>A positive integer lensec specifying the number of bits that match the
bit-security level. Valid values are 128, 192 and 256. This is used to
determine the bitlength of seeds (not associated to the matrix A), of hash
value outputs and of values associated to the generation of the shared
secrets.</t>
        </li>
        <li>
          <t>A positive integer lenSE specifying the bitlength of the seed value seedSE.</t>
        </li>
        <li>
          <t>A positive integer lensalt specifying the bitlength of the value salt.</t>
        </li>
        <li>
          <t>A discrete, symmetric error distribution X on Z with support given by
S_X = {−d, −d+1, ..., −1, 0, 1, ..., d−1, d} for a small integer d.</t>
        </li>
        <li>
          <t>A table T_X = (T_X(0), T_X(1), ..., T_X(d)) with (d+1) positive integers
based on the cumulative distribution function for X.</t>
        </li>
      </ul>
      <t>The values for these parameters corresponding to each parameter set are
given in <xref target="SummaryParams"/>.</t>
    </section>
    <section anchor="supporting-functions">
      <name>Supporting Functions</name>
      <section anchor="OctetEncoding">
        <name>Octet Encoding of Bit Strings</name>
        <t>This document follows the little-endian formatting for octet encoding of
bit strings.</t>
        <t>A bit string b = (b[0], b[1], ..., b[|b|-1]) is converted to an octet
string by taking bits from left to right, packing those from the least
significant bit of each octet to the most significant bit, and moving to
the next octet when each octet fills up. For example, the 16-bit bit
string (b[0], b[1], ..., b[15]) is converted into two octets f and g (in
this order) as</t>
        <artwork><![CDATA[
f = b[7] * 2^7 + b[6] * 2^6 + b[5] * 2^5 + b[4] * 2^4 + b[3] * 2^3 + ...
    b[2] * 2^2 + b[1] * 2 + b[0]
g = b[15] * 2^7 + b[14] * 2^6 + b[13] * 2^5 + b[12] * 2^4 + ...
    b[11] * 2^3 + b[10] * 2^2 + b[9] * 2 + b[8]
]]></artwork>
        <t>The conversion from octet string to bit string is the reverse of this
process.</t>
        <t>For FrodoKEM, it is always the case that |b| is a multiple of 8 when
performing octet encoding of bit strings.</t>
      </section>
      <section anchor="matrix-encoding-of-bit-strings">
        <name>Matrix Encoding of Bit Strings</name>
        <t>We define how bit strings are encoded as mod-q integer matrices.</t>
        <t>From the FrodoKEM parameters one has that 2^B &lt;= q. The encoding function
ec() encodes an integer 0 &lt;= val &lt; 2^B as an element in Z_q by multiplying
it by q/2^B = 2^(D-B):</t>
        <artwork><![CDATA[
ec(val) = val * q / 2^B.
]]></artwork>
        <t>Using this function, the function Encode(b) encodes a given bit string
b = (b[0], ..., b[l-1]) of length l = B * nHat^2 as an nHat * nHat
matrix C with coefficients C[i,j] in Z_q by applying ec(·) to B-bit
sub-strings sequentially and filling the matrix row by row entry-wise.
The function Encode(b) is defined as follows.</t>
        <sourcecode type="pseudocode"><![CDATA[
for i = 0 to nHat - 1 do
   for j = 0 to nHat - 1 do
      val = 0
      for k = 0 to B - 1 do
         val = val + b[(i * nHat + j)B + k] * 2^k
      end for
      C[i,j] = val * q / 2^B
   end for
end for

return C
]]></sourcecode>
        <t>The corresponding decoding function Decode(C) decodes an nHat * nHat
matrix C into a bit string of length l = B * nHat^2. It extracts B bits
from each entry by applying the function dc():</t>
        <artwork><![CDATA[
dc(c) = ⌊ c * 2^B / q ⌉ mod 2^B.
]]></artwork>
        <t>That is, the Z_q-entry is interpreted as an integer, then divided by q/2^B
and rounded. This amounts to rounding to the B most significant bits of
each entry. With these definitions, it is the case that dc(ec(val)) = val
for all 0 &lt;= val &lt; 2^B.
The function Decode(C) is defined as follows.</t>
        <sourcecode type="pseudocode"><![CDATA[
for i = 0 to nHat - 1 do
    for j = 0 to nHat - 1 do
        c = ⌊ C[i,j] * 2^B / q ⌉ mod 2^B
        Set c = c[0] * 2^0 + c[1] * 2^1 + ... + c[B-1] * 2^{B-1}
        for k = 0 to B - 1 do
            b[(i * nHat + j)B + k] = c[k]
        end for
    end for
end for

return (b[0], ..., b[l-1])
]]></sourcecode>
      </section>
      <section anchor="packing-matrices-modulo-q">
        <name>Packing Matrices Modulo q</name>
        <t>We define packing and unpacking functions to transform matrices with entries
in Z_q to bit strings and vice versa.</t>
        <t>The function Pack packs an n1 * n2 matrix C with entries C[i,j] in Z_q to an
octet string by concatenating the D-bit matrix coefficients.
The function Pack(C) is defined as follows.</t>
        <sourcecode type="pseudocode"><![CDATA[
for i = 0 to n1 - 1 do
    for j = 0 to n2 - 1 do
        Set C[i,j] = c[0] * 2^0 + c[1] * 2^1 + ... + c[D-1] * 2^{D-1}
        for k = 0 to D - 1 do
            b[(i * n2 + j)D + k] = c[D-1-k]
        end for
    end for
end for

return the octet string corresponding to the bit string
b = (b[0], b[1], ..., b[D * n1 * n2 - 1]), as per Section 6.1.
]]></sourcecode>
        <t>The function Unpack does the reverse of this process to transform an octet string o
to an n1 * n2 matrix C with entries C[i,j] in Z_q, converting the input to a bit
string, and then extracting D-bit strings and storing each as matrix coefficients
C[i,j] for 0 &lt;= i &lt; n1 and 0 &lt;= j &lt; n2 (row-by-row from C[0,0] to C[n1-1, n2-1]).
The function Unpack(o, n1, n2) is defined as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
Convert the input octet string o to a bit string
b = (b[0], b[1], ..., b[D * n1 * n2 - 1]), as per Section 6.1.

for i = 0 to n1 - 1 do
    for j = 0 to n2 - 1 do
        C[i,j] = 0
        for k = 0 to D - 1 do
            C[i,j] = C[i,j] + b[(i * n2 + j)D + k] * 2^(D-1-k)
        end for
    end for
end for

return C
]]></sourcecode>
      </section>
      <section anchor="sampling-from-the-error-distribution">
        <name>Sampling from the Error Distribution</name>
        <t>The error distribution X used in FrodoKEM is a discrete, symmetric distribution on
Z, centered at zero and with small support, which approximates a rounded continuous
Gaussian distribution.</t>
        <t>The support of X is S_X = {−d, −d+1, ..., −1, 0, 1, ..., d−1, d} for a positive
integer d specified by the FrodoKEM parameter set. The probabilities X(z) = X(−z)
for z in S_X are given by a discrete probability density function, which is described
by a table</t>
        <artwork><![CDATA[
T_X = (T_X(0), T_X(1), ..., T_X(d))
]]></artwork>
        <t>of d+1 positive integers related to the cumulative distribution function.</t>
        <t>Given a random 16-bit string r = (r[0], r[1], ..., r[15]), the function Sample(r)
returns a sample e from FrodoKEM’s error distribution X via inversion sampling
using a table T_X, as follows (note that T_X(d) is never accessed):</t>
        <sourcecode type="pseudocode"><![CDATA[
t = r[1] * 2^0 + r[2] * 2^1 + ... + r[15] * 2^14
e = 0

for i = 0 to d - 1 do
    if t > T_X(i) then
        e = e + 1
    end if
end for

e = (-1)^(r[0]) * e

return e
]]></sourcecode>
        <t>The output of the algorithm is a small integer in the range
{-d, -d+1, ..., -1, 0, 1, ..., d-1, d}. The tables T_X corresponding to each of
FrodoKEM’s parameter sets are given in <xref target="tbl-TX"/>.</t>
        <t>We emphasize that it is important to perform this sampling in constant time to
avoid exposing timing side-channels, which is why the for-loop of the algorithm
does a complete loop through the entire table T_X. Similarly, the comparison in
the if-loop needs to be implemented in a constant-time manner.</t>
      </section>
      <section anchor="matrix-sampling-from-the-error-distribution">
        <name>Matrix Sampling from the Error Distribution</name>
        <t>We define the function SampleMatrix which samples an n1 * n2 matrix using the
function Sample.</t>
        <t>Given (n1 * n2) 16-bit random strings r^(i) and the dimension values n1 and n2,
SampleMatrix((r^(0), ..., r^(n1 * n2 - 1)), n1, n2) generates an n1 * n2 matrix
E row-by-row from E[0,0] to E[n1-1,n2-1] by successively calling the function
Sample n1 * n2 times, as follows:</t>
        <sourcecode type="pseudocode"><![CDATA[
for i = 0 to n1 - 1 do
    for j = 0 to n2 - 1 do
        E[i,j] = Sample(r^(i * n2 + j))
    end for
end for

return E
]]></sourcecode>
      </section>
      <section anchor="GenA">
        <name>Pseudorandom Matrix Generation</name>
        <t>The function Gen takes as input a seed, seedA, of length lenA=128 bits and an
implicit dimension n that is fixed per parameter set, and outputs an n * n
pseudorandom matrix A, where all the coefficients are in Z_q.
There are two options for instantiating Gen: one based on AES128 and another
based on SHAKE128.
In both cases, the matrix A is generated row-by-row from A[0,0] to A[n-1,n-1].</t>
        <section anchor="matrix-a-generation-with-aes128">
          <name>Matrix A Generation with AES128</name>
          <t>The algorithm for the case using AES128 is shown below. Each call to AES128
generates 8 coefficients.</t>
          <sourcecode type="pseudocode"><![CDATA[
for i = 0 to n - 1 do
    for j = 0 to n - 1 step 8 do
        b = i || j || 0 || 0 || 0 || 0 || 0 || 0
        # Each concatenated element is encoded as a 16-bit string
        # represented in little-endian byte order, such that:
        # (i[0], i[1], ..., i[15]) ≡ i[0] * 2^0 + ... + i[15] * 2^15
        # and |b| = 128

        C[i,j] || C[i,j+1] || ... || C[i,j+7] = AES128(seedA, b)
        # Each matrix coefficient C[i,j] is a 16-bit string
        # interpreted as a non-negative integer in little-endian
        # byte order:
        # C[i,j] = c[0] * 2^0 + c[1] * 2^1 + ... + c[15] * 2^15
        # corresponding to the bit string (c[0], c[1], ..., c[15])

        for k = 0 to 7 do
            A[i,j+k] = C[i,j+k] mod q
        end for
    end for
end for

return A
]]></sourcecode>
        </section>
        <section anchor="matrix-a-generation-with-shake128">
          <name>Matrix A Generation with SHAKE128</name>
          <t>The algorithm for the case using SHAKE128 is shown below. Each call to SHAKE128
generates n coefficients (i.e., a full matrix row).</t>
          <sourcecode type="pseudocode"><![CDATA[
for i = 0 to n - 1 do
    b = i || seedA
    # Element i is encoded as a 16-bit string
    # represented in little-endian byte order, such that:
    # (i[0], i[1], ..., i[15]) ≡ i[0] * 2^0 + ... + i[15] * 2^15
    # and |b| = lenA + 16

    C[i,0] || C[i,1] || ... || C[i,n-1] = SHAKE128(b, 16 * n)
    # Each matrix coefficient C[i,j] is a 16-bit string interpreted
    # as a non-negative integer in little-endian byte order:
    # C[i,j] = c[0] * 2^0 + c[1] * 2^1 + ... + c[15] * 2^15
    # corresponding to the bit string (c[0], c[1], ..., c[15])

    for j = 0 to n - 1 do
        A[i,j] = C[i,j] mod q
    end for
end for

return A
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="frodokem">
      <name>FrodoKEM</name>
      <section anchor="key-generation">
        <name>Key Generation</name>
        <t>The key generation algorithm accepts no input, requires randomness, and
outputs the keypair (pk, sk) = (seedA || b, s || seedA || b || S^T || pkh).</t>
        <sourcecode type="pseudocode"><![CDATA[
Choose uniformly random seed s of bitlength lensec
Choose uniformly random seed seedSE of bitlength lenSE
Choose uniformly random seed z of bitlength lenA
# Generate pseudorandom seed:
seedA = SHAKE(z, lenA)
# Generate the matrix A:
A = Gen(seedA)
# Generate pseudorandom bit string:
r = SHAKE(0x5F || seedSE, 32 * n * nHat)
# Sample matrix S transposed:
S^T = SampleMatrix((r^(0), r^(1), ..., r^(n * nHat − 1)), nHat, n)
# Sample error matrix E:
E = SampleMatrix((r^(n * nHat), r^(n * nHat + 1), ...,
                  r^(2 * n * nHat − 1)), n, nHat)
B = A * S + E
b = Pack(B)
pkh = SHAKE(seedA || b, lensec)
pk = (seedA || b)
sk = (s || seedA || b || S^T || pkh)

return pk, sk  # Return public key and secret key
]]></sourcecode>
        <t>Here, the matrix ST = S^T is encoded row-by-row from ST[0,0] to ST[nHat−1,n−1],
where each matrix coefficient ST[i,j] is a signed integer encoded
as a 16-bit string (s[0], s[1], ..., s[15]) in the little-endian byte order, i.e.</t>
        <artwork><![CDATA[
ST[i,j] = −s[15] * 2^15 + (s[0] + s[1] * 2 + s[2] * 2^2 + ... + s[14] * 2^14).
]]></artwork>
      </section>
      <section anchor="encapsulation">
        <name>Encapsulation</name>
        <t>The encapsulation algorithm takes as input a public key pk = (seedA || b), requires randomness, and
outputs a ciphertext c = (c1 || c2 || salt) and a shared secret ss.</t>
        <sourcecode type="pseudocode"><![CDATA[
Choose uniformly random value u of bitlength lensec
Choose uniformly random value salt of bitlength lensalt
pkh = SHAKE(pk, lensec)
# Generate pseudorandom values:
seedSE || k = SHAKE(pkh || u || salt, lenSE + lensec)
# Generate pseudorandom bit string:
r = SHAKE(0x96 || seedSE, 16 * (2 * nHat * n + nHat^2))
# Sample matrices S' and E':
S' = SampleMatrix((r^(0), r^(1), ..., r^(nHat * n - 1)), nHat, n)
E' = SampleMatrix((r^(nHat * n), r^(nHat * n + 1), ...,
                   r^(2 * nHat * n - 1)), nHat, n)
# Generate the matrix A:
A = Gen(seedA)
B' = S' * A + E'
c1 = Pack(B')
# Sample error matrix E":
E" = SampleMatrix((r^(2 * nHat * n), r^(2 * nHat * n + 1), ...,
                   r^(2 * nHat * n + nHat^2 - 1)), nHat, nHat)
B = Unpack(b, n, nHat)
V = S' * B + E"
C = V + Encode(u)
c2 = Pack(C)
ss = SHAKE(c1 || c2 || salt || k, lensec)

return (c1 || c2 || salt), ss  # Return ciphertext and shared secret
]]></sourcecode>
      </section>
      <section anchor="decapsulation">
        <name>Decapsulation</name>
        <t>The decapsulation algorithm takes as input a ciphertext c = (c1 || c2 || salt) and
a secret key sk = (s || seedA || b || S^T || pkh), and outputs a shared secret ss.</t>
        <sourcecode type="pseudocode"><![CDATA[
B' = Unpack(c1, nHat, n)
C = Unpack(c2, nHat, nHat)
M = C - B' * S
u' = Decode(M)
# Generate pseudorandom values:
seedSE' || k' = SHAKE(pkh || u' || salt, lenSE + lensec)
# Generate pseudorandom bit string:
r = SHAKE(0x96 || seedSE', 16 * (2 * nHat * n + nHat^2))
# Sample matrices S' and E':
S' = SampleMatrix((r^(0), r^(1), ..., r^(nHat * n - 1)), nHat, n)
E' = SampleMatrix((r^(nHat * n), r^(nHat * n + 1), ...,
                   r^(2 * nHat * n - 1)), nHat, n)
# Generate the matrix A:
A = Gen(seedA)
B" = S' * A + E'
# Sample error matrix E":
E" = SampleMatrix((r^(2 * nHat * n), r^(2 * nHat * n + 1), ...,
                   r^(2 * nHat * n + nHat^2 - 1)), nHat, nHat)
B = Unpack(b, n, nHat)
V = S' * B + E"
C' = V + Encode(u')
kHat = k' if B' == B" and C == C' else kHat = s
ss = SHAKE(c1 || c2 || salt || kHat, lensec)

return ss  # Return shared secret ss
]]></sourcecode>
      </section>
    </section>
    <section anchor="frodokem-variants">
      <name>FrodoKEM Variants</name>
      <t>FrodoKEM is parameterized by the pseudorandom generator (PRG) that is used for
the generation of the matrix A. As explained in <xref target="GenA"/> there are two options
for PRG: AES128 and SHAKE128.</t>
      <t>In addition, FrodoKEM consists of two main variants: a "standard" variant that does
not impose any restriction on the reuse of key pairs, and an "ephemeral" variant
that is intended for applications in which the number of ciphertexts produced
relative to any single public key is small. Concretely, the use of standard
FrodoKEM is recommended for applications in which the number of ciphertexts
produced for a single public key is expected to be equal or greater than 2^8.
Ephemeral FrodoKEM <bcp14>MUST</bcp14> be used for applications in which that same figure is
expected to be smaller than 2^8.</t>
      <t>In contrast to ephemeral FrodoKEM, standard FrodoKEM incorporates some changes to address
certain multi-ciphertext attacks <xref target="Annex"/>. Specifically, standard FrodoKEM doubles the
length of the seedSE value and incorporates a public random salt value into
encapsulation (see Table 2).</t>
    </section>
    <section anchor="parameter-sets">
      <name>Parameter Sets</name>
      <t>This document specifies the following twelve parameter sets:</t>
      <ol spacing="normal" type="1"><li>
          <t>FrodoKEM-640-⟨PRG⟩ and eFrodoKEM-640-⟨PRG⟩, which match or exceed the brute-force security of AES128.</t>
        </li>
        <li>
          <t>FrodoKEM-976-⟨PRG⟩ and eFrodoKEM-976-⟨PRG⟩, which match or exceed the brute-force security of AES192.</t>
        </li>
        <li>
          <t>FrodoKEM-1344-⟨PRG⟩ and eFrodoKEM-1344-⟨PRG⟩, which match or exceed the brute-force security of AES256.</t>
        </li>
      </ol>
      <t>The label "eFrodoKEM" corresponds to the ephemeral variants.
The options for ⟨PRG⟩ are AES or SHAKE, when either AES128 or SHAKE128 (respectively)
is used for the generation of the matrix A. Thus, the first FrodoKEM variant consists
of the parameter sets FrodoKEM-640-AES, FrodoKEM-976-AES and FrodoKEM-1344-AES (and
their corresponding ephemeral variants). The second FrodoKEM variant consists of the
parameter sets FrodoKEM-640-SHAKE, FrodoKEM-976-SHAKE and FrodoKEM-1344-SHAKE (and
their corresponding ephemeral variants).</t>
      <section anchor="SummaryParams">
        <name>Summary of Parameters</name>
        <t>The parameter values characterizing the FrodoKEM parameter sets are listed below.</t>
        <table>
          <name>Parameters for FrodoKEM.</name>
          <thead>
            <tr>
              <th align="right">Name</th>
              <th align="center">(e)FrodoKEM-640</th>
              <th align="center">(e)FrodoKEM-976</th>
              <th align="center">(e)FrodoKEM-1344</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">D</td>
              <td align="center">15</td>
              <td align="center">16</td>
              <td align="center">16</td>
              <td align="left">Bitlength of q</td>
            </tr>
            <tr>
              <td align="right">q</td>
              <td align="center">32768</td>
              <td align="center">65536</td>
              <td align="center">65536</td>
              <td align="left">Power-of-two integer modulus</td>
            </tr>
            <tr>
              <td align="right">n</td>
              <td align="center">640</td>
              <td align="center">976</td>
              <td align="center">1344</td>
              <td align="left">Integer matrix dimension</td>
            </tr>
            <tr>
              <td align="right">nHat</td>
              <td align="center">8</td>
              <td align="center">8</td>
              <td align="center">8</td>
              <td align="left">Integer matrix dimension</td>
            </tr>
            <tr>
              <td align="right">B</td>
              <td align="center">2</td>
              <td align="center">3</td>
              <td align="center">4</td>
              <td align="left">Number of bits encoded per matrix entry</td>
            </tr>
            <tr>
              <td align="right">d</td>
              <td align="center">12</td>
              <td align="center">10</td>
              <td align="center">6</td>
              <td align="left">Integer defining the support of X</td>
            </tr>
            <tr>
              <td align="right">lenA</td>
              <td align="center">128</td>
              <td align="center">128</td>
              <td align="center">128</td>
              <td align="left">Bitlength of seeds for generation of matrix A</td>
            </tr>
            <tr>
              <td align="right">lensec</td>
              <td align="center">128</td>
              <td align="center">192</td>
              <td align="center">256</td>
              <td align="left">Number of bits matching the bit-security level</td>
            </tr>
            <tr>
              <td align="right">SHAKE</td>
              <td align="center">SHAKE128</td>
              <td align="center">SHAKE256</td>
              <td align="center">SHAKE256</td>
              <td align="left">SHAKE variant used for hashing</td>
            </tr>
          </tbody>
        </table>
        <table>
          <name>Additional parameters for FrodoKEM variant.</name>
          <thead>
            <tr>
              <th align="right">Name</th>
              <th align="center">FrodoKEM-640</th>
              <th align="center">FrodoKEM-976</th>
              <th align="center">FrodoKEM-1344</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">lenSE</td>
              <td align="center">256</td>
              <td align="center">384</td>
              <td align="center">512</td>
              <td align="left">Bitlength of seedSE in FrodoKEM</td>
            </tr>
            <tr>
              <td align="right">lensalt</td>
              <td align="center">256</td>
              <td align="center">384</td>
              <td align="center">512</td>
              <td align="left">Bitlength of salt in FrodoKEM</td>
            </tr>
          </tbody>
        </table>
        <table>
          <name>Additional parameters for eFrodoKEM variant.</name>
          <thead>
            <tr>
              <th align="right">Name</th>
              <th align="center">eFrodoKEM-640</th>
              <th align="center">eFrodoKEM-976</th>
              <th align="center">eFrodoKEM-1344</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">lenSE</td>
              <td align="center">128</td>
              <td align="center">192</td>
              <td align="center">256</td>
              <td align="left">Bitlength of seedSE in eFrodoKEM</td>
            </tr>
            <tr>
              <td align="right">lensalt</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="center">0</td>
              <td align="left">No salt in eFrodoKEM</td>
            </tr>
          </tbody>
        </table>
        <table>
          <name>Error distributions. Probabilities are shown for each integer value from 0 up to +-12. The last two rows correspond to Renyi's order and divergence.</name>
          <thead>
            <tr>
              <th align="right">Name</th>
              <th align="center">X_Frodo-640</th>
              <th align="center">X_Frodo-976</th>
              <th align="center">X_Frodo-1344</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">sigma</td>
              <td align="center">2.8</td>
              <td align="center">2.3</td>
              <td align="center">1.4</td>
            </tr>
            <tr>
              <td align="right">0</td>
              <td align="center">9288</td>
              <td align="center">11278</td>
              <td align="center">18286</td>
            </tr>
            <tr>
              <td align="right">+-1</td>
              <td align="center">8720</td>
              <td align="center">10277</td>
              <td align="center">14320</td>
            </tr>
            <tr>
              <td align="right">+-2</td>
              <td align="center">7216</td>
              <td align="center">7774</td>
              <td align="center">6876</td>
            </tr>
            <tr>
              <td align="right">+-3</td>
              <td align="center">5264</td>
              <td align="center">4882</td>
              <td align="center">2023</td>
            </tr>
            <tr>
              <td align="right">+-4</td>
              <td align="center">3384</td>
              <td align="center">2545</td>
              <td align="center">364</td>
            </tr>
            <tr>
              <td align="right">+-5</td>
              <td align="center">1918</td>
              <td align="center">1101</td>
              <td align="center">40</td>
            </tr>
            <tr>
              <td align="right">+-6</td>
              <td align="center">958</td>
              <td align="center">396</td>
              <td align="center">2</td>
            </tr>
            <tr>
              <td align="right">+-7</td>
              <td align="center">422</td>
              <td align="center">118</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">+-8</td>
              <td align="center">164</td>
              <td align="center">29</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">+-9</td>
              <td align="center">56</td>
              <td align="center">6</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">+-10</td>
              <td align="center">17</td>
              <td align="center">1</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">+-11</td>
              <td align="center">4</td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">+-12</td>
              <td align="center">1</td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">order</td>
              <td align="center">200</td>
              <td align="center">500</td>
              <td align="center">1000</td>
            </tr>
            <tr>
              <td align="right">divergence</td>
              <td align="center">0.324 x 10^-4</td>
              <td align="center">0.140 x 10^-4</td>
              <td align="center">0.264 x 10^-4</td>
            </tr>
          </tbody>
        </table>
        <table anchor="tbl-TX">
          <name>The distribution table entries T_X(i), for 0 &lt;= i &lt;= d, for sampling.</name>
          <thead>
            <tr>
              <th align="right">Table entries</th>
              <th align="center">FrodoKEM-640</th>
              <th align="center">FrodoKEM-976</th>
              <th align="center">FrodoKEM-1344</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">T_X(0)</td>
              <td align="center">4,643</td>
              <td align="center">5,638</td>
              <td align="center">9,142</td>
            </tr>
            <tr>
              <td align="right">T_X(1)</td>
              <td align="center">13,363</td>
              <td align="center">15,915</td>
              <td align="center">23,462</td>
            </tr>
            <tr>
              <td align="right">T_X(2)</td>
              <td align="center">20,579</td>
              <td align="center">23,689</td>
              <td align="center">30,338</td>
            </tr>
            <tr>
              <td align="right">T_X(3)</td>
              <td align="center">25,843</td>
              <td align="center">28,571</td>
              <td align="center">32,361</td>
            </tr>
            <tr>
              <td align="right">T_X(4)</td>
              <td align="center">29,227</td>
              <td align="center">31,116</td>
              <td align="center">32,725</td>
            </tr>
            <tr>
              <td align="right">T_X(5)</td>
              <td align="center">31,145</td>
              <td align="center">32,217</td>
              <td align="center">32,765</td>
            </tr>
            <tr>
              <td align="right">T_X(6)</td>
              <td align="center">32,103</td>
              <td align="center">32,613</td>
              <td align="center">32,767</td>
            </tr>
            <tr>
              <td align="right">T_X(7)</td>
              <td align="center">32,525</td>
              <td align="center">32,731</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">T_X(8)</td>
              <td align="center">32,689</td>
              <td align="center">32,760</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">T_X(9)</td>
              <td align="center">32,745</td>
              <td align="center">32,766</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">T_X(10)</td>
              <td align="center">32,762</td>
              <td align="center">32,767</td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">T_X(11)</td>
              <td align="center">32,766</td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
            <tr>
              <td align="right">T_X(12)</td>
              <td align="center">32,767</td>
              <td align="center"> </td>
              <td align="center"> </td>
            </tr>
          </tbody>
        </table>
        <table>
          <name>Sizes (in bits) of inputs and outputs.</name>
          <thead>
            <tr>
              <th align="right">Scheme</th>
              <th align="center">secret key sk</th>
              <th align="center">public key pk</th>
              <th align="center">ciphertext ct</th>
              <th align="center">shared secret ss</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">FrodoKEM-640</td>
              <td align="center">19,888</td>
              <td align="center">9,616</td>
              <td align="center">9,752</td>
              <td align="center">16</td>
            </tr>
            <tr>
              <td align="right">eFrodoKEM-640</td>
              <td align="center">19,888</td>
              <td align="center">9,616</td>
              <td align="center">9,720</td>
              <td align="center">16</td>
            </tr>
            <tr>
              <td align="right">FrodoKEM-976</td>
              <td align="center">31,296</td>
              <td align="center">15,632</td>
              <td align="center">15,792</td>
              <td align="center">24</td>
            </tr>
            <tr>
              <td align="right">eFrodoKEM-976</td>
              <td align="center">31,296</td>
              <td align="center">15,632</td>
              <td align="center">15,744</td>
              <td align="center">24</td>
            </tr>
            <tr>
              <td align="right">FrodoKEM-1344</td>
              <td align="center">43,088</td>
              <td align="center">21,520</td>
              <td align="center">21,696</td>
              <td align="center">32</td>
            </tr>
            <tr>
              <td align="right">eFrodoKEM-1344</td>
              <td align="center">43,088</td>
              <td align="center">21,520</td>
              <td align="center">21,632</td>
              <td align="center">32</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>FrodoKEM-640, FrodoKEM-976 and FrodoKEM-1344 are designed to be
post-quantum IND-CCA2 secure KEMs at the security levels of AES-128,
AES-192 and AES-256, respectively.</t>
      <t>Users are recommended to use the highest possible security level that
a given application allows.  In particular, the designers of FrodoKEM
recommend to use either FrodoKEM-976 or FrodoKEM-1344 for most
applications, and limit the use of FrodoKEM-640 to applications that
require short-term security.</t>
      <t>Lattice-based cryptographic schemes such as FrodoKEM are still relatively
young.  Therefore, it is recommended to use FrodoKEM in combination with
a classical scheme (e.g., based on elliptic curves) while our confidence
in the security of lattice schemes increases over time.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
      <!-- # Acknowledgments -->
<!-- {:numbered="false"} -->

<!-- TODO acknowledge. -->

</section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FIPS197" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197-upd1.pdf">
          <front>
            <title>Advanced Encryption Standard (AES), FIPS 197</title>
            <author initials="N. I. of S. and T." surname="(NIST)" fullname="National Institute of Standards and Technology (NIST)">
              <organization/>
            </author>
            <date year="2001" month="November"/>
          </front>
        </reference>
        <reference anchor="FIPS202" target="https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions, FIPS 202</title>
            <author initials="N. I. of S. and T." surname="(NIST)" fullname="National Institute of Standards and Technology (NIST)">
              <organization/>
            </author>
            <date year="2015" month="August"/>
          </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="Frodo17" target="https://frodokem.org">
          <front>
            <title>FrodoKEM: Learning With Errors Key Encapsulation</title>
            <author initials="E." surname="Alkim" fullname="E. Alkim">
              <organization/>
            </author>
            <author initials="J. W." surname="Bos" fullname="J. W. Bos">
              <organization/>
            </author>
            <author initials="L." surname="Ducas" fullname="L. Ducas">
              <organization/>
            </author>
            <author initials="P." surname="Longa" fullname="P. Longa">
              <organization/>
            </author>
            <author initials="I." surname="Mironov" fullname="I. Mironov">
              <organization/>
            </author>
            <author initials="M." surname="Naehrig" fullname="M. Naehrig">
              <organization/>
            </author>
            <author initials="V." surname="Nikolaenko" fullname="V. Nikolaenko">
              <organization/>
            </author>
            <author initials="C." surname="Peikert" fullname="C. Peikert">
              <organization/>
            </author>
            <author initials="A." surname="Raghunathan" fullname="A. Raghunathan">
              <organization/>
            </author>
            <author initials="D." surname="Stebila" fullname="D. Stebila">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
        </reference>
        <reference anchor="Annex" target="https://frodokem.org/files/FrodoKEM-annex-20230418.pdf">
          <front>
            <title>Annex on FrodoKEM updates</title>
            <author initials="E." surname="Alkim" fullname="E. Alkim">
              <organization/>
            </author>
            <author initials="J. W." surname="Bos" fullname="J. W. Bos">
              <organization/>
            </author>
            <author initials="L." surname="Ducas" fullname="L. Ducas">
              <organization/>
            </author>
            <author initials="P." surname="Longa" fullname="P. Longa">
              <organization/>
            </author>
            <author initials="I." surname="Mironov" fullname="I. Mironov">
              <organization/>
            </author>
            <author initials="M." surname="Naehrig" fullname="M. Naehrig">
              <organization/>
            </author>
            <author initials="V." surname="Nikolaenko" fullname="V. Nikolaenko">
              <organization/>
            </author>
            <author initials="C." surname="Peikert" fullname="C. Peikert">
              <organization/>
            </author>
            <author initials="A." surname="Raghunathan" fullname="A. Raghunathan">
              <organization/>
            </author>
            <author initials="D." surname="Stebila" fullname="D. Stebila">
              <organization/>
            </author>
            <date year="2023" month="April"/>
          </front>
        </reference>
        <reference anchor="Mic10">
          <front>
            <title>Cryptographic functions from worst-case complexity assumptions</title>
            <author initials="D." surname="Micciancio" fullname="D. Micciancio">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="Information Security and Cryptography, pages 427–452" value=""/>
        </reference>
        <reference anchor="Reg10">
          <front>
            <title>The learning with errors problem (invited survey)</title>
            <author initials="O." surname="Regev" fullname="O. Regev">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="IEEE Conference on Computational Complexity, pages 191–204" value=""/>
        </reference>
        <reference anchor="Pei16">
          <front>
            <title>A decade of lattice cryptography</title>
            <author initials="C." surname="Peikert" fullname="C. Peikert">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="Foundations and Trends in Theoretical Computer Science, 10(4):283–424." value=""/>
        </reference>
        <reference anchor="Ajt96">
          <front>
            <title>Generating hard instances of lattice problems (extended abstract)</title>
            <author initials="M." surname="Ajtai" fullname="M. Ajtai">
              <organization/>
            </author>
            <date year="1996"/>
          </front>
          <seriesInfo name="28th Annual ACM Symposium on Theory of Computing, pages 99–108" value=""/>
        </reference>
        <reference anchor="AD97">
          <front>
            <title>A public-key cryptosystem with worst-case/average-case equivalence</title>
            <author initials="M." surname="Ajtai" fullname="M. Ajtai">
              <organization/>
            </author>
            <author initials="C." surname="Dwork" fullname="C. Dwork">
              <organization/>
            </author>
            <date year="1997"/>
          </front>
          <seriesInfo name="29th Annual ACM Symposium on Theory of Computing, pages 284–293" value=""/>
        </reference>
        <reference anchor="Reg09">
          <front>
            <title>On lattices, learning with errors, random linear codes, and cryptography</title>
            <author initials="O." surname="Regev" fullname="O. Regev">
              <organization/>
            </author>
            <date year="2009"/>
          </front>
          <seriesInfo name="Journal of the ACM, 56(6):34, 2009. Preliminary version in STOC 2005" value=""/>
        </reference>
        <reference anchor="LP11">
          <front>
            <title>Better key sizes (and attacks) for LWE-based encryption</title>
            <author initials="R." surname="Lindner" fullname="R. Lindner">
              <organization/>
            </author>
            <author initials="C." surname="Peikert" fullname="C. Peikert">
              <organization/>
            </author>
            <date year="2011"/>
          </front>
          <seriesInfo name="Topics in Cryptology – CT-RSA 2011, volume 6558 of Lecture Notes in Computer Science, pages 319–339" value=""/>
        </reference>
        <reference anchor="FO99">
          <front>
            <title>Secure integration of asymmetric and symmetric encryption schemes</title>
            <author initials="E." surname="Fujisaki" fullname="E. Fujisaki">
              <organization/>
            </author>
            <author initials="T." surname="Okamoto" fullname="T. Okamoto">
              <organization/>
            </author>
            <date year="1999"/>
          </front>
          <seriesInfo name="Advances in Cryptology – CRYPTO’99, volume 1666 of Lecture Notes in Computer Science, pages 537–554" value=""/>
        </reference>
        <reference anchor="TU16">
          <front>
            <title>Post-quantum security of the Fujisaki-Okamoto and OAEP transforms</title>
            <author initials="E. E." surname="Targhi" fullname="E. E. Targhi">
              <organization/>
            </author>
            <author initials="D." surname="Unruh" fullname="D. Unruh">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="14th Theory of Cryptography Conference (TCC 2016-B), Part II, volume 9986 of Lecture Notes in Computer Science, pages 192–216" value=""/>
        </reference>
        <reference anchor="HHK17">
          <front>
            <title>A modular analysis of the Fujisaki-Okamoto transformation</title>
            <author initials="D." surname="Hofheinz" fullname="D. Hofheinz">
              <organization/>
            </author>
            <author initials="K." surname="Hovelmanns" fullname="K. Hovelmanns">
              <organization/>
            </author>
            <author initials="E." surname="Kiltz" fullname="E. Kiltz">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <seriesInfo name="15th Theory of Cryptography Conference (TCC 2017), Part I, volume 10677 of Lecture Notes in Computer Science, pages 341–371" value=""/>
        </reference>
        <reference anchor="JZC_18">
          <front>
            <title>IND-CCA-secure key encapsulation mechanism in the quantum random oracle model, revisited</title>
            <author initials="H." surname="Jiang" fullname="H. Jiang">
              <organization/>
            </author>
            <author initials="Z." surname="Zhang" fullname="Z. Zhang">
              <organization/>
            </author>
            <author initials="L." surname="Chen" fullname="L. Chen">
              <organization/>
            </author>
            <author initials="H." surname="Wang" fullname="H. Wang">
              <organization/>
            </author>
            <author initials="Z." surname="Ma" fullname="Z. Ma">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
          <seriesInfo name="Advances in Cryptology – CRYPTO 2018, Part III, volume 10993 of Lecture Notes in Computer Science, pages 96–125" value=""/>
        </reference>
      </references>
    </references>
    <?line 838?>



  </back>
  <!-- ##markdown-source:
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
/wM3jLmuHoMAAA==

-->

</rfc>
