<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-sigma-protocols-03" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title>Sigma Proofs for Linear Relations</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-sigma-protocols-03"/>
    <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="August" day="17"/>
    <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 295?>

<t>This document describes Sigma Protocols for proving knowledge of preimages of linear maps in prime-order elliptic curve groups. These are sometimes also called <em>Maurer Proofs</em>, or <em>proofs of knowledge of a preimage of a group homomorphism</em>.</t>
      <t>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 301?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Zero-knowledge proofs of knowledge allow a prover to convince a verifier that a statement is true, without revealing anything other than what is already revealed by the statement itself.</t>
      <t>Sigma Protocols are an essential component of a number of cryptographic constructions, such as anonymous credentials <xref target="ARC"/> <xref target="BBS"/>, verifiable random functions <xref target="RFC9381"/>, anonymous tokens <xref target="RFC9497"/>, blind signatures <xref target="BBSBlind"/>, and proofs of knowledge of the opening of a Pedersen commitment <xref target="Pedersen91"/>. This document specifies a single Sigma Protocol for proving knowledge of a preimage of a linear map over a prime-order group <xref target="Cramer97"/> <xref target="Maurer09"/>. A <em>linear relation</em> is a system of equations among group elements that is linear in the secret scalars; affine relations with constant terms (e.g. verifiable encryption) and quadratic equations (e.g. range proofs) can also be expressed as the preimage of a linear map (<xref target="linear-map"/>).</t>
      <t>A Sigma Protocol is an interactive proof with the following three-message flow:</t>
      <figure anchor="fig-sigma-proofs">
        <name>Flow of an interactive sigma protocol.</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="616" viewBox="0 0 616 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
              <path d="M 88,88 L 88,304" fill="none" stroke="black"/>
              <path d="M 192,32 L 192,80" fill="none" stroke="black"/>
              <path d="M 424,32 L 424,80" fill="none" stroke="black"/>
              <path d="M 520,88 L 520,304" fill="none" stroke="black"/>
              <path d="M 608,32 L 608,80" fill="none" stroke="black"/>
              <path d="M 8,32 L 192,32" fill="none" stroke="black"/>
              <path d="M 424,32 L 608,32" fill="none" stroke="black"/>
              <path d="M 8,80 L 192,80" fill="none" stroke="black"/>
              <path d="M 424,80 L 608,80" fill="none" stroke="black"/>
              <path d="M 96,144 L 512,144" fill="none" stroke="black"/>
              <path d="M 96,192 L 512,192" fill="none" stroke="black"/>
              <path d="M 96,256 L 512,256" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="520,256 508,250.4 508,261.6" fill="black" transform="rotate(0,512,256)"/>
              <polygon class="arrowhead" points="520,144 508,138.4 508,149.6" fill="black" transform="rotate(0,512,144)"/>
              <polygon class="arrowhead" points="104,192 92,186.4 92,197.6" fill="black" transform="rotate(180,96,192)"/>
              <g class="text">
                <text x="100" y="52">Prover</text>
                <text x="516" y="52">Verifier</text>
                <text x="60" y="68">witness,</text>
                <text x="132" y="68">instance</text>
                <text x="516" y="68">instance</text>
                <text x="204" y="116">ProverCommitment(instance,</text>
                <text x="348" y="116">witness,</text>
                <text x="404" y="116">rng)</text>
                <text x="140" y="132">commitment</text>
                <text x="472" y="180">challenge</text>
                <text x="212" y="228">ProverResponse(prover_state,</text>
                <text x="372" y="228">challenge)</text>
                <text x="132" y="244">response</text>
                <text x="172" y="292">Verifier(instance,</text>
                <text x="296" y="292">commitment,</text>
                <text x="388" y="292">challenge,</text>
                <text x="472" y="292">response)</text>
                <text x="356" y="308">accept</text>
                <text x="396" y="308">or</text>
                <text x="436" y="308">reject</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+----------------------+                            +----------------------+
|        Prover        |                            |       Verifier       |
|  witness, instance   |                            |       instance       |
+----------------------+                            +----------------------+
          |                                                     |
          | ProverCommitment(instance, witness, rng)            |
          | commitment                                          |
          |---------------------------------------------------->|
          |                                                     |
          |                                           challenge |
          |<----------------------------------------------------|
          |                                                     |
          | ProverResponse(prover_state, challenge)             |
          | response                                            |
          |---------------------------------------------------->|
          |                                                     |
          | Verifier(instance, commitment, challenge, response) |
          |                              accept or reject       |
]]></artwork>
        </artset>
      </figure>
      <t>The messages are respectively called <strong>commitment</strong> (computed by the prover), <strong>challenge</strong> (randomly sampled by the verifier), and <strong>response</strong> (computed by the prover). The prover is stateful and maintains a single-use private state between the first and third messages. The <strong>transcript</strong> <tt>(commitment, challenge, response)</tt> is checked by the verifier.</t>
      <t>Sigma Protocols can compose: several statements can be proven simultaneously (AND composition), disjunctively (OR composition <xref target="CramerDS94"/>), or thresholded. AND composition of linear relations is immediate in this document (<xref target="relation-notation"/>); OR and threshold composition, and composition across heterogeneous proof systems, are not part of this document, but possible via the Sigma Protocol interface. Composition carries soundness and zero-knowledge caveats; see <xref target="security-considerations"/> and <xref target="privacy-considerations"/>.</t>
    </section>
    <section anchor="terminology-and-conventions-in-this-document">
      <name>Terminology and conventions in this document</name>
      <t>The key words "<strong>MUST</strong>", "<strong>MUST NOT</strong>", "<strong>REQUIRED</strong>", "<strong>SHALL</strong>", "<strong>SHALL NOT</strong>", "<strong>SHOULD</strong>", "<strong>SHOULD NOT</strong>", "<strong>RECOMMENDED</strong>", "<strong>NOT RECOMMENDED</strong>", "<strong>MAY</strong>", and "<strong>OPTIONAL</strong>" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      <t>The algorithms and procedures in this document are specified using Python-like pseudocode. Each function accepts defined inputs and parameters and returns one or more output values. Once a protocol variant and ciphersuite are selected, all associated parameters are treated as constants.</t>
      <t>The following notation is used throughout this document.</t>
      <section anchor="bytes-and-integers">
        <name>Bytes and integers</name>
        <t>A byte is an 8-bit unsigned integer (an octet), and a <em>byte string</em> is a finite sequence of bytes. The empty byte string is written <tt>""</tt>, and <tt>x || y</tt> is the concatenation of the byte strings <tt>x</tt> and <tt>y</tt>. For any finite sequence <tt>x</tt>, <tt>len(x)</tt> is the number of elements in <tt>x</tt>; for a byte string, this is its length in bytes. Byte strings are indexed from zero: for integers <tt>0 &lt;= i &lt;= j &lt;= len(x)</tt>, <tt>x[i : j]</tt> denotes the <tt>(j - i)</tt>-byte substring of <tt>x</tt> at positions <tt>i, i+1, ..., j-1</tt>, so that <tt>x[0 : N]</tt> is the first <tt>N</tt> bytes of <tt>x</tt> and <tt>x[i : i]</tt> is <tt>""</tt>.</t>
        <t><tt>I2OSP(n, w)</tt> and <tt>OS2IP(x)</tt> are the integer/byte-string conversion primitives used throughout this document, in big-endian byte order, as defined in <xref section="4" sectionFormat="of" target="RFC8017"/>. <tt>I2OSP(n, w)</tt> converts a non-negative integer <tt>n</tt> with <tt>0 &lt;= n &lt; 256^w</tt> into a <tt>w</tt>-byte, big-endian byte string, and fails if <tt>n &gt;= 256^w</tt>; <tt>OS2IP(x)</tt> is its inverse, mapping a <tt>w</tt>-byte string to the integer in <tt>[0, 256^w)</tt> that it represents. <tt>LE(n, w)</tt> is the little-endian counterpart defined in <xref target="fiat-shamir"/>. <tt>LE2IP(x)</tt>, also defined in <xref target="fiat-shamir"/>, converts a little-endian byte string back into a non-negative integer. Byte order and length of the scalar and group-element encodings are fixed by each ciphersuite (<xref target="ciphersuites"/>).</t>
      </section>
      <section anchor="rng-definition">
        <name>Randomized algorithms</name>
        <t>The prover commitment algorithm requires fresh, single-use randomness to ensure privacy of the witness. This document denotes with <tt>rng</tt> a cryptographically secure random number generator (CSPRNG), and uses <tt>Group.random_scalar(rng)</tt> to denote sampling a uniformly random element of the scalar field, similarly to <tt>RandomScalar()</tt> of <xref section="2.1" sectionFormat="of" target="RFC9497"/>.</t>
      </section>
      <section anchor="group-abstraction">
        <name>Group abstraction</name>
        <t>Elliptic curves are presented using additive notation.</t>
        <t>Group elements are upper-case (<tt>G</tt>, <tt>X</tt>, <tt>M</tt>) and scalars lower-case (<tt>x</tt>, <tt>s</tt>). The name <tt>G</tt> denotes the group generator <tt>Group.generator()</tt> (<xref target="group"/>). Pseudocode and interface names are descriptive (e.g. <tt>commitment</tt>, <tt>image</tt>, <tt>witness</tt>) and do not follow this rule.</t>
        <section anchor="group">
          <name>Group elements</name>
          <t><tt>identity()</tt> is the neutral element, <tt>generator()</tt> returns the canonical generator of the prime-order subgroup (<xref target="ciphersuites"/>), and <tt>order()</tt> returns its order <tt>p</tt>. Addition, negation, equality, and scalar multiplication by a <tt>Scalar</tt> are written <tt>+</tt>, <tt>-</tt>, <tt>==</tt>, and <tt>*</tt>.</t>
          <t><tt>serialize(elements: list[Group])</tt> and <tt>deserialize(buffer)</tt> convert <tt>N</tt> non-neutral group elements into a fixed-length <tt>Ne * N</tt>-byte encoding, where <tt>Ne</tt> is fixed per ciphersuite (<xref target="ciphersuites"/>).</t>
          <t>Both <tt>serialize</tt> and <tt>deserialize</tt> are defined only on non-neutral elements. Serialization <strong>MUST</strong> fail on the identity element, and deserialization <strong>MUST</strong> fail for invalid encodings, including on the encoding of the identity. An honest prover statistically hits this event only with negligible probability. See <xref section="10.1" sectionFormat="of" target="RFC9380"/>, Appendix C of <xref target="PAIRING"/>, <xref section="2.1" sectionFormat="of" target="RFC9497"/>, <xref target="ARC"/>.</t>
        </section>
        <section anchor="scalar">
          <name>Scalars</name>
          <t>A <tt>Scalar</tt> is an element of the group's <em>scalar field</em>, the prime field of integers modulo the group order <tt>p</tt>. Addition and multiplication are written <tt>+</tt> and <tt>*</tt> via operator overloading.</t>
          <t><tt>serialize(scalars: list[Scalar])</tt> and <tt>deserialize(buffer)</tt> batch convert between <tt>N</tt> scalars and their canonical, fixed-length <tt>Ns * N</tt>-byte encoding.</t>
          <t>Sampling a random scalar takes two steps: obtaining high-quality entropy via a CSPRNG (e.g., <tt>getrandom()</tt>; see <xref target="RFC4086"/> for randomness requirements), and reducing the resulting bytes to a scalar. It is <strong>RECOMMENDED</strong> that the latter be done via <tt>DecodeField</tt> as in <xref target="fiat-shamir"/>. Different sampling mechanisms, such as the wide reduction of <tt>hash_to_field</tt> (<xref section="5.2" sectionFormat="of" target="RFC9380"/>) and the integer conversion of Appendix A.4.1 of <xref target="FIPS186-5"/> do not affect interoperability of proofs. The "discard method" of Appendix A.4.2 of <xref target="FIPS186-5"/> <strong>SHOULD NOT</strong> be used <xref target="constant-time"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="linear-relations">
      <name>Linear relations</name>
      <t>This section specifies the statement being proven: the preimage of a linear map over a group, also known as the preimage of a group homomorphism. The Sigma Protocol proving knowledge of a preimage is specified in <xref target="sigma-protocol-group"/>.</t>
      <section anchor="linear-map">
        <name>Linear map</name>
        <t>A linear map is a matrix-vector product <tt>image = M * witness</tt>, where <tt>M</tt> is a matrix of group elements and <tt>witness</tt> is a vector of scalars.</t>
        <t><tt>M</tt> and <tt>image</tt> together form the statement (the <em>instance</em>), while <tt>witness</tt> is the secret. The <em>relation</em> (the set of instance-witness pairs of which knowledge is proven) is:</t>
        <artwork><![CDATA[
R := { ((M, image), witness) : image = M * witness }
]]></artwork>
        <t><tt>image</tt> is the result of the multi-scalar multiplication of each matrix row with the witness. For <tt>i</tt> in <tt>0, ..., num_equations - 1</tt></t>
        <artwork><![CDATA[
image[i] = sum(witness[j] * M[i][j] for j in 0, ..., num_scalars - 1)
]]></artwork>
        <t><tt>num_scalars</tt> is the length of <tt>witness</tt> (the width of <tt>M</tt>), and <tt>num_equations</tt> is the number of group elements in <tt>image</tt> (the height of <tt>M</tt>).</t>
        <t>As an example, Schnorr's identification protocol has <tt>num_scalars = num_equations = 1</tt> and <tt>M = [[G]]</tt>, where <tt>G</tt> is the group generator, proving knowledge of the scalar <tt>x</tt> such that the group element <tt>X</tt> satisfies <tt>X = x * G</tt> <xref target="RFC8235"/>.</t>
        <t>Another example is the Chaum-Pedersen relation <xref target="ChaumP92"/>: given the group generator <tt>G</tt> and group elements <tt>H</tt>, <tt>X</tt>, <tt>Y</tt>, the prover shows knowledge of a single scalar <tt>x</tt> such that <tt>X = x * G</tt> and <tt>Y = x * H</tt>. Here <tt>num_scalars = 1</tt>, <tt>num_equations = 2</tt>, and:</t>
        <artwork><![CDATA[
M = [[G],
     [H]]
]]></artwork>
        <t>Variants of the Chaum-Pedersen relation are widely used for VRFs <xref target="RFC9381"/> and anonymous tokens <xref target="RFC9497"/>. Proofs of knowledge of the opening <tt>(m, r)</tt> of a Pedersen commitment <xref target="Pedersen91"/> <tt>C = m * G + r * H</tt> are Okamoto-Schnorr proofs <xref target="Okamoto92"/>.</t>
        <t>Affine equations with constant terms can be expressed directly through image terms and coefficients (<xref target="representation"/>); more elaborate relations, such as quadratic equations, reduce to this same form by letting instance elements themselves serve as bases (<xref target="relation-notation"/>).</t>
        <t>The group <tt>Group</tt>, and its generator, are provided by the ciphersuite <xref target="ciphersuites"/>. The statement author has the responsibility to select the appropriate <tt>M</tt>, and this requires care. Computationally-independent bases, sometimes also called <em>auxiliary generators</em>, or <em>nothing up my sleeve (NUMS) generators</em>, may be computed via hash to the curve (<xref section="3" sectionFormat="of" target="RFC9380"/>).</t>
      </section>
      <section anchor="representation">
        <name>Representation</name>
        <t>The linear relations proven with Sigma Protocols are typically sparse: most entries of <tt>M</tt> are zero. This document handles and serializes them in a sparse, symbolic form rather than as a 2-dimensional vector of group elements.</t>
        <t>A <tt>LinearRelation</tt> is the instance for the Sigma Protocol. It fixes the linear map <tt>M</tt> and the image, that is, the instance <tt>(M, image)</tt> of the relation <tt>R</tt> (<xref target="linear-map"/>). There might be multiple witnesses for the same <tt>(M, image)</tt>, or no valid witness. The word <em>relation</em> is used here in the linear-algebra sense: a system of linear equations among group elements. A <tt>LinearRelation</tt> is held and evaluated by both prover and verifier (<xref target="map-evaluation"/>).</t>
        <artwork><![CDATA[
class LinearRelation:
  elements: list[Group]
    # non-empty; elements[0] is fixed to Group.generator()
  equations: list[Equation]    # non-empty

class Equation:
  image: list[(int, Scalar)]
    # non-empty, (element_index, coeff)
  terms: list[(int, int, Scalar)]
    # non-empty, (scalar_index, element_index, coeff)
]]></artwork>
        <t>A <tt>LinearRelation</tt> holds a set of group elements (each corresponding to an <tt>element_index</tt>) and a list of equations. Each row of <tt>M</tt> is called an <tt>Equation</tt>, and consists of two lists of terms.</t>
        <t>The <tt>image</tt> terms (the left-hand side) are pairs <tt>(element_index, coeff)</tt>. The image is the sum of <tt>coeff * elements[element_index]</tt>.</t>
        <t>The <tt>terms</tt> (the right-hand side) are triplets <tt>(scalar_index, element_index, coeff)</tt>. Each <tt>coeff</tt> is a scalar (<xref target="scalar"/>) fixed by the instance.</t>
        <t>A <tt>LinearRelation</tt> <strong>MUST</strong> have at least one equation, and every equation's <tt>image</tt> and <tt>terms</tt> <strong>MUST</strong> be non-empty. A constant of the statement (an element carrying no witness scalar) is encoded as an image term (<xref target="relation-notation"/>). It <strong>MUST NOT</strong> be encoded as a right-hand side term whose witness scalar is "fixed" to <tt>1</tt>. A coefficient <strong>MAY</strong> be zero.</t>
        <t>The instance <strong>MUST</strong> contain, as individually-indexed elements, every group element on which the statement depends. In particular, all group elements processed by the verifier <strong>MUST</strong> appear in the statement, else the resulting argument is malleable across its preimages (<xref target="sigma-ni-security"/>).</t>
        <t>For instance, the verifiable-decryption statement <tt>M + E1 = x * E0</tt> is encoded with the two image terms <tt>(M, 1), (E1, 1)</tt>, never as the single element <tt>F = M + E1</tt>. Otherwise, the same proof will verify for any <tt>F = M' + E1'</tt>, even when <tt>M' != M</tt>. As another example, a statement multiplying a scalar by a sum of elements, such as <tt>Y = x * (E0 + E1)</tt>, is expressed by repeating the scalar index across terms, as <tt>terms = [(0, 1, 1), (0, 2, 1)]</tt>, never as the single element <tt>K = E0 + E1</tt>. An element may appear multiple times in the same equation, even with the same coefficient and scalar.</t>
        <t>Every group element index <strong>MUST</strong> have an associated group element. Every element <strong>MUST</strong> appear in the terms or image terms of at least one equation, except for the generator (index 0), which is present in every instance whether or not an equation uses it. Every scalar index <strong>MUST</strong> appear in at least one term, else the corresponding response is accepted unchecked.</t>
        <t>For a valid instance, let:</t>
        <artwork><![CDATA[
num_elements(instance)  = len(instance.elements)
num_equations(instance) = len(instance.equations)
num_scalars(instance)   = 1 + max(s for eq in instance.equations
                                    for (s, _, _) in eq.terms)
]]></artwork>
        <t>The number of group elements is independent of the number of equations. For instance, Chaum-Pedersen has <tt>num_elements = 4</tt>, <tt>num_equations = 2</tt>.</t>
      </section>
      <section anchor="map-evaluation">
        <name>Map evaluation</name>
        <t>This document writes <tt>map(instance, scalars)</tt> for the function that evaluates <tt>M</tt> at <tt>scalars</tt>:</t>
        <artwork><![CDATA[
map(instance, scalars) -> list[Group]

1. out = []
2. for equation in instance.equations:
3.   acc = Group.identity()
4.   for (scalar_index, element_index, coeff) in equation.terms:
5.     acc = acc + (coeff * scalars[scalar_index]) \
                   * instance.elements[element_index]
6.   out.append(acc)
7. return out
]]></artwork>
        <t><tt>image(instance)</tt> denotes the evaluation of each equation's left-hand side: the list of <tt>num_equations(instance)</tt> group elements whose <tt>i</tt>-th entry is the sum of <tt>coeff * instance.elements[element_index]</tt> over the image terms of the <tt>i</tt>-th equation.</t>
      </section>
      <section anchor="relation-notation">
        <name>Specifying the relation</name>
        <t>This section defines a symbolic notation in the spirit of <xref target="CamenischS97"/> for declaring scalars, elements, and equations.</t>
        <t anchor="relations-in-other-specs">The notation is a specification convention, not a wire format. Prover and verifier must agree on the compiled <tt>LinearRelation</tt> (<xref target="representation"/>) and its serialization (<xref target="serialize-linear-relations"/>). The notation of this section is the <strong>RECOMMENDED</strong> way to present a relation.</t>
        <t>A linear relation is declared as a US-ASCII block:</t>
        <artwork><![CDATA[
Relation NAME(P[0], ..., P[n-1]):
  Witness: s[0], ..., s[k-1]
  Equations:
    <linear combination> = <linear combination>
    ...
]]></artwork>
        <t>As a first example, the Chaum-Pedersen relation of <xref target="linear-map"/> is:</t>
        <artwork><![CDATA[
Relation ChaumPedersen(H, X, Y):
  Witness: x
  Equations:
    X = x * G
    Y = x * H
]]></artwork>
        <t>The relation parameters are the public values of the statement. A parameter whose name begins with an upper-case letter is a group element, and one whose name begins with a lower-case letter is a public scalar (following <xref target="group-abstraction"/>); the names under <tt>Witness:</tt> are the secret scalars. <tt>G</tt> denotes the group generator at element index <tt>0</tt>, and <strong>MUST NOT</strong> appear among the relation parameters. Every other name used in <tt>Equations:</tt> is declared exactly once, as a parameter or under <tt>Witness:</tt>. A declaration <strong>MUST</strong> compile to a valid instance (<xref target="instance-validation"/>). All elements and witness scalars <strong>MUST</strong> be used (<xref target="representation"/>).</t>
        <t>Each equation is an equality between two linear combinations. Each term is the product of an optional <em>coefficient</em>, an optional witness scalar, and exactly one element name. Every equation <strong>MUST</strong> be linear in the witness. A coefficient is a public constant of the statement evaluated in the scalar field before compilation. An omitted coefficient is <tt>1</tt>, and a leading <tt>-</tt> on a term negates its coefficient. Expressions in parentheses distribute before the term rules apply: <tt>2 * r * (X1 - X2)</tt> denotes <tt>2 * r * X1 - 2 * r * X2</tt>.</t>
        <t>As an example with two witness scalars in a single equation, the Okamoto-Schnorr proof proves knowledge of the opening of a Pedersen commitment <xref target="Pedersen91"/>:</t>
        <artwork><![CDATA[
Relation PedersenOpening(H, C):
  Witness: m, r
  Equations:
    C = m * G + r * H
]]></artwork>
        <t><tt>ChaumPedersen</tt> compiles to <tt>elements = [G, H, X, Y]</tt> and <tt>equations = [Equation(image=[(2, 1)], terms=[(0, 0, 1)]), Equation(image=[(3, 1)], terms=[(0, 1, 1)])]</tt>, while <tt>PedersenOpening</tt> is compiled to a <tt>LinearRelation</tt> with <tt>elements = [G, H, C]</tt> and <tt>equations = [Equation(image=[(2, 1)], terms=[(0, 0, 1), (1, 1, 1)])]</tt>.</t>
        <t>The compiled <tt>LinearRelation</tt> assigns indices in declaration order. Vectors of names (for example, <tt>C_0, ..., C_{n-1}</tt>) and families of equations stated over an index range unroll, in index order, to names and equations of the ordinary form.</t>
        <t>Terms compile to the two lists of <xref target="representation"/>. A term carrying a witness scalar compiles to the right-hand side term (homomorphism) <tt>(scalar_index, element_index, coeff)</tt>; a term without one (a <em>constant term</em>) compiles to the left-hand side term (image) <tt>(element_index, coeff)</tt>, with its coefficient negated when the term is written on the right-hand side. Terms appear in the order written, left-hand side first; equations compile in the order they are written under <tt>Equations:</tt>. Indices attach to names: every occurrence of a name, within or across equations, denotes the same scalar or element index, and every occurrence of a scalar parameter denotes the same public value.</t>
        <t>As an example with a public scalar parameter, below is the relation stating that <tt>C</tt> opens to the <em>public</em> value <tt>m</tt>, that is, <tt>C - m * G = r * H</tt>:</t>
        <artwork><![CDATA[
Relation OpensTo(m, H, C):
  Witness: r
  Equations:
    C = m * G + r * H
]]></artwork>
        <t><tt>m</tt> is now a scalar parameter, so <tt>m * G</tt> is a constant term. The relation compiles to <tt>elements = [G, H, C]</tt> and <tt>equations = [Equation(image=[(2, 1), (0, -m)], terms=[(0, 1, 1)])]</tt>.</t>
        <t>As an example with a constant term crossing sides, correct ElGamal decryption states that the ciphertext <tt>(E0, E1)</tt>, with <tt>E1 = r * X - M</tt>, decrypts to <tt>M</tt> under the decryption key <tt>x</tt> of <tt>X</tt>:</t>
        <artwork><![CDATA[
Relation ElGamalDecryption(X, E0, E1, M):
  Witness: x
  Equations:
    X = x * G
    M = x * E0 - E1
]]></artwork>
        <t>The constant term <tt>- E1</tt> crosses to the image with its coefficient negated: the second equation compiles to <tt>Equation(image=[(4, 1), (3, 1)], terms=[(0, 2, 1)])</tt>, identically to the spelling <tt>M + E1 = x * E0</tt>, and both <tt>M</tt> and <tt>E1</tt> are bound individually by the serialization of <xref target="serialize-linear-relations"/>.</t>
        <t>As yet another example with a distributed scalar, the following proves correct encryption of a public message <tt>M</tt> under the aggregate key <tt>X1 + X2</tt>, as arises in threshold decryption: the ciphertext is <tt>(E0, E1)</tt>, with <tt>E0 = r * G</tt> and <tt>E1 = r * (X1 + X2) - M</tt>:</t>
        <artwork><![CDATA[
Relation AggregateEncryption(X1, X2, M, E0, E1):
  Witness: r
  Equations:
    E0 = r * G
    M + E1 = r * (X1 + X2)
]]></artwork>
        <t>The scalar <tt>r</tt> distributes over the parenthesized sum, so the second equation compiles to <tt>Equation(image=[(3, 1), (5, 1)], terms=[(0, 1, 1), (0, 2, 1)])</tt>.</t>
        <t>As a last example, the following proves that the value committed by <tt>C</tt> is a bit, the building block of range proofs:</t>
        <artwork><![CDATA[
Relation Bit(H, C):
  Witness: b, r, s
  Equations:
    C = b * G + r * H
    C = b * C + s * H
]]></artwork>
        <t><tt>Bit</tt> compiles to <tt>elements = [G, H, C]</tt> and <tt>equations = [Equation(image=[(2, 1)], terms=[(0, 0, 1), (1, 1, 1)]), Equation(image=[(2, 1)], terms=[(0, 2, 1), (2, 1, 1)])]</tt>: the element index <tt>2</tt> (the commitment <tt>C</tt>) appears both in each equation's image and among the bases of the second equation.</t>
        <t>AND composition comes for free for this relation family. To do so, concatenate the parameter lists, <tt>Witness:</tt>, and <tt>Equations:</tt> of each sub-relation. Under concatenation, a name kept in common should denote the same scalar or element in every sub-relation, and is declared exactly once in the combined declaration. Names not intended to be shared <strong>MUST</strong> be renamed apart before concatenating.</t>
      </section>
      <section anchor="instance-validation">
        <name>Instance validation</name>
        <t>For an instance to be valid, it <strong>MUST</strong> satisfy all below conditions:</t>
        <ol spacing="normal" type="1"><li>
            <t>The instance has at least one equation: <tt>num_equations(instance) &gt; 0</tt>.</t>
          </li>
          <li>
            <t>Every equation in <tt>instance.equations</tt> has a non-empty <tt>terms</tt> list and a non-empty <tt>image</tt> list.</t>
          </li>
          <li>
            <t>Every <tt>scalar_index</tt> and every <tt>element_index</tt> is a non-negative integer less than <tt>2^32</tt>; so are <tt>num_equations(instance)</tt>, and each equation's term count and image-term count.</t>
          </li>
          <li>
            <t>Every element index is less than <tt>num_elements(instance)</tt>. In other words, every index references a group element.</t>
          </li>
          <li>
            <t>Every element index other than <tt>0</tt> appears in the terms or image terms of at least one equation; the generator (index <tt>0</tt>) is present in every instance whether or not an equation uses it (<xref target="representation"/>).
