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


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

]>


<rfc ipr="trust200902" docName="draft-josefsson-mceliece-05" 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="2026" month="June" day="23"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 84?>

<t>This document specifies Classic McEliece, a Key Encapsulation Method
(KEM) designed for IND-CCA2 security, even against quantum computers.
This is a transcribed version of the proposed ISO Classic McEliece
draft, which ISO standardized in June 2026.</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>


<?line 91?>

<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), prepared by the Classic
McEliece team, as a draft of a potential ISO McEliece standard.  ISO
standardized Classic McEliece in June 2026 <xref target="ISO18033-2-AMD2"></xref>.</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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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" type="1">
  <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 security of Classic McEliece depends on the availability and
proper use of cryptographically secure random data.</t>

<t>Implementation should be designed to minimize 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.  We recommend to use the
Chempat <xref target="I-D.josefsson-chempat"/> combiner.</t>

</section>
<section anchor="acknowledgments"><name>Acknowledgments</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, Peter C and Loganaden Velvindron for comments that improved the document.</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' anchor="sec-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' anchor="sec-informative-references">

<reference anchor="ISO18033-2-AMD2" target="https://www.iso.org/standard/86890.html">
  <front>
    <title>ISO/IEC 18033-2:2006/Amd 2, Information technology - Security techniques - Encryption algorithms - Part 2: Asymmetric ciphers, Amendment 2</title>
    <author >
      <organization>ISO</organization>
    </author>
    <date year="2026" month="June"/>
  </front>
</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="I-D.josefsson-chempat">
   <front>
      <title>Chempat: Generic Instantiated PQ/T Hybrid Key Encapsulation Mechanisms</title>
      <author fullname="Simon Josefsson" initials="S." surname="Josefsson">
         </author>
      <date day="20" month="October" year="2025"/>
      <abstract>
	 <t>   This document specify Chempat as a generic family of instantiated
   Post-Quantum/Traditional (PQ/T) Hybrid Key Exchange Methods (KEMs).
   The goal is to provide a generic combiner construct that can be
   analysed separately for security assurance, and to offer concrete
   instantiated algorithms for integration into protocol and
   implementations.  Identified instances are provided based on some
   combinations of traditional Diffie-Hellman key agreement using curves
   P-256, P-384, X25519, X448, brainpoolP256, brainpoolP384 and
   brainpoolP512 combined with post quantum methods ML-KEM-768, ML-KEM-
   1024, Streamlined NTRU Prime sntrup761, Classic McEliece and
   FrodoKEM.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-josefsson-chempat-04"/>
   
</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>


<?line 797?>

<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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
AAA=

-->

</rfc>

