<?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-01" 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="2024" month="April" day="14"/>

    
    
    <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:
H4sIAI2bG2YAA+19a3PbOLbgd/4KXE9ttTSRFEtxpxMnvrVpd5x4Oq+J3dt3
N7FTEAVJiCmS5kOOknXV/oj9hftL9jwAEKQo2Umne+9U7VRNRybBg4OD88YB
0O/3g0IXkdoXO4eRzHMdipfh00irUO0EcjzO1LL1VSgLNUuy1b7Q8TQJJkkY
ywVAmWRyWvQ/Jrma5nkS9xehoi/6u8NAp9m+KLIyL0a7uw93R8GFWl0l2WRf
HMeFymJV9H/Bz4O8HC80dJjEp6sUgB4/PT0Kliou1X4gREHPdg6zVVok4ijJ
yoV4q3Ils3AunmVJme5Aq0ylCbSaF0Wa79+9O4NByvEgTBZ3P8r8rlbF1OG2
E+SFjCcfZJTEAHml8iDV++JdkYQ9kSdZkcFg4NdqgT/OAlkW8yQDVPrQjxDT
Mop48Cd6kcTiH3bw9FYtpI72RY6v/qujyyDJZvQ6S5D2aqKLJAviJFvIQi9p
mK+OT04HR8dvTgaj3dF+gGT23r49OtzbfXAffx6+7OepCvcJXiGzmSr2hR13
yDM3sGPFju+6ScHv+gB+NNwd3RukkynD2MAQ+yJM4lxlS8IC/pio/ljmaiJC
motZJtM5cAT/la/yQi0EdqGnGvgFpnOH4Dv60f8AoX3R7EqcKrmgBhNgtH3x
OiySscoE4spDzgigjNS3jNt9/P0HP1G5nsXC9fAdh6wXafQto8Xvvv9AZ6We
KAFMKRC+WqgYWDj/jsPNVVhmulh9E2Obb//MYds+QNUstbpS33Xw6TfJc/on
SPPVXBYijaQGHf2pwI+mmhQRqLqFkvF3HbVMgYxfMXL+YDAvFtENg+WW35M9
5exrdA/qwdvgeQJgAdnwAv79nrojT74CWWhdWW4Acm93b/hwjaOOrUkCTnDC
8H/+1/8WT2NiIXwuI/ASdDFf5PTmjcwKMXz404P1MXzzYJ+kmY5wqPfgoSNk
62B1GqfZ4GMaDWKZy8EsWd5NM+B0lecf0GHIitHdvVF/b+/u3t6rwZtfjmrj
fSLSchzpsA9+S93IsdzwcNU4k4AtyJOOZ6KYK/CS2sZWuQ1vB+IfA4e5NzIk
VBD0+30hx3mRybAIgtO5zgW4WyUqXGtdVb5GpZ6Q4lfAE+ZCpnkZ8TS9VIDC
RHR+ffqya0wVII7a7PjVL/3DwycjN5M9ocDlEnIGkp8X4rKUcQGeFnhQaVmg
0DFmCz2ZRCoI/oaemEJ3rokj/Jbg9oGmCDM9hu6W8DUik0yRPAJmIE2Qfscn
r6tJJpdMZoArttmxTLgj3jE3n1kw3QF2qNbZpAA2wc7BSRwrUnaguTPoBwHy
XAjoQyRXMYiKQYZ0nI7htzeEHrUjCHmRY9OOxrlO53KsCvBtIuBUgN3dB5qI
X2SsVYRT+jM4tcAfOu6J32JN+IKEwOfHUaTjBAlTiMM5AJgl1MXbcp75TX9O
wnm5AJinJfDS4Twpe+JJKCdqoSV4mzF8CS8PZRYlwAF60kMXFOZa/KZ/JoCv
L3QsryQ42DlwMcwb9n4SahUDgbDBqQrncRIlsxUA+oeMxTMdhXOV9cTT0+fi
fwAnhHPsX8YfpXgh4xkw1lMdT+YJMkd9VDVY/01mJfCbzOSiAes4htEukRkl
PQLPWkVTePFWTiUQ7iXMbvj5QvfEsySZAW/Bm3IMvb3SCog8B8UYr5GBBlNH
5ySBOYYZEL+oeCGzC4DzdJIASyXiDbaCYRYF9HIUgYaaSPEEIoQYZtMDg8Sd
ZzDpWsYKvkK+d+i+0mECPCdOVDzJNJLsOM60JDpelGNx8llN8el/By+wARMG
8w+c0dOPcwkYvPknIBuVKKG5eFFMBtAGKFcAk50mC2AViBhaWrWM+U20WuCw
AcDv0MnvMGHrCJC4cMghrpIymohIXyiUk2Iu4wsIYOY4OUWBkQp1QiMXh6Qo
QAGgTOTYuEDfLwNWYKGy8jJAdQAxXZZMyhDx5S7Bb8gL39Hw1KmqTIbRqZ03
vz7tiisgsDaQ4AugCCpF8c5K+dlAIGiGJABSUKlECV54PElAPYMQZCtgpzSV
1P9APBGhToE7WN6xLT5H9QW+TpnbL1WWgVNr+sg0+EoKOwHZj5KrPFBTiGw0
KrmJYoUPsdwn0tRG+VdgpxnAoyeu454AjQQsN11hayR0phbJ0n5qOmfiVYqR
yYOEcQqcVRxEr/0ruRKd17/3D9886fbIP2NoMFUg3DCn4FnAVIYyjpNCOPyj
FcxOPAnWMZY+oRDFitQ98A1VXB8lkDKcgzaPDQWjFRPP+QcRWBVQl1Pqqjmo
OQwqw4gZB4U/sgs5BtzAGIwj0Dww4FQXyGifVUyKmEdkvDsBnJiJvR8hhJdm
1gKQ7RlMf1T1laJOIlEW4LSruhlMYuhudH5/z7OD47KgQRoklcw14gRqH5is
TJH6O9jzhY6incADT2RH+cCQQWKUVNEBxjbTlXmVk6UEnYzM7kwsGCOrUIFT
4jAqyaUwljjwLXEbhyAxofNFWsDY0AJjjDZJgLkl6AjgWSDfNEFGhjHA5F0M
QL8sFFtCmEd8ZOW7YvVwBbOuYSRhBEQGOqTgPUEUgZi5iI0BMMokiDuTUkY7
AkS6MvfjldHomYI5zTDVMi2uZKZQhNWkTHO2u3NQ2fhY2Mcw3qMyQ92+AJcD
SEMSHCdXMJ9RJC7gVyzm8CdMjM/hYMBhlkgQWEIIH9AuCfpKT18ajZY7Xyig
AalqkgD629cvDdMRgyG/E1jyaNDb0LM5CLZHlWKN/XuijCc4v1fQc56XC1J8
ecBiiiMFby0HHUZEqgkKYLzPirRHL2gEqAmAgguwhDkasI4eqAFKi9OpGagn
RJKGwJIZg9PLPaIqKWFGuo8QzySeVKCRh+LEhzSVOgKa5CQtSxnpiacggCRP
0S8Ar4hmFLpF5YicFMhwrmHwOabCdCQzphRiQaCkGGeJRKpQRFLJNnABuskw
f/9s0F4JMM0XRrkhqvP+tIzJ4PStGQithgjJ0IGWnMqcZGuO+pCmE3r3QJM1
mEwwJqjo77zRlHR7SFICfoBiRS8D5Lx+XoCEKiDfHIbWrxTITgnck4EpBMJN
dghTYTEFZl7zXMcZAOW5ssII8bhCjh+IY2OvkGG3e/CC6ALTviKE3PPAMOEN
/j1RGHuB7saljopawgAtBtsH5JMaIixcQTV+M3++tP8APAsqwY8F7PDhFYIs
c6TsmulmFssqQ4LzEyBmRGEjhQ6fPGH+mJZIfD+1gaxRkhOUozk0McKULDJH
AEpESTzro2RVNAXLBeqr6Ft6tfow5ACdwnc5abCJAuOqWcYDCJM47Ckz1IO5
m+Iq2sDXrJlJf7TBETJNwbZivHHy/MmvT0c/3t8HJJV4V8sbnzGwPEHTswLH
rQCPGz2ZhaasD4o9DnaNBa8gZjeaC5kcnTVn17BTy2yY/5+g1olnpc4hHtIR
cZ4zazLl9BI5BX3fl2BBRmDAZPvoUPRVLVhdgPkD/yVfYBtmqn3r5JDesL0Y
4FWSyoNNCnObo4mNQPr3jVrsJyDhQK0F8FqE7/5JL+10b2h09OES1XKMzgno
bdA0MKuX+Gb/YB8GshhziCmBngU+fvJhDDHMhy/ja/AYwQUEmj0ReTnGGJkM
Nk2A+oR2hARkTF+d41fnza/Q99n+3YfxeWj6O/8SXhOQ8PpruicG3N5ViF0d
/Pu+iDDtYlQscLsC4hGVHgMtIpy4tTeHT49fHL961pHdfacZwUVKU9KuHJqA
OILrhbJZKAQ/y5Qsmt1gU4kQU/F3AXOykMDxnwQExYVOI7MMgdJ5slqMk4jl
ite5tMRBkbRBg7+JZ5TpBXjgKcsqiomA20FZgHBWgUlO6Nl2TqpIrGsLIFZ9
o2MObEoxCkaJFI9zahk90EeoR8nBixS6u57cuzwFKgXEBe0NwbBUAqqBi5Xh
cCidYd06NB+oBHjY6NZEoB0R1yAJQ5nTegX2DQ1X1KAeeLn0CHj9Wa0bUkPx
PhkM1NEwUfEMeKOTYrrPYHz40lMhXfjgwvtgokHzERNt/6bgb2YlPAU2AMQo
SOqHCdgV5hrQIFYLbYd1ybBy/VnZNiy6NH3bv10AIyczSZlNyv6JEUn8DZ+V
+yBmcRLHasZZd8vL2z9bfttnz8HPwC/rRq/mfYiOswp9P+1fQbKAXiiY4Bc8
r6jIQOTKAjwF/APf3w7SiZ4t5Ieh2Dig2wMZ/TEgb94+w+/TXJWTxOUJCjFT
scokpkZuBWZGQJJoFScLDeoH5ARswft3n96f1WfHyx7gd5Q8/KDh61goXj2r
mNAzIwBsK5xncrGQ+6Iz6xmQuz0xGAzsX1/i/vC6uxVCjiPAkYMDhdoWWhnx
jbd+d0q4LwrQsxdWzVL8fQRT07EM6ZIF+Ina0hXq4ecwGHx+pTA0EAUahv16
qsbzEMgy5Mb2YOYHlfZhEpWLGNzKkBy7JbiLGWhq83cQPGVakx4FRM9jCDvL
cI6q2OYw2CaQXrHf9Yy+BMcDYOJi34S/8Dvzw8GY7IVcJnrCfjzlv8HfYy2O
qWEKack3Ze9PT6cYoNmkS7LAWoIKGCcGvDUF51YXSXCVIcd4A8j9UXMCI3E4
qFrKxoRf6E4i8FSSmxvOFUZZRNPdflyiA4OvkaDD6m8wiQkGdGBapyuKHeDz
HO0U9GfjeUR9AT6zoLUWM8eRBI9RzlTeazGTNtfOcTvo4zxANxMNLXetTHZq
10+MZGSSqVnPzo37m+w8yoR9VJ+DitCYt6DkFPD0XOHyFub3IwxaJMUQOVjT
AuwV+p+Zcq6yZjpXbyfkOewTedUnSv/0PFURgOcEzizyImJRIYBGeH2YnHQh
MtppxQxepiJ2WxJfC9VAB1tBDylWeQvOk85YNJrrN+R9GBdnLU4A170KFP0V
kmKOtKnR0BodF9EHv6rVM0zm0yIVz9Evin4S0WQ4t8pnZz0OQVc63zE+kAli
gFXEcNckxHy3ycFrh0NTUMaaci4mI4TxZ+RDaeQpHIAgT2Wo3Fqcj8v9AS6L
cc/1DsmhwvRg9RSh9MgLh9lAyocEJLeuZNCYEvS6gLFClBFgD+zCqVtO1foZ
axigsdjjlWDCi5leukwtKub80RrIRvbX07cNkDSHBqJsYuJ3gQ/WuvHhAvNV
YIkfHNgGNtIf4mAT4xL1WzlRHGEXlKuL2aB4K9YoUyYbIo5AW4CHHAbeera1
G89gknIt0Y5DWB2zAkPasHymigQUfWZOJb+UhWV6UME9HCH9ewwuLDjbGjPd
wRFa/9e4qKhxCecEXF01seJypD+pye+KM42bZEiYlKnhSY5YpKdAUXDyAPNY
hUo5iYwiywKXK2/p3pma1o6xR9s5dMlTDU41xCXGmSLlXHFAIAsPsUVCWscu
E5C7wf4B6RHvO151YdOrY+SPqcmlkPsPpi0mO+BPdeCUDqeFprS0IHOT29jW
G2ozYCSbA6xRxIi11eqYgjIiVbEPhKdgXC2bGx/a76HH2SlczsAlD6vq2jnV
gNcO88A43gC0X/lUgNlzjM7Mmx7mS1yA0FTeVbjQQ8CjH++v6d0NandAhh/0
k15Q1gzrQDCEpRC0sXLukSSfoy/UGXaJoYTSFJOaoUHPrEPgB3HwI9EZdQO7
RIbCXtOgLYpfdFDmZMyxbr05WTurlrukhUTnXteKeGAnajs/VRNiealZLGCY
sq7aVUEcEziOkW5CbfGccXyQpGzPDV3XaOq43lbo3H94f3c4fBjUx8u0tgqM
5tLJnOnbjaUd5X3B6wj4bR3NgIEjh68x+AHxEUmQEyjM1rGi4A9TTiswVsgJ
Rt8bd1iJpjAFTUWW2sQLWwYHCPr2pAGT61u40xj0osSVOeez+HoPpccXCYuX
VXm+y4IGutIv26SiAun6Mg4qJjQNjW7m+8B3eH7LMXqovM80Qp9kyutkgvPj
mB7NRa0qq+e7p4ioWbQTS3Dkca0Qi2b6mIeNVQSeZImV2gslc1oD6hgfgdZW
Sg4sdIYVNb6e66JEo0vFK0A4HJClEteAKIlPjJKqzNJrEJyUBLXC2bgapK3D
JFWGYz2amuir1Wtt90KJ2wwnU/KfJIXUvYxX1QQWHrkeNSZykij2wx2yvPBI
5qLqib1whk/+9hsvmX7azN1w7g1jqhCXNtHS5Ta5Bw09F8TyG8kEFjX4cFgL
uGoItFFuUYEKlTBxketa6mRhyEipQUtCnwEvUb7PF4P2z2MOhmLx+EBcbmhT
iIN/FyNuuCjEYxHf1OcF9BmLPrRmkBAYgxXTlbvkhz7Tzueu2D/A4P79u8/v
z5BlJooCNTu4qg/wztj3Y+Vrv7lLQEyNgsvD3KLzo87KdH75/t2q1nlxc+f8
zV0C0uj8y+V5cS0Q8BegfnE9oDoqImgulkjREv+zy2RdIv0vxB1RDipOI7vN
GpYjU7EwmQXmVo//GEd8vgBVFnR2e7tdFAt4LsuIZoGctRvyYzY/bdiTOf3m
jzgm91bANjGrsTg8L9uSnJSfpJGzncmdsUL1RN/HDqpNUQI5F62vRsTAVgQ2
5w/fvH3mLWFUKS+/b8GRpnsXw6TZXi7d7yEIzZ0GzrjAOK9qfuxYKWHzkrNx
xKL2Icb4nMrPkqu+CucwJ2T4F0HwzERXJov3H732mMZoMNapECxDkGo/eYtu
ULahA5gNWwgRkJHmEITcg+SKslX/QebPWXHM5HBQje8wU4Pfb+uCKtGd/wDq
ltbIOZAGMOGHXdA0IVDyMaZH6feXrD+85iiOLAHMJ/a7i3i9BZ6daYBI8iTF
kNNvlFIKMcfK6OrcOuRUNxQn8WeVJbiilq3qXzwy0Ic3Qx/2bgNxaCGOboY4
uhXEEQX/RTiwkDPQubfAl+h4qx6opY3/0ex6uQ7iBOoL5R89mldJoSqPMMPK
RHoPFM8GzNIntIKLht1w8hOadbR5oI1DmYOnTR9ou9rr2go9pZVfKnGxPmxG
aPQqvxezvhTJCxoSvrX4hx80KGRNnsguKlwNXJUNRIfUPBfSoFsw0bYoAXNs
SxnhaAuTNV0Bv1Pa1bLjAVO9ByiFKrWFCOBYGr2iaFTQ6ABo1A2C49gs7FEq
t2fGw+oTBtk5/pC9/5+n3Z5ZtDum2hGQI/F3+D+7mFSMhlI8YBXB+srqAkLV
kS7whI3Vga1wMvqgatrnpgym0gBtAg4En5p0ivkAAiXMTthpVgvdz5tzfVqr
kmD6RPoz6yoTvgL9iYzoNzbmnzJrWIFltbtngsre0tRg0eSggQ3YwAJGL8Ct
Qong+tKLfmYHuUU/gW+GdV6GnzMy2FaJWJXFawyFWeVGNihB6y8DFh+kxe9I
vRV/Ytm6A7h2+3kLhZCozA7M1rYszGdmiIPb+Rh7Z07H9/TU4NPG8IqgOGZn
G97K7sTnZcXpJekYKq83EvCYXgTcF76sSYJok4QSJaFF9LfRZk0c14kHMy6W
A/E8uYIoJSMmXQr0tACPONgCnKuDBVYnMm9whYBcU0I2ZVlf/MCQNncBWC2L
TRXUNv4nklIxL9CB0AGE2Vkz1jR2bY14BNiWU21Ux+Cq2NYyPLZuNfdy8Zic
xeVyjovrgQaZhhoSxN/BestIgj8I/e1Mdxpf3Rv17u91B74PYzOIJknh1YGx
anhmxtXQBlXKibOtopAXKq8Sh7Rsil3666b8Y9i2gEraE+3FjIvvtkYB/hqw
FwA4u3dTdyQ9XFQVFnZ12KxYXho3uhqgSZ3wODs0sK6f62SeMdJTY5l1pdir
GMcYHsM31Qct/M78ZPBAweK03qvjFxj421VtMkenNFpnjk6t++SWigOqK5eb
FpY32X3MxjaYr7gVlbbjyu1q2DrUgiZqnHg1A3I9Q/AyHIhDLw2HX8d2YC8B
4S/zD1907+P1tYV1aXs0L6ANs8fHcy3uilnH/NXl7bfoCxguKpw6/eg9xeB5
OAhGlINcuCE4JF5VC/dj3M6KuSOUIhJ6duNKcKAhngQH+jP8iy40/vVlgez6
+Zz/xRpO6yKy0cIctcmml8jypWN38+0guGe8DgVYtKhhcGC+QLxb82HoiT8X
8J81V+bYVFVivXKOFVJFmcU4z4NgD7ukP6s53uppIHdZQQAm+z68FeIw+uW1
IQj/iY40AfjBDheVTp3xmjLxiJzRVmC2iovzBDblglYXrKz9hoMh/HkHzW8V
HzGIx/YTsMePbMXJD77u/OG9U2fws6bQ4G/WoI+s7nQuoMytUiKV/MhXj7eA
eJOS/P/C+MeFcbOLAx7AuJA6rsUKz7dJnei8wpASSzTIJ8V1QPB0aYGlHk9q
iPdX/rL7BrPTa3ddmVt5fccxe/ANzM5mzY6N7T46ZbgVyRSNwORhanwG3hSW
ooIbCrrlBHyczq0FAwXpFh4I0O8pLxjwx/qW+PzIK5VIJx5Zz5h39wCGOjRr
M4mgbGCWlLN51WLYc2tctMt1X+RXMnUFNsRkQTV72Pi5rVfBlpwAc3gzT1oa
wAfXMLYnU67k5S96dT4RbXyieXsXoWKz8HPKEk0tX8Dw7zcmETcJIdTvZmbY
kAS3UegG7rfpzwGF+m4Vz3pkLT7PJlOAu9u9yNhz1xZpsXKeH5A9SpK0ehEA
Wxic4ZlXecubDn19Ts3MzhybeyQ9gthtjsNs8sX7JGh1Ma0NrkyvpyWKOQRL
8AVE3az1TSTU0pYjDKq/oG1r5RhYvqCKmk1hBBdrmDCCswaYSN4HGeRqxX5R
LwcUyqxCnMePbK1KVRNzanJMwWZPV7S6+YxHB0Kw065RAdzdoe0OuXarL/oL
Z/efI9tUbE8WyVpG3opKuvsQmj1XNeBEvV/UV1CPS1x4kyyeVeCD4xQ4bR5V
nB6vFYFeFR2FHG4iTIOOngYmX8QfUrboEafCrjQIhi7MAHK7Y21AftwCS+Bs
zU3rdLbRk2eQpYClLJK0lXnBdXZkbWvuHx0Qg2X39HfgssyNZv92wMbxdyrg
PHXhut0qvQl+i4k0ZUW38xeNQNdzhd/kz31bLPy9vb1Tl0DDyUyTPNe0B0Cb
jYo8351Dp4xpTQm8FeSnmkyRdVxrDq0UeDeNZKuemswd85+vC9aUAOU3eb+l
4WHi54YU9rb1bzF2i85zuVTV/D3nVXFcu96MxpYOKDba5jc//VQoEINDlNgl
4g2fW692t1uNFBfQ01Rx8cwFJRtzdni1sTEmWRzWqcMCgtVBz0N0mLlEZ9QV
tJ7nFAOyAZVVPEatQGU9S+N5GtzjhAUurMd999g3U5jWA68npEgQvqtUjKTh
4ey4L2HaXzut4kMzC3BtFbGkIL1yvr4nEFVCa7O69D61iStvjbBaE+RcFnn0
ExShiROeyYcvVTNw4a5p45Fd/awHpjJYl2CWU2AgH3O3sg3CfBsLM1aFfP8B
Y5+T315yWALirA92rzsefh9hKjTGLbpbZRo/Yl9fYEhDP5ZCT/F3jW4et5rh
YX8+SSqCmKpySvLjqlRQaVWOgZr2Vc/iJDOeAx9BwNtPoWUXedcbEwwI/6Eg
jH4MxcrFYfTgC3lcq3P+1y8IuEs1AsSLfhiKW7fBNNXJDQOj7mwgCqOva31S
wDx5yLneBLI7N+vg912zVlSlPchJnpFQVdUJm7j8b4JqUfuJKUa9FQfXylc3
8jCucVdTto1F3UpucEOwdEkxFW3F2mgutrHuqbxQngW2eHqSNsa+x67fseXk
EZkpHKb9e6yrzYrILQf4LbDICL52/AIOhu0EAdTA9YhylIeNseTZNuRi2M1d
tcZzhjikiEHpMQkr8n2Al65q2ZJuXX9CEEHkSSXQByLXDxrMYBfNfARGMHQF
GMQtaCg4T1C1T3VHg5mjf2xIlJpoNlXZoizsAl7gy/8lyz8ysZFEmvD3FOn5
6uUjqheCDpqHkyH9j9cUCNvO4B2qJQjlElvN8HEfbDEvvOHGcVqLiWnCqTYN
PwHpe6tC2stj16TrO7Xef7gUvP+Ht6JzHaCrQ7pLpUkck75mZ/42vMwiiCd5
bZa7quTaE0FTqsiyFxsPV4BGWCXGCnu7BWuy50cqQWMfwQbh6Znt+tILB2pF
6/VSNZa1Z3YhT9LWC/RhTCHNel0zzHpUSLu6jmSGmaBzTXLohVW0oarfbYc+
s0eEtWmqGpJGUcU1BJhwpv8NZGput3BkCrbkH58C6755+8zg2PvGQqDKNhGc
H2xxO0UotVojAPuUpNi0z21T1nW1VnteMNi2rxB5szrSqKadLis49viMujlw
5FjLF+LyII0CKMOjCTgUBY/PKJ7qYxRpi+OsFRck1xouvnP1NZiIBiaBh8l9
R9OvXFiktKgtc+EXcQuhrV62G8s50dINfqoocKsM1EEzivzqUfv0f2DjVhNN
Ajd9ZU7roRPaU/y6IU8sGD104y1YQLFLLStRs/k6DBk6GyjQ9bb/HQR+cnYd
rd7meehaf+iTmvRNjGUirK9Uzt5GmoaGbqiY9TgSeNnuj+UUaAWVvF3cE6Vc
MbOrupVUv1I0S4a3uEJOPZMwvUdpAiANTc0uEZFyXM0z/KziD1lat8PIyGRD
UDBeCwpGNwQFsrxVWFDbc+PigoCq1f5QXFDpUsn87rH6exMF1HRsQSs4mvf0
TeibSfXNBL8hctmlsYyS+f6YYxvO2XgXdcMUjx8OqMKk4FDadNPbJLsc+W7B
2mgc9Hd8b3CTIjZkwNi6owiqqqAqt9iBXPye2NiQpZmpqPIA+BH6d7jgNqyY
QJO2fWuDc5Y2n8sb27ww1MFNKZeP8M8R/X15d4TJg1g8No/3zOM99/ju6BHV
Qoon9hCmai9U0KiUoTTMJTh4Fir0xnu7AB1kWaDcyOZNa+ex3kpX8EaTRgFL
PZvcUBreLslD1nyBv7/y1w1iT0SOk7ifho1iIFYIv+WqrrgSMatcuO2ays8u
N3NutWj4V0y/gNfSwRrInjikQ8mU3bj1cDAiLKmimymhTBo/J6Y25mSNAvXx
b0hzEeg/e/AUCG4c/iFWnjMBRkAAMNFvSs4Ydg5RquB9t+adrdGLxPG2ZOBE
/maGrKXw27hwndXqtpkO2HWM2ej+m7gQU3hj1AlE1qd82ib4so7yVar+axfZ
Kieytq3Ymx5FjlEjd0qqVHEGlX0o/IOPkRhT8qV1wsZfz+DVzP5hfj5JI82K
vD6FucdoZskFONZfr6EkKZ7hws/cLoxRbW7u/TVzs9c+Nwjv9rPjBRKHPzQF
EM0Npt3xxb8d4Mg3QPlpyxyTs7xh6v4mfqZ8DkJaFVzYiGc9U9Uo1ejdsGMm
CFqMVLOc0+zO82T7Rri0RuKbVxtN8l5huw2oJVinsX/qNm2xc4OaYWl1lJA9
zA6+xjWuQrnd2dbZCarzV7xtz5SB0kURqT4uPEguu26KVm2TORG7gaLvaY1+
/PF60KCASzTnYngf6xZuJjx5Bwt0Cob3ySuobTDqtnYwwg7ujWzvnVtkA7o+
/auswsYpuG2CoTY9gZue+3s9YXIr7Ey4B24rjhL37vXH1RSyW+fvJKGX9/fs
6ergZJbKvOJ0C3N2pQvzzQcWElwP7C7mjYeiA/8dGT3YFZ06O3Rt1UNpT2sJ
MNceoaED9O1gm30Dddl0vq3v4ENKjT8CE5CF9EZuapVBzKuDiEClZGb9lM+m
o8XvB7w8hzs0aD6NX0GrbUtUakunHpdcL+/W3Qia21PoTXcl8DaHjhuv7j5g
AQAh7ywpK72krPTeEhjCJqeHowfLDz9hXw+4xUNuMdytNxn+6CP14Jobw8+f
rvkD+Hn/uv4NYz+oKEHhxnelBq489lM5mfDlDBRQWeeND54Kxqq4UngsA6LF
yQ749VOPjyXBuv+WSfLKpBsEl2NgIBhTbZ2GTuXHzQ9snSbrzGuDTMTVhpeC
znwCxrO1VK9kliVX62ACByZTzH2GXzvewbyNo7tzl3r3e+Sgj3ZvPTLA3C0v
Aa8EYFuqWDiyBQ4NddfBI05M5AjyxeTjg7PWqMjHX1R7rHxk8G1wE91wUJvI
4rVC14gKt0IZtZwNRJmCWketcBGM2RQxMSfh47lKfJcChvM6D0sy7QgyyHVR
Su6ASY3sZ0NpsyMsTfCIK03HMmVgP5YSN7I/Sd1JlbnI57S5no4Swza0Ickw
swdtsP2gA1cykPFBT7R0VBsyjGdtxLRTw1VGO68FHY66F2PqTbyD7HzP0Jx5
2RQVd+inaXf3Qdc3F6bfQ4+HN0YGXKLdHjTUz487bEeVi6ZuwHNR3A7FDeit
Pe414ycqx7lKqrofwN7zvhfFJt+bD9L0LzQIWiwBboYDxzmu7ZDbOLiKDvgH
omErBLfPW9D4bmio5Fvxb5lIfz8mEgmvASTZnVeA9wWGwUv0uFlHd3bNn8ZL
WXqFMFzsgewQVKRzCSWNYmm9iDauwCEz4Z1ZajfAtCBhaYbUYsPbnLTgFl/T
JNnP0TXyxs5uTLsb1ENoZrs/npkqM9CM2YaJuT37ehNCJ6dsmBKIo5YQ5bqp
eXS7qeEt3Junhjx1cu/+tOkJand1TO1JYb3bgOK5utMiLaYDdm5vnkE3zq2z
+Kay7UynerUpH9TSUha4Nha8lIL2ry7kR+h1CvjRwcVUfo512XjTT4uGqfTk
RUMjVLXFHk7tFFwULVCaegvXVHPnW5vx0xKjK/UIAkLX1/K4PA+QZhltN28s
y9crIddWJkKsM/hsfSb6y2SybbVzMxDgQAtQCiwO2q4htDU1PIodwXyHVRIE
fhImVep8YQb8ckvZpWGB29Z1HYjZe6pMmeEqzyfnp8/sasAnU8l0B1622UiP
62HWAuLv6nzSTaanToq8RraqaGeGFJk5gswYpdqs29IkM+xkvKSds+uk9k6E
6Gxc1r6hfMhcmTRWzPQOIPDlZQP35plEeFg9HplVO5THT//XEEYFEYsdTQfb
Qwc/Kzw3JoaAJckudoQ54IIWkwCz0YJ2G+UFnqlKaaMrmfI1AZqL9fEktiyT
Kx4eHeNj49Wg07oSxGuexOGcNCDo1T5v8ltNP++Ng8AgNjQZ2Sb3Gk0C12TP
NoGQEhdgSOl5p3+t6jSntRzMHWRJxEFMZ+iuPeK9JLvu70hJOj4mIIJ23c1E
WBBzu6GNNg5tuGloVZO9wDS5v2lozog0R1WdLWySJLaqi5QmFi8R/kbPBzcN
4wvAv755KNjsDq6I00oYZaIWGCd39x0vAFIfy7wwN4iBxewQH3otOnwklLqq
DchsViF4o+6+m4AmPEHwvBZeaVvgE6EzanQM4mMWJVNtzUu9wEysF5h56483
1pe99wvMuPQaj21rLlLbyjXSTLYEpmOg19SPlbhWf8bneTvWkdnrV+N/rgEX
dbURGLXBDp427GSsznp3VpvXOtq7Np6Ln+h4SUerUWSN+yr4oFuPymhXXdQf
Vkltg7KX1jFnaracmxd4p0nWgMPEese30eVOrOrceQpRZX8qCrkSiJV9To/N
jvdKHb9ZFXO8JoTuuzAkc3mqrDox2e3amPhLaY2TQOmQFx+LIgnokG1TDI9H
JAI96fJPNeUQMFc6XnbCXqq79tZQU4/5bkWdfurRATt4R7madD7rFDizF3a7
Zz4gN8KOBweXxCMV4yPzZIHrNuY3J5yGjx8v8Hy2fXh3p3op8xxv0aK3Bwci
DsxzjdtL4cFw32GZ6ne7Z2fmfQod4JNP58Mzxp5OTMEKh07cta0ubauz82Fb
KwtMA2mgqUcn26ZXjSntXdbbwINuz/v7spd2LUgsIHq30HHnUy+F7rubcbwd
WHPNK+2+dECGPZBYNwvQadpbgxY2oG2B7mEdAs69cCPmFh1sHr4b/f3j2X/h
vPhHr93duyM3yCNs+el8+u4TPN0yYUeprqN/1KPJsShGCAcaQZ8Xts+LDX2+
wLar8+jdyvW5auvzZaNH4PoXtr+8HOPrd+9e4ijvqDMA1T5QLiqpnlZ4AIzP
uP1Vph1PfnoI2naD79+xts13c9qZivL3d/zUbP8i0YR3Z3XZnd75fCcymSPe
MWguEqProd6037jgig0m3vHdjTPOthbAJXiejTsKQKOBCDO8yjCeBVysbVPh
Zluwt3/anMTjTqupetyWLluuhYFUlrq2SCfdeA16Adnb0ou/wP7YXdv6ut/B
H7hy4E7mmbYf/1FH1HrfLWHng1riy8XKHr7BGsKj83sjszuajlXaM8YRXi1l
VOJRtD8a354nba3Brg3dq2mm1Ko/7ZtqINvD57Uwa6rNeavVYu727F0968cL
es2FfnP6Y0t7xqHB0yI0ttN8MfccjKVLh1CK44FdlJ3Wp9P2Wfhh5ma0SXa8
AHfQGPoGt2YNxrQWXTL1m7C2E7AqfaCF/pP2NWJaTKwd1Fmd7Xz/wYPh6EEQ
4P0KfIAH2ul7PbLg+Bb3Rh3gktrARMNeGoBzGwfgpg7vgRR/Pt+j/9Jvt+BF
540eiNU5wBB3gtX5T/BqdY6rgLitaVh5PrI1Mzu4Gf3p/1v8m6e6eCe9Nc+e
+uNjTcP/LJP1Tcj/S07VV43UnJa+YZjw1gxz+PCPDhNh0DAf/GE5YqQ3Ts6f
ifVfJD08ws3S89dMzDeh/C80LV8zvgfDh6PNtgff/qe2PQb9TZPzF+H/10iP
GetG6fnLJ+ubkP+XnKq2kQIoc13wIV6JNTFbg/KWu54JBm7vrG0MEC/t3bfV
VcbVDQrBra96tveNu5tyvavAKBu9fu0zr6HgXap83bHdh4I7aCYSwgHMQwNs
vkwB49zqauS1kqQe30n89uhwb/fBfY64sciHMfBKZsw+M7z2DiItphbWhtVv
RzHFMGNVowpunv9Mt8NemN2T7qbrHG8VpUPjF3ggFjCLf2FcmiWFvcHbEMi/
7sLdNR4Er9QVbn5RMsNFUAXTxAVaHGWujb+a3oVcAboBLXzmc4zUCjqhAy/p
4DwztrjChRlcIKoPF4g1UWmUrPBRgNTxmYnv4AGYs+qG+tjHc6rpCA4IrTah
BeQeUyqURI7PNvGul+iowQwi28MyWyqIZocPu7w6vDNfjTM92aH7jwOM2uOJ
OxAqTsQVzIS7Yh0G691BhCgtNV39XXUUUGWlXSS+kqt6Gbu9II9xJfk6fvLq
yZps1RfbzNX11FKGlmL9fl+MYVIRyGuQFywmbp04oGJSZpit7mjOSCMbddsl
uHb127vDl318cIYj6rnkMOiJJDXX32GTNDwzC1C1w3+b1wkFmk/ahre4gEsT
VeuhAnbk0tAoG4LpIiMrhNDMPToDUhAUOVNntqwh90lu0V4brnehFvP/iaTz
5vg6R9CiJa0pMjdgdsmqlr76BJJSyDHfmIXlbzARZtGndoF8Y/aZr/AcayUn
dNod7gClM34QlJPnYKIKqXFXOKuRwpwHZsP5OsiKiB2Pil1DGJTEM3cGMl3N
bJcknJC6NQt3q5NGDbuki3icYt6iWHpBXaKRoqkOL3gnfc2q9ISKZ8D+nImo
X3Zh13akXzdIuc0psBXWJ656fKA6nY9X0zHmWia6tAbIXGpQr6hEGq0su5hR
baCMGzTepo1bErFKyexI5XskMjo5r8CcXR0eky0w9zjT7e72CHcaK5vlxmWa
IRLspFApX4JgDvXC7Z18vpCe4ozw4Uw8ztDWovLD4ApreA/rNw6SIR408DPF
vjgsc4ZpYW+ZxroCnk832QWt9WmYMNBzw4c/PahqdP3hiPoF2+9so7OeMYdV
dwXVLdNtnzgfc526fC2+fv17//DNk8A3RXwipN+bVbB4o71YdyFatODA3g1C
4gODWeWUSK0Tp0cLnzZnXTlNbkfE2hVpCwXu3/HJ6x/y2jpaMg1G5J6BcBd9
65qsidJFjBdMWePsXLEigylXiC3MO5ocuq0KK6awbBY8GjrNI7XC1guo6ppW
Y4dd+xq4cE739tmzpzilaS41XahFAiwswxAZVJPsVoh0TltrbgOjjdBfAH4r
alfT8XKiuSeHy+nwGiQiENHMo8+ga1ZI7S27PfSHcQnV1KlVd1I+eXrSJ0Ky
mPLFHHmETAQ/6GB6ss6j8/t7FYHtPPG2IFrdjVfuDjF3UX1OB42OsXKljN3V
8Hbc8FZTShpXiPlcIuaXVALtc7A8/xfz392qdZoAAA==

-->

</rfc>