Together with check 4, this ensures <tt>num_elements(instance)-1</tt> is the largest referenced element index.</t>
          </li>
          <li>
            <t>Every scalar index appears in the terms of at least one equation.</t>
          </li>
          <li>
            <t><tt>num_elements(instance) &gt; 0</tt>, and <tt>instance.elements[0]</tt> is the group generator <tt>Group.generator()</tt> (<xref target="representation"/>).</t>
          </li>
          <li>
            <t>No element of <tt>instance.elements</tt> is the identity element.</t>
          </li>
          <li>
            <t>No element of <tt>image(instance)</tt> is the identity element: an equation whose image evaluates to the identity is satisfied by the all-zero witness, so a proof of it attests nothing.</t>
          </li>
          <li>
            <t>No column of the matrix <tt>M</tt> is the identity. That is, for every scalar index, there is at least one equation for which the sum of <tt>coeff * elements[element_index]</tt> over the terms carrying that scalar index is not the identity.</t>
          </li>
        </ol>
        <t>The prover <strong>SHOULD</strong> reject an invalid instance, and <strong>MAY</strong> additionally check that <tt>image == map(instance, witness)</tt> before proving; <xref target="privacy-considerations"/> and <xref target="instance-security"/> state when this check, or a stronger precaution, is required. The verifier <strong>MUST</strong> fail on an invalid instance (<xref target="verifier"/>, <xref target="non-interactive"/>), either when the instance is constructed or during verification itself.</t>
        <t><tt>ValidateInstance(instance)</tt> denotes the function returning <tt>true</tt> if all above predicates are met. Instance validation won't flag all violations of <xref target="representation"/> (for instance, a registered element obtained as a precomputed linear combination from one obtained independently) because the instance generation can't know how a group element is obtained. A structurally valid instance may still yield an unsound argument.</t>
      </section>
      <section anchor="serialize-linear-relations">
        <name>Serialization</name>
        <t>A <tt>LinearRelation</tt> is serialized as a sparse matrix encoded in row-major order: each equation's image terms, then its right-hand side terms, each list preceded by its count (<xref target="representation"/>), followed by the group elements at indices <tt>1</tt> onwards. Counts and indices are encoded in 4 bytes via <tt>LE</tt> (<xref target="bytes-and-integers"/>). Coefficients are encoded with the scalar serialization function (<tt>Ns</tt> bytes each, <xref target="ciphersuites"/>). The encoding is unambiguous and prefix-free.</t>
        <artwork><![CDATA[
SerializeLinearRelation(instance)

Input:

- instance, a LinearRelation.

Output:

- a byte string

Procedure:

 1. out = ""
 2. out = out || LE(num_equations(instance), 4)
 3. for i in 0, ..., num_equations(instance) - 1:
 4.   image_terms = instance.equations[i].image
 5.   out = out || LE(len(image_terms), 4)
 6.   for (element_index, coeff) in image_terms:
 7.     out = out || LE(element_index, 4) || Scalar.serialize([coeff])
 8.   terms = instance.equations[i].terms
 9.   out = out || LE(len(terms), 4)
10.   for (scalar_index, element_index, coeff) in terms:
11.     out = out || LE(scalar_index, 4)
12.     out = out || LE(element_index, 4) || Scalar.serialize([coeff])
13. return out || Group.serialize(
      instance.elements[1 : num_elements(instance)])
]]></artwork>
        <t>For example, the compiled <tt>ChaumPedersen</tt> relation of <xref target="relation-notation"/> serializes to</t>
        <artwork><![CDATA[
LE(2, 4)                                        # 2 equations
LE(1, 4) || LE(2, 4) || Scalar.serialize([1])   # image: X
LE(1, 4) || LE(0, 4) || LE(0, 4)
         || Scalar.serialize([1])               # term: x * G
LE(1, 4) || LE(3, 4) || Scalar.serialize([1])   # image: Y
LE(1, 4) || LE(0, 4) || LE(1, 4)
         || Scalar.serialize([1])               # term: x * H
Group.serialize([H, X, Y])                      # statement elements
]]></artwork>
        <t><tt>SerializeLinearRelation</tt> operates on a <tt>LinearRelation</tt> as compiled from its declaration, following its equation and term order (<xref target="relation-notation"/>). The same relation expressed in two different ways (for example, swapping two rows of <tt>M</tt>) will yield different serializations.</t>
      </section>
    </section>
    <section anchor="sigma-protocol-group">
      <name>The Sigma Protocol</name>
      <t>This section specifies the proof of knowledge for the preimage of a linear map (<xref target="linear-relations"/>). These proofs are sometimes also called <em>Maurer proofs</em> <xref target="Maurer09"/> <xref target="Cramer97"/>.</t>
      <section anchor="core-interface">
        <name>Interface</name>
        <t>A Sigma Protocol provides the following interface:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ProverCommitment(instance, witness, rng)</tt>: produces a pair <tt>(commitment, prover_state)</tt> consisting of the <strong>commitment</strong> message, and a private <tt>prover_state</tt>. The prover state <strong>MUST</strong> be used at most once. The random number generator <tt>rng</tt> is defined in <xref target="rng-definition"/>.</t>
          </li>
          <li>
            <t><tt>ProverResponse(prover_state, challenge)</tt> produces the <strong>response</strong>.</t>
          </li>
          <li>
            <t><tt>Verifier(instance, commitment, challenge, response)</tt>, the verification algorithm.</t>
          </li>
        </ul>
        <t>These are the <em>interactive</em> protocol's building blocks. Implementations <strong>MAY</strong> also provide the <strong>zero-knowledge simulator</strong>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>SimulateResponse(instance, rng) -&gt; (response, state)</tt>, which returns a simulated response, and a simulator state.</t>
          </li>
          <li>
            <t><tt>SimulateCommitment(state, response, challenge) -&gt; simulated_commitment</tt>, which returns the <tt>simulated_commitment</tt> such that <tt>Verifier(instance, simulated_commitment, challenge, response)</tt> accepts.</t>
          </li>
        </ul>
        <t>Both are specified concretely for the linear-map Sigma Protocol in <xref target="simulator"/>. The simulator is useful for proof composition (e.g. OR-composition <xref target="CramerDS94"/>) and for compact serialization <xref target="narg-string-compact"/>.</t>
        <t>This interface allows for composition, and <strong>SHOULD NOT</strong> be exposed directly to consumers of the non-interactive argument. In particular, <tt>ProverResponse</tt> <strong>MUST NOT</strong> be invoked with a <tt>challenge</tt> that was not either sent by an honest interactive verifier or derived from the instance and commitment via the Fiat-Shamir transformation (<xref target="non-interactive"/>). Supplying an invalid challenge or an arbitrary prover state will compromise soundness and zero-knowledge.</t>
      </section>
      <section anchor="prover">
        <name>Prover</name>
        <t>The prover of a Sigma Protocol is stateful and will send two messages, described below.</t>
        <section anchor="prover-commitment">
          <name>Prover commitment</name>
          <artwork><![CDATA[
ProverCommitment(instance, witness, rng)

Inputs:

- instance, the LinearRelation being proven
- witness, an array of scalars satisfying the linear relation
- rng, a cryptographically secure random number generator

Outputs:

- A commitment message (a vector of group elements)
- A (private) prover state

Procedure:

1. fail if len(witness) != num_scalars(instance)
2. nonces = [Group.random_scalar(rng)
             for j in 0, ..., num_scalars(instance) - 1]
3. commitment = map(instance, nonces)
4. return (commitment, prover_state := (witness, nonces))
]]></artwork>
          <t>The prover <strong>MAY</strong> produce an output (and not fail) if the witness is not valid for the instance provided. The prover <strong>MUST</strong> fail if the witness length does not match <tt>num_scalars(instance)</tt>: a mismatch cannot yield a valid proof.</t>
        </section>
        <section anchor="prover-response">
          <name>Prover response</name>
          <artwork><![CDATA[
ProverResponse(prover_state, challenge)

Inputs:

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

Output: the response message, an array of scalars

Procedure:

1. witness, nonces = prover_state
2. fail if len(witness) != len(nonces)
3. return [nonces[i] + witness[i] * challenge
           for i in 0, ..., len(nonces) - 1]
]]></artwork>
          <t>The prover <strong>MUST</strong> fail if the lengths of witness and nonces mismatch.</t>
        </section>
      </section>
      <section anchor="verifier">
        <name>Verifier</name>
        <t>The <strong>challenge</strong> is a scalar drawn uniformly at random from the scalar field. Non-interactive Sigma Protocols derive the challenge via the Fiat-Shamir transformation (<xref target="non-interactive"/>).</t>
        <t>The verification equation is as follows:</t>
        <artwork><![CDATA[
Verifier(instance, commitment, challenge, response)

Inputs:

- instance, the LinearRelation being verified
- commitment, the commitment generated by the prover
- challenge, the challenge generated by the verifier
- response, the response generated by the prover

Output: a boolean indicating whether the verification succeeded

Procedure:

1. fail if ValidateInstance(instance) fails
2. fail if len(commitment) != num_equations(instance) or \
           len(response) != num_scalars(instance)
3. expected = map(instance, response)
4. got = [commitment[i] + challenge * image(instance)[i]
          for i in 0, ..., num_equations(instance) - 1]
5. fail if got != expected
]]></artwork>
        <t>The verifier <strong>MUST</strong> enforce instance validity (Step 1, see <xref target="instance-validation"/>), and that the shape of the transcript matches that of the instance.</t>
      </section>
      <section anchor="simulator">
        <name>Simulator</name>
        <t>Implementations that expose the zero-knowledge simulator (<xref target="core-interface"/>) provide the two algorithms below; they are also what the compact verifier (<xref target="non-interactive"/>) relies on to recover the prover's commitment from <tt>(challenge, response)</tt>.</t>
        <t><tt>SimulateResponse(instance, rng)</tt> returns as simulated response a vector of <tt>num_scalars(instance)</tt> uniformly random scalars, and as simulator state the instance itself.</t>
        <t><tt>SimulateCommitment(state, response, challenge)</tt> solves the verification equation (<xref target="verifier"/>) for the commitment, returning the vector of <tt>num_equations(state)</tt> group elements</t>
        <artwork><![CDATA[
simulated_commitment[i] = map(state, response)[i]
                              - challenge * image(state)[i]
]]></artwork>
        <t>Drawing <tt>response</tt> uniformly at random with <tt>SimulateResponse</tt> and then computing <tt>commitment</tt> with <tt>SimulateCommitment</tt> yields a transcript <tt>(commitment, challenge, response)</tt> with the same distribution as an honest one. This is the honest-verifier zero-knowledge property (<xref target="security-considerations"/>).</t>
      </section>
    </section>
    <section anchor="non-interactive">
      <name>Non-interactive Sigma Protocols</name>
      <t>The Fiat-Shamir transformation applied to Sigma Protocols yields a non-interactive zero-knowledge argument of knowledge.</t>
      <t><xref target="fiat-shamir"/> describes how to instantiate the transformation, for the group and field codecs given. This section specifies the session identifier binding a proof to its application (<xref target="sigma-proofs-tag"/>), the challenge derivation shared by prover and verifier (<xref target="challenge-derivation"/>), the two non-interactive argument (NARG) string serializations (<xref target="sigma-narg"/>), and batch verification (<xref target="batch-verification"/>).</t>
      <section anchor="sigma-proofs-tag">
        <name>Tag and session identifier</name>
        <t>The session identifier <tt>session_id</tt> is a 32-byte string. It <strong>SHOULD</strong> be derived from a string <tt>tag</tt> using <tt>DeriveSessionID</tt> of <xref target="fiat-shamir"/>. The prover and verifier initialize their duplex sponge state from it (<xref target="challenge-derivation"/>).</t>
        <t>The <tt>tag</tt> is a byte string following the security requirements on the session identifier in <xref target="fiat-shamir"/>. It <strong>MUST</strong> contain, verbatim, the <em>flavor</em> (<tt>DSFS</tt> for batchable NARG strings, <tt>CMPT</tt> for compact NARG strings), and the ciphersuite identifier (<xref target="ciphersuites"/>). Following the domain-separation conventions of <xref section="3.1" sectionFormat="of" target="RFC9380"/>, an application concatenates its own name, version, and epoch with these two components. As an example, a reasonable choice of <tt>tag</tt> for a fictional application named Foo is:</t>
        <artwork><![CDATA[
FOO-V{xx}-{tttt}-{flavor}-with-{ciphersuiteID}
]]></artwork>
        <t>where <tt>xx</tt> is the two-digit number indicating the version, <tt>tttt</tt> is the four-digit number identifying the epoch, <tt>flavor</tt> is the serialization flavor marker, and <tt>ciphersuiteID</tt> is the ciphersuite identifier of <xref target="ciphersuites"/>. For instance, for batchable NARG strings:</t>
        <artwork><![CDATA[
FOO-V01-0001-DSFS-with-sigma-proofs_Shake128_P256
]]></artwork>
        <t>The corresponding tag for compact NARG strings replaces the flavor marker <tt>DSFS</tt> (duplex sponge Fiat-Shamir) with <tt>CMPT</tt>.</t>
        <t>The prover and the verifier each construct the tag (or session identifier). Neither should accept a session identifier supplied by a third party. An adversary who controls the entire session identifier can cause a proof to be accepted where it was never intended.</t>
      </section>
      <section anchor="challenge-derivation">
        <name>Challenge derivation</name>
        <t>The prover derives the challenge from the tag (<xref target="sigma-proofs-tag"/>), the instance being proven, and the serialized commitment message; the verifier re-derives it from the same values, exactly as the prover does. Both compute <tt>DeriveChallenge</tt>, which outputs the challenge, a scalar:</t>
        <artwork><![CDATA[
DeriveChallenge(tag, instance, commitment_bytes)

Inputs:

- tag, a byte string uniquely identifying the session
- instance, the LinearRelation being proven
- commitment_bytes, the serialized commitment message

Output: the challenge, a scalar

1. session_id = DeriveSessionID(tag)
2. duplex_sponge = DS.Init(session_id)
3. duplex_sponge.Absorb(SerializeLinearRelation(instance))
4. duplex_sponge.Absorb(commitment_bytes)
5. return DecodeField(duplex_sponge.Squeeze(Ns + 16), p, 1)
]]></artwork>
        <t><tt>DS</tt>, <tt>DeriveSessionID</tt>, and <tt>DecodeField</tt> are defined in <xref target="fiat-shamir"/>; <tt>Ns + 16</tt> is the input length <tt>DecodeField</tt> requires over a prime field, and the choices of <tt>DecodeField</tt> for the ciphersuites of this document are discussed in <xref target="ciphersuites"/>. The challenge is drawn from the full scalar field (<xref target="sigma-ni-security"/>).</t>
      </section>
      <section anchor="sigma-narg">
        <name>Non-interactive argument string serialization</name>
        <t>Two serialization flavors are possible:</t>
        <ul spacing="normal">
          <li>
            <t>A <strong>batchable</strong> NARG string serializes the prover messages <tt>(commitment, response)</tt>, as in <xref target="fiat-shamir"/>, and it permits amortized verification costs (<xref target="batch-verification"/>).</t>
          </li>
          <li>
            <t>A <strong>compact</strong> NARG string serializes <tt>(challenge, response)</tt>. It is preferable in the common case, whenever the commitment (<tt>num_equations</tt> group elements) is larger than a single challenge scalar.</t>
          </li>
        </ul>
        <t>A batchable NARG string is a <tt>(Ne * num_equations + Ns * num_scalars)</tt>-byte string, while a compact NARG string is a <tt>(Ns * (num_scalars + 1))</tt>-byte string. A NARG string verifies only under the flavor it was produced for: the flavor marker is a mandatory tag component (<xref target="sigma-proofs-tag"/>). Both flavors have the same soundness guarantees.</t>
        <t>NARG strings are not deterministic, and so applications <strong>MUST NOT</strong> rely on the uniqueness of the NARG string for replay protection or as a nullifier.</t>
      </section>
      <section anchor="narg-string-batchable">
        <name>Batchable NARG strings</name>
        <t>A <strong>batchable</strong> NARG string is the NARG string of <xref target="fiat-shamir"/>, consisting of the concatenation of the serialized prover messages using their respective serialization functions:</t>
        <artwork><![CDATA[
Group.serialize(commitment) || Scalar.serialize(response)
]]></artwork>
        <t><tt>ProveBatchable</tt> and <tt>VerifyBatchable</tt> are the NARG prover and verifier of <xref target="fiat-shamir"/> instantiated with the Sigma Protocol of <xref target="sigma-protocol-group"/>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>ProveBatchable(tag, instance, witness, rng)</tt> computes the commitment message with <tt>ProverCommitment</tt>, derives the challenge as <tt>DeriveChallenge(tag, instance, Group.serialize(commitment))</tt> (<xref target="challenge-derivation"/>), computes the response with <tt>ProverResponse(prover_state, challenge)</tt>, and outputs the NARG string above.</t>
          </li>
          <li>
            <t><tt>VerifyBatchable(tag, instance, narg_string)</tt> checks:
            </t>
            <ol spacing="normal" type="1"><li>
                <t><tt>len(narg_string)</tt> is exactly <tt>Ne * num_equations(instance) + Ns * num_scalars(instance)</tt></t>
              </li>
              <li>
                <t>deserialization succeeds</t>
              </li>
              <li>
                <t><tt>Verifier(instance, commitment, challenge, response)</tt> accepts.</t>
              </li>
            </ol>
          </li>
        </ul>
      </section>
      <section anchor="narg-string-compact">
        <name>Compact NARG strings</name>
        <t>A <strong>compact</strong> NARG string serializes <tt>serialize(challenge) || serialize(response)</tt>. The Sigma Protocol transcript is recovered by invoking the simulator.</t>
        <artwork><![CDATA[
ProveCompact(tag, instance, witness, rng)

Inputs:

- tag, a byte string uniquely identifying the session
- instance, the LinearRelation to be proven
- witness, the prover's secret witness
- rng, a cryptographically secure random number generator

Output: the compact NARG string

Procedure:

1. (commitment, prover_state) = ProverCommitment(instance, witness, rng)
2. commitment_bytes = Group.serialize(commitment)
3. challenge = DeriveChallenge(tag, instance, commitment_bytes)
4. response = ProverResponse(prover_state, challenge)
5. return Scalar.serialize([challenge]) || Scalar.serialize(response)
]]></artwork>
        <t>The verifier recomputes the commitment from the challenge and response via <tt>SimulateCommitment</tt> (<xref target="simulator"/>), then recomputes the challenge from that commitment and accepts only if it matches the one in the NARG string.</t>
        <artwork><![CDATA[
VerifyCompact(tag, instance, narg_string)

Inputs:

- tag, a byte string uniquely identifying the session
- instance, the LinearRelation to be proven
- narg_string, the compact NARG string

Output: a boolean indicating whether the NARG string is valid

Procedure:

1. fail if ValidateInstance(instance) fails
2. Nr = num_scalars(instance) * Ns
3. fail if len(narg_string) != Ns + Nr
4. challenge = Scalar.deserialize(narg_string[0 : Ns])[0]
5. response = Scalar.deserialize(narg_string[Ns : Ns + Nr])
6. commitment = SimulateCommitment(instance, response, challenge)
7. fail if any element of commitment is the identity element
8. expected_challenge = DeriveChallenge(tag, instance,
     Group.serialize(commitment))
9. return challenge == expected_challenge
]]></artwork>
        <t>Step 7 maintains consistency with <tt>Group.deserialize</tt>, which rejects the identity element. Since the simulator always outputs accepting transcripts, there is no need to run <tt>Verifier</tt> in this case.</t>
      </section>
      <section anchor="batch-verification">
        <name>Batch verification</name>
        <t>Verification of multiple batchable NARG strings <strong>MAY</strong> be done more efficiently than verifying each NARG string on its own, via batch verification. Batch verification can be more efficient even in the presence of a single instance, provided the instance has at least a few equations. Batch verification is a local verifier-side optimization, which affects neither the prover nor the NARG string.</t>
        <t>Batch verification is done by re-computing the verifier challenge of each NARG string individually (<xref target="challenge-derivation"/>), and then checking a single random linear combination of the verification equations of the whole batch. See <xref section="8.2" sectionFormat="of" target="RFC8032"/>, <xref target="BDLSY11"/>, and <xref target="BellareGR98"/>.</t>
        <t>The verification equation for <tt>Nt</tt> transcripts <tt>(commitment, challenge, response)</tt> of preimages of linear relations is:</t>
        <artwork><![CDATA[
commitment[i][j] + challenge[i] * image(instances[i])[j]
                 == map(instances[i], response[i])[j]
]]></artwork>
        <t>for each transcript index <tt>i</tt> and each equation index <tt>j</tt>.
