<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version  (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-josefsson-mceliece-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Classic McEliece">Classic McEliece</title>

    <author fullname="Simon Josefsson" role="editor">
      <organization></organization>
      <address>
        <email>simon@josefsson.org</email>
      </address>
    </author>

    <date year="2023" month="October" day="13"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document specifies Classic McEliece, a particular family of encryption algorithms.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-josefsson-mceliece/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/jas/ietf-mceliece"/>.</t>
    </note>


  </front>

  <middle>


<section anchor="foreword"><name>Foreword</name>

<t>This document is a transcribed version of the proposed ISO McEliece standard.</t>

<t>The Classic McEliece team is to be considered the author and owner of the text in this document, and consists of (in alphabetical order):</t>

<t><list style="symbols">
  <t>Daniel J. Bernstein, University of Illinois at Chicago and Ruhr University Bochum</t>
  <t>Tung Chou, Academia Sinica</t>
  <t>Carlos Cid, Simula UiB and Okinawa Institute of Science and Technology</t>
  <t>Jan Gilcher, ETH Zurich</t>
  <t>Tanja Lange, Eindhoven University of Technology</t>
  <t>Varun Maram, ETH Zurich</t>
  <t>Ingo von Maurich, self</t>
  <t>Rafael Misoczki, Google</t>
  <t>Ruben Niederhagen, Academia Sinica and University of Southern Denmark</t>
  <t>Edoardo Persichetti, Florida Atlantic University</t>
  <t>Christiane Peters, self</t>
  <t>Nicolas Sendrier, Inria</t>
  <t>Jakub Szefer, Yale University</t>
  <t>Cen Jung Tjhai, PQ Solutions Ltd.</t>
  <t>Martin Tomlinson, PQ Solutions Ltd. and University of Plymouth</t>
  <t>Wen Wang, Yale University</t>
</list></t>

</section>
<section anchor="introduction"><name>Introduction</name>

<t>The first code-based public-key encryption system (PKE) was introduced in 1978 <xref target="McEliece"></xref>. The public key
specifies a random binary Goppa code. A ciphertext is a codeword plus random errors. The private key allows
efficient decoding: extracting the codeword from the ciphertext, identifying and removing the errors.</t>

<t>The McEliece system was designed to be one-way (OW-CPA), meaning that an attacker cannot efficiently find
the codeword from a ciphertext and public key, when the codeword is chosen randomly. The security level of
the McEliece system has remained remarkably stable, despite dozens of attack papers over 45 years. The
original McEliece parameters were designed for only 2^64 security, but the system easily scales up to "overkill"
parameters that provide ample security margin against advances in computer technology, including quantum
computers.</t>

<t>The McEliece system has prompted a tremendous amount of followup work. Some of this work improves
efficiency while clearly preserving security: this includes a "dual" PKE proposed by Niederreiter, software
speedups, and hardware speedups.</t>

<t>Furthermore, it is now well known how to efficiently convert an OW-CPA PKE into a KEM that is IND-CCA2
secure against all ROM attacks. This conversion is tight, preserving the security level, under two assumptions
that are satisfied by the McEliece PKE: first, the PKE is deterministic (i.e., decryption recovers all randomness
that was used); second, the PKE has no decryption failures for valid ciphertexts. Even better, recent work
achieves similar tightness for a broader class of attacks, namely QROM attacks. The risk that a hash-function-
specific attack could be faster than a ROM or QROM attack is addressed by the standard practice of selecting a
well-studied, high-security, "unstructured" hash function.</t>

<t>Classic McEliece brings all of this together. It is a KEM designed for IND-CCA2 security at a very high security
level, even against quantum computers. The KEM is built conservatively from a PKE designed for OW-CPA
security, namely Niederreiter's dual version of McEliece's PKE using binary Goppa codes. Every level of the
construction is designed so that future cryptographic auditors can be confident in the long-term security of
post-quantum public-key encryption.</t>

</section>
<section anchor="terms-and-definitions"><name>Terms and definitions</name>

<t>For the purposes of this document, the following terms and definitions apply.</t>

<t><list style="symbols">
  <t>SHAKE256: see <xref target="NIST.FIPS.202"></xref>, the sole symmetric primitive used in Classic McEliece with the selected parameters</t>
  <t>IND-CCA2: indistinguishability against adaptive chosen-ciphertext attacks</t>
  <t>KEM: key-encapsulation mechanism</t>
  <t>OW-CPA: one-wayness against chosen-plaintext attacks</t>
  <t>PKE: public-key encryption system</t>
  <t>ROM: random-oracle model</t>
  <t>QROM: quantum random-oracle model</t>
  <t>F_q: finite field of q</t>
  <t>:=: member of a set</t>
  <t>A_b, A_{b}: entity A subscripted with expression b</t>
  <t>A^b, A^{b}: entity A superscripted with expression b</t>
  <t>A_b^c, A_{b}^{c}, A^{c}_{b}: entity A subscripted with expression b and superscripted with expression c</t>
  <t>=&gt;: larger than or equal</t>
  <t>&lt;=: less than or equal</t>
  <t>CEILING(a): function mapping a to the least integer greater than or equal to a</t>
  <t>p * q: matrix multiplication</t>
</list></t>

</section>
<section anchor="symbols-and-abbreviated-terms"><name>Symbols and abbreviated terms</name>

<section anchor="guide-to-notation"><name>Guide to notation</name>

<t>The list below introduces the notation used in this specification. It is meant as a reference guide only; for
complete definitions of the terms listed, refer to the appropriate text. Some other symbols are also used
occasionally; they are introduced in the text where appropriate.</t>

<t><list style="symbols">
  <t>n: The code length (part of the CM parameters)</t>
  <t>k: The code dimension (part of the CM parameters)</t>
  <t>t: The guaranteed error-correction capability (part of the CM parameters)</t>
  <t>q: The size of the field used (part of the CM parameters)</t>
  <t>m: logarithm base 2 of q (part of the CM parameters)</t>
  <t>u: A nonnegative integer (part of the CM parameters)</t>
  <t>v: A nonnegative integer (part of the CM parameters)</t>
  <t>Hash: A cryptographic hash function (symmetric-cryptography parameter)</t>
  <t>HashLen: Length of an output of Hash (symmetric-cryptography parameter)</t>
  <t>Sigma_1 : A nonnegative integer (symmetric-cryptography parameter)</t>
  <t>Sigma_2 : A nonnegative integer (symmetric-cryptography parameter)</t>
  <t>PRG: A pseudorandom bit generator (symmetric-cryptography parameter)</t>
  <t>g: A polynomial in F_q[x] (part of the private key)</t>
  <t>alpha_i: An element of the finite field F_q (part of the private key)</t>
  <t>Gamma: (g, alpha_0, ..., alpha_{n-1}) (part of the private key)</t>
  <t>s: A bit string of length n (part of the private key)</t>
  <t>T: An mt * k matrix over F_2 (the CM public key)</t>
  <t>e: A bit string of length n and Hamming weight t</t>
  <t>C: A ciphertext encapsulating a session key</t>
</list></t>

</section>
<section anchor="column-vectors-vs-row-vectors"><name>Column vectors vs. row vectors</name>

<t>Elements of F_2^n, such as codewords and error vectors, are always viewed as column vectors. This convention
avoids all transpositions. Beware that this differs from a common convention in coding theory, namely to
write codewords as row vectors but to transpose the codewords for applying parity checks.</t>

</section>
<section anchor="numbering-vs-1-numbering"><name>0-numbering vs. 1-numbering</name>

<t>To simplify comparisons to software in most programming languages, this specification consistently uses
indices numbered from 0, including row indices, column indices, and alpha indices. Beware that conventions in
the mathematical literature sometimes agree with this but sometimes do not: for example, polynomial
exponents are conventionally numbered from 0, while most vectors not related to polynomial exponents are
conventionally numbered from 1.</t>

</section>
</section>
<section anchor="requirements"><name>Requirements</name>

<t>This document defines the Classic McEliece KEM. The KEM consists of three mathematical functions, namely
KeyGen, Encap, and Decap, for each of the "selected parameter sets" listed in Clause 10.</t>

<t>The definitions for each selected parameter set are unified into a single definition for a broader parameter
space specified in Clause 6. For each parameter set in that parameter space, subsequent clauses in this
document define</t>

<t><list style="symbols">
  <t>exactly which public key and private key are output by KeyGen given random bits;</t>
  <t>exactly which ciphertext and session key are output by Encap given a public key and random bits; and</t>
  <t>exactly which session key is output by Decap given a ciphertext and a private key.</t>
</list></t>

<t>This document defines each mathematical function F by presenting an algorithm to compute F. Basic
algorithms such as Gaussian elimination are not repeated here, but MatGen, Encode, Decode, Irreducible,
FieldOrdering, SeededKeyGen, FixedWeight, KeyGen, Encap, and Decap are specified below as numbered lists
of steps.</t>

<t>Three of these algorithms, namely FixedWeight, KeyGen, and Encap, are randomized, generating random bits
at specified moments. The set of strings of random bits allowed as input for the corresponding mathematical
functions is defined as the set of strings of random bits consumed by these algorithms. For example, the
KeyGen algorithm reads exactly HashLen random bits, so the domain of the mathematical function KeyGen is the set
of HashLen-bit strings. Here HashLen, one of the Classic McEliece parameters, is 256 for each of the selected parameter sets.</t>

<t>To claim conformance to this document, an algorithm shall (1) name either KeyGen or Encap or Decap; (2)
identify a parameter set listed in Clause 10 (not another parameter set from Clause 6); and (3) compute
exactly the corresponding mathematical function defined in this document for that parameter set. For
example, a KeyGen implementation claimed to conform to this document for the mceliece6960119
parameter set shall compute the specified KeyGen function for that parameter set: i.e., the implementation
shall read exactly HashLen = 256 bits of randomness, and shall produce the same output that the KeyGen algorithm
specified below produces given the same 256-bit string.</t>

<t>Conformance to this document for a tuple of three algorithms, one for each of KeyGen and Encap and Decap, is
defined as conformance to this document for each algorithm, and again shall identify a parameter set listed in
Clause 10.</t>

<t>Users sometimes place further constraints on algorithms, for example to include various side-channel
countermeasures (which could use their own random bits) or to achieve particular levels of performance.
Such constraints are out of scope for this document. This document defines the mathematical functions that
shall be computed by any conformant algorithms; this document does not constrain how these functions are
computed.</t>

</section>
<section anchor="parameters"><name>Parameters</name>

<t>The CM parameters are implicit inputs to the CM algorithms defined below. A CM parameter set specifies the
following:</t>

<t><list style="symbols">
  <t>A positive integer m. This also defines a parameter q = 2^m.</t>
  <t>A positive integer n with n &lt;= q.</t>
  <t>A positive integer t =&gt; 2 with mt &lt; n. This also defines a parameter k = n - mt.</t>
  <t>A monic irreducible polynomial f(z) := F_2[z] of degree m. This defines a representation F_2[z]/f(z) of
the field F_q.</t>
  <t>A monic irreducible polynomial F(y) := F_q[y] of degree t. This defines a representation F_q[y]/F(y) of
the field F_{q^t} = F_{2^mt}.</t>
  <t>Integers v =&gt; u =&gt; 0 with v &lt;= k + u. Parameter sets that do not mention these parameters define them as
(0,0) by default.</t>
  <t>The symmetric-cryptography parameters listed below.</t>
</list></t>

<t>The symmetric-cryptography parameters are the following:</t>

<t><list style="symbols">
  <t>A positive integer HashLen.</t>
  <t>A cryptographic hash function Hash that outputs HashLen bits.</t>
  <t>An integer Sigma_1 =&gt; m.</t>
  <t>An integer Sigma_2 =&gt; 2m.</t>
  <t>A pseudorandom bit generator PRG mapping a string of HashLen bits to a string of n + Sigma_2 q + Sigma_1 t + HashLen bits.</t>
</list></t>

</section>
<section anchor="the-one-way-function"><name>The one-way function</name>

<section anchor="matrix-reduction"><name>Matrix reduction</name>

<section anchor="reduced-row-echelon-form"><name>Reduced row-echelon form</name>

<t>Given a matrix X, Gaussian elimination computes the unique matrix R in reduced row-echelon form having the
same number of rows as X and the same row space as X. Being in reduced row-echelon form means that there
is a sequence c_0 &lt; c_1 &lt; ... &lt; c_{r-1} such that</t>

<t><list style="symbols">
  <t>row 0 of R begins with a 1 in column c_0, and this is the only nonzero entry in column c_0;</t>
  <t>row 1 of R begins with a 1 in column c_1, the only nonzero entry in column c_1;</t>
  <t>row 2 of R begins with a 1 in column c_2, the only nonzero entry in column c_2;</t>
  <t>etc.;</t>
  <t>row r - 1 of R begins with a 1 in column c_{r-1}, the only nonzero entry in column c_{r-1}; and</t>
  <t>all subsequent rows of R are 0.</t>
</list></t>

<t>Note that the rank of R is r.</t>

</section>
<section anchor="systematic-form"><name>Systematic form</name>

<t>As a special case, R is in systematic form if</t>

<t><list style="symbols">
  <t>R has exactly r rows, i.e., there are no zero rows; and</t>
  <t>c_i = i for 0 &lt;= i &lt; r. (This second condition is equivalent to simply saying c_{r-1} = r - 1, except in the
degenerate case r = 0.)</t>
</list></t>

<t>In other words, R has the form (I_r|T), where I is an r * r identity matrix. Reducing a matrix X to systematic
form means computing the unique systematic-form matrix having the same row space as X, if such a matrix
exists.</t>

</section>
<section anchor="semi-systematic-form"><name>Semi-systematic form</name>

<t>The following generalization of the concept of systematic form uses two integer parameters u,v satisfying v =&gt;
u =&gt; 0.</t>

<t>Let R be a rank-r matrix in reduced row-echelon form. Assume that r =&gt; u, and that there are at least r - u + v
columns.</t>

<t>We say that R is in (u,v)-semi-systematic form if R has r rows (i.e., no zero rows); c_i = i for 0 &lt;= i &lt; r - u; and
c_i &lt;= i - u + v for 0 &lt;= i &lt; r. (The c_i conditions are equivalent to simply c_{r-u-1} = r - u - 1 and c_{r-1} &lt;= r -
u + v - 1 except in the degenerate case r = u.)</t>

<t>As a special case, (u,v)-semi-systematic form is equivalent to systematic form if u = v. However, if v &gt; u then
(u,v)-semi-systematic form allows more matrices than systematic form.</t>

<t>This specification gives various definitions first for the simpler case (u,v) = (0,0) and then for the general
case. The list of selected parameter sets provides, for each key size, one parameter set with (u,v) = (0,0), and
one parameter set labeled "f" with (u,v) = (32,64).</t>

</section>
</section>
<section anchor="matrix-generation-for-goppa-codes"><name>Matrix generation for Goppa codes</name>

<section anchor="general"><name>General</name>

<t>The following algorithm MatGen takes as input Gamma = (g, alpha_0, alpha_1, ..., alpha_{n-1}) where</t>

<t><list style="symbols">
  <t>g is a monic irreducible polynomial in F_q[x] of degree t and</t>
  <t>alpha_0, alpha_1, ..., alpha_{n-1} are distinct elements of F_q.</t>
</list></t>

<t>The algorithm output MatGen(Gamma) is defined first in the simpler case of systematic form, and then in the
general case of semi-systematic form. The output is either NIL or of the form (T, ...), where T is the CM public
key, an mt * k matrix over F_2.</t>

</section>
<section anchor="systematic-form-1"><name>Systematic form</name>

<t>For (u,v) = (0,0), the algorithm output MatGen(Gamma) is either NIL or of the form (T, Gamma), where T is an mt * k
matrix over F_2. Here is the algorithm:</t>

<t><list style="numbers">
  <t>Compute the t * n matrix M = {h_{i,j}} over F_q, where h_{i,j} = alpha_j^i / g(alpha_j) for i = 0, ..., t - 1 and j = 0, ..., n - 1.</t>
  <t>Form an mt * n matrix N over F_2 by replacing each entry u_0 + u_1 z + ... + u_{m-1} z^{m-1} of M with a column
of m bits u_0, u_1, ..., u_{m-1}.</t>
  <t>Reduce N to systematic form (I_{mt}|T), where I_{mt} is an mt * mt identity matrix. If this fails, return NIL.</t>
  <t>Return (T, Gamma).</t>
</list></t>

</section>
<section anchor="semi-systematic-form-1"><name>Semi-systematic form</name>

<t>For general u,v, the algorithm output MatGen(Gamma) is either NIL or of the form (T, c_{mt-u}, ..., c_{mt-1}, Gamma'), where</t>

<t><list style="symbols">
  <t>T is an mt * k matrix over F_2;</t>
  <t>c_{mt-u}, ..., c_{mt-1} are integers with mt - u &lt;= c_{mt-u} &lt; c_{mt-u+1} &lt; ... &lt; c_{mt-1} &lt; mt - u + v;</t>
  <t>Gamma' = (g, alpha'_0, alpha'_1, ..., alpha'_{n-1});</t>
  <t>g is the same as in the input; and</t>
  <t>alpha'_0, alpha'_1, ..., alpha'_{n-1} are distinct elements of F_q.</t>
</list></t>

<t>Here is the algorithm:</t>

<t><list style="numbers">
  <t>Compute the t * n matrix M = {h_{i,j}} over F_q, where h_{i,j} = alpha_j^i / g(alpha_j) for i = 0, ..., t - 1 and j = 0, ..., n - 1.</t>
  <t>Form an mt * n matrix N over F_2 by replacing each entry u_0 + u_1 z + ... + u_{m-1} z^{m-1} of M with a column
of m bits u_0, u_1, ..., u_{m-1}.</t>
  <t>Reduce N to (u,v)-semi-systematic form, obtaining a matrix H. If this fails, return NIL. (Now row i has its
leading 1 in column c_i. By definition of semi-systematic form, c_i = i for 0 &lt;= i &lt; mt - u; and mt - u &lt;=
c_{mt-u} &lt; c_{mt-u+1} &lt; ... &lt; c_{mt-1} &lt; mt - u + v. The matrix H is a variable that can change later.)</t>
  <t>Set (alpha'_0, alpha'_1, ..., alpha'_{n-1}) = (alpha_0, alpha_1, ..., alpha_{n-1}). (Each alpha'_i is a variable that can change later.)</t>
  <t>For i = mt - u, then i = mt - u + 1, and so on through i = mt - 1, in this order: swap column i with
column c_i in H, while swapping alpha'_i with alpha'_{c_i}. (After the swap, row i has its leading 1 in column i. The
swap does nothing if c_i = i.)</t>
  <t>The matrix H now has systematic form (I_{mt}|T), where I_{mt} is an mt * mt identity matrix. Return
(T, c_{mt-u}, ..., c_{mt-1}, Gamma') where Gamma' = (g, alpha'_0, alpha'_1, ..., alpha'_{n-1}).</t>
</list></t>

<t>In the special case (u,v) = (0,0), the c_{mt-u}, ..., c_{mt-1} portion of the output is empty, and the i loop is empty,
so Gamma' is guaranteed to be the same as Gamma. The reduction to (0,0)-semi-systematic form is exactly reduction to
systematic form. The general algorithm definition thus matches the (0,0) algorithm definition.</t>

</section>
</section>
<section anchor="encoding-subroutine"><name>Encoding subroutine</name>

<t>The following algorithm Encode takes two inputs: a weight-t column vector e := F_2^n; and a public key T, i.e.,
an mt * k matrix over F_2. The algorithm output Encode(e, T) is a vector C := F_2^{mt}. Here is the algorithm:</t>

<t><list style="numbers">
  <t>Define H = (I_{mt}|T).</t>
  <t>Compute and return C = He := F_2^{mt}.</t>
</list></t>

</section>
<section anchor="decoding-subroutine"><name>Decoding subroutine</name>

<t>The following algorithm Decode decodes C := F_2^{mt} to a word e of Hamming weight wt(e) = t with C = He if
such a word exists; otherwise it returns failure.</t>

<t>Formally, Decode takes two inputs: a vector C := F_2^{mt}; and Gamma', the last component of MatGen(Gamma) for some Gamma
such that MatGen(Gamma) != NIL. Write T for the first component of MatGen(Gamma). By definition of MatGen,</t>

<t><list style="symbols">
  <t>T is an mt * k matrix over F_2;</t>
  <t>Gamma' has the form (g, alpha'_0, alpha'_1, ..., alpha'_{n-1});</t>
  <t>g is a monic irreducible polynomial in F_q[x] of degree t; and</t>
  <t>alpha'_0, alpha'_1, ..., alpha'_{n-1} are distinct elements of F_q.</t>
</list></t>

<t>There are two possibilities for Decode(C, Gamma'):</t>

<t><list style="symbols">
  <t>If C = Encode(e, T) then Decode(C, Gamma') = e. In other words, if there exists a weight-t vector e := F_2^n such
that C = He with H = (I_{mt}|T), then Decode(C, Gamma') = e.</t>
  <t>If C does not have the form He for any weight-t vector e := F_2^n, then Decode(C, Gamma') = NIL.</t>
</list></t>

<t>Here is the algorithm:</t>

<t><list style="numbers">
  <t>Extend C to v = (C, 0, ..., 0) := F_2^n by appending k zeros.</t>
  <t>Find the unique c := F_2^n such that (1) Hc = 0 and (2) c has Hamming distance &lt;= t from v. If there is no
such c, return NIL.</t>
  <t>Set e = v + c.</t>
  <t>If wt(e) = t and C = He, return e. Otherwise return NIL.</t>
</list></t>

</section>
</section>
<section anchor="the-classic-mceliece-kem"><name>The Classic McEliece KEM</name>

<section anchor="irreducible-polynomial-generation"><name>Irreducible-polynomial generation</name>

<t>The following algorithm Irreducible takes a string of Sigma_1 t input bits d_0, d_1, ..., d_{Sigma_1 t - 1}. It outputs either NIL or a
monic irreducible degree-t polynomial g := F_q[x]. Here is the algorithm:</t>

<t><list style="numbers">
  <t>Define beta_j = SUM^{m-1}_{i=0}(d_{Sigma_1 j + i} z^i) for each j := {0, 1, ..., t - 1}. (Within each group of Sigma_1 input bits, this uses only
the first m bits. The algorithm ignores the remaining bits.)</t>
  <t>Define beta = beta_0 + beta_1 y + ... + beta_{t-1} y^{t-1} := F_q[y] / F(y).</t>
  <t>Compute the minimal polynomial g of beta over F_q. (By definition g is monic and irreducible, and g(beta) = 0.)</t>
  <t>Return g if g has degree t. Otherwise return NIL.</t>
</list></t>

</section>
<section anchor="field-ordering-generation"><name>Field-ordering generation</name>

<t>The following algorithm FieldOrdering takes a string of Sigma_2 q input bits. It outputs either NIL or a sequence
(alpha_0, alpha_1, ..., alpha_{q-1}) of q distinct elements of F_q. Here is the algorithm:</t>

<t><list style="numbers">
  <t>Take the first Sigma_2 input bits b_0, b_1, ..., b_{Sigma_2-1} as a Sigma_2-bit integer a_0 = b_0 + 2b_1 + ... + 2^{Sigma_2 -1} b_{Sigma_2-1}, take the
next Sigma_2 bits as a Sigma_2-bit integer a_1, and so on through a_{q-1}.</t>
  <t>If a_0, a_1, ..., a_q-1 are not distinct, return NIL.</t>
  <t>Sort the pairs (a_i, i) in lexicographic order to obtain pairs (a_pi(i), pi(i)) where pi is a permutation of
{0, 1, ..., q - 1}.</t>
  <t>Define alpha_i = SUM^{m-1}_{j=0}(pi(i)_j z^{m-1-j})</t>
  <t>where pi(i)_j denotes the j:th least significant bit of pi(i). (Recall that the finite field F_q is constructed as F_2[z] / f(z).)</t>
  <t>Output (alpha_0, alpha_1, ..., alpha_{q-1}).</t>
</list></t>

</section>
<section anchor="key-generation"><name>Key generation</name>

<t>The following randomized algorithm KeyGen takes no input (beyond the parameters). It outputs a public key
and private key. Here is the algorithm, using a subroutine SeededKeyGen defined below:</t>

<t><list style="numbers">
  <t>Generate a uniform random HashLen-bit string Delta. (This is called a seed.)</t>
  <t>Output SeededKeyGen(Delta).</t>
</list></t>

<t>The following algorithm SeededKeyGen takes an HashLen-bit input Delta. It outputs a public key and private key. Here is
the algorithm:</t>

<t><list style="numbers">
  <t>Compute E = PRG(Delta), a string of n + Sigma_2 q + Sigma_1 t + HashLen bits.</t>
  <t>Define Delta' as the last HashLen bits of E.</t>
  <t>Define s as the first n bits of E.</t>
  <t>Compute alpha_0, ..., alpha_{q-1} from the next Sigma_2 q bits of E by the FieldOrdering algorithm. If this fails, set Delta = Delta'
and restart the algorithm.</t>
  <t>Compute g from the next Sigma_1 t bits of E by the Irreducible algorithm. If this fails, set Delta = Delta' and restart the
algorithm.</t>
  <t>Define Gamma = (g, alpha_0, alpha_1, ..., alpha_{n-1}). (Note that alpha_n, ..., alpha_{q-1} are not used in Gamma.)</t>
  <t>Compute (T, c_{mt-u}, ..., c_{mt-1}, Gamma') = MatGen(Gamma). If this fails, set Delta = Delta' and restart the algorithm.</t>
  <t>Write Gamma' as (g, alpha'_0, alpha'_1, ..., alpha'_{n-1}).</t>
  <t>Output T as public key and (Delta, c, g, alpha, s) as private key, where c = (c_{mt-u}, ..., c_{mt-1}) and alpha =
(alpha'_0, ..., alpha'_{n-1}, alpha_n, ..., alpha_{q-1}).</t>
</list></t>

</section>
<section anchor="fixed-weight-vector-generation"><name>Fixed-weight-vector generation</name>

<t>The following randomized algorithm FixedWeight takes no input. It outputs a vector e := F_2^n of weight t. The
algorithm uses a precomputed integer tau =&gt; t defined below. Here is the algorithm:</t>

<t><list style="numbers">
  <t>Generate Sigma_1 tau uniform random bits b_0, b_1, ..., b_{Sigma_1 tau-1}.</t>
  <t>Define d_j = SUM^{m-1}_{i=0}(b_{Sigma_1 j + i} 2^i) for each j := {0, 1, ..., tau - 1}. (Within each group of Sigma_1 random bits, this uses
only the first m bits. The algorithm ignores the remaining bits.)</t>
  <t>Define a_0, a_1, ..., a_{t-1} as the first t entries in d_0, d_1, ..., d_{tau-1} in the range {0, 1, ..., n - 1}. If there are fewer
than t such entries, restart the algorithm.</t>
  <t>If a_0, a_1, ..., a_{t-1} are not all distinct, restart the algorithm.</t>
  <t>Define e = (e_0, e_1, ..., e_{n-1}) := F_2^n as the weight-t vector such that e_{a_i} = 1 for each i.</t>
  <t>Return e.</t>
</list></t>

<t>The integer tau is defined as t if n = q; as 2t if q/2 &lt;= n &lt; q; as 4t if q/4 &lt;= n &lt; q/2; etc. All of the selected
parameter sets have q / 2 &lt;= n &lt;= q, so tau := {t, 2t}.</t>

</section>
<section anchor="encapsulation"><name>Encapsulation</name>

<t>The following randomized algorithm Encap takes as input a public key T. It outputs a ciphertext C and a
session key K. Here is the algorithm for non-pc parameter sets:</t>

<t><list style="numbers">
  <t>Use FixedWeight to generate a vector e := F_2^n of weight t.</t>
  <t>Compute C = Encode(e, T).</t>
  <t>Compute K = Hash(1, e, C); see Clause 9.2 for Hash input encodings.</t>
  <t>Output ciphertext C and session key K.</t>
</list></t>

<t>Here is the algorithm for pc parameter sets:</t>

<t><list style="numbers">
  <t>Use FixedWeight to generate a vector e := F_2^n of weight t.</t>
  <t>Compute C_0 = Encode(e, T).</t>
  <t>Compute C_1 = Hash(2, e). Put C = (C_0, C_1).</t>
  <t>Compute K = Hash(1, e, C).</t>
  <t>Output ciphertext C and session key K.</t>
</list></t>

</section>
<section anchor="decapsulation"><name>Decapsulation</name>

<t>The following algorithm Decap takes as input a ciphertext C and a private key, and outputs a session key K.
Here is the algorithm for non-pc parameter sets:</t>

<t><list style="numbers">
  <t>Set b = 1.</t>
  <t>Extract s := F_2^n and Gamma' = (g, alpha'_0, alpha'_1, ..., alpha'_{n-1}) from the private key.</t>
  <t>Compute e = Decode(C, Gamma'). If e = NIL, set e = s and b = 0.</t>
  <t>Compute K = Hash(b, e, C); see Clause 9.2 for Hash input encodings.</t>
  <t>Output session key K.</t>
</list></t>

<t>Here is the algorithm for pc parameter sets:</t>

<t><list style="numbers">
  <t>Split the ciphertext C as (C_0, C_1) with C_0 := F_2^{mt} and C_1 := F_2^HashLen.</t>
  <t>Set b = 1.</t>
  <t>Extract s := F_2^n and Gamma' = (g, alpha'_0, alpha'_1, ..., alpha'_{n-1}) from the private key.</t>
  <t>Compute e = Decode(C_0, Gamma'). If e = NIL, set e = s and b = 0.</t>
  <t>Compute C'_1 = Hash(2, e).</t>
  <t>If C'_1 != C_1, set e = s and b = 0.</t>
  <t>Compute K = Hash(b, e, C).</t>
  <t>Output session key K.</t>
</list></t>

</section>
</section>
<section anchor="bits-and-bytes"><name>Bits and bytes</name>

<section anchor="choices-of-symmetric-cryptography-parameters"><name>Choices of symmetric-cryptography parameters</name>

<t>All of the selected parameter sets use the following symmetric-cryptography parameters:</t>

<t><list style="symbols">
  <t>The integer HashLen is 256.</t>
  <t>The HashLen-bit string Hash(x) is defined as the first HashLen bits of output of SHAKE256(x). Byte strings here are
viewed as bit strings in little-endian form; see Clause 9.2. The set of bytes is defined as {0, 1, ..., 255}.</t>
  <t>The integer Sigma_1 is 16. (All of the selected parameter sets have m &lt;= 16, so Sigma_1 =&gt; m.)</t>
  <t>The integer Sigma_2 is 32.</t>
  <t>The (n + Sigma_2 q + Sigma_1 t + HashLen)-bit string PRG(Delta) is defined as the first n + Sigma_2 q + Sigma_1 t + HashLen bits of output of
SHAKE256(64, Delta). Here 64, Delta means the 33-byte string that begins with byte 64 and continues with Delta.</t>
</list></t>

<t>All Hash inputs used in Classic McEliece begin with byte 0 or 1 (or 2 for pc) (see Clause 9.2), and thus do not
overlap the SHAKE256 inputs used in PRG.</t>

</section>
<section anchor="representation-of-objects-as-byte-strings"><name>Representation of objects as byte strings</name>

<section anchor="bit-vectors"><name>Bit vectors</name>

<t>If r is a multiple of 8 then an r-bit vector v = (v_0, v_1, ..., v_{r-1}) := F_2^r is represented as the following sequence
of r/8 bytes:</t>

<t>(v0 + 2v_1 + 4v_2 + ... + 128v_7, v_8 + 2v_9 + 4v_10 + ... + 128v_15, ..., v_{r-8} + 2v_{r-7} + 4v_{r-6} + ... + 128v_{r-1}).</t>

<t>If r is not a multiple of 8 then an r-bit vector v = (v_0, v_1, ..., v_{r-1}) := F_2^r is zero-padded on the right to length
between r + 1 and r + 7, whichever is a multiple of 8, and then represented as above.</t>

<t>By definition, Simply Decoded Classic McEliece ignores padding bits on input, while Narrowly Decoded Classic
McEliece rejects inputs (ciphertexts and public keys) where padding bits are nonzero; rejection means
returning NIL. For some parameter sets (but not all), r is always a multiple of 8, so there are no padding bits, so
Simply Decoded Classic McEliece and Narrowly Decoded Classic McEliece are identical.</t>

<t>The definitions of Simply Decoded and Narrowly Decoded are provided for convenience in discussions of
situations where the distinction is potentially relevant. Applications should avoid relying on the distinction.
Conformance to this document does not require a Simply Decoded or Narrowly Decoded label.</t>

</section>
<section anchor="session-keys"><name>Session keys</name>

<t>A session key K is an element of F_2^HashLen. It is represented as a CEILING(HashLen/8)-byte string.</t>

</section>
<section anchor="ciphertexts-for-non-pc-parameter-sets"><name>Ciphertexts for non-pc parameter sets</name>

<t>For non-pc parameter sets: A ciphertext C is an element of F_2^{mt}. It is represented as a CEILING(mt/8)-byte string.</t>

</section>
<section anchor="ciphertexts-for-pc-parameter-sets"><name>Ciphertexts for pc parameter sets</name>

<t>For pc parameter sets, a ciphertext C has two components: C_0 := F_2^mt and C_1 := F_2^HashLen. The ciphertext is
represented as the concatenation of the CEILING(mt/8)-byte string representing C_0 and the CEILING(HashLen/8)-byte string
representing C_1.</t>

</section>
<section anchor="hash-inputs-for-non-pc-parameter-sets"><name>Hash inputs for non-pc parameter sets</name>

<t>For non-pc parameter sets, there are two types of hash inputs: (1, v, C), and (0, v, C). Here v := F_2^n, and C is a
ciphertext.</t>

<t>The initial 0 or 1 is represented as a byte. The vector v is represented as the next CEILING(n/8) bytes. The ciphertext
is represented as the next CEILING(mt/8) bytes. All hash inputs thus begin with byte 0 or 1, as mentioned earlier.</t>

</section>
<section anchor="hash-inputs-for-pc-parameter-sets"><name>Hash inputs for pc parameter sets</name>

<t>For pc parameter sets, there are three types of hash inputs: (2, v); (1, v, C); and (0, v, C). Here v := F_2^n, and C
is a ciphertext.</t>

<t>The initial 0, 1, or 2 is represented as a byte. The vector v is represented as the next CEILING(n/8) bytes. The
ciphertext, if present, is represented as the next CEILING(mt/8) + CEILING(HashLen/8) bytes.</t>

<t>All hash inputs thus begin with byte 0, 1, or 2, as mentioned earlier.</t>

</section>
<section anchor="public-keys"><name>Public keys</name>

<t>The public key T, which is an mt * k matrix, is represented in a row-major fashion. Each row of T is
represented as a CEILING(k/8)-byte string, and the public key is represented as the mt CEILING(k/8)-byte concatenation of
these strings.</t>

</section>
<section anchor="field-elements"><name>Field elements</name>

<t>Each element of F_q congruent F_2[z] / f(z) has the form SUM^{m-1}_{i=0}(c_i z) where c_i := F_2. The representation of the field
element is the representation of the vector (c_0, c_1, ..., c_{m-1}) := F_2^m.</t>

</section>
<section anchor="monic-irreducible-polynomials"><name>Monic irreducible polynomials</name>

<t>The monic irreducible degree-t polynomial g = g_0 + g_1 x + ... + g_{t-1} x^{t-1} + x t is represented as t CEILING(m/8)
bytes, namely the concatenation of the representations of the field elements g_0, g_1, ..., g_{t-1}.</t>

</section>
<section anchor="field-orderings"><name>Field orderings</name>

<t>The obvious representation of a sequence (alpha_0, ..., alpha_{q-1}) of q distinct elements of F_q would be as a sequence of
q field elements. This document instead specifies the following representation.</t>

<t>An "in-place Benes network" is a series of 2m - 1 stages of swaps applied to an array of q = 2^m objects
(a_0, a_1, ..., a_{q-1}). The first stage conditionally swaps a_0 and a_1, conditionally swaps a_2 and a_3, conditionally
swaps a_4 and a_5, etc., as specified by a sequence of q/2 control bits (1 meaning swap, 0 meaning leave in
place). The second stage conditionally swaps a_0 and a_2, conditionally swaps a_1 and a_3, conditionally swaps a_4
and a_6, etc., as specified by the next q/2 control bits. This continues through the m:th stage, which
conditionally swaps a_0 and a_{q/2}, conditionally swaps a_1 and a_{q/2+1}, etc. The (m + 1):st stage is just like the
(m - 1):st stage (with new control bits), the (m + 2):nd stage is just like the (m - 2):nd stage, and so on
through the (2m - 1):st stage.</t>

<t>Define pi as the permutation of {0, 1, ..., q - 1} such that alpha_i = SUM^{m-1}_{j=0}(pi(i)_j z^{m-1-j} for all i := {0, 1, ..., q - 1}.
The ordering (alpha_0, ..., alpha_{q-1}) is represented as a sequence of (2m - 1)2^{m-1} control bits for an in-place Benes
network for pi. This vector is represented as CEILING((2m - 1)2^{m-4}) bytes as above.</t>

<t>Mathemtically, each permutation has multiple choices of control-bit vectors. For conformance to this
document, a permutation pi shall be converted to specifically the control bits defined by controlbits in the
following Python script. This is not a requirement for the decapsulation algorithm reading control bits to
check uniqueness.</t>

<figure><artwork><![CDATA[
def composeinv(c,pi):
  return [y for x,y in sorted(zip(pi,c))]

def controlbits(pi):
  n = len(pi)
  m = 1
  while 1<<m < n: m += 1
  assert 1<<m == n

  if m == 1: return [pi[0]]
  p = [pi[x^1] for x in range(n)]
  q = [pi[x]^1 for x in range(n)]

  piinv = composeinv(range(n),pi)
  p,q = composeinv(p,q),composeinv(q,p)

  c = [min(x,p[x]) for x in range(n)]
  p,q = composeinv(p,q),composeinv(q,p)
  for i in range(1,m-1):
    cp,p,q = composeinv(c,q),composeinv(p,q),composeinv(q,p)
    c = [min(c[x],cp[x]) for x in range(n)]

  f = [c[2*j]%2 for j in range(n//2)]
  F = [x^f[x//2] for x in range(n)]
  Fpi = composeinv(F,piinv)
  l = [Fpi[2*k]%2 for k in range(n//2)]
  L = [y^l[y//2] for y in range(n)]
  M = composeinv(Fpi,L)
  subM = [[M[2*j+e]//2 for j in range(n//2)] for e in range(2)]
  subz = map(controlbits,subM)
  z = [s for s0s1 in zip(*subz) for s in s0s1]
  return f+z+l
]]></artwork></figure>

</section>
<section anchor="column-selections"><name>Column selections</name>

<t>Part of the private key generated by KeyGen is a sequence c = (c_{mt-u}, ..., c_{mt-1}) of u integers in increasing
order between mt - u and mt - u + v - 1.</t>

<t>This sequence c is represented as a CEILING(v/8)-byte string, the little-endian format of the integer
SUM^{u-1}_{i=0}(2^{c_{mt-u+i}-(mt-u).</t>

<t>However, for (u,v) = (0,0), the sequence c is instead represented as the 8-byte string which is the little-
endian format of 2^32 - 1, i.e., 4 bytes of value 255 followed by 4 bytes of value 0.</t>

</section>
<section anchor="private-keys"><name>Private keys</name>

<t>A private key (Delta, c, g, alpha, s) is represented as the concatenation of five parts:</t>

<t><list style="symbols">
  <t>The CEILING(HashLen/8)-byte string representing Delta := F_2^HashLen.</t>
  <t>The string representing the column selections c. This string has CEILING(v/8) bytes, or 8 bytes if (u,v) = (0,0).</t>
  <t>The tCEILING(m/8)-byte string representing the polynomial g.</t>
  <t>The CEILING((2m - 1)2^{m-4}) bytes representing the field ordering alpha.</t>
  <t>The CEILING(n/8)-byte string representing s := F_2^n.</t>
</list></t>

</section>
</section>
</section>
<section anchor="selected-parameter-sets"><name>Selected parameter sets</name>

<section anchor="parameter-set-mceliece6688128"><name>Parameter set mceliece6688128</name>

<t>KEM with m = 13, n = 6688, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. This is a non-pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6688128f"><name>Parameter set mceliece6688128f</name>

<t>KEM with m = 13, n = 6688, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. Semi-systematic parameters (u,v) = (32,64). This is a non-pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6688128pc"><name>Parameter set mceliece6688128pc</name>

<t>KEM with m = 13, n = 6688, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. This is a pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6688128pcf"><name>Parameter set mceliece6688128pcf</name>

<t>KEM with m = 13, n = 6688, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. Semi-systematic parameters (u,v) = (32,64). This is a pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6960119"><name>Parameter set mceliece6960119</name>

<t>KEM with m = 13, n = 6960, t = 119. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y 119 +
y^8 + 1. This is a non-pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6960119f"><name>Parameter set mceliece6960119f</name>

<t>KEM with m = 13, n = 6960, t = 119. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y 119 +
y^8 + 1. Semi-systematic parameters (u,v) = (32,64). This is a non-pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6960119pc"><name>Parameter set mceliece6960119pc</name>

<t>KEM with m = 13, n = 6960, t = 119. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y 119 +
y^8 + 1. This is a pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece6960119pcf"><name>Parameter set mceliece6960119pcf</name>

<t>KEM with m = 13, n = 6960, t = 119. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y 119 +
y^8 + 1. Semi-systematic parameters (u,v) = (32,64). This is a pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece8192128"><name>Parameter set mceliece8192128</name>

<t>KEM with m = 13, n = 8192, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. This is a non-pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece8192128f"><name>Parameter set mceliece8192128f</name>

<t>KEM with m = 13, n = 8192, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. Semi-systematic parameters (u,v) = (32,64). This is a non-pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece8192128pc"><name>Parameter set mceliece8192128pc</name>

<t>KEM with m = 13, n = 8192, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. This is a pc parameter set.</t>

</section>
<section anchor="parameter-set-mceliece8192128pcf"><name>Parameter set mceliece8192128pcf</name>

<t>KEM with m = 13, n = 8192, t = 128. Field polynomials f(z) = z^13 + z^4 + z^3 + z + 1 and F(y) = y^128 +
y^7 + y^2 + y + 1. Semi-systematic parameters (u,v) = (32,64). This is a pc parameter set.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>Classic McEliece is a Key Encapsulation Mechanism designed to achieve
IND-CCA2 security at a very high security level, against conventional
and quantum computers.</t>

<t>The quality of the random data is critical for security of Classic
McEliece, see <xref target="RFC4086"></xref> for additional discussion and recommendations.</t>

<t>Implementation should be designed to mimize leaking of security
sensitive material, including protecting against side-channel attacks.</t>

<t>New research results on the security of Classic McEliece may be
published at any time that may warrant implementation or deployment
reconsiderations.</t>

<t>To hedge against new research findings, Classic McEliece may be
combined with a traditional algorithm in a "hybrid" mode intended to
be no weaker than any one of the individual algorithms used and the
way the algorithms are combined.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor='NIST.FIPS.202' target='http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf'>
  <front>
    <title>SHA-3 Standard:  Permutation-Based Hash and Extendable-Output Functions</title>
    <author fullname='Morris J. Dworkin' initials='M.' surname='Dworkin'>
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <author fullname='Morris J. Dworkin' surname='Dworkin'>
      <organization>Information Technology Laboratory</organization>
    </author>
    <author>
      <organization abbrev='NIST'>National Institute of Standards and Technology</organization>
      <address>
        <postal>
          <country>US</country>
          <city>Gaithersburg</city>
        </postal>
      </address>
    </author>
    <date month='August' year='2015'/>
  </front>
  <seriesInfo name='FIPS' value='PUB 202'/>
  <seriesInfo name='NIST Federal Information Processing Standards Publications' value='202'/>
  <seriesInfo name='DOI' value='10.6028/nist.fips.202'/>
  <seriesInfo name='DOI' value='10.6028/NIST.FIPS.202'/>
</reference>




    </references>

    <references title='Informative References'>



<reference anchor='RFC4086'>
  <front>
    <title>Randomness Requirements for Security</title>
    <author fullname='D. Eastlake 3rd' initials='D.' surname='Eastlake 3rd'/>
    <author fullname='J. Schiller' initials='J.' surname='Schiller'/>
    <author fullname='S. Crocker' initials='S.' surname='Crocker'/>
    <date month='June' year='2005'/>
    <abstract>
      <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
      <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. 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='106'/>
  <seriesInfo name='RFC' value='4086'/>
  <seriesInfo name='DOI' value='10.17487/RFC4086'/>
</reference>


<reference anchor="CM-spec" target="https://classic.mceliece.org/mceliece-spec-20221023.pdf">
  <front>
    <title>Classic McEliece: conservative code-based cryptography: cryptosystem specification</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="CM-rationale" target="https://classic.mceliece.org/mceliece-rationale-20221023.pdf">
  <front>
    <title>Classic McEliece: conservative code-based cryptography: design rationale</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="CM-impl" target="https://classic.mceliece.org/mceliece-impl-20221023.pdf">
  <front>
    <title>Classic McEliece: conservative code-based cryptography: guide for implementors</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="CM-security" target="https://classic.mceliece.org/mceliece-security-20221023.pdf">
  <front>
    <title>Classic McEliece: conservative code-based cryptography: guide for security reviewers</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="CM-pc" target="https://classic.mceliece.org/mceliece-pc-20221023.pdf">
  <front>
    <title>Classic McEliece: conservative code-based cryptography: what plaintext confirmation means</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="CM-papers" target="https://classic.mceliece.org/papers.html">
  <front>
    <title>Classic McEliece: papers</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="CM-sage" target="https://classic.mceliece.org/spec.html">
  <front>
    <title>Classic McEliece: Sage package</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2022" month="October"/>
  </front>
</reference>
<reference anchor="McEliece" target="https://ipnpr.jpl.nasa.gov/progress_report2/42-44/44N.PDF">
  <front>
    <title>A public-key cryptosystem based on algebraic coding theory</title>
    <author fullname="R. J. McEliece">
      <organization></organization>
    </author>
    <date year="1978"/>
  </front>
</reference>


    </references>


<section anchor="overview-of-classic-mceliece-resources-informative"><name>Overview of Classic McEliece resources (informative)</name>

<t>Classic McEliece is specified in <xref target="CM-spec"></xref> and, for the pc options, <xref target="CM-pc"></xref>. The specification in this document
is compatible with <xref target="CM-spec"></xref> and <xref target="CM-pc"></xref>. For the design rationale, see <xref target="CM-rationale"></xref>.</t>

<t><xref target="CM-sage"></xref> presents algorithms for the Classic McEliece functions in the Sage language. Subject to being
computer-executable, this package is designed for the algorithms to be as readable as possible, including
detailed comments matching the algorithms to <xref target="CM-spec"></xref> (and <xref target="CM-pc"></xref>).</t>

<t><xref target="CM-impl"></xref> provides guidance to implementors. For example, it covers security against side-channel attacks,
considerations in picking a parameter set, engineering cryptographic network applications for efficiency,
existing implementations, and how to build new implementations.</t>

<t><xref target="CM-security"></xref> provides guidance to security reviewers. As a preliminary matter, <xref target="CM-security"></xref> covers
correctness of the cryptosystem: for example, c in Step 2 of Decode is unique if it exists, and c always exists
when C is output by Encap. <xref target="CM-security"></xref> then reviews the stability of attacks against the original 1978
McEliece cryptosystem introduced in <xref target="McEliece"></xref>, and reviews the tight relationship between the OW-CPA
security of that cryptosystem and the QROM IND-CCA2 security of Classic McEliece.</t>

<t>Given the analysis in <xref target="CM-security"></xref>, all of the parameters selected in this document meet ISO's requirement of
2^128 post-quantum security against known attacks. This is true even if one counts merely qubit operations,
ignoring (1) qubit overheads and (2) the costs of memory access inside attacks. (This document does not
comment on whether parameters not listed here also meet this requirement.) For comparison, 128-bit
ciphers such as AES-128 provide only slightly more than 2^64 security in this metric.</t>

<t>Many further references can be found in the documents cited above and in <xref target="CM-papers"></xref>.</t>

</section>


  </back>

<!-- ##markdown-source:
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
MJ9FxPySSaB9AZbnvwEsI6axxpgAAA==

-->

</rfc>

