<?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-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Classic McEliece">Classic McEliece</title>

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

    <date year="2025" month="July" day="07"/>

    
    
    <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="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 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'>



<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="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' target='https://datatracker.ietf.org/doc/html/draft-josefsson-chempat-03'>
   <front>
      <title>Chempat: Generic Instantiated PQ/T Hybrid Key Encapsulation Mechanisms</title>
      <author fullname='Simon Josefsson' initials='S.' surname='Josefsson'>
         </author>
      <date day='18' month='March' 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-03'/>
   
</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:
H4sIANexa2gAA+19a3MbN5bo9/4VWE1thRyTtEgrji3HW9dR/FASP8ZSNrvX
tlxgEyRh9Uv9oEz76r/f8wDQ6GaTkh1P7k7VnaqJxW70wcHBeeMAGA6HQanL
SB2KvaNIFoUOxfPwcaRVqPYCOZ3matX5KpSlWqT5+lDoZJ4GszRMZAxQZrmc
l8MPaaHmRZEmwzhU9MVw/06gs/xQlHlVlJP9/fv7k+BcrS/TfHYojpNS5Ykq
hz/j50FRTWMNHabJ6ToDoMePT58EK5VU6jAQoqRne0f5OitT8STNq1i8VoWS
ebgUT/O0yvagVa6yFFotyzIrDm/fXsAg5XQUpvHtD7K4rVU5d7jtBUUpk9l7
GaUJQF6rIsj0oXhTpuFAFGle5jAY+Gsd4x/vAlmVyzQHVIbQjxDzKop48Cc6
ThPxix08vVWx1NGhKPDV/3J0GaX5gl7nKdJezXSZ5kGS5rEs9YqG+eL45HT0
5PjVyWiyPzkMkMze26PnwyJT4SEBKWW+UOWhsIMNebpGdoDY2203E/jdEGBO
xvuTO6NsNmcYW7jgUIRpUqh8RV3Dj5kaTmWhZiKkCVjkMlsCG/CvYl2UKhbY
hZ5rYBKYwz2C74hG/wOEDkW7K3GqZEwNZsBdh+JlWKZTlQvElYecE0AZqa8Z
t/v42w9+pgq9SITr4RsOWcdZ9DWjxe++/UAXlZ4pAZwoEL6KVQJ8W3zD4RYq
rHJdrr+Ksc23/8xh2z5Av6y0ulTfdPDZV8lz9k+Q5sulLEUWSQ2K+WOJH801
aR/Qb7GSyTcdtcyAjF8wcv5gtCzj6JrBcstvyZ5y8SW6B/XgTfA8AbCAbHgO
/35L3VGkX4AstK7NNQC5s38wvr/BUcfWDgEnOGEYiscJMRA+lRE4BrpcxgU8
fyXzUozv/3BvE/+vHuijLNcRDvMOPDwe/jyq3Y1wqeJMlgjOUbeTAjpLsnz0
IYtGiSzkaJGubmc5sL8qivfoOuTl5PbBZHhwcPvg4MXo1c9PGkR4JLJqGulw
CB5M0/KxMDEV1DSXMAwQMp0sRLlU4C91Dbp2IF6PxC8jh7k3ZKRgEAyHQyGn
RZnLsAyC06UuBDheFWpha3JVsUG+gZDiV8ATpkhmRRXx3D1XgMJM9H59/Lxv
7Bcgjiru+MXPw6OjRxM3vQOhwPkScgHqoCjFRSWTEnwu8KWyqkRJZMxiPZtF
Kgj+hu5cns6qEDtCPEF16rwofXXj0U/VrGOI2Hv16+O+uJQFOJcMCb7QCVFB
vLHjejcSCJohCYAU1DSQYIuTWQrzoROZr8XTNMsk9T8Sj0Sos6XKSbNpbIvP
0REFjVcV9kuV52DaTB+5Bo2psBOY2Ci9LAI1B/9GI+VnimcY3LiPNDVmtmuw
8xzg0RPX8UCARUlKPV9ja+gRDEqcruynpnMmnpMDQx4kjJsxcIGnChhODS/l
WvRe/jE8evWoPyAtzdBAk0uYvbIE/QLqIZRJkpbC4R+tYXaSWbCJsfQJhSjW
pB6AhQCWaHwDpAyXIImJoWC0ZuI5LREBG0UinVNX7UEtYVA5Oss4KPwjP5dT
wA1c82kEPAwDzjRMwSz9pJICoJgRGR0v0hWM7eB78N6lmbUAtNACpj+q+8pk
DnKGPCvAdKsm36cJdDc5u3vgMf60KmmQBkklC404heDjFaLKkPp72PO5jqK9
wANPZAeNskLHQaKvVNMBxgZ4OXmSs5VMQoXM7mRKlCpcJmmULgAJnYRRRTrE
iF7gi14XhyAxofM4K2FsEmIu9NRmKTC3jNMKeBbIN0+RkWEMMHnnI3GSxgof
l6hV8BF6eIC/qlk9XMOsaxhJGAGRgQ4ZqEvwJRAz57cxAEaZBHFvVsloT4BI
I0pZitI/XYsXWs2AyxXMaY5R1ry8lLlCEVazKoNwCxluKfMZPhb2MYz3SZXD
jORxmgNXaJLgJL2E+YwicQ5/JWIJP2FifA4HBwZmiQSBJYTwAe2SonJ8/Jzn
C0BZ5RfQgFQ9SQD99cvnhumIwZDfCSwGqvhtqRdLEGyPKuUG+w9Elcxwfi+h
56KoYlJ8RcBiiiMF9VyADiMiNQQFMD5kRTqgFzQC1ARAwVgnuihBNnt6pEYo
LU6n5qCeEEkaAktmAlaOe0RVUsGM9B8gnmkyq0EjDyWpD2kOkSzQpCBpWclI
zzwFASR5jFZiqkqaUegWlSNyUiDDpYbBFxgF60jmTCnEgkBJMc1TiVQhv6SW
beACtIswf/9o0V6JXBfnRrkhqsvhvErI4AytGQithgjTKpqhlpzLgmRrifqQ
phN690CTNZjN0Amo6U+5AYnGgXR7SFJSqEixopcBct6wKEFCFZBvCUMb1gpk
rwLuycEUAuFme4SpsJgCM2+4OtMcgPJcWWEEr1whx4/EsbFXyLC7TbYgusC0
rwkh9zwwTHiNQScKYy/Q3bTSUdkIG9BisH1APmkgwsIV1OM38+dL+3fAs6AS
hJUcGKcdPrxCkFWBlN0w3cxieW1IcH4CxIwobKTQ4VOkzB/zConvBzjIGhWl
XAo0h8gaFOGgRUYtjNMepcliiJJV0xQsF6ivcmjp1enDjNABOoXvCtJgMwXG
VbOMB0/SnGBnVY56sHBTbL04lj7WzKQ/uuAImWVgW8HpEifPHv36ePL93UNA
Uok3jZTROwZWpGh61jHYpRzGDZ5MrCn2Q7HHwW6w4CX47kZzIZOjs+bsGnZq
mQ1TfzPUOgmEx8VSTnVEnOfMmsw4yCSnYOj7EizICAyY7BAdiqFqeKcxmD/w
X4oY2zBTHVonh/SG7cUAr0NVDzYpzF2OJjYC6T80anGYgoQDtWLgtQjf/YNe
2une0ujJ+wtUywk6J6C3QdPArF7gm8OHhzCQGGMyVGlAzxIfP3o/HcB/Pk+v
wGMEFxBo9kgU1bQIc00GmyZAfUQ7QgIypa/O8Kuz9lfo++z+7v30LDT9nX0O
rwhIePUl3RMD7u4qxK4e/sehiDDOMioWuF0B8YhKPwItIpy4jTdHj49/O37x
tCf7h04zgouUZaRd0ZCTOILrhbJZKgQPcZos291gU4kQM/F3AXMCQWquP4q4
ikqdRSYZidJ5so6nacRyxSluLXFQJG3Q4G/iKeV7AB54yrKOYiLgdlAWIJx1
YFIQeradkyoS60Ya1KpvdMyBTSlGUXPwQsH3Mwkm9EAfoB4lBy9S6O56cs8K
zygFxAXtDcGwVAKqgYuV43AESoN169B8oBLgYaNbE4F2RFyDNAxlQVlL7Bsa
rqlBM/DibkG6wOvPG92QGkoOyWCgjoaJShbAG70MA3+D8dFzT4X04YNz74OZ
Bs1HTLT7m5K/WVTwFNgAEKMgaRimYFeYa0CDWC20G9YFwyr0J2XbsOjS9O3+
NgZGTheSMhwU7osJSfw1n1WHIGZJmiRqwbk3y8u7P1t93WfPwM/AL5tGr+F9
iJ6zCkM/+VdDsoB+UzDBv/G8oiIDkatK8BTwB76/GaQTvYjl+7HYOqCbA5n8
OSCvXj/F77NCVbPU5QlKsVCJyiV4BTcDsyAgabRO0liD+gE5AVvw9s3Ht++a
s+NlD/A7GWVL+V7D14lQnEOvmdAzIwBsJ5ynMo7loegtBgbk/kCMRiP763My
HF/1d0IocAQ4cnCgUNtCKyO+yc7vTgn3uAQ9e27VLMXfT2BqepYhXbIAP1E7
ukI9/AwGg88vFYYGokTDcNhM1XgeAlmGwtgezPyg0j5KoypOwK0MybFbgbuY
g6Y2v4PgMdOa9CggepZA2FmFS1TFNofBNoH0iv1uYPQlOB4AE1P+M/7C78wP
BxOyF3KV6hn78SWwWAH+HmvxkfhJUUhLvil7f3o+xwDNJl3SGJcRa2CcGPCS
iM6tLtPgMkeO8QZQ+KPmBEbqcFCNlI0Jv9CdROCZJDc3XCqMsoim+8OkQgcG
XyNBx/VvMIkpBnRgWudrih3g8wLtFPRn43lEPQafWVBy1cxxJMFjlAtVDDrM
JEUaaNsobgd9XAToZqKh5a6VyU7t+4mRnEwyNRvYuXG/yc6jTNhHzTmoCY15
C0pOAU8vFSa5Q5DrCIMWSTFEAda0BHuF/meunKusmc712xl5DodEXvWR0j8D
T1UE4DmBM4u8iFjUCKAR3hwmJ12IjHZaMYOXq4jdltTXQg3QwU7QY4pVXoPz
pHMWjXZSmbwP4+JsxAnguteBopk146QgbRo0tEbHRfTBr2r9VIEIUlaa5+hn
RX8S0WS4tMpnbzMOQVe62DM+kAligFXEeN8kxHy3ycHrhkNTUCWaci4mI4Tx
Z+RDaeUpHICgyGSoXPLdx+XuCGsTuOdmh+RQYXqwfopQBuSFw2wg5UMCUlhX
MmhNCXpdwFghygiwB3bh1C2nav2MNQzQWOzpWjDhxUKvXKYWFXPxYANkK/vr
6dsWSJpDA1G2MfG7wAcb3fhwgflqsMQPDmwLG+kPcbSNcYn6nZwonmAXlKtL
2KB4K1coUyYbIp6AtgAPOQy8dS1rN57CJBVaoh2HsDphBYa0YfnMFAko+syc
Sn4uS8v0oIIHOEL69xhcWHC2NWa6gydo/V/mM9KyA3ECrq6aWXF5oj+q2R+K
M43bZEiYlKnhSY5YpKdAUXCKAPNYpco4iYwiywJXKG8Jz5mazo6xR9s5dMlT
DU41xCXGmSLlXHNAIEsPsTglrWOXCcjdYP+A9Ij3Ha+6sOnVCfLH3ORSyP0H
05aQHfCnOnBKh9NCc1pakIXJbezqDbUZMJLNATYoYsTaanVMQRmRqtkHwlMw
rpbNjQ/t9zDg7BQuZ+CSh1V13ZxqwGuHeWAcbwA6rH0qwOwZRmfmzQDzJS5A
aCvvOlwYIODJ93c39O4WtTsiww/6SceUNcPVYAxhKQRt5LIaElUs0RfqjfvE
UEJpiknN0KBn1iHwB3HwA9Gb9AO7RIbC3tCgHYpf9FDmZMKxbrM5WTurlvuk
hUTvTt+KeGAnajc/1RNiecnG+U7tMFM2VbsqiWMCxzHSTagtoTGOD5KU7bmh
6wZNHdfbdfq79+/uj8f3g+Z4mdZWgdFcOpkzfbuxdKN8KHgdAb9tohkwcOTw
DQZ/SHxEEuQECrN1rCj4w4zTCowVcoLR98YdVqItTEFbkWU28cKWwQGCvj1p
wOT6Du40Br2scGXO+Sy+3kPp8UXC4mVVnu+yoIGu9csuqahBur6Mg4oJTUOj
6/k+8B2e3wuMHmrvM4vQJ5nzOpng/DimRwvRqM4Y+O4pImoW7cQKHHlcKywA
jyHmYRMVgSdZYZFmrGRBa0A94yPQ2krFgYXOBa6/eXqujxKNLhWvAOFwQJYq
XAOiJD4xSqZyS69RcFIR1Bpn42qQtg7TTBmO9Whqoq9Or7XbCyVuM5xMyX+S
FFL3MlnXE1h65HrQmshZqtgPd8jywiOZi7on9sIZPvnbr7xk+mk7d8O5N4yp
QlzaREtX2OQeNPRcEMtvJBNY1ODDYS3gqiHQRrlFhUPKCgsOSL3USWzISKlB
S0KfAS9Qvs/iUffnCQdDifjxobjY0qYUD/9DTLhhXIofRXJdn+fQZyKG0JpB
QmAMVkzX7pIf+sx7n/ri8CEG92/ffHr7DllmpihQs4Or+wDvjH0/Vr72m9sE
xNQouDzMDTp/0lubzi/evlk3Oi+v75y/uU1AWp1/vjgrrwQC/gzUL68Ql2Mm
aCFWSNEK/7PPZF0h/c/FLVGNak4ju80aliNTEZvMAnOrx3+MIz6PQZUFvf3B
fh/FAp7LKqJZIGftmvyYzU8b9mROv/4jjsm9FbBtzGosDs/LriQn5Sdp5Gxn
CmesUD3R94mDalOUQM6489WEGNiKwPb84avXT70ljDrl5fctONJ07xKYNNvL
hft7DEJzq4UzLjAu65ofO1ZK2DznbByxqH2IMT6n8vP0cqjCJcwJGf44CJ6a
6Mpk8f5r0B3TGA3GOhWCZQhS7Sev0Q3Kt3QAs2ELIQIy0hyCkHuQXlK26r/I
/DkrjpkcDqrxHWZq8PtdXVA9qvMfQN3SGjkH0gAmfL8PmiYESv6I6VH6+3M+
HF9xFEeWAOYT+91HvF4Dzy40QCR5kmLM6TdKKYWYY2V0dWEdcqobStLkk8pT
XFHL180vHhjo4+uhjwc3gTi2ECfXQ5zcCOKEgv8yHFnIOejcG+BLdLxRD9TS
xv9odr1cB3EC9YXyjx7Ni7RUtUcIInbO74Hi+YhZ+oRWcNGwG05+RLOONg+0
cSgL8LTpA21Xe11boee08kslLtaHzQmNQe33YtaXInlBQ8K3Fv/wvQaFrMkT
2UeFq4Gr8pHokZrnQhp0C2baFiVgjm0lIxxtabKma+B3SrtadnzIVB8ASqHK
bCECOJZGrygaFTR6CDTqB8FxYhb2KJU7MONh9QmD7B2/z9/+n9P+wCzaHVPt
CMiR+Dv8n11MKkZDKR6ximB9ZXUBoepIF3jCxurAVjgZfVA3HXJTBlNrgC4B
B4LPTTrFfACBEmYn7DSrWA+L9lyfNqokmD6R/sS6yoSvQH8iI/qNrfmnzBpW
YFnt7pmgarAyNVg0OWhgAzawgNFv4FahRHB96fkwt4PcoZ/AN8M6L8PPORls
q0SsyuI1htKsciMbVKD1VwGLD9LiD6Temj+xbN0DXPvDooNCSFRmB2ZrWxbm
MzPEwd18jL0zp+N7emrw6WJ4RVAcs7MN72R34vOq5vSKdAwSwkrAj/Qi4L7w
ZUMSRJckVCgJHaK/izYb4rhJPJhxsRqJZ+klRCk5MelKoKcFeCTBDuBcHSyw
OpF5gysE5IYSsinL5uIHhrSFC8AaWWyqoLbxP5GUinmBDoQOIMzOmrGmiWtr
xCPAtpxqozoGV8W2keGxdauFl4vH5Cwul3Nc3Aw0yDQ0kCD+DjZbRhL8Qehv
b77X+urOZHD3oD/yfRibQTRJCq8OjFXDUzOuljaoU06cbRWlPFdFnTikZVPs
0l835T/GXQuopD3RXiy4+G5nFOCvAXsBgLN713VH0sNFVWFpV4fNiuWFcaPr
AZrUCY+zRwPr+7lO5hkjPQ2W2VSKg5pxjOExfFN/0MHvzE8GDxQsTuu9OP4N
A3+7qk3m6JRG68zRqXWf3FJxQHXlctvC8ja7j9nYFvOVN6LSbly5XQNbh1rQ
Ro0Tr2ZArmcIXsYjceSl4fDrxA7sOSD8efn+sx58uLqysC5sj+YFtGH2+HCm
xW2x6Jlffd6Eh76A4aLSqdMP3lMMnsejYEI5yNgNwSHxol64n+KmNswdoRSR
0LMbV4EDDfEkONCf4F90ofHX5xjZ9dMZ/4s1nNZFZKOFOWqTTa+Q5SvH7ubb
UXDHeB0KsOhQw+DAfIZ4t+HD0BN/LuA/G67MsamqxHrlAiukyipPcJ5HwQF2
ST/rOd7paSB3WUEAJvs2vBXiMIbVlSEI/0RHmgB8Z4eLSqfJeG2ZeEDOaCcw
W8XFeQKbckGrC1bWfsPBEP55C81vHR8xiB/tJ2CPH9iKk+983fndW6fO4M+G
QoPfrEEfWN3pXEBZWKVEKvmBrx5vAPE6Jfn/hfHPC+N2Fwc8gGkpddKIFZ7t
kjrRe4EhJZZokE+K64Dg6dICSzOe1BDvr/1l9y1mZ9DtujK38vqOY/bgK5id
zZodG9t9dMpwK5IpGoHJw9T4ArwpLEUFNxR0ywn4OL0bCwYK0g08EKDfY14w
4I/1DfH5nlcqkU48soEx7+4BDHVs1mZSQdnAPK0Wy7rFeODWuFJckD4UxaXM
XIENMVlQzx42fmbrVbAlJ8Ac3syTlgbwwRWM7dGcK3n5i0GTT0QXn2je3kWo
2Cz8krJEc8sXMPy7rUnETUII9ZuZGTYkwU0UuoH7dfpzRKG+W8WzHlmHz7PN
FOB2Vi8y9ty1OCvXzvMDskdpmtUvAmALgzM88ypvedOhr8+pmdmZY3OPpEcQ
u+1xmE2+eJ8EnS6mtcG16fW0RLmEYAm+gKibtb6JhDracoRB9Re0ba2aAsuX
VFGzLYzgYg0TRnDWABPJhyCDXK04LJvlgEKZVYiz5IGtValrYk5NjinY7umK
Tjef8ehBCHbaNyqAuzuy3SHX7vRFf+bs/jNkm5rtySJZy8hbUUl3H0GzZ6oB
nKj3s/oC6nGJC2+Sxc3JPjhOgdPmUcXp8UYR6GXZU8jhJsI06Oh5YPJF/CFl
ix5wKuxSg2Do0gygsDvWRuTHxVgCZ2tuOqezi548gywFLGWRpK3MMdfZkbVt
uH90TASW3dPvwGWZW83+7SEbxz+ogPPUhet2q/Q2+B0m0pQV3cxfNALdzBV+
lT/3dbHwt/b2Tl0CDSczS4tC0x4AbTYq8nz3jpwypjUl8FaQnxoyRdZxozm0
UuDdtJKtem4yd8x/vi7YUAKU3+T9loaHiZ9bUjjY1b/F2C06L+VK1fP3jFfF
ce16Oxo7OqDYaJff/PhjqUAMjlBiV4g3fG692v1+PVJcQM8yxcUz55RsLNjh
1cbGmGRx2KQOCwhWBz0L0WHmEp1JX9B6nlMMyAZUVvEjagUq61kZz9PgnqQs
cGEz7rvDvpnCtB54PSFFgvBdrWIkDQ9nx30J0/7SaRUfmlmA66qIJQXplfMN
PYGoE1rb1aX3qU1ceWuE9Zog57LIo5+hCM2c8Mzef66bgQt3RRuP7OpnMzCV
waYEs5wCA/mYu5VtEOabWJipKuXb9xj7nPz+nMMSEGf9cP+q5+H3AaZCY9yi
+3Wm8QP29RmGNPZjKfQU/9Do5nGrBZ7z5ZOkJoipKqckP65KBbVW5RiobV/1
Iklz4znwEQS8/RRa9pF3vTHBgPAfCsLoj7FYuziMHnwmj2t9xv/6BQG3qUaA
eNEPQ3HrNpimJrlhYNSdDURh9E2tTwqYJw8515tAducWPfy+b9aK6rQHOckL
Eqq6OmEbl/9NUC3qMDXFqDfi4Eb56lYexjXuesp2sahbyQ2uCZYuKKairVhb
zcUu1j0FVD0LbPH0JG2KfU9dv1PLyRMyUzhM+3uq682KyC0P8VtgkQl87fgF
HAzbCQJogBsQ5SgPm2DJs23IxbDbu+qM5wxxSBGD0mMS1uR7Dy9d1bIl3ab+
hCCCyJNJoA9Eru81mME+mvkIjGDoCjCIW9BQcJ6gbp/pngYzR//YkCgz0Wym
8rgq7QJe4Mv/Bcs/MrGRRJrwtxTp+erlA6oXgg6ah5Mhww9XFAjbzuAdqiUI
5VJbzfDhEGwxL7zhxnFai0lowqk2DT8B6XutQtrLY9ekmzu13r6/ELz/h7ei
cx2gq0O6TaVJHJO+ZGf+JrzMIohH92yXu7rk2hNBU6rIspcYD1eARlinxgp7
uwUbsudHKkFrH8EW4RmY7frSCwcaRevNUjWWtad2IU/S1gv0YUwhzWZdM8x6
VEq7uo5khpmgc00K6IVVtKGq322PPuuPtmuqBpJGUSUNBJhwpv8tZGpvt3Bk
CnbkHx8D6756/dTgOPjKQqDaNhGc72xxO0UojVojAPuYpNi0L2xT1nWNVgde
MNi1rxB5sz7SqKGdLmo49viMpjlw5NjIF+LyII0CKMOjCTgUBY/PKJ76YxRp
i+OiExck1wYuvnP1JZiIFiaBh8ldR9MvXFiktKgtc+EXSQehrV62G8s50dIP
fqgpcKMM1MN2FPnFo/bpf8/GrSaaBG76wpzWfSe0p/h1S55YMAboxluwgGKf
WtaiZvN1GDL0tlCg723/exj4ydlNtAbb56Fv/aGPajY0MZaJsL5QOXsbaVoa
uqViNuNI4GW7P5ZToDVU8nZxT5Ryxcyu6lZS/UrZLhne4Qo59UzC9BalCYC0
NDW7RETKaT3P8Gcdf8jKuh1GRmZbgoLpRlAwuSYokNWNwoLGnhsXFwRUrfan
4oJal0rmd4/V35oooKFjS1rB0bynb0bfzOpvZvgNkcsujeWUzPfHnNhwzsa7
qBvmeAhpQBUmJYfSppvBNtnlyHcH1kbjoL/je4PbFLEhA8bWPUVQVQ1VucUO
5OK3xMaGLO1MRZ0HwI/Qv8MFt3HNBJq07WsbnLO0+Vze2uaFoQ5uSrl4gD8n
9Pvi9gSTB4n40Tw+MI8P3OPbkwdUCyke2UOY6r1QQatShtIwF+DgWajQG+/t
AnSQZYFyE5s3bRzAeCNdwRtNWgUszWxyS2l4uySPWPMF/v7KX7eIPRE5SZNh
FraKgVgh/F6opuJKxaJ24XZrKj+73M65NaLhXzH9Al5LD2sgB+KIDiVTduPW
/dGEsKSKbqaEMmn8gpjamJMNCjTHvyXNRaD/2YOnQHDr8I+w8pwJMAECgIl+
VXHGsHeEUgXv+w3vbINeJI43JQMn8rczZCOF38WFm6zWtM34qGbMVvdfxYWY
wpuiTiCyPubTNsGXdZSvU/VfushWO5GNbcXe9ChyjFq5U1KlijOo7EPhDz5G
YkrJl84Jm345g9cz+6f5+SSLNCvy5hQWHqOZJRfgWH+9hpKkeIYLP3O7MCaN
ubnz18zNQffcILybz44XSBx91xZANDeYdscX//YQR74Fyg875pic5S1T9zfx
E+VzENK65MJGcbRMqWqUavSu2TETBB1Gql3OaXbnebJ9LVxaI/HNq40mea+w
3QbUEazT2D/227bYuUHtsLQ+SsgeZgdf4xpXqdzubOvsBPX5K962Z8pA6bKM
1BAXHiSXXbdFq7HJnIjdQtH3tCbff381alHAJZoLMb6LdQvXE568gxidgvFd
8goaG4z6nR1MsIM7E9t77wbZgL5P/zqrsHUKbppgaExP4Kbn7sFAmNwKOxPu
gduKo8SdO8NpPYXs1vk7Sejl3QMu/07xBIZKmVecbmHOrnVhsf3AQoLrgd3H
vPFY9OC/E6MH+6LXZIe+rXqo7GktAebaIzR0gL4dbLtvoC6bztfNHXxIqekH
YAKykN7ITa0yiHl9EBGolNysn/LZdLT4fY+X53CHBs2n8StotW2FSm3l1OOK
6+XduhtBc3sKvemuBd7m0HHj1e17LAAg5L0VZaVXlJU+WAFD2OT0eHJv9f4H
7Oset7jPLcb7zSbj732k7l1xY/jzhyv+AP68e9X8hrEf1ZSgcOObUgNXHoeZ
nM34NHYKqKzzxgdPBVNVXio8lgHR4mQH/PXDgI8lwbr/jknyyqRbBJdTYCAY
U2OdZoB3wuDmB7ZOs03mtUEm4mrDS0FnPgHj2VqqFzLP08tNMIEDkyvmPsOv
Pe9g3tbR3YVLvfs9ctBHu7ceGGDuroeAVwKwLVUsPLEFDi1118MjTkzkCPLF
5OODszaoyMdf1HusfGTwbXAd3XBQ28jitULXiAq3Qhl1nA1EmYJGR51wEYzZ
FMHn3PK5Spo2GGI4r4uwItOOIINCl5XkDpjUyH42lDY7wrIUj7jSdCxTDvZj
JXEj+6PMnVRZiGJJm+vpKDFsQxuSDDN70Ea7DzpwJQM5H/RES0eNIcN4NkZM
OzVcZbTzWtDhaHoxpt7EO8jO9wzNmZdtUXGHfpp2t+/1fXNh+j3yeHhrZMAl
2t1BQ/P8uKNuVLlo6ho84/JmKG5Bb+PxoB0/UTnOZVrX/QD2nvcdl9t8bz5I
07/QIOiwBLgZDhznpLFDbuvgajrgD0TDVgjunreg9d3YUMm34l8zkf5+TCQS
3gBGsrusAR8KDINX6HGzju7tm5/GS1l5hTBc7IHsENSkcwkljWJpvYgursAh
M+GdWeo2wLQgYWmG1GLD25604AZf0yTZz9E18sbObky3GzRAaGa7P56ZKnPQ
jPmWibk5+3oTQienbJkSiKNWEOW6qXlws6nhLdzbp4Y8dXLv/mnTEzTu6pjb
k8IGNwHFc3WrQ1pMB+zcXj+Dbpw7Z/FVbduZTs1qUz6opaMscGMseCkF7V+N
5QfodQ740cHFVH6Oddkwv6cdGqbWk+ctjVDXFns4dVMwLjugtPUWrqkWzrc2
46clRlfqEQSErq/lcXkeIC1y2m7eWpZvVkJurEyEWGfwyfpM9Mtksm21czsQ
4EALUAosDtquIXQ1NTyKHcF8h3USBP4kTOrUeWwG/HxH2aVhgZvWdT0Ui7dU
mbLAVZ6Pzk9f2NWAj6aS6Ra87LKRHtfDrAXE3/X5pNtMT5MURYNsddHOAimy
cARZMEqNWbelSWbY6XRFO2c3Se2dCNHbuqx9TfmQuLQ3ScjGERPAlxct3Ntn
EuFh9XhkVuNQHj/930AYFUQi9jQdbA8d/KTw3JgEApY0P98T5oALWkwCzCYx
7TYqSjxTldJGlzLjawI0F+vjSWx5Ltc8PDrGx8arQa9zJYjXPInDOWlA0Ot9
3uS3mn7eGgeBQWxpMrFN7rSaBK7JgW0CISUuwJDS807/WjdpTms5mDvI04iD
mN7YXXvEe0n23e9ISTo+JiCC9t3NRFgQc7OhTbYObbxtaHWTg8A0ubttaM6I
tEdVny1skiS2qouUJhYvEf5GzwfXDeMzwL+6fijY7BauiNNKGGWiYoyT+4eO
FwCpD1WBh5KZQrUe8aHXosdHQqnLxoDMZhWCN+kfuglowxMEz2vhlbYFPhF6
k1bHID5mUTLT1rw0C8zEZoGZt/54bX3ZW7/AjEuv8di29iK1rVwjzWRLYHoG
ekP9WInr9Gd8nrdjnZi9fg3+5xpw0VQbgVEb7OBpw07G6mx2Z7V5o6ODK+O5
+ImO53S0GkXWuK+CD7r1qIx21UX9YZ3UNih7aR1zpmbHuXmBd5pkAzhMrHd8
G13uxKrOnacQ1fanppArgVjb5/TY7Hiv1fGrdbnEa0LovgtDMpenyusTk92u
jZm/lNY6CZQOefGxKNOADtk2xfB4RCLQk277U3MOAQulk1UvHGS6b68JNPWY
b9bU6ccBHbCD1xOrWe+TzoAzB2G//84H5EbY8+DgknikEnxknsS4bmP+5oTT
+McfYzyf7RDe3apfyqLAW7To7cOHIgnMc43bS+HB+NBhmek3++/emfcZdIBP
Pp6N3zH2dGIKVjj0kr5tdWFbvTsbd7WywDSQBpp6dLJtBvWYssFFsw086A+8
3xeDrG9BYgHRm1gnvY+DDLrvb8fxZmDNvY60+9IBGQ9AYt0sQKfZYANa2IK2
A7qHdQg4D8KtmFt0sHn4ZvL3D+/+nfPiH7x2t29P3CCfYMuPZ/M3H+Hpjgl7
kukm+k8GNDkWxQjhQCPo89z2eb6lz9+w7foserN2fa67+nze6hG4/jfbX1FN
8fWbN89xlLfUOwDVPVAuKqmf1ngAjE+4/VVmPU9+BgjadoPv37C2LfYL2pmK
8vd3/NRs/yLRhHfvmrI7v/XpVmQyR7xj0FwkRtdDveq+ccEVG8y847tbZ5zt
LIBL8TwbdxSARgMR5niVYbIIuFjbpsLNtmBv/7Q5icedVlP3uCtdttoIA6ks
dWORTrrxGvQCsreVF3+B/bG7tvXVsId/4MqBO5ln3n38RxNR6313hJ33Gokv
Fyt7+AYbCE/O7kzM7mg6VunAGEd4tZJRhUfRfm98e560jQb7NnSvp5lSq/60
b6uB7A6fN8KsuTbnrdaLubuzd82sHy/otRf6zemPHe0ZhxZPi9DYTvPF0nMw
Vi4dQimOe3ZRdt6cTttn6YeZ29Em2fEC3FFr6Fvcmg0Y80Z0ydRvw9pNwLr0
gRb6T7rXiGkxsXFQZ322891798aTe0GA9yvwAR5op+8MyILjW9wb9RCX1EYm
GvbSAJzbeAhu6vgOSPGnswP6L/3tFrzovNGHYn0GMMStYH32A7xan+EqIG5r
Gteej+zMzI6uR3/+/xb/9qku3klv7bOn/vxYs/B/ymR9FfL/klP1RSM1p6Vv
GSa8NcMc3/+zw0QYNMx7f1qOGOmtk/PPxPovkh4e4Xbp+Wsm5qtQ/heali8Z
373x/cl224Nv/0fbHoP+tsn5i/D/a6THjHWr9Pzlk/VVyP9LTlXXSAGUuS74
CK/EmpmtQUXHXc8EA7d3NjYGiOf27tv6KuP6BoXgxlc92/vG3U253lVglI3e
vPbZHNNe33e8WVAzU3i6Q2HLUORK6sjd/JvMArwYFIhR8ZGRjZPZOdPM16qb
bTkzSZV+x82LUEzdy1Q1CED75PHCzkjJc7NV0l1rXeAVonRCfIynXwFn+LfD
AVKlva7bUMO/28JdLB4EL9Ql7nRRMscVTwVzUrqx7qRLLNeAcECrnMUSw7KS
juPAGzk4qYwtLnEVBleDmgOG8AfoGqVrfBTgFi6fc/jCHYC5qK+jT3w855rO
24A4ahtaMMVTynuSfPFBJt5dEj01WkAYe1TlKwWh6/h+n5eC95braa5ne3TZ
cYAhejJzpz8lqbiEmXD3qcNgvQuHEKWVpnu+644CKqO0K8KXct2sWbe34TGu
IyH+UHR7fRzj2SNlaguZg6OlijMg6efPx8OfRx/SQs2LAtRmyM+vriwQWiEX
j8LzJL2MgICdl9yRGNIFiWGup4CgdzE5p2JSzDbNxPHJy5qy7lp4uu9yb7I/
ubN/ML6/J94cPR/qIn1nwdgdyBtzUypJh2AxOe2cKyaOrMolZfNneKWKcmdI
co1P696hgS2jdVfw9XD+MGadKr76hCJZPvrmZ1AuwPS/4Nn6OSZGdDIQvyea
8GX2Po4inaRImFIcoeguUuridbXM/aY/peGyijEsrrDgB+R2ANSWM9CmWGWW
wJd4kafMoxQCfz2jckjQc+J3/RMBfAmSLC+lOAY8dIn181iRF3JhHTY4BWWY
pFG6WAOgX4DPnuoIpjkfiMenz8T/BoEMl9i/TD5I8Rvm8uANMN8yxXsNmqNq
wPpPmVega1F9t2AdJzDaFSpiSY+w5j+a44Hxci6BcM9hdsNP53ognqbpIlL4
pppCb3zJ/VIu8PKtFhloME10TtIKBRFP5ElimZ8DnMezFFgqFa+wFQyzLKGX
JxGIx0yKR2UksZDRA4PEXea4Wi1B9F6Z+7wMui90mALPgUFKZrlGkh0noBmJ
jufVVJx8wqujB+K/ZaRaMGEwv+CMnn5YSsDg1T8A2ajilM5v5QwTIc/xJp9E
nKYxsEqBla4brTrG/CpaxzhsAPAHdPKHxNxgGwESFzXTuEDFK+68JJiSpjkX
v6RLnJyyLLhfMr+8Bem3dCETIHwi/lNFK+CD3JwezVrE3oIC+jcHBmFRc9cI
oa44fvTi0YblbuoLTGKB8qOWMrQqejgciilYEQTyEkaCWxU6LQWo7bTKcS0M
hJRzijDyfrd/0LhYEjULPniHQx24pSfwQtLMXK6JTbLwnVnebhwt3lYageZz
/OEtloeQZWj0UAN74ha50BwLpovEo2awqB6buUfvgBQEBaTgnS2aKnwdb9He
GK53XR8b3BNJp1nyZbHgo1VUscD6EnPX1nEZqo9gmks55fv4sLgWJsIsKTsX
wvbrocKaF0/JV3JGZ2ni/nI6QQxBOQcimKkS/Bw1q9mIThu0ycImyJqIPY+K
fUMYNP3v3AnrdPG7XfB0XoFbEXV3xmn031Z0zZdz+3Z4MoOg6UIgRTMdnvM5
HQ2fdSBUsgBTyXnO5lU6duVY+lXJtHIyB7ZCJb0e8HUNdPpmw6kxl77RlVhA
5kqDGKPX0mpl2cWMagtl3KBzRVuAkD6PzH53vqUmp3M5S9RnTXhMtsDcEo9L
re6CCBorO/2tq3pDJNhJqTK+YsUcGYibx/n0Mj3HGeGj34zxtZXu/DC4xB0C
R837TMnNH7XwM1sJcFjmhOTS+tNYtcTz6Sa7pEoCDRMGNn18/4d79Q4Afzi4
nMK35LHisI3eDcyhDnV3Je2KoLuEcT6WOnOrQfj65R/Do1ePAt/35fNm/d6s
R/eP1y+fi80ApUMLjuzNQyQ+MJh1Qcs0TeIMqKzCumF1SOb2W21cwBgrCC7B
T/uuaKzSp/NgQsEfCHc5tIHPhiihm5i4aMAFemUOU64QW5h39HHpLjysx8Si
fIij6KygzArbIKA9HVTrMe7b18CFS7oV1J5sxwsmxl+LVZwCC8swRAbVJLs1
Ir3Tzor+wGgjDFCA38rGxZdcrGBu4eJiXbxkjQhENPPoM+qb+gt7h/cAo20s
0DBVsPWNt48enwyJkCymfO1PESETwR907QWFA5Ozuwc1ge088aZDqh1J1u6G
whz9EPT4CjrGeIp1cVUyc9d+mHHDW00LXlh/wqeeMb9kEmhfgOX5v5JladHO
mgAA

-->

</rfc>