Batch verification consists of sampling uniformly random scalars <tt>batching_randomness[i][j]</tt> (for <tt>i = 0, ..., Nt - 1</tt> and <tt>j = 0, ..., num_equations(instances[i]) - 1</tt>) and checking the single equation:</t>
        <artwork><![CDATA[
sum(
  batching_randomness[i][j] * commitment[i][j]
  + batching_randomness[i][j] * challenge[i] * image(instances[i])[j]
  - batching_randomness[i][j] * map(instances[i], response[i])[j]
  for i in 0, ..., Nt - 1
  for j in 0, ..., num_equations(instances[i]) - 1
) == Group.identity()
]]></artwork>
        <t>Similarly to batch verification of Ed25519 signatures <xref target="BDLSY11"/>, a false NARG string will be accepted with probability at most <tt>2^-128</tt>, which is negligible. In general, for <tt>batching_randomness</tt> elements drawn uniformly from a set of <tt>2^t</tt> scalars, a false NARG string will be accepted with probability at most <tt>2^-t</tt>.</t>
        <t>It is <strong>RECOMMENDED</strong> that the batching randomness be generated deterministically, with the duplex sponge of <xref target="fiat-shamir"/> as follows; it <strong>MAY</strong> instead be freshly sampled from a cryptographically secure random number generator. Below, <tt>session_ids[i]</tt> is the 32-byte session identifier of the <tt>i</tt>-th NARG string being verified (<xref target="sigma-proofs-tag"/>).</t>
        <artwork><![CDATA[
 1. batching_sid = DeriveSessionID(
      "irtf-cfrg-sigma-protocols/batch-verify")
 2. duplex_sponge = DS.Init(batching_sid)
 3. for i in 0, ..., Nt - 1:
 4.   duplex_sponge.Absorb(session_ids[i])
 5.   duplex_sponge.Absorb(SerializeLinearRelation(instances[i]))
 6.   duplex_sponge.Absorb(narg_strings[i])
 7. batching_randomness_bytes = duplex_sponge.Squeeze(
      16 * sum(num_equations(instances[i]) for i in 0, ..., Nt - 1))
]]></artwork>
        <t>The session identifier has fixed length, and the length of each NARG string is determined by the respective instance.</t>
        <t>The squeezed output is read in row-major order (for example, the second batching randomness corresponds to the second equation of the first transcript). Each 16-byte chunk is interpreted as a little-endian integer via <tt>LE2IP</tt> (<xref target="bytes-and-integers"/>). The batching randomness elements are uniform in <tt>[0, 2^128)</tt> and are used as scalars without further reduction.</t>
        <artwork><![CDATA[
 8. k = 0
 9. for i in 0, ..., Nt - 1:
10.   for j in 0, ..., num_equations(instances[i]) - 1:
11.     batching_randomness[i][j] =
          LE2IP(batching_randomness_bytes[16*k : 16*(k+1)])
12.     k = k + 1
]]></artwork>
        <t>The batch verifier <strong>MUST</strong> perform instance validation for each instance, and <strong>MUST</strong> compute each of the verifier challenges with <tt>DeriveChallenge</tt> (<xref target="challenge-derivation"/>). Empty batches are accepted as valid; the batch size <strong>MUST</strong> be less than <tt>2^32</tt>. Upon failure, batch verification does not identify the offending NARG string; an application may fall back to verifying the NARG strings individually.</t>
        <t>Batch verification is sound only if the prover(s) cannot choose their messages as a function of the batching randomness. When derived deterministically, the batching randomness <strong>MUST</strong> therefore absorb every value in the batched equation before squeezing. In particular, this includes the response message. Omitting prover messages from the derivation will compromise soundness of batch verification <xref target="SOLANA-ZK"/> <xref target="SOLANA-PHANTOM"/>. When sampled, the batching randomness <strong>MUST</strong> be drawn only after every NARG string in the batch is received, and <strong>MUST NOT</strong> be reused across batches. The batch verification procedure <strong>MUST NOT</strong> reuse the duplex sponge of a NARG verifier.</t>
        <t>The batching randomness elements <strong>MAY</strong> be replaced by the successive powers <tt>1, mu, mu^2, ...</tt> of a single uniformly random scalar <tt>mu</tt>, assigned in row-major order (transcripts, then equations) to the pairs <tt>(i, j)</tt> and computed in the scalar field. In this case, step 7 squeezes 16 bytes instead of <tt>16 * K</tt>, where <tt>K = sum(num_equations(instances[i]) for i in 0, ..., Nt - 1)</tt> is the total number of batched equations, and <tt>mu</tt> is the little-endian integer they encode, read via <tt>LE2IP</tt> (<xref target="bytes-and-integers"/>), uniformly distributed in <tt>[0, 2^128)</tt>. In this case, an invalid batch is accepted with probability at most <tt>(K - 1)/2^128</tt>, rather than the <tt>2^-128</tt> achieved by independent sampling.</t>
      </section>
    </section>
    <section anchor="efficiency-considerations">
      <name>Efficiency Considerations</name>
      <t>Constant arithmetic operations <strong>MAY</strong> be preprocessed, provided the security requirements of <xref target="representation"/> hold: evaluation-time precomputation, such as fixed-base multiplication tables, is safe; registering a precomputed linear combination as a new instance element is not.</t>
      <t>Multi-scalar multiplication (MSM) algorithms can help evaluate <tt>map(instance, scalars)</tt> (<xref target="map-evaluation"/>) and the verification equation. For example, the verifier of <xref target="verifier"/> is specified as the equality <tt>map(instance, response) == commitment + challenge * image(instance)</tt>, evaluated as two separate vectors for clarity. Implementations <strong>MAY</strong> instead verify each equation <tt>i</tt> by checking that <tt>commitment[i] + challenge * image(instance)[i] - sum(response[j] * M[i][j] for j in 0, ..., num_scalars(instance) - 1)</tt> is <tt>identity()</tt>, accumulating all terms in a single MSM per equation. Prioritizing field operations, by evaluating expressions over terms and scalar coefficients, will be faster than computing and summing each term individually.</t>
      <t>The fastest MSM algorithms, such as Pippenger's bucket method or windowed non-adjacent forms, run in time that depends on the scalars. This is safe, for instance, in the verification equation above, for image computation <tt>image(instance)</tt>, and in <tt>SimulateCommitment</tt> (<xref target="simulator"/>): there, every scalar is public.</t>
      <t>The efficiency considerations of <xref target="fiat-shamir"/> apply here too. Implementations that produce or verify many proofs for the same instance can precompute and reuse the duplex sponge state after the instance is absorbed (steps 1-3 of <tt>DeriveChallenge</tt>, <xref target="challenge-derivation"/>) across proofs. <tt>ValidateInstance</tt> (<xref target="instance-validation"/>) likewise depends only on the instance, and can be checked once per instance rather than once per proof.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>A Sigma Protocol run interactively provides the guarantees of <xref target="interactive-security-properties"/>. In practice, however, Sigma Protocols are almost always deployed non-interactively via the Fiat-Shamir transformation (<xref target="non-interactive"/>); <xref target="sigma-ni-security"/> describes how these guarantees carry over and what additional care the non-interactive setting requires. In either setting, every guarantee is relative to the instance: <xref target="instance-security"/> collects the obligations on how prover and verifier construct it and agree on it.</t>
      <section anchor="interactive-security-properties">
        <name>Interactive security properties</name>
        <t>The interactive Sigma Protocol of <xref target="sigma-protocol-group"/> has special soundness <xref target="Cramer97"/> <xref target="Maurer09"/>: two accepting transcripts with the same commitment and distinct challenges yield a witness, so a prover that convinces the verifier must know a witness satisfying the proof statement. Knowledge of a witness is meaningful only when the relation is computationally hard: if witnesses are easy to find, the proof conveys nothing.</t>
        <t>The interactive Sigma Protocol of <xref target="sigma-protocol-group"/> is honest-verifier zero knowledge: the prover messages do not reveal any information beyond what can be directly inferred from the statement itself, so an honest verifier gains no knowledge about the witness <xref target="Cramer97"/>.</t>
        <t>Because interactive Sigma Protocols do not have transferable message authenticity, a third party (neither the prover nor the verifier) cannot be convinced that the prover made the proof. The interaction is thus not transferable as evidence to a third party <xref target="JakobssonSI96"/> <xref target="Pass03"/>.</t>
      </section>
      <section anchor="sigma-ni-security">
        <name>Fiat-Shamir transformation</name>
        <t>The security considerations of <xref target="fiat-shamir"/> apply here as well.</t>
        <t>Soundness holds only if the encoded instance contains the entire statement being proven (<xref target="serialize-linear-relations"/>). Omitting any statement element will compromise knowledge soundness of the resulting non-interactive argument <xref target="CVE-2022-29566"/>. For example, consider the verifiable-decryption statement <tt>M + E1 = x * E0</tt>. If encoded with the single image element <tt>F = M + E1</tt>, then <tt>M</tt> and <tt>E1</tt> never enter the instance encoding function, and the resulting NARG string is malleable across statements: it verifies (unchanged) for every pair <tt>(M', E1')</tt> with <tt>M' + E1' = F</tt>. An attacker can thus present a NARG string generated for one plaintext-ciphertext pair as valid for a different one. Another example: encoding <tt>Y = x * (E0 + E1)</tt> with the single element <tt>K = E0 + E1</tt> as base instead of the two terms <tt>x * E0 + x * E1</tt> verifies unchanged for every pair <tt>(E0', E1')</tt> with <tt>E0' + E1' = K</tt>. <xref target="representation"/> requires the instance to contain, individually, every group element on which the application's acceptance depends; both examples above violate that requirement while remaining structurally valid (<xref target="instance-validation"/>).</t>
        <t>The challenge is drawn uniformly at random from the scalar field (<xref target="verifier"/>), and the non-interactive instantiations of <xref target="non-interactive"/> always derive full-field challenges. Writing <tt>C</tt> for the set the challenge is drawn from, <tt>1/|C| &lt; 2^-250</tt> for the ciphersuites of <xref target="ciphersuites"/>. Compositions of Sigma Protocols (out of scope for this document) <strong>MAY</strong> restrict the challenge to a smaller <em>challenge set</em> <tt>C</tt>.</t>
        <t>Knowledge extraction in the random oracle model requires rewinding the adversary: by the Forking Lemma <xref target="PointchevalS00"/>, an adversary that outputs an accepting proof with probability <tt>epsilon</tt> after <tt>q</tt> hash queries yields a witness with probability about <tt>epsilon^2/q</tt>, a quadratic loss. In the algebraic group model (with a random oracle), extraction is instead straight-line (when, for each row of <tt>M</tt>, finding a non-trivial linear relation among its elements is computationally hard) with total extraction error on the order of <tt>q/|C|</tt> (Section 9 of <xref target="Orru24"/>).</t>
      </section>
      <section anchor="verifier-input-validation">
        <name>NARG string validation</name>
        <t>The security considerations of <xref target="fiat-shamir"/> apply here too.</t>
        <t>In particular, for group elements, deserialization <strong>MUST</strong> verify that each point is valid, lies on the curve, and in the prime-order (sub-)group suited for cryptographic use. Uncompressed or hybrid forms of <xref target="SEC1"/> <strong>MUST</strong> be rejected <xref target="ChalkiasGN20"/>. Skipping the on-curve or subgroup check enables invalid-curve attacks <xref target="JagerSS15"/>. Accepting non-canonical field elements will compromise soundness <xref target="CVE-2022-23806"/>. The identity element <strong>MUST</strong> be rejected in any deserialized prover messages and instance elements (<xref target="group-abstraction"/>).</t>
        <t>For scalars, deserialization <strong>MUST</strong> reject any value that is not the canonical representative in <tt>[0, p)</tt> <xref target="CVE-2023-33252"/> <xref target="CVE-2025-57801"/>.</t>
        <t>For compact NARG strings, the verifier <strong>MUST</strong> recompute the challenge and compare it before accepting.</t>
      </section>
      <section anchor="instance-security">
        <name>Instance security</name>
        <t>The prover and verifier construct the instance from values they independently hold and trust, such as the group generator. Often, one party will supply elements or scalars to the other (<xref target="relation-notation"/>). These are untrusted input, and <strong>MUST</strong> be checked (<xref target="verifier-input-validation"/>). For the verifier, those checks are part of verification. The prover <strong>MUST NOT</strong> produce a proof over an instance without validating well-formedness of all group elements and scalars first.</t>
        <t>Some equations pin down no specific scalars. For example, the equation <tt>X = x * G + 5 * y * G</tt> collapses to <tt>X = (x + 5 * y) * G</tt>, and has <tt>p</tt> distinct witnesses <tt>[x, y]</tt>, each trivial to derive from any other. Similarly, the pair of terms <tt>x * H - x * H</tt> cancels for every value of <tt>x</tt>, and constrains nothing. It is the responsibility of the caller to provide non-trivial relations. Some effort in this direction is made in <xref target="instance-validation"/> (such as rejection of trivial images), however this will not cover all cases. Applications <strong>MUST</strong> handle degenerate equations before calling the prover and verifier.</t>
      </section>
      <section anchor="privacy-considerations">
        <name>Privacy Considerations</name>
        <t>The NARG string discloses nothing beyond the truth of the statement the instance encodes. However, if the instance is chosen by the adversary the privacy guarantee might be vacuous. Untrusted inputs to the instance need to be validated by the caller. Instance validation (<xref target="instance-validation"/>) checks only the structure of the result; a well-formed instance may encode an attacker-chosen linear map.</t>
        <t>The entropy source of <tt>ProverCommitment</tt> <strong>MUST</strong> provide different scalars for every different input. A re-used nonce reveals the witness <xref target="PS3"/>. (This is the extractor: given different challenges <tt>c1 != c2</tt>, the witness is <tt>(s1 - s2) / (c1 - c2)</tt>, where <tt>s1</tt>, <tt>s2</tt> are the corresponding responses).</t>
        <t>The <tt>Verifier</tt> procedure <strong>SHOULD NOT</strong> be used interactively with an untrusted verifier: interactive Sigma Protocols only guarantee zero-knowledge against honest verifiers (<xref target="security-considerations"/>).</t>
        <t>For verification, <tt>VerifyBatchable</tt> and <tt>VerifyCompact</tt> <strong>SHOULD</strong> be used. The non-interactive Fiat-Shamir transformation yields statistically zero-knowledge arguments of knowledge.</t>
        <t>Implementations <strong>SHOULD</strong> securely delete prover state as soon as it is no longer needed (witness and instance), and put in place safeguards to prevent re-use of the prover state. Private witness information should not be part of crash dumps and diagnostic logging.</t>
      </section>
      <section anchor="constant-time">
        <name>Constant-Time Requirements</name>
        <t>The secret values of this document are the witness, the nonces, and the prover state that carries them. The instance and the NARG string are public. All group and field operations whose inputs include secret values <strong>SHOULD</strong> be constant-time in those values, and randomness <strong>SHOULD</strong> be derived with straight-line code, avoiding rejection sampling and other methods whose iteration count depends on the entropy drawn (<xref target="rng-definition"/>). Implementations <strong>MAY</strong> skip multiplications by coefficient <tt>1</tt>, or test instance coefficients for zero in variable time.</t>
        <t>The dominant secret-dependent operation is the multi-scalar multiplication <tt>map(instance, nonces)</tt> in <tt>ProverCommitment</tt>, whose scalars are secret and whose bases are public instance elements: it <strong>SHOULD</strong> be constant-time with respect to the scalars, a guarantee group libraries typically offer as an interface separate from their variable-time MSM. The variable-time algorithms of <xref target="efficiency-considerations"/> leak scalar bits through window sizes and iteration counts, and partial knowledge of the nonces will compromise the witness <xref target="HowgraveGrahamS01"/> <xref target="JancarSSS20"/>.</t>
        <t>In some applications, such as keyed-verification credentials, constant-time implementations are required for the verifier too: there, the instance itself depends on the issuer's secret key. The secret then enters the verification equation through the group elements rather than the scalars, and an MSM that is constant-time only with respect to the scalars is not sufficient: the point arithmetic must not branch on exceptional cases, and the comparison of the two sides of the verification equation must be constant-time.</t>
        <t>The constant-time requirements of <xref target="fiat-shamir"/> apply here, and extend to the encoding of the instance during challenge derivation. Implementations that expose the simulator (<xref target="core-interface"/>) for OR composition should note that which clause is simulated is itself determined by the witness. Real and simulated clauses <strong>SHOULD</strong> follow the same code path, with constant-time selection of the desired transcript.</t>
      </section>
      <section anchor="post-quantum-security-considerations">
        <name>Post-Quantum Considerations</name>
        <t>Sigma Protocols are unconditionally sound and honest-verifier zero-knowledge. What breaks in the post-quantum setting are the statements themselves. They are preimages of linear maps in groups where the discrete logarithm problem is assumed hard, and they are meaningful only while computing discrete logarithms remains infeasible. Therefore, relations of <xref target="linear-map"/> <strong>SHOULD NOT</strong> be used in the presence of quantum adversaries.</t>
        <t>For instance, in the statement <tt>C = m * G + r * H, R = r * G</tt>, the witness <tt>m</tt> is only computationally hidden. The NARG string does not leak the witness. Yet, a quantum adversary may recover <tt>r</tt> from <tt>R</tt> and then <tt>m</tt> from <tt>C - r * H</tt>, with two discrete logarithm computations.</t>
        <t>As another example, the statement <tt>C = m * G + r * H, D = m * G + s * H</tt>, asserting that two commitments open to the same value, is meaningless to a quantum adversary: the commitments bind <tt>m</tt> only computationally, and an adversary that computes the discrete logarithm of <tt>H</tt> to the base <tt>G</tt> can open either of them to any value of its choice.</t>
        <t>The quantum random-oracle model (QROM) <xref target="BDFLSZ11"/>, where the adversary may query the hash function in superposition, is not considered in this document. An analysis of the Fiat-Shamir transformation in the QROM can be found in <xref target="DFMS19"/>.</t>
        <t>Other families of Sigma Protocols, e.g. MPC-in-the-Head <xref target="IKOS07"/>, lattice-based <xref target="AttemaCK21"/>, or code-based <xref target="Stern93"/> approaches, can provide post-quantum guarantees, but are not specified in this document. The generic AND composition with a post-quantum-sound Sigma Protocol does not upgrade security. For example, the binding of a Pedersen commitment fails against a quantum adversary regardless of the strength of the conjunct statement, so the combined statement is meaningful only while <strong>both</strong> underlying problems remain hard. See <xref target="BonehS23"/>.</t>
      </section>
    </section>
    <section anchor="ciphersuites">
      <name>Ciphersuites</name>
      <t>A ciphersuite for the non-interactive Sigma Protocol (<xref target="non-interactive"/>) is composed of the following parameters:</t>
      <ul spacing="normal">
        <li>
          <t>an elliptic curve group, over which the Sigma Protocol of <xref target="sigma-protocol-group"/> is run,</t>
        </li>
        <li>
          <t>a duplex sponge <xref target="fiat-shamir"/>.</t>
        </li>
      </ul>
      <t>The ciphersuites defined by this document, and the identifiers used by the test vectors, are:</t>
      <table anchor="tab-ni-ciphersuites">
        <name>Non-interactive Sigma Protocol ciphersuites</name>
        <thead>
          <tr>
            <th align="left">Identifier</th>
            <th align="left">Group</th>
            <th align="left">Ne</th>
            <th align="left">Ns</th>
            <th align="left">Duplex Sponge</th>
            <th align="left">Security</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>sigma-proofs_Shake128_P256</tt></td>
            <td align="left">P-256 (secp256r1)</td>
            <td align="left">33</td>
            <td align="left">32</td>
            <td align="left">SHAKE128</td>
            <td align="left">128-bit pre-quantum</td>
          </tr>
          <tr>
            <td align="left">
              <tt>sigma-proofs_Shake128_BLS12381</tt></td>
            <td align="left">BLS12-381 (G1)</td>
            <td align="left">48</td>
            <td align="left">32</td>
            <td align="left">SHAKE128</td>
            <td align="left">about 120-bit pre-quantum</td>
          </tr>
        </tbody>
      </table>
      <t>Each row uses the Sigma Protocol of <xref target="sigma-protocol-group"/> over the named group. <tt>Ne</tt> and <tt>Ns</tt> are the element and scalar byte lengths of that group. The ciphersuite identifier fixes the group, the codecs, and the hash instantiation, and is included verbatim in the <tt>tag</tt> (<xref target="sigma-proofs-tag"/>).</t>
      <t>For every ciphersuite in this document, the verifier challenge is derived with <tt>DecodeField(buf, p, 1)</tt> exactly as specified in <xref target="fiat-shamir"/>: the scalar field is prime, and its serialization length <tt>Ns = 32</tt> equals the smallest integer such that <tt>256^Ns &gt;= p</tt>, so provers and verifiers squeeze exactly <tt>Ns + 16 = 48</tt> bytes per challenge (<xref target="challenge-derivation"/>). Note that <tt>DecodeField</tt> interprets the squeezed bytes as a little-endian integer.</t>
      <t>The groups are prime-order elliptic curve groups, defined as follows.</t>
      <section anchor="p-256-secp256r1">
        <name>P-256 (secp256r1)</name>
        <t>This ciphersuite uses P-256 <xref target="NIST-SP-800-186"/> for the Group.</t>
        <section anchor="elliptic-curve-group-of-p-256-secp256r1-nist-sp-800-186">
          <name>Elliptic curve group of P-256 (secp256r1) <xref target="NIST-SP-800-186"/></name>
          <ul spacing="normal">
            <li>
              <t><tt>order()</tt>: <tt>115792089210356248762697446949407573529996955224135760342422259061068512044369</tt>.</t>
            </li>
            <li>
              <t><tt>generator()</tt>: the base point <tt>G</tt> specified in <xref target="NIST-SP-800-186"/>; its compressed serialization is <tt>036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296</tt>. It is the group element at index <tt>0</tt> of every instance (<xref target="representation"/>).</t>
            </li>
            <li>
              <t><tt>serialize([A])</tt>: the compressed Elliptic-Curve-Point-to-Octet-String conversion of <xref target="SEC1"/> (<tt>Ne = 33</tt>).</t>
            </li>
            <li>
              <t><tt>deserialize(buf)</tt>: inverts the conversion above; only the compressed form is a valid encoding (each <tt>Ne</tt>-byte slice begins with <tt>0x02</tt> or <tt>0x03</tt>). It <strong>MUST</strong> perform partial public-key validation as defined in Section 5.6.2.3.4 of <xref target="NIST-SP-800-56A"/> and <strong>MUST</strong> fail otherwise.</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>: the big-endian fixed-length integer encoding <tt>I2OSP</tt> (<xref target="bytes-and-integers"/>) (<tt>Ns = 32</tt>).</t>
            </li>
            <li>
              <t><tt>deserialize(buf)</tt>: <tt>OS2IP</tt> (<xref target="bytes-and-integers"/>); it <strong>MUST</strong> fail unless the result is in <tt>[0, order())</tt>.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="bls12-381-g1">
        <name>BLS12-381 (G1)</name>
        <t>This ciphersuite uses the prime-order subgroup G1 of the BLS12-381 elliptic curve <xref target="RFC9380"/> for the Group.</t>
        <section anchor="elliptic-curve-group-of-bls12-381-g1-rfc9380">
          <name>Elliptic curve group of BLS12-381 (G1) <xref target="RFC9380"/></name>
          <ul spacing="normal">
            <li>
              <t><tt>order()</tt>: <tt>52435875175126190479447740508185965837690552500527637822603658699938581184513</tt>.</t>
            </li>
            <li>
              <t><tt>generator()</tt>: the generator of G1 specified in Section 4.2.1 of <xref target="PAIRING"/>; its compressed serialization is <tt>97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb</tt>. It is the group element at index <tt>0</tt> of every instance (<xref target="representation"/>).</t>
            </li>
            <li>
              <t><tt>serialize([A])</tt>: the compressed G1 serialization of Appendix C of <xref target="PAIRING"/> (<tt>Ne = 48</tt>). The point-at-infinity encoding of that format (<tt>I_bit</tt> set) is neither produced (<xref target="group-abstraction"/>) nor accepted.</t>
            </li>
            <li>
              <t><tt>deserialize(buf)</tt>: inverts the serialization above. It <strong>MUST</strong> perform full point validation and <strong>MUST</strong> reject the point at infinity.</t>
            </li>
          </ul>
        </section>
        <section anchor="scalar-field-of-bls12-381">
          <name>Scalar Field of BLS12-381</name>
          <ul spacing="normal">
            <li>
              <t><tt>serialize(s)</tt>: the big-endian fixed-length integer encoding <tt>I2OSP</tt> (<xref target="bytes-and-integers"/>) (<tt>Ns = 32</tt>).</t>
            </li>
            <li>
              <t><tt>deserialize(buf)</tt>: <tt>OS2IP</tt> (<xref target="bytes-and-integers"/>); it <strong>MUST</strong> fail unless the result is in <tt>[0, order())</tt>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. The ciphersuite identifiers of <xref target="ciphersuites"/> are defined by this document and enter the protocol only as components of the <tt>tag</tt> (<xref target="sigma-proofs-tag"/>); no registry is established.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors thank Jan Bobolz, Vishruti Ganesh, Stephan Krenn, Mary Maller, Ivan Visconti, and Yuwen Zhang for reviewing a previous edition of this specification.</t>
      <t>The authors thank Giap Vu and David Wong (zkSecurity) for their help and contributions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="fiat-shamir">
          <front>
            <title>Fiat-Shamir Transformation</title>
            <author fullname="Michele Orrù" initials="M." surname="Orrù">
              <organization>CNRS</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This document describes how to construct a non-interactive proof via
   the Fiat–Shamir transformation, using a generic procedure that
   compiles an interactive proof into a non-interactive one by relying
   on a stateful duplex sponge object.

   The duplex sponge interface requires two methods: absorb and squeeze,
   which respectively read and write elements of a specified base type.
   The absorb operation incrementally updates the duplex sponge's
   internal state, while the squeeze operation produces variable-length,
   unpredictable outputs.  This interface can be instantiated with
   different constructions based on permutation or compression
   functions.

   This specification also defines codecs to securely map prover
   messages into the duplex sponge domain, from the duplex sponge domain
   into verifier messages.  It also establishes how the non-interactive
   argument string should be serialized.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-fiat-shamir-02"/>
        </reference>
        <reference anchor="NIST-SP-800-186" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf">
          <front>
            <title>Recommendations for Discrete Logarithm-based Cryptography: Elliptic Curve Domain Parameters</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2023"/>
          </front>
          <seriesInfo name="NIST SP" value="800-186"/>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography, Version 2.0</title>
            <author initials="" surname="Standards for Efficient Cryptography Group (SECG)">
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="NIST-SP-800-56A">
          <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>
        <reference anchor="PAIRING">
          <front>
            <title>Pairing-Friendly Curves</title>
            <author fullname="Yumi Sakemi" initials="Y." surname="Sakemi">
              <organization>GMO CONNECT Inc.</organization>
            </author>
            <author fullname="Satoru Kanno" initials="S." surname="Kanno">
              <organization>GMO CONNECT Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
              <organization>Stanford University</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   Pairing-based cryptography, a subfield of elliptic curve
   cryptography, has received attention due to its flexible and
   practical functionality.  Pairings are special maps defined using
   elliptic curves and it can be applied to construct several
   cryptographic protocols such as identity-based encryption, attribute-
   based encryption, and so on.  At CRYPTO 2016, Kim and Barbulescu
   proposed an efficient number field sieve algorithm named exTNFS for
   the discrete logarithm problem in a finite field.  Several types of
   pairing-friendly curves such as Barreto-Naehrig curves are affected
   by the attack.  In particular, a Barreto-Naehrig curve with a 254-bit
   characteristic was adopted by a lot of cryptographic libraries as a
   parameter of 128-bit security, however, it ensures no more than the
   100-bit security level due to the effect of the attack.  In this
   memo, we list the security levels of certain pairing-friendly curves,
   and motivate our choices of curves.  First, we summarize the adoption
   status of pairing-friendly curves in standards, libraries and
   applications, and classify them in the 128-bit, 192-bit, and 256-bit
   security levels.  Then, from the viewpoints of "security" and "widely
   used", we select the recommended pairing-friendly curves considering
   exTNFS.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-pairing-friendly-curves-13"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="FIPS186-5" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf">
          <front>
            <title>Digital Signature Standard (DSS)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2023"/>
          </front>
          <seriesInfo name="FIPS" value="186-5"/>
        </reference>
        <reference anchor="BDFLSZ11" target="https://eprint.iacr.org/2010/428.pdf">
          <front>
            <title>Random Oracles in a Quantum World</title>
            <author fullname="Dan Boneh">
              <organization/>
            </author>
            <author fullname="Özgür Dagdelen">
              <organization/>
            </author>
            <author fullname="Marc Fischlin">
              <organization/>
            </author>
            <author fullname="Anja Lehmann">
              <organization/>
            </author>
            <author fullname="Christian Schaffner">
              <organization/>
            </author>
            <author fullname="Mark Zhandry">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="DFMS19" target="https://eprint.iacr.org/2019/190.pdf">
          <front>
            <title>Security of the Fiat-Shamir Transformation in the Quantum Random-Oracle Model</title>
            <author fullname="Jelle Don">
              <organization/>
            </author>
            <author fullname="Serge Fehr">
              <organization/>
            </author>
            <author fullname="Christian Majenz">
              <organization/>
            </author>
            <author fullname="Christian Schaffner">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="IKOS07" target="https://doi.org/10.1145/1250790.1250794">
          <front>
            <title>Zero-Knowledge from Secure Multiparty Computation</title>
            <author fullname="Yuval Ishai">
              <organization/>
            </author>
            <author fullname="Eyal Kushilevitz">
              <organization/>
            </author>
            <author fullname="Rafail Ostrovsky">
              <organization/>
            </author>
            <author fullname="Amit Sahai">
              <organization/>
            </author>
            <date year="2007"/>
          </front>
        </reference>
        <reference anchor="BellareGR98" target="https://doi.org/10.1007/BFb0054130">
          <front>
            <title>Fast Batch Verification for Modular Exponentiation and Digital Signatures</title>
            <author fullname="Mihir Bellare">
              <organization/>
            </author>
            <author fullname="Juan A. Garay">
              <organization/>
            </author>
            <author fullname="Tal Rabin">
              <organization/>
            </author>
            <date year="1998"/>
          </front>
        </reference>
        <reference anchor="BDLSY11" target="https://doi.org/10.1007/978-3-642-23951-9_9">
          <front>
            <title>High-speed high-security signatures</title>
            <author fullname="Daniel J. Bernstein">
              <organization/>
            </author>
            <author fullname="Niels Duif">
              <organization/>
            </author>
            <author fullname="Tanja Lange">
              <organization/>
            </author>
            <author fullname="Peter Schwabe">
              <organization/>
            </author>
            <author fullname="Bo-Yin Yang">
              <organization/>
            </author>
            <date year="2011"/>
          </front>
        </reference>
        <reference anchor="ChalkiasGN20" target="https://eprint.iacr.org/2020/1244.pdf">
          <front>
            <title>Taming the Many EdDSAs</title>
            <author fullname="Konstantinos Chalkias">
              <organization/>
            </author>
            <author fullname="François Garillot">
              <organization/>
            </author>
            <author fullname="Valeria Nikolaenko">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="AttemaCK21" target="https://doi.org/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 year="2023"/>
          </front>
        </reference>
        <reference anchor="Stern93" target="https://doi.org/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 Damgård">
              <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="Maurer09" target="https://doi.org/10.1007/978-3-642-02384-2_17">
          <front>
            <title>Unifying Zero-Knowledge Proofs of Knowledge</title>
            <author fullname="Ueli M. Maurer">
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="Schnorr91" target="https://doi.org/10.1007/BF00196725">
          <front>
            <title>Efficient Signature Generation by Smart Cards</title>
            <author fullname="Claus-Peter Schnorr">
              <organization/>
            </author>
            <date year="1991"/>
          </front>
        </reference>
        <reference anchor="Pedersen91" target="https://doi.org/10.1007/3-540-46766-1_9">
          <front>
            <title>Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing</title>
            <author fullname="Torben Pryds Pedersen">
              <organization/>
            </author>
            <date year="1991"/>
          </front>
        </reference>
        <reference anchor="ChaumP92" target="https://doi.org/10.1007/3-540-48071-4_7">
          <front>
            <title>Wallet Databases with Observers</title>
            <author fullname="David Chaum">
              <organization/>
            </author>
            <author fullname="Torben Pryds Pedersen">
              <organization/>
            </author>
            <date year="1992"/>
          </front>
        </reference>
        <reference anchor="Okamoto92" target="https://doi.org/10.1007/3-540-48071-4_3">
          <front>
            <title>Provably Secure and Practical Identification Schemes and Corresponding Signature Schemes</title>
            <author fullname="Tatsuaki Okamoto">
              <organization/>
            </author>
            <date year="1992"/>
          </front>
        </reference>
        <reference anchor="CamenischS97" target="https://doi.org/10.1007/BFb0052252">
          <front>
            <title>Efficient Group Signature Schemes for Large Groups</title>
            <author fullname="Jan Camenisch">
              <organization/>
            </author>
            <author fullname="Markus Stadler">
              <organization/>
            </author>
            <date year="1997"/>
          </front>
        </reference>
        <reference anchor="JakobssonSI96" target="https://doi.org/10.1007/3-540-68339-9_13">
          <front>
            <title>Designated Verifier Proofs and Their Applications</title>
            <author fullname="Markus Jakobsson">
              <organization/>
            </author>
            <author fullname="Kazue Sako">
              <organization/>
            </author>
            <author fullname="Russell Impagliazzo">
              <organization/>
            </author>
            <date year="1996"/>
          </front>
        </reference>
        <reference anchor="Pass03" target="https://doi.org/10.1007/978-3-540-45146-4_19">
          <front>
            <title>On Deniability in the Common Reference String and Random Oracle Model</title>
            <author fullname="Rafael Pass">
              <organization/>
            </author>
            <date year="2003"/>
          </front>
        </reference>
        <reference anchor="PointchevalS00" target="https://doi.org/10.1007/s001450010003">
          <front>
            <title>Security Arguments for Digital Signatures and Blind Signatures</title>
            <author fullname="David Pointcheval">
              <organization/>
            </author>
            <author fullname="Jacques Stern">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="Orru24" target="https://eprint.iacr.org/2024/1552">
          <front>
            <title>Revisiting Keyed-Verification Anonymous Credentials</title>
            <author fullname="Michele Orrù">
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="ARC">
          <front>
            <title>Anonymous Rate-Limited Credentials Cryptography</title>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="Wood">
              <organization>Apple, Inc.</organization>
            </author>
            <author fullname="Armando Faz-Hernandez" initials="A. F." surname="Faz-Hernandez">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This document specifies the Anonymous Rate-Limited Credential (ARC)
   protocol, a specialization of keyed-verification anonymous
   credentials with support for rate limiting.  ARC credentials can be
   presented from client to server up to some fixed number of times,
   where each presentation is cryptographically bound to client secrets
   and application-specific public information, such that each
   presentation is unlinkable from the others as well as the original
   credential creation.  ARC is useful in applications where a server
   needs to throttle or rate-limit access from anonymous clients.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-privacypass-arc-crypto-01"/>
        </reference>
        <reference anchor="BBS">
          <front>
            <title>The BBS Signature Scheme</title>
            <author fullname="Tobias Looker" initials="T." surname="Looker">
              <organization>MATTR</organization>
            </author>
            <author fullname="Vasilis Kalos" initials="V." surname="Kalos">
              <organization>MATTR</organization>
            </author>
            <author fullname="Andrew Whitehead" initials="A." surname="Whitehead">
              <organization>Portage</organization>
            </author>
            <author fullname="Mike Lodder" initials="M." surname="Lodder">
              <organization>CryptID</organization>
            </author>
            <date day="8" month="January" year="2026"/>
            <abstract>
              <t>   This document describes the BBS Signature scheme, a secure, multi-
   message digital signature protocol, supporting proving knowledge of a
   signature while selectively disclosing any subset of the signed
   messages.  Concretely, the scheme allows for signing multiple
   messages whilst producing a single, constant size, digital signature.
   Additionally, the possessor of a BBS signatures is able to create
   zero-knowledge, proofs of knowledge of a signature, while selectively
   disclosing subsets of the signed messages.  Being zero-knowledge, the
   BBS proofs do not reveal any information about the undisclosed
   messages or the signature itself, while at the same time,
   guaranteeing the authenticity and integrity of the disclosed
   messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-bbs-signatures-10"/>
        </reference>
        <reference anchor="BBSBlind">
          <front>
            <title>Blind BBS Signatures</title>
            <author fullname="Vasilis Kalos" initials="V." surname="Kalos">
              <organization>MATTR</organization>
            </author>
            <author fullname="Greg M. Bernstein" initials="G. M." surname="Bernstein">
              <organization>Grotto Networking</organization>
            </author>
            <date day="26" month="June" year="2026"/>
            <abstract>
              <t>   This document defines an extension to the BBS Signature scheme that
   supports blind digital signatures, i.e., signatures over messages not
   known to the Signer.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the Crypto Forum Research
   Group mailing list (cfrg@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/cfrg.

   Source for this draft and an issue tracker can be found at
   https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-bbs-blind-signatures-03"/>
        </reference>
        <reference anchor="CVE-2022-23806" target="https://nvd.nist.gov/vuln/detail/CVE-2022-23806">
          <front>
            <title>CVE-2022-23806: crypto/elliptic Curve.IsOnCurve returns true for non-canonical field elements in Go</title>
            <author>
              <organization/>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="CVE-2022-29566" target="https://nvd.nist.gov/vuln/detail/CVE-2022-29566">
          <front>
            <title>CVE-2022-29566: Fiat-Shamir hashing omits public values from the statement and the proof in Bulletproofs (Frozen Heart)</title>
            <author>
              <organization/>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="CVE-2023-33252" target="https://nvd.nist.gov/vuln/detail/CVE-2023-33252">
          <front>
            <title>CVE-2023-33252: snarkjs accepts public signals not reduced modulo the field order</title>
            <author>
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="CVE-2025-57801" target="https://nvd.nist.gov/vuln/detail/CVE-2025-57801">
          <front>
            <title>CVE-2025-57801: gnark in-circuit ECDSA/EdDSA verification accepts out-of-range S (signature malleability)</title>
            <author>
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="SOLANA-ZK" target="https://solana.com/news/post-mortem-may-2-2025">
          <front>
            <title>Post Mortem: ZK ElGamal Proof Program Bug</title>
            <author>
              <organization>Solana Foundation</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="SOLANA-PHANTOM" target="https://blog.zksecurity.xyz/posts/solana-phantom-challenge-bug/">
          <front>
            <title>Uncovering the Phantom Challenge Soundness Bug in Solana's ZK ElGamal Proof Program</title>
            <author fullname="Suneal Gong">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="JagerSS15" target="https://doi.org/10.1007/978-3-319-24174-6_21">
          <front>
            <title>Practical Invalid Curve Attacks on TLS-ECDH</title>
            <author fullname="Tibor Jager">
              <organization/>
            </author>
            <author fullname="Jörg Schwenk">
              <organization/>
            </author>
            <author fullname="Juraj Somorovsky">
              <organization/>
            </author>
            <date year="2015"/>
          </front>
        </reference>
        <reference anchor="HowgraveGrahamS01" target="https://doi.org/10.1023/A:1011214926272">
          <front>
            <title>Lattice Attacks on Digital Signature Schemes</title>
            <author fullname="Nick Howgrave-Graham">
              <organization/>
            </author>
            <author fullname="Nigel P. Smart">
              <organization/>
            </author>
            <date year="2001"/>
          </front>
        </reference>
        <reference anchor="JancarSSS20" target="https://doi.org/10.46586/tches.v2020.i4.281-308">
          <front>
            <title>Minerva: The curse of ECDSA nonces</title>
            <author fullname="Jan Jancar">
              <organization/>
            </author>
            <author fullname="Vladimir Sedlacek">
              <organization/>
            </author>
            <author fullname="Petr Svenda">
              <organization/>
            </author>
            <author fullname="Marek Sys">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="PS3" target="https://fahrplan.events.ccc.de/congress/2010/Fahrplan/attachments/1780_27c3_console_hacking_2010.pdf">
          <front>
            <title>Console Hacking 2010: PS3 Epic Fail</title>
            <author fullname="fail0verflow">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
          <seriesInfo name="In" value="27th Chaos Communication Congress (27C3)"/>
        </reference>
        <reference anchor="RFC9381">
          <front>
            <title>Verifiable Random Functions (VRFs)</title>
            <author fullname="S. Goldberg" initials="S." surname="Goldberg"/>
            <author fullname="L. Reyzin" initials="L." surname="Reyzin"/>
            <author fullname="D. Papadopoulos" initials="D." surname="Papadopoulos"/>
            <author fullname="J. Včelák" initials="J." surname="Včelák"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>A Verifiable Random Function (VRF) is the public key version of a keyed cryptographic hash. Only the holder of the secret key can compute the hash, but anyone with the public key can verify the correctness of the hash. VRFs are useful for preventing enumeration of hash-based data structures. This document specifies VRF constructions based on RSA and elliptic curves that are secure in the cryptographic random oracle model.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9381"/>
          <seriesInfo name="DOI" value="10.17487/RFC9381"/>
        </reference>
        <reference anchor="RFC9497">
          <front>
            <title>Oblivious Pseudorandom Functions (OPRFs) Using Prime-Order Groups</title>
            <author fullname="A. Davidson" initials="A." surname="Davidson"/>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>An Oblivious Pseudorandom Function (OPRF) is a two-party protocol between a client and a server for computing the output of a Pseudorandom Function (PRF). The server provides the PRF private key, and the client provides the PRF input. At the end of the protocol, the client learns the PRF output without learning anything about the PRF private key, and the server learns neither the PRF input nor output. An OPRF can also satisfy a notion of 'verifiability', called a VOPRF. A VOPRF ensures clients can verify that the server used a specific private key during the execution of the protocol. A VOPRF can also be partially oblivious, called a POPRF. A POPRF allows clients and servers to provide public input to the PRF computation. This document specifies an OPRF, VOPRF, and POPRF instantiated within standard prime-order groups, including elliptic curves. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9497"/>
          <seriesInfo name="DOI" value="10.17487/RFC9497"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC8235">
          <front>
            <title>Schnorr Non-interactive Zero-Knowledge Proof</title>
            <author fullname="F. Hao" initials="F." role="editor" surname="Hao"/>
            <date month="September" year="2017"/>
            <abstract>
              <t>This document describes the Schnorr non-interactive zero-knowledge (NIZK) proof, a non-interactive variant of the three-pass Schnorr identification scheme. The Schnorr NIZK proof allows one to prove the knowledge of a discrete logarithm without leaking any information about its value. It can serve as a useful building block for many cryptographic protocols to ensure that participants follow the protocol specification honestly. This document specifies the Schnorr NIZK proof in both the finite field and the elliptic curve settings.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8235"/>
          <seriesInfo name="DOI" value="10.17487/RFC8235"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
    </references>
    <?line 1098?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This appendix contains test vectors for the non-interactive Sigma Protocols specified in this document, one section per ciphersuite (<xref target="tv-p256"/>, <xref target="tv-bls12381"/>). Each ciphersuite section has two subsections: valid proofs, and adversarial vectors. <xref target="seeded-prng"/> pins the randomness used, so that the vectors are reproducible from this document alone.</t>
      <t>The vectors follow the format specified in the Test Vectors appendix of <xref target="fiat-shamir"/>: a block of <tt>Key = Value</tt> lines, no key repeated, values inline or indented under their key, and sequences written one <tt>- </tt> item per line. Every vector carries <tt>Id</tt>, its stable name, and <tt>Function</tt>, which is <tt>SigmaProof</tt> throughout this document. Where <xref target="fiat-shamir"/> identifies the hash suite with <tt>Hash</tt>, these vectors carry <tt>Ciphersuite</tt>, which fixes the group and the hash together (<xref target="ciphersuites"/>). Every vector also carries <tt>Expected</tt>, which is <tt>accept</tt> or <tt>reject</tt>: unlike the functional vectors of <xref target="fiat-shamir"/>, each vector here is a verifier decision.</t>
      <t>The remaining keys are those of the protocol. <tt>Relation</tt> names the relation of <xref target="relation-notation"/> and <tt>Flavor</tt> is <tt>batchable</tt> or <tt>compact</tt>; one vector covers one flavor, so <tt>Tag</tt>, <tt>SessionId</tt> and <tt>NargString</tt> are unambiguous. The <tt>Witness</tt> field, which never appears on the wire, is encoded as the concatenation of <tt>Scalar.serialize</tt> of the witness scalars, in the order given by each relation.</t>
      <t>Every adversarial vector carries <tt>BaseId</tt>, naming the valid vector it is derived from: it re-verifies that transcript under a different tag, statement, or encoding, and a conformant verifier <strong>MUST</strong> reject it while accepting its baseline. Testing only that the adversarial vectors are rejected is therefore not sufficient; an implementation that rejects every input passes no accept/reject pair. The prose accompanying each vector states which check fails; where the rejection step depends on the implementation's check order, any of the stated rejection points is conformant.</t>
      <t>Batch verification (<xref target="batch-verification"/>) can be tested on any subset of these vectors: a batch of valid batchable proofs <strong>MUST</strong> verify, and a batch containing any invalid batchable proof <strong>MUST</strong> be rejected.</t>
      <section anchor="seeded-prng">
        <name>Seeded PRNG</name>
        <t>The randomness for these vectors is drawn from a seeded PRNG, instantiated via a duplex sponge <xref target="fiat-shamir"/> initialized with the session identifier <tt>DeriveSessionID(prng_tag)</tt>.</t>
        <t>The US-ASCII tag:</t>
        <artwork><![CDATA[
TestDRNG-SIGMA-PROOFS-{Ciphersuite}-{Relation}
]]></artwork>
        <t>Yields the scalars that build the instance and witness, in the order given by each relation.</t>
        <t>The tag:</t>
        <artwork><![CDATA[
TestDRNG-SIGMA-PROOFS-DSFS-{Ciphersuite}-{Relation}
]]></artwork>
        <t>Provides the randomness for the prover in the batchable NARG string. That is, it is used to sample <tt>num_scalars(instance)</tt> commitment nonces of the batchable proof.</t>
        <t>Finally, the tag:</t>
        <artwork><![CDATA[
TestDRNG-SIGMA-PROOFS-CMPT-{Ciphersuite}-{Relation}
]]></artwork>
        <t>Provides the randomness for the prover in the compact NARG strings.</t>
        <t>Applications <strong>MUST NOT</strong> use this deterministic pseudorandom generator. The prover's randomness <strong>MUST</strong> be seeded from operating-system entropy (<xref target="scalar"/>).</t>
      </section>
      <section anchor="tv-p256">
        <name>sigma-proofs_Shake128_P256</name>
        <t>This section contains vectors for the ciphersuite identified as <tt>sigma-proofs_Shake128_P256</tt>.</t>
        <section anchor="tv-p256-valid">
          <name>Valid proofs</name>
          <t>Knowledge of a discrete logarithm, <tt>X = x * G</tt>: the Schnorr relation
given as example in <xref target="linear-map"/>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = discrete_logarithm
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  72eeaaf4b2af14a6020b59d9b0501f7263bdbb16a403d93d7af1635546dcc503
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
Witness =
  9b7b9af133b35ea96e662c4662956909fe465084fe929506980e025022d750be
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = accept
]]></artwork>
          <t>Knowledge of a discrete logarithm, <tt>X = x * G</tt>: the Schnorr relation
