<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-sigma-protocols-02" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>Interactive Sigma Proofs</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-sigma-protocols-02"/>
    <author fullname="Michele Orrù">
      <organization>CNRS</organization>
      <address>
        <email>m@orru.net</email>
      </address>
    </author>
    <author fullname="Cathie Yun">
      <organization>Apple, Inc.</organization>
      <address>
        <email>cathieyun@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>zero-knowledge</keyword>
    <keyword>sigma protocols</keyword>
    <keyword>cryptography</keyword>
    <keyword>proofs of knowledge</keyword>
    <abstract>
      <?line 105?>

<t>A Sigma Protocol is an interactive zero-knowledge proof of knowledge that allows a prover to convince a verifier of the validity of a statement. It satisfies the properties of completeness, soundness, and zero-knowledge, as described in <xref target="security-considerations"/>.</t>
      <t>This document describes Sigma Protocols for proving knowledge of pre-images of linear maps in prime-order elliptic curve groups. Examples include zero-knowledge proofs for discrete logarithm relations, ElGamal encryptions, Pedersen commitments, and range proofs.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://mmaker.github.io/draft-irtf-cfrg-sigma-protocols/draft-irtf-cfrg-sigma-protocols.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-irtf-cfrg-sigma-protocols/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Crypto Forum Research Group mailing list (<eref target="mailto:cfrg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cfrg"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cfrg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mmaker/draft-irtf-cfrg-sigma-protocols"/>.</t>
    </note>
  </front>
  <middle>
    <?line 111?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Any Sigma Protocol must define a <em>commitment</em> (computed by the prover), a <em>challenge</em> (randomly sampled from a specific distribution), and a <em>response</em> (computed by the prover). One of the advantages of Sigma Protocols is their composability, which enables the construction of more complex protocols. A classic example is the OR composition <xref target="CramerDS94"/>. Given a Sigma Protocol for N relations, it is possible to prove knowledge of one of N witnesses for those relations . The composed sigma protocols can be made non-interactive using the Fiat-Shamir transformation <xref target="Cramer97"/>. However, such compositions must be handled carefully to preserve security properties as discussed in <xref target="security-considerations"/>.</t>
      <section anchor="core-interface">
        <name>Core interface</name>
        <t>The public functions are obtained relying on an internal structure containing the definition of a Sigma Protocol.</t>
        <artwork><![CDATA[
class SigmaProtocol:
   def new(instance) -> SigmaProtocol
   def prover_commit(self, witness, rng) -> (commitment, prover_state)
   def prover_response(self, prover_state, challenge) -> response
   def verifier(self, commitment, challenge, response) -> bool
   def serialize_commitment(self, commitment) -> bytes
   def serialize_response(self, response) -> bytes
   def deserialize_commitment(self, data: bytes) -> commitment
   def deserialize_response(self, data: bytes) -> response
   # optional
   def simulate_response(self, rng) -> response
   # optional
   def simulate_commitment(self, response, challenge) -> commitment
]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>new(instance) -&gt; SigmaProtocol</tt>, denoting the initialization function. This function takes as input an instance generated via a <tt>LinearRelation</tt>, the public information shared between prover and verifier.</t>
          </li>
          <li>
            <t><tt>prover_commit(self, witness: Witness, rng) -&gt; (commitment, prover_state)</tt>, denoting the <strong>commitment phase</strong>, that is, the computation of the first message sent by the prover in a Sigma Protocol. This method outputs a new commitment together with its associated prover state, depending on the witness known to the prover, the statement to be proven, and a random number generator <tt>rng</tt> as defined in <xref target="rng-definition"/>. This step generally requires access to a high-quality entropy source to perform the commitment. Leakage of even just a few bits of the commitment could allow for the complete recovery of the witness. The commitment is meant to be shared, while <tt>prover_state</tt> must be kept secret.</t>
          </li>
          <li>
            <t><tt>prover_response(self, prover_state, challenge) -&gt; response</tt>, denoting the <strong>response phase</strong>, that is, the computation of the second message sent by the prover, depending on the witness, the statement, the challenge received from the verifier, and the internal state <tt>prover_state</tt>. The return value response is a public value and is transmitted to the verifier.</t>
          </li>
          <li>
            <t><tt>verifier(self, commitment, challenge, response) -&gt; bool</tt>, denoting the <strong>verifier algorithm</strong>. This method checks that the protocol transcript is valid for the given statement. The verifier algorithm outputs true if verification succeeds, or false if verification fails.</t>
          </li>
          <li>
            <t><tt>serialize_commitment(self, commitment) -&gt; bytes</tt>, serializes the commitment into a canonical byte representation.</t>
          </li>
          <li>
            <t><tt>serialize_response(self, response) -&gt; bytes</tt>, serializes the response into a canonical byte representation.</t>
          </li>
          <li>
            <t><tt>deserialize_commitment(self, data: bytes) -&gt; commitment</tt>, deserializes a byte array into a commitment. This function can raise a <tt>DeserializeError</tt> if deserialization fails.</t>
          </li>
          <li>
            <t><tt>deserialize_response(self, data: bytes) -&gt; response</tt>, deserializes a byte array into a response. This function can raise a <tt>DeserializeError</tt> if deserialization fails.</t>
          </li>
        </ul>
        <t>The final two algorithms describe the <strong>zero-knowledge simulator</strong>. In particular, they may be used for proof composition (e.g. OR-composition). The function <tt>simulate_commitment</tt> is also used when verifying short proofs. We have:</t>
        <ul spacing="normal">
          <li>
            <t><tt>simulate_response(self, rng) -&gt; response</tt>, denoting the first stage of the simulator.</t>
          </li>
          <li>
            <t><tt>simulate_commitment(self, response, challenge) -&gt; commitment</tt>, returning a simulated commitment -- the second phase of the zero-knowledge simulator.</t>
          </li>
        </ul>
        <t>The simulated transcript <tt>(commitment, challenge, response)</tt> must be indistinguishable from the one generated using the prover algorithms.</t>
        <t>The abstraction <tt>SigmaProtocol</tt> allows implementing different types of statements and combiners of those, such as OR statements, validity of t-out-of-n statements, and more.</t>
        <section anchor="rng-definition">
          <name>Randomized algorithms</name>
          <t>The generation of proofs involves randomized algorithms that take as
input a source of randomness, denoted as <tt>rng</tt>.
The functionality required in this document is a secure way to sample
non-zero scalars uniformly at random.
Algorithms access this functionality through the following interface.</t>
          <artwork><![CDATA[
class CSRNG(ABC):
    def getrandom(self, length: int) -> bytes:
        pass

    def random_scalar(self) -> groups.Scalar:
        pass
]]></artwork>
          <t>Implementations MUST use a cryptographically secure pseudorandom number
generator (CSPRNG) to sample non-zero scalars either by using rejection
sampling methods or reducing a large bitstring modulo the group order.
Refer to Section A.4 of <xref target="FIPS.186-5"/> for guidance about these methods.</t>
        </section>
      </section>
    </section>
    <section anchor="sigma-protocol-group">
      <name>Sigma Protocols over prime-order groups</name>
      <t>The following sub-section presents concrete instantiations of Sigma Protocols over prime-order elliptic curve groups.
It relies on a prime-order elliptic-curve group as described in <xref target="group-abstraction"/>.</t>
      <t>Valid choices of elliptic curves can be found in <xref target="ciphersuites"/>.</t>
      <t>Traditionally, Sigma Protocols are defined in Camenisch-Stadler <xref target="CS97"/> notation as (for example):</t>
      <artwork><![CDATA[
1. DLEQ(G, H, X, Y) = PoK{
2.   (x):        // Secret variables
3.   X = x * G, Y = x * H        // Predicates to satisfy
4. }
]]></artwork>
      <t>In the above, line 1 declares that the proof name is "DLEQ", the public information (the <strong>instance</strong>) consists of the group elements <tt>(G, X, H, Y)</tt> denoted in upper-case.
Line 2 states that the private information (the <strong>witness</strong>) consists of the scalar <tt>x</tt>.
Finally, line 3 states that the linear relation that needs to be proven is
<tt>x * G  = X</tt> and <tt>x * H = Y</tt>.</t>
      <section anchor="group-abstraction">
        <name>Group abstraction</name>
        <t>Because of their dominance, the presentation in the following focuses on proof goals over elliptic curves, therefore leveraging additive notation. For prime-order subgroups of residue classes, all notation needs to be changed to multiplicative, and references to elliptic curves (e.g., curve) need to be replaced by their respective counterparts over residue classes.</t>
        <t>We detail the functions that can be invoked on these objects. Example choices can be found in <xref target="ciphersuites"/>.</t>
        <section anchor="group">
          <name>Group</name>
          <ul spacing="normal">
            <li>
              <t><tt>identity()</tt>, returns the neutral element in the group.</t>
            </li>
            <li>
              <t><tt>generator()</tt>, returns the generator of the prime-order elliptic-curve subgroup used for cryptographic operations.</t>
            </li>
            <li>
              <t><tt>order()</tt>: returns the order of the group <tt>p</tt>.</t>
            </li>
            <li>
              <t><tt>serialize(elements: [Group; N])</tt>, serializes a list of group elements and returns a canonical byte array <tt>buf</tt> of fixed length <tt>Ne * N</tt>.</t>
            </li>
            <li>
              <t><tt>deserialize(buffer)</tt>, attempts to map a byte array <tt>buffer</tt> of size <tt>Ne * N</tt> into <tt>[Group; N]</tt>, fails if the input is not the valid canonical byte representation of an array of elements of the group. This function can raise a <tt>DeserializeError</tt> if deserialization fails.</t>
            </li>
            <li>
              <t><tt>add(element: Group)</tt>, implements elliptic curve addition for the two group elements.</t>
            </li>
            <li>
              <t><tt>equal(element: Group)</tt>, returns <tt>true</tt> if the two elements are the same and <tt>false</tt> otherwise.</t>
            </li>
            <li>
              <t><tt>scalar_mul(scalar: Scalar)</tt>, implements scalar multiplication for a group element by an element in its respective scalar field.</t>
            </li>
          </ul>
          <t>In this spec, instead of <tt>add</tt> we will use <tt>+</tt> with infix notation; instead of <tt>equal</tt> we will use <tt>==</tt>, and instead of <tt>scalar_mul</tt> we will use <tt>*</tt>. A similar behavior can be achieved using operator overloading.</t>
        </section>
        <section anchor="scalar">
          <name>Scalar</name>
          <ul spacing="normal">
            <li>
              <t><tt>identity()</tt>: outputs the (additive) identity element in the scalar field.</t>
            </li>
            <li>
              <t><tt>add(scalar: Scalar)</tt>: implements field addition for the elements in the field.</t>
            </li>
            <li>
              <t><tt>mul(scalar: Scalar)</tt>, implements field multiplication.</t>
            </li>
            <li>
              <t><tt>random(rng)</tt>: samples a scalar from the RNG. Securely decoding random bytes into a random scalar is described in Section 9.1.4 of <xref target="fiat-shamir"/>.</t>
            </li>
            <li>
              <t><tt>serialize(scalars: list[Scalar; N])</tt>: serializes a list of scalars and returns their canonical representation of fixed length <tt>Ns * N</tt>.</t>
            </li>
            <li>
              <t><tt>deserialize(buffer)</tt>, attempts to map a byte array <tt>buffer</tt> of size <tt>Ns * N</tt> into <tt>[Scalar; N]</tt>, and fails if the input is not the valid canonical byte representation of an array of elements of the scalar field. This function can raise a <tt>DeserializeError</tt> if deserialization fails.</t>
            </li>
          </ul>
          <t>In this spec, instead of <tt>add</tt> we will use <tt>+</tt> with infix notation; instead of <tt>equal</tt> we will use <tt>==</tt>, and instead of <tt>mul</tt> we will use <tt>*</tt>. A similar behavior can be achieved using operator overloading.</t>
        </section>
      </section>
      <section anchor="proofs-of-preimage-of-a-linear-map">
        <name>Proofs of preimage of a linear map</name>
        <section anchor="witness">
          <name>Witness representation</name>
          <t>A witness is an array of scalar elements. The length of the array is denoted <tt>num_scalars</tt>.</t>
          <artwork><![CDATA[
Witness = [Scalar; num_scalars]
]]></artwork>
        </section>
        <section anchor="linear-map">
          <name>Linear map</name>
          <t>A <em>linear map</em> takes a <tt>Witness</tt> (an array of <tt>num_scalars</tt> in the scalar field) and maps it to an array of group elements. The length of the image is denoted <tt>num_elements</tt>.</t>
          <t>Linear maps can be represented as matrix-vector multiplications, where the multiplication is the elliptic curve scalar multiplication defined in <xref target="group-abstraction"/>.</t>
          <t>Since the matrix is oftentimes sparse, it is stored in Yale sparse matrix format.</t>
          <t>Here is an example:</t>
          <artwork><![CDATA[
class LinearCombination:
    scalar_indices: list[int]
    element_indices: list[int]
]]></artwork>
          <t>The linear map can then be presented as:</t>
          <artwork><![CDATA[
class LinearMap:
    Group: groups.Group
    linear_combinations: list[LinearCombination]
    group_elements: list[Group]
    num_scalars: int
    num_elements: int

    def map(self, scalars: list[Group.ScalarField; num_scalars]) -> list[Group; num_elements]
]]></artwork>
          <section anchor="initialization">
            <name>Initialization</name>
            <t>The linear map <tt>LinearMap</tt> is initialized with</t>
            <artwork><![CDATA[
linear_combinations = []
group_elements = []
num_scalars = 0
num_elements = 0
]]></artwork>
          </section>
          <section anchor="linear-map-evaluation">
            <name>Linear map evaluation</name>
            <t>A witness can be mapped to a vector of group elements via:</t>
            <artwork><![CDATA[
map(self, scalars: [Scalar; num_scalars]) -> list[Group; num_elements]

Inputs:

- self, the current state of the constraint system
- witness,

1. image = []
2. for linear_combination in self.linear_combinations:
3.     coefficients = [scalars[i] for i in linear_combination.scalar_indices]
4.     elements = [self.group_elements[i] for i in linear_combination.element_indices]
5.     image.append(self.Group.msm(coefficients, elements))
6. return image
]]></artwork>
          </section>
        </section>
        <section anchor="statements-for-linear-relations">
          <name>Statements for linear relations</name>
          <t>A <tt>LinearRelation</tt> encodes a proof statement of the form <tt>linear_map(witness) = image</tt>, and is used to prove knowledge of a witness that produces <tt>image</tt> under linear map.
It internally stores <tt>linear_map</tt> (cf. <xref target="linear-map"/>) and an <tt>image</tt> (an array of <tt>num_elements</tt> Group elements).</t>
          <artwork><![CDATA[
class LinearRelation:
    Domain = group.ScalarField
    Image = group.Group

    linear_map = LinearMap
    image = list[group.Group]

def allocate_scalars(self, n: int) -> list[int]
def allocate_elements(self, n: int) -> list[int]
def append_equation(self, lhs: int, rhs: list[(int, int)]) -> None
def set_elements(self, elements: list[(int, Group)]) -> None
]]></artwork>
          <section anchor="element-and-scalar-variables-allocation">
            <name>Element and scalar variables allocation</name>
            <t>Two functions allow to allocate the new scalars (the witness) and group elements (the instance).</t>
            <artwork><![CDATA[
allocate_scalars(self, n)

Inputs:
    - self, the current state of the LinearRelation
    - n, the number of scalars to allocate
Outputs:
    - indices, a list of integers each pointing to the new allocated scalars

Procedure:

1. indices = range(self.num_scalars, self.num_scalars + n)
2. self.num_scalars += n
3. return indices
]]></artwork>
            <t>and below the allocation of group elements</t>
            <artwork><![CDATA[
allocate_elements(self, n)

Inputs:
    - self, the current state of the LinearRelation
    - n, the number of elements to allocate
Outputs:
    - indices, a list of integers each pointing to the new allocated elements

Procedure:

1. indices = range(self.num_elements, self.num_elements + n)
2. self.num_elements += n
3. return indices
]]></artwork>
            <t>Group elements, being part of the instance, can later be set using the function <tt>set_elements</tt></t>
            <artwork><![CDATA[
set_elements(self, elements)

Inputs:
    - self, the current state of the LinearRelation
    - elements, a list of pairs of indices and group elements to be set

Procedure:

1. for index, element in elements:
2.   self.linear_map.group_elements[index] = element
]]></artwork>
          </section>
          <section anchor="constraint-enforcing">
            <name>Constraint enforcing</name>
            <artwork><![CDATA[
append_equation(self, lhs, rhs)

Inputs:

- self, the current state of the constraint system
- lhs, the left-hand side of the equation
- rhs, the right-hand side of the equation (a list of (ScalarIndex, GroupEltIndex) pairs)

Outputs:

- An Equation instance that enforces the desired relation

Procedure:

1. linear_combination = LinearMap.LinearCombination(scalar_indices=[x[0] for x in rhs], element_indices=[x[1] for x in rhs])
2. self.linear_map.append(linear_combination)
3. self._image.append(lhs)
]]></artwork>
          </section>
        </section>
        <section anchor="core-protocol">
          <name>Core protocol</name>
          <t>This defines the object <tt>SchnorrProof</tt>. The initialization function takes as input the statement, and pre-processes it.</t>
        </section>
        <section anchor="prover-procedures">
          <name>Prover procedures</name>
          <t>The prover of a Sigma Protocol is stateful and will send two messages, a "commitment" and a "response" message, described below.</t>
          <section anchor="prover-commitment">
            <name>Prover commitment</name>
            <artwork><![CDATA[
prover_commit(self, witness, rng)

Inputs:

- witness, an array of scalars
- rng, a cryptographically secure random number generator

Outputs:

- A (private) prover state, holding the information of the interactive prover necessary for producing the protocol response
- A (public) commitment message, an element of the linear map image, that is, a vector of group elements.

Procedure:

1. nonces = [rng.random_scalar() for _ in range(self.instance.linear_map.num_scalars)]
2. prover_state = self.ProverState(witness, nonces)
3. commitment = self.instance.linear_map(nonces)
4. return (prover_state, commitment)
]]></artwork>
          </section>
          <section anchor="prover-response">
            <name>Prover response</name>
            <artwork><![CDATA[
prover_response(self, prover_state, challenge)

Inputs:

    - prover_state, the current state of the prover
    - challenge, the verifier challenge scalar

Outputs:

    - An array of scalar elements composing the response

Procedure:

1. witness, nonces = prover_state
2. return [nonces[i] + witness[i] * challenge for i in range(self.instance.linear_map.num_scalars)]
]]></artwork>
          </section>
        </section>
        <section anchor="verifier">
          <name>Verifier</name>
          <artwork><![CDATA[
verify(self, commitment, challenge, response)

Inputs:

- self, the current state of the SigmaProtocol
- commitment, the commitment generated by the prover
- challenge, the challenge generated by the verifier
- response, the response generated by the prover

Outputs:

- A boolean indicating whether the verification succeeded

Procedure:

1. assert len(commitment) == self.instance.linear_map.num_constraints and len(response) == self.instance.linear_map.num_scalars
2. expected = self.instance.linear_map(response)
3. got = [commitment[i] + self.instance.image[i] * challenge for i in range(self.instance.linear_map.num_constraints)]
4. return got == expected
]]></artwork>
        </section>
        <section anchor="example-schnorr-proofs">
          <name>Example: Schnorr proofs</name>
          <t>The statement represented in <xref target="sigma-protocol-group"/> can be written as:</t>
          <artwork><![CDATA[
statement = LinearRelation(group)
[var_x] = statement.allocate_scalars(1)
[var_G, var_X] = statement.allocate_elements(2)
statement.append_equation(var_X, [(var_x, var_G)])
]]></artwork>
          <t>At which point it is possible to set <tt>var_G</tt> and <tt>var_X</tt> whenever the group elements are at disposal.</t>
          <artwork><![CDATA[
G = group.generator()
statement.set_elements([(var_G, G), (var_X, X)])
]]></artwork>
          <t>It is worth noting that in the above example, <tt>[X] == statement.linear_map.map([x])</tt>.</t>
        </section>
        <section anchor="example-dleq-proofs">
          <name>Example: DLEQ proofs</name>
          <t>A DLEQ proof proves a statement:</t>
          <artwork><![CDATA[
    DLEQ(G, H, X, Y) = PoK{(x): X = x * G, Y = x * H}
]]></artwork>
          <t>Given group elements <tt>G</tt>, <tt>H</tt> and <tt>X</tt>, <tt>Y</tt> such that <tt>x * G = X</tt> and <tt>x * H = Y</tt>, then the statement is generated as:</t>
          <artwork><![CDATA[
1. statement = LinearRelation()
2. [var_x] = statement.allocate_scalars(1)
3. [var_G, var_X, var_H, var_Y] = statement.allocate_elements(4)
4. statement.set_elements([(var_G, G), (var_H, H), (var_X, X), (var_Y, Y)])
5. statement.append_equation(X, [(var_x, G)])
6. statement.append_equation(Y, [(var_x, H)])
]]></artwork>
        </section>
        <section anchor="example-pedersen-commitments">
          <name>Example: Pedersen commitments</name>
          <t>A representation proof proves a statement</t>
          <artwork><![CDATA[
    REPR(G, H, C) = PoK{(x, r): C = x * G + r * H}
]]></artwork>
          <t>Given group elements <tt>G</tt>, <tt>H</tt> such that <tt>C = x * G + r * H</tt>, then the statement is generated as:</t>
          <artwork><![CDATA[
1. statement = LinearRelation()
2. var_x, var_r = statement.allocate_scalars(2)
3. [var_G, var_H, var_C] = statement.allocate_elements(3)
4. statement.set_elements([(var_G, G), (var_H, H), (var_C, C)])
5. statement.append_equation(C, [(var_x, G), (var_r, H)])
]]></artwork>
        </section>
      </section>
      <section anchor="ciphersuites">
        <name>Ciphersuites</name>
        <t>We consider ciphersuites of prime-order elliptic curve groups.</t>
        <section anchor="p-256-secp256r1">
          <name>P-256 (secp256r1)</name>
          <t>This ciphersuite uses P-256 <xref target="SP800"/> for the Group.</t>
          <section anchor="elliptic-curve-group-of-p-256-secp256r1-sp800">
            <name>Elliptic curve group of P-256 (secp256r1) <xref target="SP800"/></name>
            <ul spacing="normal">
              <li>
                <t><tt>order()</tt>: Return the integer <tt>115792089210356248762697446949407573529996955224135760342422259061068512044369</tt>.</t>
              </li>
              <li>
                <t><tt>serialize([A])</tt>: Implemented using the compressed Elliptic-Curve-Point-to-Octet-String method according to <xref target="SEC1"/>; <tt>Ne = 33</tt>.</t>
              </li>
              <li>
                <t><tt>deserialize(buf)</tt>: Implemented by attempting to read <tt>buf</tt> into chunks of 33-byte arrays and convert them using the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SEC1"/>, and then performs partial public-key validation as defined in section 5.6.2.3.4 of <xref target="KEYAGREEMENT"/>. This includes checking that the coordinates of the resulting point are in the correct range, that the point is on the curve, and that the point is not the point at infinity.</t>
              </li>
            </ul>
          </section>
          <section anchor="scalar-field-of-p-256">
            <name>Scalar Field of P-256</name>
            <ul spacing="normal">
              <li>
                <t><tt>serialize(s)</tt>: Relies on the Field-Element-to-Octet-String conversion according to <xref target="SEC1"/>; <tt>Ns = 32</tt>.</t>
              </li>
              <li>
                <t><tt>deserialize(buf)</tt>: Reads the byte array <tt>buf</tt> in chunks of 32 bytes using Octet-String-to-Field-Element from <xref target="SEC1"/>. This function can fail if the input does not represent a Scalar in the range <tt>[0, G.Order() - 1]</tt>.</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Interactive Sigma Protocols have the following properties:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Knowledge soundness</strong>: If the proof is valid, the prover must have knowledge of a secret witness satisfying the proof statement. This property ensures that valid proofs cannot be generated without possession of the corresponding witness.</t>
        </li>
        <li>
          <t><strong>Honest verifier zero-knowledge</strong>: The proof string produced by the <tt>prove</tt> function does not reveal any information beyond what can be directly inferred from the statement itself. This ensures that honest verifiers gain no knowledge about the witness.</t>
        </li>
        <li>
          <t><strong>Completeness</strong>: If the statement being proved is true, an honest verifier can be convinced of this fact by an honest prover via the proof.</t>
        </li>
        <li>
          <t><strong>Deniable</strong>: Because Interactive Sigma Protocols don't have transferable message authenticity, a third party (not the prover or verifier) cannot be convinced that the prover made the proof. This means that the Sigma Protocol interaction is not transferable as evidence to a third party.</t>
        </li>
      </ul>
      <section anchor="privacy-considerations">
        <name>Privacy Considerations</name>
        <t>Sigma Protocols are insecure against malicious verifiers and should not be used.
The non-interactive Fiat-Shamir transformation leads to publicly verifiable (transferable) proofs that are statistically zero-knowledge.</t>
      </section>
      <section anchor="constant-time-requirements">
        <name>Constant-Time Requirements</name>
        <t>The prover's control flow and memory access patterns are typically influenced by the witness.
To prevent side-channel leakage of witness information, which may reveal private values, it is important that the implementation of underlying group and field operations are constant-time. Operations such as modular reduction, scalar multiplication, random value generation, and all other group and field operations are required to be constant-time especially when working with inputs which are private to prevent side-channel attacks which may reveal their values. In some cases, such as keyed-verification credentials, also the verifier must be constant-time.
Implementations MUST securely delete prover state as soon as it is no longer needed, and SHOULD minimize the lifetime of sensitive material (witness and instance), explicitly zeroize temporary buffers after proof generation, use secure de-allocation mechanisms when available, and reduce exposure in crash dumps, swap/page files, and diagnostic logging.</t>
      </section>
    </section>
    <section anchor="post-quantum-security-considerations">
      <name>Post-Quantum Security Considerations</name>
      <t>The zero-knowledge proofs described in this document provide statistical zero-knowledge and statistical soundness properties when modeled in the random oracle model.</t>
      <section anchor="privacy-considerations-1">
        <name>Privacy Considerations</name>
        <t>These proofs offer zero-knowledge guarantees, meaning they do not leak any information about the prover's witness beyond what can be inferred from the proven statement itself. This property holds even against quantum adversaries with unbounded computational power.</t>
        <t>Specifically, these proofs can be used to protect privacy against post-quantum adversaries, in applications demanding:</t>
        <ul spacing="normal">
          <li>
            <t>Post-quantum anonymity</t>
          </li>
          <li>
            <t>Post-quantum unlinkability</t>
          </li>
          <li>
            <t>Post-quantum blindness</t>
          </li>
          <li>
            <t>Protection against "harvest now, decrypt later" attacks.</t>
          </li>
        </ul>
      </section>
      <section anchor="soundness-considerations">
        <name>Soundness Considerations</name>
        <t>While the proofs themselves offer privacy protections against quantum adversaries, the hardness of the relation being proven depends (at best) on the hardness of the discrete logarithm problem over the elliptic curves specified in <xref target="ciphersuites"/>.
Since this problem is known to be efficiently solvable by quantum computers using Shor's algorithm, these proofs MUST NOT be relied upon for post-quantum soundness guarantees.</t>
        <t>Implementations requiring post-quantum soundness SHOULD transition to alternative proof systems such as:</t>
        <ul spacing="normal">
          <li>
            <t>MPC-in-the-Head approaches as described in <xref target="GiacomelliMO16"/></t>
          </li>
          <li>
            <t>Lattice-based approaches as described in <xref target="AttemaCK21"/></t>
          </li>
          <li>
            <t>Code-based approaches as described in <xref target="Stern93"/></t>
          </li>
        </ul>
        <t>Implementations should consider the timeline for quantum computing advances when planning migration to post-quantum sound alternatives.
Implementers MAY adopt a hybrid approach during migration to post-quantum security by using AND composition of proofs. This approach enables gradual migration while maintaining security against classical adversaries.
This composition retains soundness if <strong>both</strong> problems remain hard. AND composition of proofs is NOT described in this specification, but examples may be found in the proof-of-concept implementation and in <xref target="BonehS23"/>.</t>
      </section>
    </section>
    <section anchor="protocol-id-generation">
      <name>Generation of the protocol identifier</name>
      <t>As of now, it is responsibility of the user to pick a unique protocol identifier that identifies the proof system. This will be expanded in future versions of this specification.</t>
    </section>
    <section anchor="instance-id-generation">
      <name>Generation of the instance identifier</name>
      <t>As of now, it is responsibility of the user to pick a unique instance identifier that identifies the statement being proven.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors thank Jan Bobolz, Vishruti Ganesh, Stephan Krenn, Mary Maller, Ivan Visconti, Yuwen Zhang for reviewing a previous edition of this specification.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="KEYAGREEMENT">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
          <refcontent>National Institute of Standards and Technology</refcontent>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="fiat-shamir" target="https://mmaker.github.io/draft-irtf-cfrg-sigma-protocols/draft-irtf-cfrg-fiat-shamir.html">
          <front>
            <title>draft-irtf-cfrg-fiat-shamir</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="SP800" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf">
          <front>
            <title>Recommendations for Discrete Logarithm-based Cryptography</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author initials="" surname="Standards for Efficient Cryptography Group (SECG)">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="GiacomelliMO16" target="https://eprint.iacr.org/2016/163.pdf">
          <front>
            <title>ZKBoo: Faster Zero-Knowledge for Boolean Circuits</title>
            <author fullname="Irene Giacomelli">
              <organization/>
            </author>
            <author fullname="Jesper Madsen">
              <organization/>
            </author>
            <author fullname="Claudio Orlandi">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="AttemaCK21" target="https://dl.acm.org/doi/10.1007/978-3-030-84245-1_19">
          <front>
            <title>A Compressed Sigma-Protocol Theory for Lattices</title>
            <author fullname="Thomas Attema">
              <organization/>
            </author>
            <author fullname="Ronald Cramer">
              <organization/>
            </author>
            <author fullname="Lisa Kohl">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="BonehS23" target="https://toc.cryptobook.us/">
          <front>
            <title>A Graduate Course in Applied Cryptography</title>
            <author fullname="Dan Boneh">
              <organization/>
            </author>
            <author fullname="Victor Shoup">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Stern93" target="https://link.springer.com/chapter/10.1007/3-540-48329-2_2">
          <front>
            <title>A New Identification Scheme Based on Syndrome Decoding</title>
            <author fullname="Jacques Stern">
              <organization/>
            </author>
            <date year="1993"/>
          </front>
        </reference>
        <reference anchor="CramerDS94" target="https://ir.cwi.nl/pub/1456/1456D.pdf">
          <front>
            <title>Proofs of Partial Knowledge and Simplified Design of Witness Hiding Protocols</title>
            <author fullname="Ronald Cramer">
              <organization/>
            </author>
            <author fullname="Ivan Damgaard">
              <organization/>
            </author>
            <author fullname="Berry Schoenmakers">
              <organization/>
            </author>
            <date year="1994"/>
          </front>
        </reference>
        <reference anchor="Cramer97" target="https://ir.cwi.nl/pub/21438">
          <front>
            <title>Modular Design of Secure yet Practical Cryptographic Protocols</title>
            <author fullname="Ronald Cramer">
              <organization/>
            </author>
            <date year="1997"/>
          </front>
        </reference>
        <reference anchor="CS97" target="https://crypto.ethz.ch/publications/files/CamSta97b.pdf">
          <front>
            <title>Proof Systems for General Statements about Discrete Logarithms</title>
            <author fullname="Jan Camenisch">
              <organization/>
            </author>
            <author fullname="Markus Stadler">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="FIPS.186-5">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization/>
            </author>
            <date month="February" year="2023"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.186-5"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
        <reference anchor="FIPS-202">
          <front>
            <title>SHA-3 standard :: permutation-based hash and extendable-output functions</title>
            <author>
              <organization/>
            </author>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.6028/nist.fips.202"/>
          <refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
        </reference>
      </references>
    </references>
    <?line 578?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="seeded-prng">
        <name>Seeded PRNG</name>
        <t>For interoperability, the random number generator used for test vectors
is implemented using the duplex sponge SHAKE128 instantiation in Section 8.1 of <xref target="fiat-shamir"/>,
absorbing a seed of 32 bytes.
The Seeded PRNG is for reproducible test vectors; production implementations MUST use a CSPRNG.</t>
        <t>Random scalars are generated squeezing <tt>Ns + 16</tt> bytes, seen as a big-endian positive integer and reduced modulo <tt>p</tt>, as in Section 9.1.4 of <xref target="fiat-shamir"/>.</t>
        <artwork><![CDATA[
class SeededPRNG:
    def __init__(self, seed: bytes, order: int):
        assert(len(seed) == 32)
        self.order = order
        self.hash_state = SHAKE128(b"sigma-proofs/TestDRNG/SHAKE128".ljust(64, b"\x00"))
        self.hash_state.absorb(seed)

    def random_scalar(self) -> Scalar:
        Ns = (self.order.bit_length() + 7) // 8
        random_integer  = OS2IP(self.hash_state.squeeze(Ns + 16))
        return Scalar(random_integer % self.order)
]]></artwork>
        <t>The following sections contain test vectors for the Sigma Protocols specified in this document.</t>
      </section>
      <section anchor="discretelogarithm">
        <name>discrete_logarithm</name>
        <artwork><![CDATA[
Ciphersuite = sigma-proofs_Shake128_BLS12381
SessionId = 64697363726574655f6c6f6761726974686d
Statement = 010000000100000001000000000000000000000097f1d3a73197d794
2695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3a
f00adb22c6bbb2fa861063d133109d361486d5105a7e9c676a7831f8707b940cde05
514a18ca60f09d5d253c4b7b1b4b349d8a8c108f
Witness = 14de3306fc5f57e5d9e2e89caaf03a261f668b621093c17da407ee7462
43a421
Proof = 06a4c2c6e672c645b22be579a8c85df51582866b3af4ac4498d4c0a3253c
e7fe1c079022962b5a9ff682c728754e1e5984727d6e41b9fc7a48fc804a08538e88
Batchable Proof = 936241c2ed1da3b385294db75a499e96ffc71b5014a01db263
b993b718a901259f0d97700216c683fd97edb99ecac9e8423f70c52c0ea33b3037e6
2ffb3cfae8fd20cc5f3da8981aad1e5900deb7ee8c
]]></artwork>
      </section>
      <section anchor="dleq">
        <name>dleq</name>
        <artwork><![CDATA[
Ciphersuite = sigma-proofs_Shake128_BLS12381
SessionId = 646c6571
Statement = 02000000010000000100000000000000000000000300000001000000
000000000200000097f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e
3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bbb24cff92be94ce84df8a18bd
8f9c7e2f271bc9091002ff1196a7281283c87b563d9c3cf55173d30f57cac60e7683
0fe4b2fa861063d133109d361486d5105a7e9c676a7831f8707b940cde05514a18ca
60f09d5d253c4b7b1b4b349d8a8c108f81eba50cd26d9e72c32af73e57f9f201b76b
6c19061210eba4018d488830508c15d8862e09d24b19008a91c85d0aab2b
Witness = 054b258f4428690087c110387c5a27b3036847c4eb3021dacf604bbb69
7ec4a6
Proof = 2a29d448b76a5511f8ef616b0fb548a237211e6c40404c9e7522ef6d9b8f
9a3756f6239886c671da3b45e5deca4b23ee37947b859ebec21e8b9d535b712abf12
Batchable Proof = 936241c2ed1da3b385294db75a499e96ffc71b5014a01db263
b993b718a901259f0d97700216c683fd97edb99ecac9e8b6ed99afa6262bb161ee5e
e7a9c1ac4d63adb6aa983af069ee60b1c48927f6e4a5609d4a982f35c9cf69aecc3d
8f93992db48a698a9154b4f7339afc9830f258d923c9f69683f6d259dca5669e3e90
1b
]]></artwork>
      </section>
      <section anchor="pedersencommitment">
        <name>pedersen_commitment</name>
        <artwork><![CDATA[
Ciphersuite = sigma-proofs_Shake128_BLS12381
SessionId = 706564657273656e5f636f6d6d69746d656e74
Statement = 01000000020000000200000000000000000000000100000001000000
97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55
e83ff97a1aeffb3af00adb22c6bbb2fa861063d133109d361486d5105a7e9c676a78
31f8707b940cde05514a18ca60f09d5d253c4b7b1b4b349d8a8c108fb40c3e47aae4
5fa96715c58ddf5715c96c0765d7fdb919dc08c9fc0b3649b5054d71706a5bf1980d
f11e5e70390d20d6
Witness = 054b258f4428690087c110387c5a27b3036847c4eb3021dacf604bbb69
7ec4a628b20b5b8bbc7e534ac549882000877da9b475cc0725b403998a139355ab8a
f6
Proof = 1152702d85a1a11b53dbbdcf86fc27e31bfd1478d1192da60de113341cfc
357547dc2e89734b54c68845324fe71951a75f73c4e31c7ea3136539e9292afd75d2
68551cec3d44ba6d02fa80f6e88fe9aa59663d68985b41aaa63003221741afed
Batchable Proof = b277abf8285d0c764f8b57cb326399bf9bed4224d698832dd4
20d63080db3cea5d8e4b5fbd2417c88b76969b344c9afe1b6151cb572ec64038634a
a6b2977b86db6c7a01528051b8d18675b6488fb7010d06945f6bba1103b427d25e63
6a041a4f65ba6236e110b6c897730cbd9f1a1d
]]></artwork>
      </section>
      <section anchor="pedersencommitmentdleq">
        <name>pedersen_commitment_dleq</name>
        <artwork><![CDATA[
Ciphersuite = sigma-proofs_Shake128_BLS12381
SessionId = 706564657273656e5f636f6d6d69746d656e745f646c6571
Statement = 02000000020000000200000000000000000000000100000001000000
050000000200000000000000030000000100000004000000b2fa861063d133109d36
1486d5105a7e9c676a7831f8707b940cde05514a18ca60f09d5d253c4b7b1b4b349d
8a8c108fb24cff92be94ce84df8a18bd8f9c7e2f271bc9091002ff1196a7281283c8
7b563d9c3cf55173d30f57cac60e76830fe498be754a4ad6f66dedcfca7e23f5d47f
4f913da328c25dd4506ac0ae3744115b2b3fca2dd3ef851faa74a4fdd82e947c8997
75bf2f7af10a80c0ad6cd35a2646bc2e9c8be292111073cc781d483e7eee325aba7b
e547ce566b071e5d463aca55b003bc4efdafcb4717d5b0ea62db9380edb54c6dd905
788216b21d4f3341dd82a038fe2d59bfca0ec4b8cfa801a4d76db289a73c5a7406c2
7d17f398edad6729f29ba1323b978b00e90abf824e0134e0f113ca9d04375df36caf
d59d51aa5437
Witness = 33c24a45ec7c5d15db45372751862cbd11487a6acc8599e1d4b09d85a5
32262f1baffc5c29eef8881343a7d0950a1ee46a39605e63f7cebf0fb2420385527f
53
Proof = 65fe2c4f0e97f2034c874bc141950d5bb8c70ab2bcf6d778aad6d5d5d8d6
3db1160571f08b1c51ba3f83ca80d132a32db2ddab8a0ddd6dc7b6ed7d4574842917
70c7cbeb3670ee9a523a1d1844a7c0d49369b9be4fe79f5e4b328f31ce85c5e1
Batchable Proof = 81c544e0ef1984f63a1b0b51f112d9f51af2bf76d1b5ecf32e
edaebab1ee9a97d63817756a61c3389331c1cf17ac7eb8823c7e780bad136e99c825
a0992b6d34e2b0c79ea945af382a5cde5596959df8127f58f39a4f1050a49aa94945
bb0c3e5b2a32a32f07b8b5834a9bbce6050b38e7a972fe8be310e76a0d1a72227b49
522d41bae56c2b50e65d4bfaff911fda1c40f68ff0df313c4737155271839f4997
]]></artwork>
      </section>
      <section anchor="bbsblindcommitmentcomputation">
        <name>bbs_blind_commitment_computation</name>
        <artwork><![CDATA[
Ciphersuite = sigma-proofs_Shake128_BLS12381
SessionId = 6262735f626c696e645f636f6d6d69746d656e745f636f6d70757461
74696f6e
Statement = 01000000040000000400000000000000000000000100000001000000
02000000020000000300000003000000b2fa861063d133109d361486d5105a7e9c67
6a7831f8707b940cde05514a18ca60f09d5d253c4b7b1b4b349d8a8c108fb24cff92
be94ce84df8a18bd8f9c7e2f271bc9091002ff1196a7281283c87b563d9c3cf55173
d30f57cac60e76830fe4899775bf2f7af10a80c0ad6cd35a2646bc2e9c8be2921110
73cc781d483e7eee325aba7be547ce566b071e5d463aca55b003bc4efdafcb4717d5
b0ea62db9380edb54c6dd905788216b21d4f3341dd82a038fe2d59bfca0ec4b8cfa8
01a4d76d8789e9517c935cc3f345bec16dfbdf0777273de701583f2098c3020a10ca
1f3f93c07f45fd64bb932423317e5a1e74e8
Witness = 479b2e7e7b15a1d4118e1c887fe73fc4c7938cdd7d88422302b2c61794
6b4bb633c24a45ec7c5d15db45372751862cbd11487a6acc8599e1d4b09d85a53226
2f1baffc5c29eef8881343a7d0950a1ee46a39605e63f7cebf0fb2420385527f533b
7e5ed38fe5ce6cf2dd67fb59e7739981a80aa62b7bc1abf6880346db4f28de
Proof = 4bfb793c5b79281a5465ec59b8ba6f33bebb7a015181ecc65672ead554c4
d1a52025fca49faed8cd469f81dbc53a5de3ca0e3dd46f95fed9829f8770e90e72fe
5a6b5e4b091c5285037b0b56d1d2e13ff3511da0a3076066b5fa0456066287711bee
58aaed34ad00252e625479e314722b73c2c1645a1fea7bed0c96f5ed89e95f38b662
efd67399b248d0759691b1466a804d22f032ee08218196f324b9913b
Batchable Proof = b123897f9ff891e048b0c83eb3d3dc45b8e1d4c5a29941b3a4
727990ee1dd1028596f66fb5ef2934a7e6e083f0dd15e90139c8bf20adee43783325
c39a4516bc9aa2c418d9d0d75584b3695d5a9b0ab343ddc80038226d4d4a0ea8b064
2b55065b960c332af80d3dd52780cfbe3f064264e72e633ef92ed150c722d4af80dd
34e268b56b6cc9caf54c36b3bdecf62bc831e62d2e3ec166aec3289ee605272df2d1
69e69bba520326a082a299dca54110
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V96XLbSJbufzwFrhw3RnKLNPZFHb7RLtlle6q8jOXpLrdv
hZkAEiLGJMACQMlqh/u95vd9sfudXLCRlGxXdYwroiyRuZ7lO0ueTM9mM6Mt
2hU/M4+ely2vWdoWV9y8KC7XzHxdV1XeHBkpa/llVd+cmUWZV4aRVWnJ1uiT
1SxvZ0Xd5rM0ry9nDXWbbeqqrdJq1cwsx2i2ybpomqIq25sNpxEyvuH4X9ka
5Xad8PrMyDD+mXF1ZroGqzmjtbx5++ORcV3VHy/rarvBJ+f1zaatzB+rers+
Mj7yG3yZnZnvj/7B62r2sayuVzy75Een5pFYhdmtgj5KRe/Lmm2WN/T7RuzM
rHKz7/mrccXLLRZimvsnNU25haM3vOGsTpfmU2pHX6xZscIXRIS/FLzN51V9
SZ9TK3y+bNtNc/bgATWjj0DiuW72gD54kNTVdcMf0ADU77Jol9sEPddr9pHX
D+4gNHVZgYhNO5xMdJ3LoeZFddcgd30/X7br1ZFhsG27rGoi08zMt6uVFIWj
F0W65Ctuvqrr//fftCDTxO5YWfyDteD+mXn+8s2F+Jgraq3/UtX1dl7y9mg6
2DlrlwU3323LfSM92mxW/NR8Xqbz0YCp6HWzLf9ySZ/M0wpcM8qqXjOS6jPD
IPntfjPNvGDtrFmydSH2AwYrXZiSYtBQLkiIrJmzVcNlR1ZfclD/DyP+YEZB
eMxy8TqyrPE633DscQ11EpRpTOzOfFw0ac1bbv5cXbIaC1jPEtbwzDwfKsHe
VZdXq802aeZl0bTzy+rqAf1Anzy42PC0YKvX22RVpHKyBy+fX7ydX7yeY1Uz
OwrmmyynVT45t8eLxCemfWY+Wa2KTVuk5vm2BsTcvZrr6+t5w9NLoSX4wZ5d
OWqSXQb0Ukl/ZupvE3jTnJkXLQOJ6kwS6EmeF2kBABqtQSqzeYzVPj1B96cF
A205Fv3ilR2Md/T3n36oqjPzR9YAMs2/EwL9pHFETIGvV5yV5nlRp9uibfZv
kG/qomznmKgWe3QsO3hgB+5XbVJvcaA1z2te8sHCjw41/HfebLDwFyxreHmw
1fmKbbOigkavQD4x2qO2hbKd/+RMWPzIPK/Wm5o3JGfCeMxeK9E23y45bIcg
y8+shQDwA+TIVnOWrgUlsqp4YFtz27LCB3EYzdyZ5VqzyHM8f2Z/sOPvoM7b
ZbVmjdrBgTZvqpKtSFHwW32gzc9Fw8yfqiVp5A9VyZcXjqvFrifH05plW6wP
dNnWDYcYCtQq9qrhLilAubm0WUlVfZxvmweq4SEx79f3GGIn1nVLm78WaQt2
XCwh8aSykOIydqcsfcmvzedkqItc6bx5AYxfc/MHgSf0+02Z1RA28zGAKCvK
y/2cXRXlx3lD0n4JUIR0PkiXbINZOya7M9+zZl7kOvHM+eAM+GvHsbtPw0fy
zNLftryRG6ElSA4+voi98aZed3b/NatbAJrZ6y1kHKK7BpNyYtNjDoguqenf
iraEZJvPCtqh+XpodXf3CrxOr4t5uXoA4Hxge34g/vd4otTYlnfXtkbieLSv
xfMrcPsxW18yoNveFj/wGsoHvlW8FDap6ekTh2PqvKiyLfyTwdYveLqtuXnD
W2ybfMMUJBsIMND8m8jh2J4bjakQfjMVzi/0wieMhTgCkNcS5Z8CC2usFtiP
zyDFjcmSatvusY/N0V7t2hEy4Dl+hE1Ml0f727xg9cctySHLVj3LpjSRmj3n
7fIfc/h+m6FRzYsVbx5gHowRh4mSmh+fv76Yw8bOfCj4q+fQmXlgOZE0wf2X
quXMsZxD7fCVYcxmMxCjaYmlhvGod/clYhcgVQnI6uOBsZNtCvd55D2b7ZK1
Jlut4Maawvm+goGB75xW5VVRplAvE5+QatXUsV1y84qtoFHtDf3OzEbzaW4+
b80G5GjQuBEtMRzsVUu/oi3wA/5fy0kpT82m2paZ/JE0eLxSfNaYGQfDiwQ6
DRT+/Lkhmca0MyytKTLsUVD+y5e5YbxdYu8Ib7a0kK5jMyGQFDDaI+FBTwOs
DTZwVqzZpVwpcA+BAqKDTUNzAwDXfIa4BTTg2htKhTckIo5mbj75xGhz1Dxd
bbP9lJfzZ1qOV1qOzZqv5GZO4W09ZWuIPy+FtMkPX3NMDZNPJFwXrdAKSbaa
ld3ocykg6yKDEBvGPTjabQ1oSGkUiEt5MxWY9bYhauXYLjh5vx/9vnlM3Nq2
IH5yo3kJQTg5FQ2XkBiOmdEOK8iq9eoGrCcKZGYOw0JyQZ4nDBDttwU3trSK
E7lqDAGfY4O98cMzzc1XJdcyxzIgZqv5M2VrIcStqIWIVQ1LihUE5dS8BtAt
QUqWrJREkuy0tSQJjbSuaq4E81Mfes7NR2a6Ygh/U5NLzqo5zFdv1CSFGOLz
595kQRLhxCEYxf4mhCa+vxyyuWhpQAzTFFgbKZzY9VgoK7n/l+a1tGRcChCw
Dp5JN5g5J1dNrQpUnITRZgpMSDiEGVJZVuVsiA/bhjSB9vUjxS0XIm4xgS9l
owKuwR7jkHb4rLrmYA8UeAvaDmjRSHHCVEvwmCQhZTUnkL2R+0P0TSqj9XiI
DqTtUIut8EPv1PZ79+Ce1VwiXc5STgAAuRF4DFgvU7keTG9WScsg3hnR64Y2
iw1pkIR9MqU0bIUUlNRUE0SoRaHlZMpRrIIshBAS+ZX+prNCGMAs+fUxIhmE
MSk/MWf/Z9x02FIK/QepgscNX+Wnmu2nZl1eit7HvYae6h4Cf0/2DKU1TA02
bH5qdhosxtVNh6No1FfdhzN3nU+7nmIY+LyjPYHfcNWKf/APfe+d4WTPm5Y3
+7tOtjGecNot47fMCdeFnck+onff4NAQk7mnA0zJds+sBGKzMRWK9ZaSPDs7
UUz9xlF2tqX7T5k62J7xtyWvKY8yMxe3i+QCu+Rl1WotECpAxJBQoHWLIAf4
pX+Fp/RRanFRAsqlgskpzEvhzxG8XxUMerT4WRjXNwq+MGHb626X58GYzRL6
C6PA22vOS+2akPnQojkXG7pFc850DPA1KjTd+v2BPTQ3S4RO9++fSn+paE6V
NSHLxTRI0Ed5UQME15gTxgpijL4js0botgMmkpprOJYVwrNti0HJGwOrBlwE
iMIbBSNpd0tYECJ4U6WFIK4aXam3zNUquKPJFUGEfSkJjvsVya10bhx9majv
Sm2upZE3ZeJXsxSmaAGyLqSvlguUFdiND2c9fJLREPuDj79Rfckm1Py3bVGT
2KQpLQ3zMnNZXC5nv20Z2W8YbvgvmxtyFetUGkngPQREE19RZm7+zNlHJo0m
JwP8X2SJmJmDgAkRSjFnQMy02iI4EY6vMqq8c1CxtJQoc6P7Kep1hlYPIpjG
OppJiRVuB2z6Yihdi844fuSblmwgXMCR/H4HXO9KrP7m6+UVK6nA4sMCe1iY
JoKjptArJSJy+BjKIRSBg9JbKVUSXjozTEmXMckkuUGnbV1S0LHl3c5FqKNB
Q35FQ5KPRr4L+EM6ocR8DBffadd2ad2FRWx1WQk//v79sSanS55+bCQLFEGl
OygWiRBlI0RIxFOdEF4KD3IQVb0dbKGfq4MJ+C8gh7bXKt8D3yzlPAOLMKrI
tO00yVmxaiRJvtFOgxRdj2aqV+Ao6TGczqoUWQfqAnIK96+Usjed9U4Tvztj
LwhfPd93+gaC8YPZmZyB1TW76WYfQNHYMJLzXbOiofhq8bgf50ldV/WCmNIP
vsOX73BFvma1uu0ft9a3wvCRHrfXVS+jfQivVGYSFCufpqpJcZ7DxFNuL6VU
lsCSG8QsNwSZW4oKVOiu8gg6/jrm80sEim9mgw9PpM50+1rs8Z0WAkFWTSUH
v15C54R6iBihWVZ1q6Nq828U0Vwp9+lrvbkpXki/oGmVlRLIqbc/H4/8HR7e
4lThJE3HOmcxG2rmbDYEfGEg9EoO8UWxth9uAFyL47ugs7d5RUlJAKxtW8BG
UsDb2QSKcXsXsY9HtbvXyZJai05/CcaOXVedxqJcsMBOGisr8hy+L9nom43M
HjSDzGIpSJTAd6mVl1ARnUVsC7cG0X7f+nSU+WpnQOBZlc/KURMakZIKWC4F
qvfMN8J1ghplQ8X4fG/iJMndKUoo+6ySRkV5Va2usPZ671DSvMABx4IN5X9r
lwmDyE7SXguJpN6N9NzmxlBRpNOl3DLhyrWjtJqwuY3MLF8zEdTLnI9BaQWS
IbMBAjNQclsW5KfBy8Pa5ArmxqN+zdrlG+KPnL5d1tX2cil1piKGEhe7SH8U
d59fvHn59PjRD+cnfeqXYiW4yXJOpT8kmO2SahgGVqzvQn82GM8YDSJH+CB3
JAYSfVXC70J8vG+M51r6VHbmxX9evCWQITMxTMALH1hRc9PwbVaNnGyjd7KP
zy9eY6MnPcHNHYLzQkQG8NykCtX8v7jM+4ke9JF0ShryCMDebSqhYkU5buEk
t7VoRWcJ0m8SWzVF2nNuvOG5TAxfyHHNR3OPxOvz5z6N/eWLQGloeSZCP5m3
x1DYvZqdsjc76Tuh6cMkqyQylGR82j4TnytV6YWj2SazRq1Kmf2GsjkyyyoD
UQSxkh17soc70+/P8RrPW0oiiWR2KXLluz1mgx57Utji89kAwkQ666/C/0uX
FR2xihBmNH+XwcspYy4HSosN2N1sCwiyTIDXLCukFq1uTne2SJmwQYjWHYfM
1IkH5fguKL8HyVLxAVZ/TNxU+U+omBB2e24+/vnJfxw/PTWfnZq/nJrvTsyH
5uvqp8/ia2eO/x1/OjnTSvHgAUkMOAHwhOtAiVjR0KWGv6DrJ/O+icHeqR+f
DTq+hpySu8obKfp0tHAjentzE2LwXIYjELMrYDYl7U0b2wQ41HzsdoOodNJD
EHZEyz86mHU4lp6KTl/cv38icsYwX10UKbnLV8qGLIgWvwhyvIPN0xgLMm83
iFdnKQzt3KCsh+lIUzFaW3HFhJTuLEFFWftWILXeXHwCgv9YKJ6L/bs7M6iz
DJ0ull+UFByMIn2QxlgIXpjgxC8LYcgWkiMPzXcLmXaVtRZDG/z53q5QG8YP
PGXbzr8oapPsVkkEVYQfeOfS0AwVOofFaaSaSd5dVkzr6UQ3xHA1zykdvKK8
NLsUuJaRNlzxTpznVAw2UlmghoIZMpK8KTLEUcKu0Kggaa8KQ2rB0YGXI2JL
OEVtsZFHgCSA4jyGC28jlSI7VWThrZ7K307EsGpUxCsrWDd9BFLUwoviMkmf
Qu9h/sg7VkSYLBe8+Rvpdwt3XJKyS4ELbiv8ID/iozz/l5hcJWQk+tOrDoO+
AnDuddKgJOCLcGILUXfQ3hyfdC6pDNhKvm3pWFepjWa66Dqnnp292+naW0Il
/rcgr+ZqHzOMjK5JJw7SEohJxRiY8Gw0oRx5pO2LzWI+ClqPtf6fme8FHf5s
vvz1ZByowrpCa2mgCWRISZET7sSuMlZbJNt8QV3z4hN2Il0Yc/ESyGC+lGsZ
BHrHaA3Bo/kZFcpsWiF/a7YZR4AL2U4M3KBfN6CMDRf9VjCSiO4o7JOZGnIs
gZ/Qiv4U+Pa4WxyclGpqYdfU/oek/cOiUFAEaq/5cialkyjSxQPN1LJLmKAh
VPKFwtcxr8S4nDKSe0bWPFxQEmahSUWD9KyuZfDbkPkRmCrSMeAAAdd1QbaB
5Eog+gdAyrH88cyULuZkAwr5h9Cjls/GCyckASUH6kZ50AGqqJHygq+yubKl
lKTF96fCaeIsI0YRURfmNWX9gIkE6os/LVQKuoRwdjD551EvQbJJv4cPFxIl
hw37nU9a31/QMSxiT6q9BRwhBi9InyU2sXRZ8KsuZJR6TRABfFxVjNKVCqUk
HafodNYn0MCdY20wTkzdZopUY3opYZvy6mzIK9F0V8Y60dB2rxvxTu7LEcfM
Fz1VuENJCKyhUbUIrFu0jrYRRsxVcRCij0wVf+n0voiLuiyR/EyNUEx8WR0F
xHNbxwGDyleyECOwVGHKmQDE93JvEjDP9gOmjmuGSKmO+DvE2QWbCVY2fzRW
NiOs7LehxPpfDpgjGfzDsnf/Y6r/r9F58lP7ekGQV9T1yEP8vrBHYoMuEZyw
4fM95Xx/oSorfXYmy6s65ihmdIZCJB2V7OmqFZl2bbqgYIHgXqUUmoXKZeg1
PDQ7iRq0+lUu9Odu4Vic3MUMv4j1feh39UGfxJoLNewC2DZY9GgB+6DtRGaw
ROWTONca9p6Yxj07lrSe7lj3oC3/PKitUnztqC9TUwiD6uLT7IqLYtcx2jV0
usaVTZ1YQVWhM7Hx+y3m6Lxyf1h+IcrfxDxiQTR+lbdkHdactAUk5LqSp8FS
5XDvGBxp+aXuKEM7DPmMVi7FSIXVZ8N8liTNuchHyisTXX5JWUlKpMJBVzgK
HPq1a6FovK+JyJf0QiLI3lLGO+kiMUH5PYt5wTb9Ip7K6zUqHyJ+676Tw39I
+8XrJezsql+zGOlD70mL9mLcvs1AYEUGb/RF35W+GeXvsFGV/hsbHzG8yt/9
SBI/VjeR5Osb/nk0jVRGKqwbVkXs0HfR0U4cM3Q1FHTQAPCU69xDMIIAufEx
YfrPByvFh5YxpYP4UK5xgBicTkjVUns46+rCNhsZh1KlZ6rCrEnAclUwJRx7
yLoXtu6iI431nEyklrqZKYcV54nbWqTs5alwd3hPpXusoM9FvbDqpk+ju/yU
xKCOZs5cuF679CZtpTnn+2S3T1JBISqur54IXqg9vi9+FSMXNNDuGPOxzv6q
E1cDZZWj0RLGDL9r5Imuy6F9ObTY/ZyYWmaCU1JR5+tmfTzcyGm3iBNZPRbM
9Vm7GEI5z/1ZSU/EvvaQ5Gla0EOlq1XGVTnx8Lylq5GhEo6F2hcJlGIhZRLF
3NpXaGQYv786knWSLJIcG1HqimkXcghzW1IU36ulSODqggPKvRNkN8N1wFam
+RwGYWBgv0iDCF3R4+7a0868qYxIR9j5LqBqMvWo+rhaQ6ix9cspMnVNniuJ
li0k8E6RlxT9YY/a/UUq1Vfo4mAApYMElXRuRmlWrbxKwcv+xGRsbkZ99Ga/
qpOQyg/kIBIN9PHMUuI34umlRulj8TuNJJHkZVXybpiGt9NpJzZEdpdx+mAA
iYxPVGBHfFXeQZeb1vuSsI5AflBNKmqFCCfV1lVe67oLVo4HxTFSbCYweiwD
A1V8p6TjEPVPxiCp+XknTo7lbNCvlJ1UEdcgyBrsSTR/JSPj4ZwKaU4HIRqp
0iUdm3L45eamKuSBqyq6IbroQTWZ1QkbnPOUZ9ua90cKaniIqShol7g1MCen
5vQT809EIYXvu18+NEuN4BrU5BSGQXxJuOAluegdv3fN3oQ/U0n/1zOoE5x/
PYfGe/4WFumeAx51697LpP7bW7g0RtJTcIyWTjnwLtRQenQqPBmqT6hFER5v
B2UEgyKQAWgs5K5uwZE/nLf9Tnr+bFghqw40bfdAhqos5O1BxghHAbbu0+kw
ZdUBYn8sN/R1yB5OfQ4a41fwV32i0PK8d7s4HVLRubFSjENoLoD85I/08cSg
4jSL5+1sKZC7yLpuegmqda1b18Xl8pbmMOUdL46l3X0uCSmk78mqFb+eSEap
DXWqpyZ7VJpP9Hhd0bPwSCS5VMEaHCJRVaFdp4Ps3OOnDsz6fCeaOh67mQ/f
f3pvSe/xE8kBaPHr6TQ4pEb2pNFYTwdiolzJ3XWdaN0VPT6MHM+VEIB7+qaG
PsHXN7VE9K0OW8QhlLm4SJdlVdcic6NKPw8Un0+rzSdVqMRtus61IdqKSzNF
q1LBr2t11q+o3qiLI/LjPdc8ZGiPofPtSgwsUlUImDOR5VdVs0Kpj/pyqCNV
NX2kS6GOdMvTQRZV2KC50jK1smHNPhH3zlshe5Wsa7Gbrmq0ipSXp7dVpBwo
+D6gAuaxOsc+mdShL6tV1l8l6I+4OwjvryKpjiUnpjF18Vw69YOaMMmV0ZUJ
Ob84yT8Z1rt1JB8cg6h5B7G6kNpBmfThIHh+UGXLqpSW8T3IOh8XDp2IfXwQ
WtbbTQ0UQz0b+C8nXeQ6LIjGBKKzlBURmR13rJZr6FRyQAfVa8+Ux8NOXmeD
jye1530J8FhYOy4MRfUry9j3yK3k5bjDQUMhmw36DQoQhzXfg3r0Rp0D7Upw
B+SHcru65FTJ4XjjewRiwhWwYLgtzVtF7veyEcX8f9I96Zf7g7V3yYBvkiGB
eX9VlJCLkzWuX1n7/j0WfPeC22w0z6RcvC/9HF06MPYytafHTjfNbw1vXcXs
qFj80GwHUC1Rr4EIq8mE73y9lFdw+jnHFfc8OygUVKoB7xUbGFTOnpgPD+un
YGfvEkn/kPr3FfJ39R6iPkSOf6LjX+z/FlDo2a+w5LIiEHnfL1qK6ngAgaO/
R2wH+zz5dYJIYgUPu9VLwVZFK3RUKjwHVS6rSpa7nNPwcEHeLN1XU/hFp0Ov
a7o7UvbZ8H6khxPv/lh0lWR6f4WtCO+5v7mxE9jbg7ZPqZq4/vDLgS5dWOKc
jFcxn3rdYpRT87344ZMc9ekJ3DnjUasuQIvIb8+VYwqVFqK9KvcSYy1ENTy/
UlI+LV2BcwBTmRUNXbTW92CfdsmpQRnPZOGjaEsuF0R4enJq6j38Ipb9XKzz
uqrbpdkV0LPuHF5U++njk1Nz8Z5IOKThQK5InN9/+vVkMZ+IDNUAdvLyaPCr
RIRm+K7BwEgcqHwU9Y77ahm/II4V13mmJYNPF1j5M0X1X+iXdwtZdC62qgrx
9tXhncqTm5HPS/Tqoa2TXGDOLcLb+fvfIrrufCy98q9n8q93d8my13kaXy0V
GPrZSELUz++I/Cpm8ee3qMdQNZ7qHsFtPd4NejwTEjkSnX1vMZAMTY6QD0lT
L0xvnrx+o4TpvJckmF8I07kWJuBs/VWSNBCenc7/AqEZgE19u+Q4eyVHicz5
XSLj/j6ROSfafo2YnI/ERPWuewEwzwcFkObne6N6SFF+qd8pMIdfyQqEOyvL
ZXA6c/zAhJFMN/ihhsbJYHkwninKYmXDz5/Fu3Kq5p5YK895uiT37kzi/aTp
LP1Axrgi8o20vTpOu8TyF7bth7FjRbFjW64fOF4UBk4Qh54XxF7sWaEfur4T
x3EQ+77jeLbrh4Hleo7nOI4fW4FtBZFvO5bnuUE8Lal8/0gUBHU3KEYXgtL+
oTK9t5l4kW72mszbrK1mr+ActLMLdZFB3sFkaYotqbQntvrk3P7y5c+i7vGh
6bp7q4Omi6BSOlkppMapqYJFVmiKWqB0uS0/Cma77qwvIdL3i8orcvywifX+
/QzXTfvYt79b99NdqC31DelGXqZjK1XjPvvIb2QFUlfdPyiB0Lcn/Hkwd+au
ruj6Xz89effo6ZsnT148efn24c67ROoJQT94VLvdJW/1/k0jL792xlvuWKyc
Kb1QnjnVZVBmV2ySiVc9VGtEF2krXcfTQcW8dGYafRlZyLcmwLSNrr1So7ei
bqks2hutJjLrZ4rjtk49jEnxmtQGffODxhPtZ+ogaUf0JMcbQedD4kdBoesc
FL83kDCZH9upCQZ9BvLmqKo9KVhTSRqtU5YB6kXsqx+jirBx/VpWcUnFzrxR
jkzVBEpayCeIFu8tIOf8lYQPhE/2rwt52Uc/93I+esiFLvcceOKFKtL2PGmr
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
AA==

-->

</rfc>
