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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>


<rfc ipr="trust200902" docName="draft-josefsson-mceliece-02" 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="2025" month="March" day="17"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document specifies Classic McEliece, a Key Encapsulation Method (KEM) designed for IND-CCA2 security, even against quantum computers.</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 (the "20230419" <xref target="CM-iso"></xref> version).</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>

<t>The editor would like to thank John Mattsson and Peter C for comments that improved the document.</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 minize 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 other algorithms (e.g., Curve25519) 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' target='https://www.rfc-editor.org/info/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="CM-iso" target="https://classic.mceliece.org/iso-mceliece-20230419.pdf">
  <front>
    <title>Information security — Encryption algorithms — Part 1978: Classic McEliece</title>
    <author >
      <organization>Classic McEliece Team</organization>
    </author>
    <date year="2023" month="April"/>
  </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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

-->

</rfc>