given as example in <xref target="linear-map"/>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = discrete_logarithm
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  2934314b80877ce535bf39bb9074bc541c98e171b563b74dff82a63a921c6858
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
Witness =
  9b7b9af133b35ea96e662c4662956909fe465084fe929506980e025022d750be
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216c
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
Expected = accept
]]></artwork>
          <t>Discrete-logarithm equality, <tt>X = x * G</tt> and <tt>Y = x * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/dleq/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = dleq
Flavor = batchable
Tag = dleq-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  322adf7cff2aca1c08e9c7053b1d1d75016d22f1903f1b109f0267034645478c
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
Witness =
  b4fbb257ea2f224915a82a630ff348069e2b25bafdcf6255322c9fa0dfb6340a
NargString =
  0203ed31e0d73b821eba236b903f83ddd6e60e59a77249462be32fc43ab4d5dd
  7e038ad4a96b49f6e29ea0afcb6a329632b5e3cdea70137e965515219da19be4
  497655ca705567b987c6f9c5dd5bd866d069dfdcbc415b2036dab9ec63a821d4
  c045
Expected = accept
]]></artwork>
          <t>Discrete-logarithm equality, <tt>X = x * G</tt> and <tt>Y = x * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/dleq/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = dleq
Flavor = compact
Tag = dleq-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  6f3abd4c1daaa824fce769441e9f5c724021ee723174190745be999dbfeca92f
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
Witness =
  b4fbb257ea2f224915a82a630ff348069e2b25bafdcf6255322c9fa0dfb6340a
NargString =
  5351e8969b72d4bdc0f2688ff68c69bb36154dc9074e534d954c8899b6c813b5
  284cb4905860f4b1db7edc4473f5ee2b4ab178c5c2a8cbe57056ac330fc71d37
Expected = accept
]]></artwork>
          <t>Knowledge of the opening of a Pedersen commitment, <tt>C = m * G + r * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/pedersen_commitment/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = pedersen_commitment
Flavor = batchable
Tag = pedersen_commitment-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  6d12e90fc2e3d74d9496ff609cd49f1013c6319da01b7aba5383f6b46789985e
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0206c16fcf4c4017adb8908fb2ec0aba8ea9edd683ae38eac52d59f040956be8
  f803e8372937cb2d0d9d0d48263ecd0a1d4b96207bceb3806739757fcad774f9
  2642
Witness =
  25c9fd63403d0da31081857537ade64b637c80ed2338639148a9938b3562ea06
  afc354c8985ee3cb61b83af2f7a5bb2abeb7d510db5168b6ede21b4910594a2b
NargString =
  03491976f248dcde9ecf9c4536754cb2e81b61be73999efd8e82d061cabf3a49
  439eaa3fd376be7bb7a599b5bd03397d967174f61b27c514e4541a05cfaea37b
  2d05c8c392bcc53462ce9b997cec950c02f6d023537137b3586e2ec277a3c328
  80
Expected = accept
]]></artwork>
          <t>Knowledge of the opening of a Pedersen commitment, <tt>C = m * G + r * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/pedersen_commitment/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = pedersen_commitment
Flavor = compact
Tag = pedersen_commitment-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  4d241bd0f43a3a162d0671aa263a8285f51d22d848d08b0f9e2e747f20b19d89
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0206c16fcf4c4017adb8908fb2ec0aba8ea9edd683ae38eac52d59f040956be8
  f803e8372937cb2d0d9d0d48263ecd0a1d4b96207bceb3806739757fcad774f9
  2642
Witness =
  25c9fd63403d0da31081857537ade64b637c80ed2338639148a9938b3562ea06
  afc354c8985ee3cb61b83af2f7a5bb2abeb7d510db5168b6ede21b4910594a2b
NargString =
  9e11b127fa8984da359687ba95ce5b1bb4e82ea252e0df9562d62e8c60acc013
  ecfcd356f2476e287e3f043f7cf11d1fb3a3dce9a190ce605819d1a05bbd23c5
  5630f834648c294b6f39d23e9f0f507119ecdf8691ee3ac5dcfd4b669bbdf3f7
Expected = accept
]]></artwork>
          <t>Two Pedersen-form equations sharing both witness scalars, <tt>X = x0 * G0 +
x1 * G1</tt> and <tt>Y = x0 * G2 + x1 * G3</tt> (<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/pedersen_commitment_dleq/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = pedersen_commitment_dleq
Flavor = batchable
Tag = pedersen_commitment_dleq-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  688476139ac68ba996cc86d0331830b18fe2b5c8ab87038d4cf622d7c897c1cf
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000006000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000004000000000000000000000000000000
  0000000000000000000000000000000000000001010000000500000000000000
  0000000000000000000000000000000000000000000000000000000102120b29
  125003d5d494503fd47fa4057e761c1cb1632e8965233b8f8dfadd9d2503dc92
  fe87397abd7e0beded9099032d680f46280672afeb1682e46b45e046d5b302a2
  8a33dc8792cb198a9d7942eb1a34909373a5f382e8e68983a54f6fba75875502
  76d70754e0a8f249a41695d5db16f8765d27a46a19dfcd8c1fdc7ac5896f46f5
  03ccdb0adda1a852cac38054215e298b8d4b19823e3a66b9a80e44d063935de4
  09028ef1cfa2468871b4b5116a6709c8df1f722180fc4fc1ad6e5db991660be7
  8915
Witness =
  1242ef15dea6fafe29b8d3e9ba859d0489744d46cc8b52563c445dcd0ee62854
  b80c18e412222e458decdfbecd398b8036df12500008fac1a8f16eecb517bf54
NargString =
  03e2aa1a7e5b705690b8fc4859dc9353a8ca262c6f11016306a9a84664e55f48
  fc0268b6aeff56dbd1517e0721f62a59fe09fa2f523972ad06f3a6ccd75d82f8
  6e95febeaa429522ab5e7bc356178a08cf50442e991f4a70db479f650903104a
  92fa26e56545c5957e6e0ec86adbe6ca1675d8a713f39abeef120c72edeae7bf
  a9ad
Expected = accept
]]></artwork>
          <t>Two Pedersen-form equations sharing both witness scalars, <tt>X = x0 * G0 +
x1 * G1</tt> and <tt>Y = x0 * G2 + x1 * G3</tt> (<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/pedersen_commitment_dleq/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = pedersen_commitment_dleq
Flavor = compact
Tag = pedersen_commitment_dleq-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  ef423a52be5ad7d7d8e499aa870634f5ac3fc424b89fdc96aa72d8c5361e79d1
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000006000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000004000000000000000000000000000000
  0000000000000000000000000000000000000001010000000500000000000000
  0000000000000000000000000000000000000000000000000000000102120b29
  125003d5d494503fd47fa4057e761c1cb1632e8965233b8f8dfadd9d2503dc92
  fe87397abd7e0beded9099032d680f46280672afeb1682e46b45e046d5b302a2
  8a33dc8792cb198a9d7942eb1a34909373a5f382e8e68983a54f6fba75875502
  76d70754e0a8f249a41695d5db16f8765d27a46a19dfcd8c1fdc7ac5896f46f5
  03ccdb0adda1a852cac38054215e298b8d4b19823e3a66b9a80e44d063935de4
  09028ef1cfa2468871b4b5116a6709c8df1f722180fc4fc1ad6e5db991660be7
  8915
Witness =
  1242ef15dea6fafe29b8d3e9ba859d0489744d46cc8b52563c445dcd0ee62854
  b80c18e412222e458decdfbecd398b8036df12500008fac1a8f16eecb517bf54
NargString =
  6cb7a0e88a0aa524c402339e9891851ed483bbe2f2ac4c2cea87999d33bef283
  3c4bfd5c2a8de1abcd9a7134fd13391680dc7c9321b7e517b7bacf3755a6b177
  48c11272f913bb15744d25f97e1f21885a948c952567463f289d6e382866314b
Expected = accept
]]></artwork>
          <t>The blind commitment computation of <xref target="BBSBlind"/>, <tt>C = blind * Q2 +
msg_1 * J1 + msg_2 * J2 + msg_3 * J3</tt>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/bbs_blind_commitment_computation/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = bbs_blind_commitment_computation
Flavor = batchable
Tag =
  bbs_blind_commitment_computation-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  72af721d175eb7b0c975ab01d37b8770077ce6bf9e81779188f59cb51a31bcbc
Instance =
  0100000001000000050000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000003000000000000000000000000000000000000000000000000000000
  0000000000000001030000000400000000000000000000000000000000000000
  000000000000000000000000000000010202eaa274def05ab048396033e7f2d7
  638851a60131af9759a016e3eff592941c02b4f47e54f51d447c160ecf71c456
  a8e0d513d593c07bfaac23a373a4b51ca868034f75a59df8f7f10f97fcd9bdaf
  24a3b0c5ea403167929f4fcab9d4e3f483747c02f86566f754588d585264dac4
  f3650cf8ff53ec716ed21dfd07213058d8fc78020390ef88459ded35acdbe56d
  986dad595f45a8b6f190bbce3ddb5908308f6115b5
Witness =
  af35a44a86ed7403467f49203e8c79501e70f039b113cd1753993f84977d95ac
  13cadbba0e76ff85edd77b7340ba0396e45671dff7229dc424faa180dba435ba
  334d189229fa64202a6182e85d80497f21f250fa467ded4cf8152154af76c241
  0a3c8706d1a6d4623d89b5b9213c59e1163975d6ef7abc8311682ddfe6d7390b
NargString =
  03206f70cc509ce8660cca8caa1f3b403f143c006705fe72daf4cb083be82495
  8499b37f26362a50c596ec4885b97e8deeae5b3da96329e3e715ceee04b9f32b
  026945804d8d0f3594587be911a9809a61bb200b23b30cc94f246f8250be4882
  df8128a391c9deefda6d96daa4c5977f902d137a0b4130e7e2fe3f14f3e0106c
  3052e00a1c9b9607a5d7a502ac0d419fc87b0636289fdabd05824091e07140e0
  1d
Expected = accept
]]></artwork>
          <t>The blind commitment computation of <xref target="BBSBlind"/>, <tt>C = blind * Q2 +
msg_1 * J1 + msg_2 * J2 + msg_3 * J3</tt>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/bbs_blind_commitment_computation/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = bbs_blind_commitment_computation
Flavor = compact
Tag =
  bbs_blind_commitment_computation-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  079c5d8e65618f746d72d2881bbb630155565d95375eb27619581b1e937a697d
Instance =
  0100000001000000050000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000003000000000000000000000000000000000000000000000000000000
  0000000000000001030000000400000000000000000000000000000000000000
  000000000000000000000000000000010202eaa274def05ab048396033e7f2d7
  638851a60131af9759a016e3eff592941c02b4f47e54f51d447c160ecf71c456
  a8e0d513d593c07bfaac23a373a4b51ca868034f75a59df8f7f10f97fcd9bdaf
  24a3b0c5ea403167929f4fcab9d4e3f483747c02f86566f754588d585264dac4
  f3650cf8ff53ec716ed21dfd07213058d8fc78020390ef88459ded35acdbe56d
  986dad595f45a8b6f190bbce3ddb5908308f6115b5
Witness =
  af35a44a86ed7403467f49203e8c79501e70f039b113cd1753993f84977d95ac
  13cadbba0e76ff85edd77b7340ba0396e45671dff7229dc424faa180dba435ba
  334d189229fa64202a6182e85d80497f21f250fa467ded4cf8152154af76c241
  0a3c8706d1a6d4623d89b5b9213c59e1163975d6ef7abc8311682ddfe6d7390b
NargString =
  431c50915e63bb13e4c89556d736cea30703c6235711c62aa3a3fde58e250526
  93c3b5716f935f1052bb9fb97dd5635a7f14b3254ccdeeffc8fad01f2f4fed36
  db0324e47ffdf5218646411ca9ccbcdde13001686a63997ea358f88c956524db
  a190b324f47d021fc6b4373414e99aa68e673eb517e04fb169923418dec5d44b
  fb208ece8117954283043ab111babce94b9d5716ef75f696f8c4492e2def66e7
Expected = accept
]]></artwork>
          <t>Correct ElGamal decryption, <tt>X = x * G</tt> and <tt>M = x * E0 - E1</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/elgamal_decryption/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = elgamal_decryption
Flavor = batchable
Tag = elgamal_decryption-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  b9125fe73ce90119db10799a9669a1ee47f6bc7b1dc7e0e8ab00296df6159657
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0300000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000200000000000000000000000000000000000000
  000000000000000000000000000000010372462b86837aaadb6ec2348fc4a602
  9f7ae77e9aea238017bebbbe469dd299be039f3ab1733887055e7f18884bc8d6
  66d2461925888f366009aeefcaaffd94900e02597c2dd8b7bd7c2c9864efa356
  ed285103582e75c001fbd8400aaf618790fa93036d21e24e585051080212d7ee
  b3884dcb28017e91d50967bcd432bbd9a8cf4986
Witness =
  14375a0f9d92dd6fd4b67cb11de6f81b54c101f6e846cd8817dce6db7b30fb4c
NargString =
  02f2de68f98653dc53ef1832f363b62fd68837f7b5d17080e068e4450ef35bc5
  2f036ae8948f8836f4c38bf16298de1179a4641f6a11e2222457160ff4f8963b
  72868c2b3964e4fc66374f635bb8a497d34592420c5b2ebd653ed30f80fe56bb
  3776
Expected = accept
]]></artwork>
          <t>Correct ElGamal decryption, <tt>X = x * G</tt> and <tt>M = x * E0 - E1</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/elgamal_decryption/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = elgamal_decryption
Flavor = compact
Tag = elgamal_decryption-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  cf4b3a76432ab31da160eb35049dde5afea29635eaadc9a79c59a04771b0908f
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0300000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000200000000000000000000000000000000000000
  000000000000000000000000000000010372462b86837aaadb6ec2348fc4a602
  9f7ae77e9aea238017bebbbe469dd299be039f3ab1733887055e7f18884bc8d6
  66d2461925888f366009aeefcaaffd94900e02597c2dd8b7bd7c2c9864efa356
  ed285103582e75c001fbd8400aaf618790fa93036d21e24e585051080212d7ee
  b3884dcb28017e91d50967bcd432bbd9a8cf4986
Witness =
  14375a0f9d92dd6fd4b67cb11de6f81b54c101f6e846cd8817dce6db7b30fb4c
NargString =
  827f88105d6a14c364c070fcdc5a53f0208b42ec6d8a6e397eea1d24382676bb
  7af67b61c733281b12822892a29da92326df8fd6921802462909ace20d42e632
Expected = accept
]]></artwork>
          <t>The <tt>ChaumPedersen</tt> relation of <xref target="relation-notation"/> again, with <tt>Y = x
* H</tt> derived by the prover from its witness rather than received: the
compiled instance matches <tt>dleq</tt>, and only the tag (hence the proof
bytes) differs.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/dleq_derived_element/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = dleq_derived_element
Flavor = batchable
Tag = dleq_derived_element-DSFS-with-sigma-proofs_Shake128_P256
SessionId =
  c14c1f05e26976121b0842e9a64270893d4d7ca1b24e09c7d6b4147e74e9af0d
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000103f56baee56b8f80b4bae59bb48c615a7b34ab47
  c8f0de3fe6bc23706511a90a0d037100a881faf4f73982c7e3113810c6e56a69
  c42c98562a121c15ad1951c8eafa031def6155fd67b1be8e4fd49c7227e576c1
  abe0886e5d6a928a015f5d8f08e436
Witness =
  45d78f1fff7555932001aa84fb525f9caa8a0949bb8406aaacdd9ce9f06dfdea
NargString =
  029e903a7f21e67b403658a8b55c2097d0b5ec918a10b4ac965dbbddca20d216
  d50374b96946905242651598a20721cce60aaa1a1d84f4f4644ad1abb2ea61eb
  435f785e12da6947bdcaa0b49176170df8a65f54f828e03412df5b31744433be
  5e7c
Expected = accept
]]></artwork>
          <t>The <tt>ChaumPedersen</tt> relation of <xref target="relation-notation"/> again, with <tt>Y = x
* H</tt> derived by the prover from its witness rather than received: the
compiled instance matches <tt>dleq</tt>, and only the tag (hence the proof
bytes) differs.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/dleq_derived_element/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Relation = dleq_derived_element
Flavor = compact
Tag = dleq_derived_element-CMPT-with-sigma-proofs_Shake128_P256
SessionId =
  5ed1c6effe868eaf259136b7702a342c2bd7aee2028e29dcee0364f8cbe88e2d
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000103f56baee56b8f80b4bae59bb48c615a7b34ab47
  c8f0de3fe6bc23706511a90a0d037100a881faf4f73982c7e3113810c6e56a69
  c42c98562a121c15ad1951c8eafa031def6155fd67b1be8e4fd49c7227e576c1
  abe0886e5d6a928a015f5d8f08e436
Witness =
  45d78f1fff7555932001aa84fb525f9caa8a0949bb8406aaacdd9ce9f06dfdea
NargString =
  e8c65a06a08e5573f7b29c56246dc4efe5bd9d834ed12aa32e62a427875b852c
  ffb5e51026648606a6f78a935c334c86c1a930c515e852db06e010f7418e8871
Expected = accept
]]></artwork>
        </section>
        <section anchor="tv-p256-invalid">
          <name>Adversarial vectors</name>
          <t>Deserialization fails on the SEC1 uncompressed prefix 0x04.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/A1
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  047e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Deserialization fails on the SEC1 hybrid prefix 0x06.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/A2
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  067e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Deserialization fails on the SEC1 hybrid prefix 0x07.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/A2b
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  077e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Deserialization fails if the x-coordinate is lifted by the field
characteristic (x = 5, encoded as x + p): the coordinate is
non-canonical.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/A3
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  02ffffffff000000010000000000000000000000010000000000000000000000
  049dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Deserialization fails on 0x00 padded to Ne bytes.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/A4
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0000000000000000000000000000000000000000000000000000000000000000
  009dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Deserialization fails on x = 1, which has no square root for y.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/A6
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0200000000000000000000000000000000000000000000000000000000000000
  019dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Deserialization fails if <tt>response[0]</tt> is set to order + 1.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/B1
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325
  52
Expected = reject
]]></artwork>
          <t>Deserialization fails if <tt>challenge</tt> is set to order + 1.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/B2
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
Expected = reject
]]></artwork>
          <t>Verification fails if one trailing 0x00 byte is appended to a valid
proof.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/C1
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b00
Expected = reject
]]></artwork>
          <t>Verification fails if a valid proof is truncated by one byte.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/C2
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
Expected = reject
]]></artwork>
          <t>Verification fails if one trailing 0x00 byte is appended to a valid
proof.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/C1
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216c
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
  00
Expected = reject
]]></artwork>
          <t>Verification fails if a valid proof is truncated by one byte.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/C2
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216c
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c
Expected = reject
]]></artwork>
          <t>Verification fails on the all-zero compact proof: challenge and response
are zero.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/D1
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
Expected = reject
]]></artwork>
          <t>Instance validation fails if scalar index 1 appears in no equation
(check 6); the proof satisfies the verification equations, so rejection
must come from instance validation.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E1
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  031ac02e1fd7d885b1e5eb1811abd9c4d03eee8eada37d9c1a860ca3c649b8e2
  a302ccab62b6a53592a5bc088188532faa9eee974c21150d6276da6c6d924b6e
  2dc1
NargString =
  033d85fedbddfd463f0392eeea57107720404fbce572e420fe54fba77bad18b4
  b94358208ea29237036630d19ee48191bf7626c37730249a3951083345b19ed4
  e6c2e07d1d92976e9398c5cc356ce644df48ecb1362ccf31d97166a3e40048c7
  76e4555c95e4b42275076c8523f4ee48be8835478f8b0262fce9279e2bcb8c7a
  94
Expected = reject
]]></artwork>
          <t>Instance validation fails on the same instance, here with the
unconstrained <tt>response[1]</tt> perturbed.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E1b
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  031ac02e1fd7d885b1e5eb1811abd9c4d03eee8eada37d9c1a860ca3c649b8e2
  a302ccab62b6a53592a5bc088188532faa9eee974c21150d6276da6c6d924b6e
  2dc1
NargString =
  033d85fedbddfd463f0392eeea57107720404fbce572e420fe54fba77bad18b4
  b94358208ea29237036630d19ee48191bf7626c37730249a3951083345b19ed4
  e6c2e07d1d92976e9398c5cc356ce644df48ecb1362ccf31d97166a3e40048c7
  77e4555c95e4b42275076c8523f4ee48be8835478f8b0262fce9279e2bcb8c7a
  94
Expected = reject
]]></artwork>
          <t>Instance validation fails if the image terms X + (-X) sum to the
identity (check 9).</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E2
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_trivial_equation-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000002000000010000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000101000000000000000000000000000000
  00000000000000000000000000000000000000000000000000000001031db20b
  c00c5012329627c85174b00ade13788636ce3ce3842e0fc1dde4179ca5021db2
  0bc00c5012329627c85174b00ade13788636ce3ce3842e0fc1dde4179ca5
NargString =
  022fb88456a6a7f8d974b129ec99f3745ffd9e3dcbae9771815571d4c4087a12
  088aa155e5f5e22708f62eec3e7425026489340ed065e835229f1a5010637696
  d9
Expected = reject
]]></artwork>
          <t>Instance validation fails if a statement element is the identity (check
8), here at index 1, encoded as stand-in bytes (P-256 has no identity
encoding); parsers may instead reject at group deserialization.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E3
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_identity_element-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0000000000000000000000000000000000000000000000000000000000000000
  0003871d14718441e23004e5c432427775bde2e9244f75550e839d210556bde1
  cad0
NargString =
  02b9d1353c5f3bf39418f2ea4bb8f8ba63cef1e8cc7eb14f51242c31ec17765a
  5fa919d7f15f2e14c494b5e199eaf0b70735118e7ae2b7a278edee4b27a0135f
  fb2cb0ed2a76d9c583db0758976f24bc3eb65764691a2a51779f84acca97e161
  bc
Expected = reject
]]></artwork>
          <t>Instance validation fails if a term references element index 2 while a
single element follows; parsers may instead reject on length.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E4
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_index_out_of_bounds-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000020000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies under the tag it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/F1
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = accept
]]></artwork>
          <t>Verification fails under a different tag.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/F1b
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag =
  discrete_logarithm/wrong-session-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies under the tag it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/F1
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216c
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
Expected = accept
]]></artwork>
          <t>Verification fails under a different tag.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/F1b
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag =
  discrete_logarithm/wrong-session-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216c
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies against the statement it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/F2
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = dleq-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  0203ed31e0d73b821eba236b903f83ddd6e60e59a77249462be32fc43ab4d5dd
  7e038ad4a96b49f6e29ea0afcb6a329632b5e3cdea70137e965515219da19be4
  497655ca705567b987c6f9c5dd5bd866d069dfdcbc415b2036dab9ec63a821d4
  c045
Expected = accept
]]></artwork>
          <t>Verification fails if the statement's two equations are swapped.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/F2b
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = dleq-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000000000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  0203ed31e0d73b821eba236b903f83ddd6e60e59a77249462be32fc43ab4d5dd
  7e038ad4a96b49f6e29ea0afcb6a329632b5e3cdea70137e965515219da19be4
  497655ca705567b987c6f9c5dd5bd866d069dfdcbc415b2036dab9ec63a821d4
  c045
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies against the statement it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/F2
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = dleq-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  5351e8969b72d4bdc0f2688ff68c69bb36154dc9074e534d954c8899b6c813b5
  284cb4905860f4b1db7edc4473f5ee2b4ab178c5c2a8cbe57056ac330fc71d37
Expected = accept
]]></artwork>
          <t>Verification fails if the statement's two equations are swapped.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/F2b
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = dleq-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000000000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  5351e8969b72d4bdc0f2688ff68c69bb36154dc9074e534d954c8899b6c813b5
  284cb4905860f4b1db7edc4473f5ee2b4ab178c5c2a8cbe57056ac330fc71d37
Expected = reject
]]></artwork>
          <t>Verification fails if a statement element is changed after proving.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/F3
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001039db6eb62700691
  c3580fbda8fc7ee33f6cfdd5b43203507c1b0533b15d0d1b7e
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Verification fails if a statement element is changed after proving.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/F3
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001039db6eb62700691
  c3580fbda8fc7ee33f6cfdd5b43203507c1b0533b15d0d1b7e
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216c
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
Expected = reject
]]></artwork>
          <t>Verification fails if the batchable proof's transcript is re-encoded as
a compact NARG string.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/F4
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  e44d6cb80e7b099d06525dbb3567fc05ebfc9b7d3da0624e5cf643163d7a51e3
  9dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e1713b
Expected = reject
]]></artwork>
          <t>Verification fails if the compact proof's transcript is re-encoded as a
batchable NARG string: the challenge derived under the batchable tag
differs.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/F4b
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0221f8d84da0727022bf043b23de7c67590535109a3a6c24f4fba9c8732190c6
  eacfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c
  28
Expected = reject
]]></artwork>
          <t>Verification fails if <tt>response[0]</tt> is increased by 1.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/H1
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  199dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3c
Expected = reject
]]></artwork>
          <t>Verification fails if <tt>commitment[0]</tt> is replaced by a different valid
group element.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/H2
BaseId = sigma-protocols/p256/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2
  969dda433231690cefaaaceb1bf372b37ca060a6a3a87b40dafea0a8d2f5e171
  3b
Expected = reject
]]></artwork>
          <t>Verification fails if <tt>challenge</tt> is replaced by a different scalar.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/compact/H3
BaseId = sigma-protocols/p256/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  3f29987a13e3ea094f2f7ee8f1ccc37ef3239bd303535a9959ca3aacca1f216d
  cfa4f6e2f3a7a88a485fc90cc1eba4019f4d66756cd8b3df83a6a43044ab1c28
Expected = reject
]]></artwork>
        </section>
      </section>
      <section anchor="tv-bls12381">
        <name>sigma-proofs_Shake128_BLS12381</name>
        <t>This section contains vectors for the ciphersuite identified as <tt>sigma-proofs_Shake128_BLS12381</tt>.</t>
        <section anchor="tv-bls12381-valid">
          <name>Valid proofs</name>
          <t>Knowledge of a discrete logarithm, <tt>X = x * G</tt>: the Schnorr relation
given as example in <xref target="linear-map"/>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = discrete_logarithm
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
SessionId =
  b9a184f47a2038072177099bdfe75e6663e86f0cb6790b7b618102b3f3b2d787
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
Witness =
  641c3cdcc72c9b3a84b85df5808de5f37cf4489ca15f1cffdfd105b780ec0682
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = accept
]]></artwork>
          <t>Knowledge of a discrete logarithm, <tt>X = x * G</tt>: the Schnorr relation
given as example in <xref target="linear-map"/>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = discrete_logarithm
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
SessionId =
  8651b5e07aef46852f93102b9e9432370b671d4bd84fbfcfd1e224a06e7ae182
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
Witness =
  641c3cdcc72c9b3a84b85df5808de5f37cf4489ca15f1cffdfd105b780ec0682
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ee
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
Expected = accept
]]></artwork>
          <t>Discrete-logarithm equality, <tt>X = x * G</tt> and <tt>Y = x * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/dleq/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = dleq
Flavor = batchable
Tag = dleq-DSFS-with-sigma-proofs_Shake128_BLS12381
SessionId =
  8a5c790e1a988d7ad14e5eecdfbd2fc1ce87e01e788c38e3c2487f8d8898c9cc
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
Witness =
  4a27c7be9fb7612efe553eb66c7120b978433c35625c00c9c530da6e7214db08
NargString =
  b13432cd2a44f3287e1ee64986f77cfd30bc6e27cb5bb245e5e0d5cd74d7ea59
  d64b17f3e612b0a5790bad93d77ea46291f38f62b25f78dae74200765604f560
  b5b0459b45404eb953e498497a94757841739571c4fa83ba5b27fb2cd9c01c20
  53843da83608b616cb57c042f0d21160317095e5ab1706e02299dfd47f67b453
Expected = accept
]]></artwork>
          <t>Discrete-logarithm equality, <tt>X = x * G</tt> and <tt>Y = x * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/dleq/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = dleq
Flavor = compact
Tag = dleq-CMPT-with-sigma-proofs_Shake128_BLS12381
SessionId =
  244120cf7e64e64f0230270461e2011b7e7a37a4ddd1f10613c5a9ea3d69afb5
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
Witness =
  4a27c7be9fb7612efe553eb66c7120b978433c35625c00c9c530da6e7214db08
NargString =
  6756a6afe70dc8b509ece61173992cd9970d6219332d289fecf58e240f1497ca
  1712fb2963a360c4bc783fa9764bb115b7162e014c5f6c8859fbcd71fbc58844
Expected = accept
]]></artwork>
          <t>Knowledge of the opening of a Pedersen commitment, <tt>C = m * G + r * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/pedersen_commitment/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = pedersen_commitment
Flavor = batchable
Tag = pedersen_commitment-DSFS-with-sigma-proofs_Shake128_BLS12381
SessionId =
  e029c091ebd8fea4edbd7025de04170104768f284ab9693ede56a0a6ffb299fc
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  98a75ce3f191eebaed9f6a49b445f423ac6ba6dd2caad41ff2d5a05db9531f35
  0d9125914ddacd670af9e851d44c05239482122220076c1aa251a964e649aec8
  3af91fb2660b1e1dd1932353a88020c3ef09a805be4d8af09a094eaf2263695f
Witness =
  513794634e24e09f9eb668c0c1f4dfd6857e303b6b8bc5d08bae5a19e3961ed3
  27b79d17769ee1f8c1d774380a3acdb8d70c96f4869fa17fdcaf7a5729804a12
NargString =
  a35cdeff7ecb8c09e2527e98c6da38d23d8f9ac25affe1be3fec9976428f0b83
  7b8b9c62b8726f4ee3522e59a64e6b402e26ba8823477689798c38ba703692f5
  156f5d39febaa33eacf1a0ecbc2973a813e0e02d5c72770b6397cfab9315e5cf
  3c2402516220b2ac1ec139c9bfdc020f
Expected = accept
]]></artwork>
          <t>Knowledge of the opening of a Pedersen commitment, <tt>C = m * G + r * H</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/pedersen_commitment/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = pedersen_commitment
Flavor = compact
Tag = pedersen_commitment-CMPT-with-sigma-proofs_Shake128_BLS12381
SessionId =
  0d54417e1f7bbbb652a9230e7e47701d1654bee35c8ae86235864576c86521a4
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  98a75ce3f191eebaed9f6a49b445f423ac6ba6dd2caad41ff2d5a05db9531f35
  0d9125914ddacd670af9e851d44c05239482122220076c1aa251a964e649aec8
  3af91fb2660b1e1dd1932353a88020c3ef09a805be4d8af09a094eaf2263695f
Witness =
  513794634e24e09f9eb668c0c1f4dfd6857e303b6b8bc5d08bae5a19e3961ed3
  27b79d17769ee1f8c1d774380a3acdb8d70c96f4869fa17fdcaf7a5729804a12
NargString =
  0af9ef56a2968b32d07654a7de630732e9cad9625c51f7b7975cd3056ef71021
  1be5f52ee640769f3fd276008102aa8ee5041f859aa509d2bf8bc35224eb2841
  36a8475ab594387b75de3af7e2ff51464c6b518172604308ede2dac3fc97f9bc
Expected = accept
]]></artwork>
          <t>Two Pedersen-form equations sharing both witness scalars, <tt>X = x0 * G0 +
x1 * G1</tt> and <tt>Y = x0 * G2 + x1 * G3</tt> (<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/pedersen_commitment_dleq/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = pedersen_commitment_dleq
Flavor = batchable
Tag = pedersen_commitment_dleq-DSFS-with-sigma-proofs_Shake128_BLS12381
SessionId =
  ce017f3f5b3462089c1b374cdd47271a0d0d3bae7381eb3435830eeaf9c48879
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000006000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000004000000000000000000000000000000
  0000000000000000000000000000000000000001010000000500000000000000
  0000000000000000000000000000000000000000000000000000000192e906e9
  85c25121c422faf4c618bd1a1b9a31a563997e0300fc79a90752ec3423b0b607
  7a8f1efbf89c4feee7e6f55b85fe8aa4926c2c83d53466c50d7e61f51b071708
  e0886e493aec496695ca47ec167c232c892c4dbfb5ab7f62208af10489f0a331
  1573d65bc23cb94ff627e7e5855348e476b5d6a2b7fa4daa31d77c20f7a6f44b
  059d3fe72dde06ec2b3e29f4973cf3101e95d7c046d2984c5bde86e5ca114357
  ef165d2d15018d420aa35a96c109631357d5c2f61997cb3004b5a0d49785c04c
  35f1feccfe251efff48c5dcedfaffbab72620d295c0fce75698a7d07ae46d5f4
  b2f44602f8cb21af77c53e07b3134ce7555cb8088050c52848913e400eb19141
  6af4356dadc545c7e12333ebe29658ab0c3a01d890f9ff0a250bc926
Witness =
  6633fad945a9da933660070571afb1deb184bb2d24f542bdee864493dcb30027
  05f1a4f40164cbbe8b8a33038ad8458afb6b262c0691f7442b1fb2ad253b60c3
NargString =
  93a9baa8ac481ad40ffb0c046c03cc8d05f698c9cce9f24aa004f86d8f2b1756
  304a4c9e213c36b95628c1e606d2f448b5f0c6903de76e160f034500b499cb05
  ea59240e4e616206e444b2f3842a30a78a50ee8551dda8fb532d07b3f9411895
  1e6c7803723853a5a5b655ec96bf793dbac487d93804573544d9b16a43cf9fa1
  4bc77e8961c638fa11f7eb0a9623f1e665272e2b9140a989b3638b896217e015
Expected = accept
]]></artwork>
          <t>Two Pedersen-form equations sharing both witness scalars, <tt>X = x0 * G0 +
x1 * G1</tt> and <tt>Y = x0 * G2 + x1 * G3</tt> (<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/pedersen_commitment_dleq/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = pedersen_commitment_dleq
Flavor = compact
Tag = pedersen_commitment_dleq-CMPT-with-sigma-proofs_Shake128_BLS12381
SessionId =
  9be697e93cbf8dc535caadba2629113c6c63bb12b6f46a86668e28fb2c9e09ef
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000006000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000004000000000000000000000000000000
  0000000000000000000000000000000000000001010000000500000000000000
  0000000000000000000000000000000000000000000000000000000192e906e9
  85c25121c422faf4c618bd1a1b9a31a563997e0300fc79a90752ec3423b0b607
  7a8f1efbf89c4feee7e6f55b85fe8aa4926c2c83d53466c50d7e61f51b071708
  e0886e493aec496695ca47ec167c232c892c4dbfb5ab7f62208af10489f0a331
  1573d65bc23cb94ff627e7e5855348e476b5d6a2b7fa4daa31d77c20f7a6f44b
  059d3fe72dde06ec2b3e29f4973cf3101e95d7c046d2984c5bde86e5ca114357
  ef165d2d15018d420aa35a96c109631357d5c2f61997cb3004b5a0d49785c04c
  35f1feccfe251efff48c5dcedfaffbab72620d295c0fce75698a7d07ae46d5f4
  b2f44602f8cb21af77c53e07b3134ce7555cb8088050c52848913e400eb19141
  6af4356dadc545c7e12333ebe29658ab0c3a01d890f9ff0a250bc926
Witness =
  6633fad945a9da933660070571afb1deb184bb2d24f542bdee864493dcb30027
  05f1a4f40164cbbe8b8a33038ad8458afb6b262c0691f7442b1fb2ad253b60c3
NargString =
  543dd59971ee254384ae6fef1d36c0dcdbfc1b3ce47ad97d33599e4b6d27f17e
  607cf3588579214c206fbd389eab0e45fd6b72ae79100468e12ed5e7a866c177
  01c611bb833a1518f0588deb29d04dbc3e43f2adfdaa378fda3c0489fbb1c4cf
Expected = accept
]]></artwork>
          <t>The blind commitment computation of <xref target="BBSBlind"/>, <tt>C = blind * Q2 +
msg_1 * J1 + msg_2 * J2 + msg_3 * J3</tt>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/bbs_blind_commitment_computation/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = bbs_blind_commitment_computation
Flavor = batchable
Tag =
  bbs_blind_commitment_computation-DSFS-with-sigma-proofs_Shake128_BLS12
  381
SessionId =
  2a5805ac1b5454c5ee85c1d1dd9edcd417a992a718de963f24b188c962457877
Instance =
  0100000001000000050000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000003000000000000000000000000000000000000000000000000000000
  0000000000000001030000000400000000000000000000000000000000000000
  00000000000000000000000000000001a1d2f5b67fab08902ded92336405309c
  6b37f32b3e435ed7b0213555f58fa1f55394ddf070c7b2c1ffeb9a4e72043ce3
  a6c3922e0802086d57687391066cf25827154b05982bc17b585272d98ba7a3be
  222acb845fef67fc29ae0e9aae085c7ab40ee516a7d08c3a178c5ff6818c598b
  ed05176adcd57e5ef03fca4d7f3db3a457b47529cd2af4a47845b38e0de2df1d
  b2c01bd2aa2ff4b0cbe41e8b04de59ce28d60849621b7409a19d51c7ef83ca68
  f1d6b1f78665c9735477bb4f354880a0a81862f2e43f3c01765ce2104b0f1f22
  8bc890da4a3ae973d7a14a7584af797b9526062591b1735f4bd01396beaad8ea
Witness =
  28288611c102591a64e5d092e2ce83cc10f8d15f094f1342e7d74bd13b85da56
  148a573a14e1c0c340ed3b0505ef72f3e308410156ed657b6690662bf22b73c6
  393c117132d5a600b63968dfd4b03480b89cf5aff74ec52749a6086b50878c62
  1e6ea7c86713a9e429396b2be43a403ed1d435367f157b9c8370e9f223ba479a
NargString =
  977956f7bad0c7473dfffc0fc9c83e6a875dc84944c8d7e6d43e37111f26b4ce
  1e34dc254886cf4560b5ca988c8b4a1116fae4c649c9c45aa1d18b91befafa3e
  c3c5d33d696b08668651de18abcb0f2f146d2ddade6629b540783e11e180b8e4
  9bacef2d6ff14d1ec1c10153b0c277321d2df04da792deb0e7be13e9c754a418
  0b8706446d986ee791f8523a1f5125c8027de941da6d6f6f20de5ef10271cb01
  57408dad73376457ed50efa9fb07f996
Expected = accept
]]></artwork>
          <t>The blind commitment computation of <xref target="BBSBlind"/>, <tt>C = blind * Q2 +
msg_1 * J1 + msg_2 * J2 + msg_3 * J3</tt>.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/bbs_blind_commitment_computation/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = bbs_blind_commitment_computation
Flavor = compact
Tag =
  bbs_blind_commitment_computation-CMPT-with-sigma-proofs_Shake128_BLS12
  381
SessionId =
  d44869a3b7c697750425649f4ff70570a192a6afc76d86f233d1d11c6f88e996
Instance =
  0100000001000000050000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000003000000000000000000000000000000000000000000000000000000
  0000000000000001030000000400000000000000000000000000000000000000
  00000000000000000000000000000001a1d2f5b67fab08902ded92336405309c
  6b37f32b3e435ed7b0213555f58fa1f55394ddf070c7b2c1ffeb9a4e72043ce3
  a6c3922e0802086d57687391066cf25827154b05982bc17b585272d98ba7a3be
  222acb845fef67fc29ae0e9aae085c7ab40ee516a7d08c3a178c5ff6818c598b
  ed05176adcd57e5ef03fca4d7f3db3a457b47529cd2af4a47845b38e0de2df1d
  b2c01bd2aa2ff4b0cbe41e8b04de59ce28d60849621b7409a19d51c7ef83ca68
  f1d6b1f78665c9735477bb4f354880a0a81862f2e43f3c01765ce2104b0f1f22
  8bc890da4a3ae973d7a14a7584af797b9526062591b1735f4bd01396beaad8ea
Witness =
  28288611c102591a64e5d092e2ce83cc10f8d15f094f1342e7d74bd13b85da56
  148a573a14e1c0c340ed3b0505ef72f3e308410156ed657b6690662bf22b73c6
  393c117132d5a600b63968dfd4b03480b89cf5aff74ec52749a6086b50878c62
  1e6ea7c86713a9e429396b2be43a403ed1d435367f157b9c8370e9f223ba479a
NargString =
  3b32ef1ba00ed483b5494e33305df9a260dac8ae87e95eed9de83617de093b71
  4955e5e99e066b6bc828c6ab6f282d38e3f11f5edbdf8857d6ddad0c8788bfb5
  68f2d25c344c5f27226941d199e5a25f129544cccfa5c0e751c9622752d19ac9
  3314321c51a7c2853483e7239b3e567f6785f863ef4a8bf558fbf228e2c0bd4d
  4056b35bfa8f6868d298d50d76c640c67a59fa67c35793b4123c49fa03a88198
Expected = accept
]]></artwork>
          <t>Correct ElGamal decryption, <tt>X = x * G</tt> and <tt>M = x * E0 - E1</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/elgamal_decryption/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = elgamal_decryption
Flavor = batchable
Tag = elgamal_decryption-DSFS-with-sigma-proofs_Shake128_BLS12381
SessionId =
  f3606306ba6a9e7497185a0dd337bee9364dd4b4cd889704fc40ce74412dffeb
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0300000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000200000000000000000000000000000000000000
  00000000000000000000000000000001a73aa2551fd1f24865adb5b9a84f63ef
  b8d2cab44fcf21dfa9e587dcabff2a0ffa36a93a82df2027ec32288160f0ebd3
  835f420c8a573cde22b41e8b427fda9427e9ab5d6bca17cdc4d045c8dd37091a
  a7315f499646c01861faf1a96f863776a002ade8d4092fd89a457856e9b7afd6
  cbe26135981799f75042353f6e9a3eabf205e3788417e21d67741f16b69837c5
  86309903b1709ca1b7aca43326415b5bf7e9eb8f259c631913fc55b3a78021cc
  bdfde509aa8168b3d949ef129247cfd9
Witness =
  6f92d7965b9cb245c7656316af218d42c5625f5234bbbd3eba630c9d6f058a76
NargString =
  abc0eca21b6faea727caf039722661724aa0ffa84df6cff0540292c4b339b2cb
  d8a06d8b64846bd48d9f194be457a14785c969bc6583aea3aa84fb9a1be42b90
  3a9de7be864d9f50f3ab7cf4c1fa4465ac65ee456fb7c652048ba4a0658d3ef8
  03c8f8cba745239dc02dac475278009f48a4c3b4e8c77b698d7403396b684f5d
Expected = accept
]]></artwork>
          <t>Correct ElGamal decryption, <tt>X = x * G</tt> and <tt>M = x * E0 - E1</tt>
(<xref target="relation-notation"/>).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/elgamal_decryption/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = elgamal_decryption
Flavor = compact
Tag = elgamal_decryption-CMPT-with-sigma-proofs_Shake128_BLS12381
SessionId =
  7e4a5e42b1686205633d27701ae29f682fb2c748e21c0a8a87d021486652c899
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0300000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000200000000000000000000000000000000000000
  00000000000000000000000000000001a73aa2551fd1f24865adb5b9a84f63ef
  b8d2cab44fcf21dfa9e587dcabff2a0ffa36a93a82df2027ec32288160f0ebd3
  835f420c8a573cde22b41e8b427fda9427e9ab5d6bca17cdc4d045c8dd37091a
  a7315f499646c01861faf1a96f863776a002ade8d4092fd89a457856e9b7afd6
  cbe26135981799f75042353f6e9a3eabf205e3788417e21d67741f16b69837c5
  86309903b1709ca1b7aca43326415b5bf7e9eb8f259c631913fc55b3a78021cc
  bdfde509aa8168b3d949ef129247cfd9
Witness =
  6f92d7965b9cb245c7656316af218d42c5625f5234bbbd3eba630c9d6f058a76
NargString =
  69a11eea4a1ee7d995219a7b0f5df7bf18ee156b4b4e66b95147b090c07cb8cb
  26816cc9aac1a2b14e5adbebbf973a42e2826591392787fddca9e13b8443b904
Expected = accept
]]></artwork>
          <t>The <tt>ChaumPedersen</tt> relation of <xref target="relation-notation"/> again, with <tt>Y = x
* H</tt> derived by the prover from its witness rather than received: the
compiled instance matches <tt>dleq</tt>, and only the tag (hence the proof
bytes) differs.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/dleq_derived_element/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = dleq_derived_element
Flavor = batchable
Tag = dleq_derived_element-DSFS-with-sigma-proofs_Shake128_BLS12381
SessionId =
  54bbba96ccae65df6e806d77e8869cd48afdbc785038d6f90fa905a14f7d53bf
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000199dab5463df27b0f83b0608d830294a57f53d279
  fd3c5b719bd25ca5bb9a25a57787f6c92bb933ccaa421588ee4554ff8673f08e
  10bee9fe8e7eb4f6a1ef0b60571e84c26710a2d4b0bacf0a49033dc814b2c0c9
  3d1e83025f0d9fde75835ac4b1aa95d5868f12734c8183e2222f3c321bd19403
  802e635dd2c12731e366be9e5e37af51c283afb582fa8a153f494b1c
Witness =
  48775faa1051b0df070268dee5c4163b9635ebecb049f9016f3538423a7d227c
NargString =
  abc30c203650564c3318f34ca0a4140728631799358f1004bff7708e2e0e1c80
  e5d3550cf546bd78734f35c50a0ef599b3f2f83ece52e1d93bdaff1f9344b03f
  c5b0f324f0a397f4ba8d10d7bb954e9ae884eaa07dd11d942f925f14ebdd3e29
  1b5757ca9c1cf7f34a3fe51c5803c9996f9ae0092d24059aecaf12352268d1d6
Expected = accept
]]></artwork>
          <t>The <tt>ChaumPedersen</tt> relation of <xref target="relation-notation"/> again, with <tt>Y = x
* H</tt> derived by the prover from its witness rather than received: the
compiled instance matches <tt>dleq</tt>, and only the tag (hence the proof
bytes) differs.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/dleq_derived_element/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Relation = dleq_derived_element
Flavor = compact
Tag = dleq_derived_element-CMPT-with-sigma-proofs_Shake128_BLS12381
SessionId =
  f284a4d31c70b703930a48a8f420606f8997f3b52ce41458ed8c827257f01a08
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  00000000000000000000000199dab5463df27b0f83b0608d830294a57f53d279
  fd3c5b719bd25ca5bb9a25a57787f6c92bb933ccaa421588ee4554ff8673f08e
  10bee9fe8e7eb4f6a1ef0b60571e84c26710a2d4b0bacf0a49033dc814b2c0c9
  3d1e83025f0d9fde75835ac4b1aa95d5868f12734c8183e2222f3c321bd19403
  802e635dd2c12731e366be9e5e37af51c283afb582fa8a153f494b1c
Witness =
  48775faa1051b0df070268dee5c4163b9635ebecb049f9016f3538423a7d227c
NargString =
  57a809847f916a14f39d848a26d1f17fb0158b2b88aaa3263d44750e10a27583
  5f9a4abeedd6c411defe5803910725b117fd1eee92ea9b38ae576fb83177f457
Expected = accept
]]></artwork>
        </section>
        <section anchor="tv-bls12381-invalid">
          <name>Adversarial vectors</name>
          <t>Deserialization fails if the compression bit is cleared.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/A1
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  221df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Deserialization fails if the x-coordinate is lifted by the field
characteristic (x = 4, encoded as x + p).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/A3
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f624
  1eabfffeb153ffffb9feffffffffaaaf56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Deserialization fails on the canonical compressed encoding of the point
at infinity: the identity is invalid in prover messages.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/A4
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  c000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000056b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Deserialization fails on a point (x = 0) on the curve but outside the
prime-order subgroup G1.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/A5
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  8000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000056b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Deserialization fails on x = 1, which is not on the curve (x^3 + 4 is a
non-residue).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/A6
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  8000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000156b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Deserialization fails if <tt>response[0]</tt> is re-encoded as s + order: same
value mod p, non-canonical bytes. Reducing instead of rejecting yields
malleability.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/B1
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcbcaa396b96915e9ea45449ee848e72694
  09cdf63ba2b25a8150042aeb5bd1b642
Expected = reject
]]></artwork>
          <t>Deserialization fails if <tt>challenge</tt> is re-encoded as c + order
(non-canonical bytes).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/B2
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  9f1898e7e0ed7c8d60adde165af00ea993091808bff2c380a78f42bb7696c7ef
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
Expected = reject
]]></artwork>
          <t>Verification fails if one trailing 0x00 byte is appended to a valid
proof.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/C1
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b64100
Expected = reject
]]></artwork>
          <t>Verification fails if a valid proof is truncated by one byte.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/C2
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b6
Expected = reject
]]></artwork>
          <t>Verification fails if one trailing 0x00 byte is appended to a valid
proof.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/C1
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ee
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
  00
Expected = reject
]]></artwork>
          <t>Verification fails if a valid proof is truncated by one byte.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/C2
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ee
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad
Expected = reject
]]></artwork>
          <t>Verification fails on the all-zero compact proof: challenge and response
are zero.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/D1
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
Expected = reject
]]></artwork>
          <t>Instance validation fails if scalar index 1 appears in no equation
(check 6); the proof satisfies the verification equations, so rejection
must come from instance validation.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E1
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag =
  instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  a52f63244810b5e28b235f33df487fce15bc509eac539e19275e1a0c1ae36de1
  79fa412292007a1d6df975de5b8ca0a6a62b428f90a014557c5744b69c6303d0
  db7a9c876dd15743738b432a9dd1cfad79790d101eedee3bb441bccd262db1c0
NargString =
  8a31aa9ace6268707d6a0213fdf4bd9a4231fc4fec35338998a38b5334723d84
  f3c46d55c6ff9104aba7bde3e38b46cd3b5d6d79ba363cb1f75f304c0af27b3c
  717d6c2048126fb60147c58ce188a5bc0c18c708366e5b159dc527ef76ac46f5
  fb5f58bd1acdc8a9e425c7f99d7f4b4a45a360ed659e5b5db089c8f07cf725b1
  4d7aaf71cb6a55bc1e41ac4fb4ab03b2
Expected = reject
]]></artwork>
          <t>Instance validation fails on the same instance, here with the
unconstrained <tt>response[1]</tt> perturbed.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E1b
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag =
  instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010200000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  a52f63244810b5e28b235f33df487fce15bc509eac539e19275e1a0c1ae36de1
  79fa412292007a1d6df975de5b8ca0a6a62b428f90a014557c5744b69c6303d0
  db7a9c876dd15743738b432a9dd1cfad79790d101eedee3bb441bccd262db1c0
NargString =
  8a31aa9ace6268707d6a0213fdf4bd9a4231fc4fec35338998a38b5334723d84
  f3c46d55c6ff9104aba7bde3e38b46cd3b5d6d79ba363cb1f75f304c0af27b3c
  717d6c2048126fb60147c58ce188a5bc0c18c708366e5b159dc527ef76ac46f5
  fb5f58bd1acdc8a9e425c7f99d7f4b4b45a360ed659e5b5db089c8f07cf725b1
  4d7aaf71cb6a55bc1e41ac4fb4ab03b2
Expected = reject
]]></artwork>
          <t>Instance validation fails if the image terms X + (-X) sum to the
identity (check 9).</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E2
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = instance_trivial_equation-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000002000000010000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000101000000000000000000000000000000
  00000000000000000000000000000000000000000000000000000001b8d20484
  960f1741eabb4d0dd0c43e72931d646c09440bf1880a1720daaa3308e7634661
  77aa88c313f8a9ad1e406c0e98d20484960f1741eabb4d0dd0c43e72931d646c
  09440bf1880a1720daaa3308e763466177aa88c313f8a9ad1e406c0e
NargString =
  8bf4a4e7cca2a2f88859d0b012289500a49db0b5e4e5df3d778248435ed8b51d
  0fb3ca489c9f45e8811bb4cc8d0096f96ad6f36b97912382f39758d4e9f591a8
  c1d24c1f3d42a2535161c7b7a9c556a3
Expected = reject
]]></artwork>
          <t>Instance validation fails if a statement element is the identity (check
8), here at index 1, encoded as the canonical compressed encoding of
infinity; parsers may instead reject at group deserialization.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E3
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = instance_identity_element-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  c000000000000000000000000000000000000000000000000000000000000000
  00000000000000000000000000000000b8722b4b2a3cc66976d848739df2bfb6
  6ae371da496a1e239add4646c35c8b8758409ad4b6312b74d4a98bb83284cb87
NargString =
  adc1c8943d8bfa5ab165ff1ed2c0f45f71567a404849da3e0b9fbd37266681c1
  089d6d9b33116aebdab2972d0cb6db1343a4376149f6584e69ef48dac314f448
  ec00ac5b96fa50ce5a369327bb6649775a460213642cf7055af8c4bb0bcbc6b6
  122f563a9163c3d3f74876f8b25b0298
Expected = reject
]]></artwork>
          <t>Instance validation fails if a term references element index 2 while a
single element follows; parsers may instead reject on length.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E4
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag =
  instance_index_out_of_bounds-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000020000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies under the tag it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/F1
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = accept
]]></artwork>
          <t>Verification fails under a different tag.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/F1b
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag =
  discrete_logarithm/wrong-session-DSFS-with-sigma-proofs_Shake128_BLS12
  381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies under the tag it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/F1
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ee
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
Expected = accept
]]></artwork>
          <t>Verification fails under a different tag.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/F1b
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag =
  discrete_logarithm/wrong-session-CMPT-with-sigma-proofs_Shake128_BLS12
  381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ee
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies against the statement it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/F2
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = dleq-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  b13432cd2a44f3287e1ee64986f77cfd30bc6e27cb5bb245e5e0d5cd74d7ea59
  d64b17f3e612b0a5790bad93d77ea46291f38f62b25f78dae74200765604f560
  b5b0459b45404eb953e498497a94757841739571c4fa83ba5b27fb2cd9c01c20
  53843da83608b616cb57c042f0d21160317095e5ab1706e02299dfd47f67b453
Expected = accept
]]></artwork>
          <t>Verification fails if the statement's two equations are swapped.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/F2b
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = dleq-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000000000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  b13432cd2a44f3287e1ee64986f77cfd30bc6e27cb5bb245e5e0d5cd74d7ea59
  d64b17f3e612b0a5790bad93d77ea46291f38f62b25f78dae74200765604f560
  b5b0459b45404eb953e498497a94757841739571c4fa83ba5b27fb2cd9c01c20
  53843da83608b616cb57c042f0d21160317095e5ab1706e02299dfd47f67b453
Expected = reject
]]></artwork>
          <t>A valid NARG string verifies against the statement it was produced for.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/F2
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = dleq-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0200000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000020000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  6756a6afe70dc8b509ece61173992cd9970d6219332d289fecf58e240f1497ca
  1712fb2963a360c4bc783fa9764bb115b7162e014c5f6c8859fbcd71fbc58844
Expected = accept
]]></artwork>
          <t>Verification fails if the statement's two equations are swapped.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/F2b
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = dleq-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0200000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000001000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000000000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  6756a6afe70dc8b509ece61173992cd9970d6219332d289fecf58e240f1497ca
  1712fb2963a360c4bc783fa9764bb115b7162e014c5f6c8859fbcd71fbc58844
Expected = reject
]]></artwork>
          <t>Verification fails if a statement element is changed after proving.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/F3
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001b94ba65546846b43
  9edbfc9da84c1c2d2af3d0ede8c88ec50fce2e1c3f782e932205982683f0802a
  4dce313610bbb2db
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Verification fails if a statement element is changed after proving.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/F3
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001b94ba65546846b43
  9edbfc9da84c1c2d2af3d0ede8c88ec50fce2e1c3f782e932205982683f0802a
  4dce313610bbb2db
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ee
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
Expected = reject
]]></artwork>
          <t>Verification fails if the batchable proof's transcript is re-encoded as
a compact NARG string.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/F4
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  0bfd67330803e2f88ba4d8f54723e95c53a032c2aa976b0f7e54099ec42d461c
  56b5ef663f786ca2120ac6e03f454e8eb6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Verification fails if the compact proof's transcript is re-encoded as a
batchable NARG string: the challenge derived under the batchable tag
differs.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/F4b
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  b87d072b8238866651b08da8276e9ea30125617a5ac1b7fcb6934f43bdfed513
  4624ffe8040caccc46560bd101c648885bc2ffa13e32b693d76be6e548a3d6c3
  9929b9d21f10e5ba1df2b44071f7ad94
Expected = reject
]]></artwork>
          <t>Verification fails if <tt>response[0]</tt> is increased by 1.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/H1
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b642
Expected = reject
]]></artwork>
          <t>Verification fails if <tt>commitment[0]</tt> is replaced by a different valid
group element.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/H2
BaseId = sigma-protocols/bls12381/discrete_logarithm/batchable
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = discrete_logarithm-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac58
  6c55e83ff97a1aeffb3af00adb22c6bb56b5ef663f786ca2120ac6e03f454e8e
  b6105238a2b3fe8250042aec5bd1b641
Expected = reject
]]></artwork>
          <t>Verification fails if <tt>challenge</tt> is replaced by a different scalar.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/compact/H3
BaseId = sigma-protocols/bls12381/discrete_logarithm/compact
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = compact
Tag = discrete_logarithm-CMPT-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000010000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000000000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b2af194b74fff452d74060e514e36a43f4b7405bff46781a78f42bc7696c7ef
  5bc2ffa13e32b693d76be6e548a3d6c39929b9d21f10e5ba1df2b44071f7ad94
Expected = reject
]]></artwork>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
REeIuMEi0hKKTW27UvqW6xG/Mso11QaiFc3xvL0VK6+118fgZJO4X3DWS2Z6
mVyJ63b4ub5STfnwyQorxVXRPhcpsBLRjOAIpprbze5UPaI20dUK48bGH8a2
aTIrdMrwJ3T730k7rM3VHLffX8IPvnOuVXAuXNAOKt2d7MNXKZgCA9Ou7GPH
LQOqHrlu+ZfNOyQk40/tXx8fqbQkyWlaRdVqH233SueuW1j2ZvWHajXbVkEM
ndajW1rH9jix0xybTZednCxQnKh2F52GKsq4pzUf9/QrWk0tW90HAdYGLLc2
go8boPAWm4bfNMwX9FGP7XIi3flJdz5k61PdiUMzWqbUXdO8AhRaNyKAdVZI
biutkdaNPYr4qHBFbaLVGpr6dCMA795lnFnwB9KAp9kdXXUw+IPX0/vpewoj
dJmIbicn9Lgy85qHGRnMjPzy0J7UQlV1HM3bVod+WIMZ/53Tr89dBuVrdz5p
N6ToOMeud/Y1UVf9kXUDOLfRMnqisUX08trwmyajdrfFN7X5UeAxjQQMvLgm
GtvHq8tf8OocK8bADQxfvBrc0Eidk39KTpkB1GoZA2DCgyGnOs4O1DPEooi5
Ni0U6Rai2ozkdEff7ekEUqN0u0rQrUU1WIyVCaK0nAeNRdkuI2wRcLxTVVms
L8tzbfiA3DQHp5q9Xgn2/SjXBHlSsY7NtLazl2FcIpRqD5xMC1vH3FZd4XVY
STdxty/npPb85sJvFC+77pKht9he6BK7xuPSXKvBoQlRJQUMV1277JOEKh4H
LK+o5Y1N4VnqMCQdtxeJwd1LbZyrC2giAFtGgl3fQ9C3mqBTOES13nvZ7vbK
KuunSidlH9YtAxHB6ypETlMveNaMQhCrxLXVjErHbnTJRiu3H96uqBXxZ/eI
1WYqL/fYRgod2u+Jve0gDumdnhKYh87xumYu2Ebkmityqj8z/aj+7Vuvs+4M
Y0h8HyCFavc0rXWrhG5qCOXawW8xemRtte3o5Jmp9ElZWHv1C2y21TNHp160
ov/GO8siTsloypjmXvM9xFDqzgrwOUQAWenO2u3LdKV5siFj3efF0U1cX2hr
PNX4KitVyHJFjRXjTkjF2K0CKJOfScUaX1CeNLUi4uou3WhZY1PNrcqLQzTu
Q2R8UlbcRvEN00OWmMHAFnSNuoIUbNgQb824ZFS+myrJtLS/HbrbQeLWSQPm
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
qvXFFpQvqC8dd/p9YQ8o4xnpYhuVBITOllYCEvAgUw7NlLT+GXGoIXNKpVNE
lpDQtpLturIVkdffvYs5GcCMqT8q34qpZIdm9SQ4dA+WByAHzxahSijzTuwU
A7Dn7fwCzF62u9Vr7bftiGlBuvsWIxVVpitOdUm1ufYA7ZgV6ircWwwvGlgu
QVuAA+eYI0nMPgc4mnyVz8ucrLbrPg7eSm5vXxmhVEgbLrppNOlQFmo2amxT
Dl+zSFTq1oZdZlTu0kdkh/395j1tiud/414e8N/nEv+p4Z+HvL4Fr++3Ju/8
t4PfBoNB5/9g1Hh/n/8YRnk5gF+8HqD9BfxSBYfwWRThPyHO8d3x94/gcfgV
/h0k2DEZtFKN2DeM/+CHRRBGswDnoN8H8IfXe0ITjGYdE3DWRBD6HdN8OPK+
2ogEkxidI9gUm6X89s7Nt/Y4p3YH8PeRToogvfYzUcbcs8VXVtDHQ2zxqdyW
z+vGp6tD01bdDXUFsO48JOmnBmlhmN1NAUvZrFCn7nyHt/Q06EYSyElbUlkG
xoGVmUtOtPDgqzn2duV4bLzrzsLWbYx3zF83pcl2bdn9znvJNlc922O7/b/D
81tkeGTZnsplR/2zi5VOqNjUrVbAuk/7c2yGEYUxF7SpyzoohUndWnxKN0CY
u62BGv4G7/zhW+8iJhbMzsfaCUrVutDV6vXK3eJhstEsVrWvFw5Qbqrtf24M
Obc1vGkfoRauG1/w+PsbSii+pUwLtkCaXJMudko5DczYms4zyj5r8wp1t7WN
GkRS/OCHD8+fLl4PFi8HM98fBDNMXNbCglsV8WWtjzpWgaSxy5o6RqT2x7Sb
Hl4SGwfBeDoP/dk8DPxoPAlHs+kknMyno9FkPpqP/Ol4Go3D+Xw+mY/HYTgK
ovF04kejcBSG4XjuTwJ/MhsDFxqNosk8psbAJq+ApjAKKPs4UA1toezOIu+z
Atpk67goivEiP5okwTQL8hDYZwrLmeazJJUTOZ5EYjTy83A69aNpNgvCTCZR
JPx8JIJoPhpns/ksDeeT2I4pu+mcwnQI86mWnCna+Cx6u1mk1Nve6uD75vit
3ru1DX1ygxM8uQGl4g025eBFupGgtLJ5RaUOdMmOk5TUw67IQJFRzHPZHSqB
M+BsBb6ob/RoRqH80vtNoNJaELfrqM2dwMZN06PQP3Jp1cJoWdDVJqdo8jJr
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
cILBJGMgVeCprYApm0BV2ELmghqfbsZo125Uw4GDNTfNNL356W15f7jKdnhz
mwJabPmwbO6yyGnYm3oDr6o8yafzlUSmuh37U9PzxRifb88FUO/8zrRdfo9w
t39wscvqKXtpzN4weWDZXnhdCfkUqPjN26nZzvJ8gOCpbOW3y+JR81ttcHu9
vPDXy+qpj7at9/KJbt7me/nT92HjFQanh/KdRcGD5napxMwaClyQgWybg+MV
LfAflWts0GXaxR6hy8pQl+evnifYP79NcQOUCGiJf0HIlDj84rOISxUqqQBo
XBHHySeoddW6HR2aytioguc8uCqqAeZxhQXAMwp4WrQ5GSguq7UFFlXmTpXA
xIfqiLs+mALzqDh809nrmnoZRYEfdCozD3CBZpMO6ghAhKUYE7uPoXIsCgJC
SlzAD0CjVJT2wzdcGj5tL4Kr8y2moceASvc+W4yaLiVB83uuWCM8JBYWwM0C
6QPLd7SWK7OkAXGtX7PtN0Nngs8MBIHAoh6sEV2SeF+NAu9U4nvNOhWNcSwV
ErMB+VstAEejp+kNj7Fipnt2rDkNkopR9DnhExEjwnzuwqQ5jeCDkQQTdhij
IsI9irrLNE/jR0weXtgwqA7RDDeimJMOp4sK4FwChgR02STETofPDS/cieoc
UwFwCETQuoPpO8H04+xL3gzSV/cpX4Hoe/Bx35uGO2IcwMjgdCBF2gaJUZli
4ZsG1AhYYJhPw6nLDgMKsKQKZ8RfdhB9/SF3EP1UIJpbacCnQ8G5vI92RDEQ
lcGwvhbofvdg4i1ZB0fgFDYYqymgJyl6YfIZ535x7g5ub0JwKeBQAXAL8u+r
ta4m3CKVADd/d3yjiQpcqR3R6dSZe7YJWKfybD9cU9/zrErbsjDk3/b2ftMv
lopf9D9bFs5km4+p8ea6VD7+O/Y/ztRH5bYqvfaPP+i9RZnVr1G47cFLs+0K
NS0LNV0mMu7plT9bFDxdlh75rPW//SQn++ftPmxp92Zn93c22udn9+HF2X3c
1u5lZ/h3ttrnZ/jxORr+/qI6wsdX9fj4pO0fldOpnP/B/jg9k5RTTfs9WA/b
ceAgUwngbz7iBP7781XsP86+m737dtVk6Nzx9tjPoxb8u1/LwZbuZHfedGdX
eH7eZMbytT7NptNvvA/3NcII4oWavSutLQqH/1tfNLnc0ubdzuY3vF6SzW/5
mg7xNWyekUCvep4sO37N//v91FTj+HjqATf7tKUHhJ0H3PTYr309Pw+444ze
dfehvwaHenPS2ctj3v+P+tPUhIg9TgD/i84X3830dtb/427K6KZHfv3r+Vn/
Q1TMv0Sb1Lj0YlfmwUKZUbPapRtWci3VjBqsmQobmbtb/7oh+IPZ/nJt5h9/
vMek0QOtIz1wgfyd1V9v9dsZrDd7D1uE/rzB/9f5Nldra2fPuNMT/MY7mOj+
1JN73dxyQfyXPbz3Vn1/tkD/n3bof3cjfnZ+8FT6pSh1N3co59ugTr3zTt5P
jQyn6SM6C91jSw/YLR3c3Xx3HnAPD3iKkWDFhe4TB3ZcaLtDbHo9jgc8hYY8
HIqnEgHWlr9TAXcz253l39Xy72Dyy8ViSN5Xf+knx+ummtMD/6fZWgxPaZOr
iaE9zoby49v4wW92EeBuRvzs/OCOF/EA93H1EBs8Yf3IJrS/FAMWBTNn+yA9
H2d63fJ8/4hrAatim3vfLNpPh2//+Sx1eDbHe/Nl5/B+sbX0ukrn1J193Zx6
7/D9fKqg0pdpzlevbDu98fOTVNyr23zNvET8DOZ51NuyH/FDSI/nUX7/Ukb0
A+UWW12qMl0PFiRNXnT3kA1J6yItV9eU7QhHvbRiI/6gSwoKIagGlyV1zkIV
qwzikQQjoSBKZVO8VJUSK/ZZAyWScYgcXTVae9WCiaGVUEPLxkmgfDGt6quq
yDZEst6ktdFY7g+SyOBI7GGkYjTKscRC7T6a7gz33zpWkIxSmk4yVUnMjrvu
VOJWUOYs2xCsahrX45IGHo0YTECYjbgFl4vN3HdnrcMw5D51MesBUkvFpnGx
OYaeLTVaZZFfYJ1zbbjUq2jL3k/D4mNRB8is7pRyqTJxOrJoh/c1++7EGRO9
iqEmb+xwvBDmv1s2JxxJlAlm1J5NZFelKjjCVCbY3R2cltF6Xg7PupR/P4Mr
9nVv9b0LDnVuMUf/6c3sXT85fX8iU5v4rSDlSWaB7TBF7TDlGWNK/CqYssya
2z8sYPmn/eRwPvvj7LvZN6/++O1s/v6Qsz6ElUVn+dNPsyXvybdo0HgjhjzJ
adA1hMC+/rxfDl6vWNs28HF529MtX18EPj4rKu4PH5rbf8QobkKsSkEnaMNW
pSbCqHV0olRhfaaYUmDJKIv/cQOwGlW31p2O0MVeGR6EVyH3P8jV3AwzhFXC
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
C8MwXgL2MJYvBMLxxX0PP0xRrBwdH+1XBMNVPMP3J69aFjyZ1MLxPqh3QYw7
GvtH+6efFiWHFwXPTz8t+sgs+l7vH620zCGOVX7pt5QVN3rkDQ3Kdh55C3d6
eR5Z73iZ97jRr+GRZeFqi/Cmvl076fuTP/eZvD+dHb8/ncPtphmAdyf7h/0V
Aiecbf5eFg1rfndjD6db+pvf+dtWNvTy/C3d8TLvcaNfw9/oZvr72Ye3+/Ut
o9jR8elFn/vm4/+14JWOb5Y9hMpXCJH77X1/CKIZdm62lens3OzuN6q/hsi7
0nXwYvfOOTxsCmP/NJuXw74HJvm+zw6P2+zd9zP63BlJnWas/2H2H729rxw0
Tn730khUF1fCP36iYpzvHbKxVZF9Fnje3lt/3E3JbGeBL89bv0CTmVoK09hy
yNr33At81OXek0s9Muubh8i1DVxxYVn2kvTSW2Xprebu3nq5Jdx5X60rX937
5hrPvHdUXHWJ+/GGVolfqCXNIzSd2XnYfSdehk6Ziyyqt1i5kaY0OFvwZSjV
S85WZZ1UYtZYZTXHRWMXWTZ2mfraPWBjl8+3Uzw+6mxUjZiDO1AflZr8YmKP
7971IzrR6TFk3qLH6GQw24emn3ahaTurf3mO8zz6n2FA7+RdS79ZZC/QqU5P
YLhluVhA36O3PYBD3TMK7RxqfaCdQ315h3qyoWrF7u4bqHbsTr1En3oKbfs4
Vk8pCK1dZSeE7m/nO1d5cFe5g48sJ9DLwcGrv/ST45X5LBzmn2br2YUpQXU1
M7hXTvqMH9/WcX6zizH3t/qX5zh3vMoHuNGrh9jgOutnOsWTS1FmUfp4tg8e
9nGmJ0pWTphmMTs6XpdN3vumvu31/83Ct/98ltU9m+O9+djv8+lvfz7voOt6
y9/P5serGXMc5/D9fCq+1JcZ6FevbHtR9fNTnqXAY17d9GucBSNEanzU2+vF
g3gohfU8GtNcSll/mOTv4s2AmzuXtILQMUmM9cNayKoUR4WskspueaV6m7vO
Jvqui4KIQoSD6sIhYh6AAGMyO88gQIU2MnueeOAIO6iVgIhl0siqKO28j9VH
5xDsarDKNt5Ik1hyTTG0pvGmjdBjzpqS8XsdpcUcs2oswAul160AUyDlajPB
NNFVXVmxY+nikkvtwYQUVWyhsBjSaCyxk4szVg/WKq7WQ/vljC8kwY8uspEW
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
AgA=

-->

</rfc>
