<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-sigma-protocols-04" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title>Sigma Proofs for Linear Relations</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-sigma-protocols-04"/>
    <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="November" day="02"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>zero-knowledge</keyword>
    <keyword>sigma protocols</keyword>
    <keyword>cryptography</keyword>
    <keyword>proofs of knowledge</keyword>
    <abstract>
      <?line 300?>

<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 306?>

<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="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="Brands00"/>, <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 for zero-knowledge. 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>
        <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.</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> 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><tt>Group</tt> values are assumed to be valid elements of the prime-order group. Deserialization <strong>MUST</strong> fail on invalid or non-canonical encodings.</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><tt>Scalar</tt> values are assumed to be integers in <tt>[0, p)</tt>. A constructor from an integer <strong>MUST</strong> fail unless the integer is in this range, and deserialization <strong>MUST</strong> fail on non-canonical encodings. Arithmetic operations reduce their results modulo <tt>p</tt>.</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. The <em>relation</em> proven is:</t>
        <artwork><![CDATA[
R := { ((M, image), witness) : image = M * witness }
]]></artwork>
        <t><tt>M</tt> and <tt>image</tt> together form the <em>instance</em>, while <tt>witness</tt> is the secret. <tt>image</tt> is the result of the multi-scalar multiplication of each matrix row with the witness, that is, 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 <xref target="Schnorr91"/> 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"/>.</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>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"/>). 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]
    # elements[i] has element index i + 2
  equations: list[Equation]

class Equation:
  image: list[(int, Scalar)]
    # (element_index, coeff)
  terms: list[(int, int, Scalar)]
    # (scalar_index, element_index, coeff)

element(instance, element_index):
  if element_index == 0: return Group.identity()
  if element_index == 1: return Group.generator()
  return instance.elements[element_index - 2]
]]></artwork>
        <t>The identity and generator have implicit element indices <tt>0</tt> and <tt>1</tt>. 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 * element(instance, 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>An empty <tt>image</tt> or <tt>terms</tt> list represents the identity element. 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, 2, 1), (0, 3, 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 element in <tt>instance.elements</tt> <strong>MUST</strong> appear in the terms or image terms of at least one equation. The identity (index <tt>0</tt>) and generator (index <tt>1</tt>) are available in every instance whether or not an equation uses them.</t>
        <t>For a valid instance, let:</t>
        <artwork><![CDATA[
num_elements(instance)  = 2 + len(instance.elements)
num_equations(instance) = len(instance.equations)
num_scalars(instance)   = max((s + 1 for eq in instance.equations
                               for (s, _, _) in eq.terms),
                              default=0)
]]></artwork>
        <t>Scalar indices need not be contiguous. Trailing unused scalar variables are not part of the instance. The number of group elements is independent of the number of equations. For instance, Chaum-Pedersen has <tt>num_elements = 5</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]) \
                   * element(instance, element_index)
6.   out.append(acc)
7. return out
]]></artwork>
        <t>With <tt>image(instance)</tt> we denote the evaluation of each equation's left-hand side.</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>1</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"/>).</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 <xref target="Okamoto92"/> 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 = [H, X, Y]</tt> and <tt>equations = [Equation(image=[(3, 1)], terms=[(0, 1, 1)]), Equation(image=[(4, 1)], terms=[(0, 2, 1)])]</tt>, while <tt>PedersenOpening</tt> is compiled to a <tt>LinearRelation</tt> with <tt>elements = [H, C]</tt> and <tt>equations = [Equation(image=[(3, 1)], terms=[(0, 1, 1), (1, 2, 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>, with its coefficient negated when the term is written on the left-hand side; 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 = [H, C]</tt> and <tt>equations = [Equation(image=[(3, 1), (1, -m)], terms=[(0, 2, 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=[(5, 1), (4, 1)], terms=[(0, 3, 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=[(4, 1), (6, 1)], terms=[(0, 2, 1), (0, 3, 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 = [H, C]</tt> and <tt>equations = [Equation(image=[(3, 1)], terms=[(0, 1, 1), (1, 2, 1)]), Equation(image=[(3, 1)], terms=[(0, 3, 1), (2, 2, 1)])]</tt>: the element index <tt>3</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>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> and <tt>1</tt> appears in the terms or image terms of at least one equation; the identity (index <tt>0</tt>) and generator (index <tt>1</tt>) are present in every instance whether or not an equation uses them (<xref target="representation"/>).
Together with check 2, this ensures either <tt>num_elements(instance) == 2</tt> or <tt>num_elements(instance)-1</tt> is the largest referenced element index.</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. When parts of the instance come from another party, see <xref target="instance-security"/> and <xref target="privacy-considerations"/>. 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>These checks admit identity images and columns, including <tt>M * x = Y</tt> with <tt>M = 0</tt> and <tt>Y = 0</tt>, or with <tt>M != 0</tt> and <tt>Y = 0</tt>.</t>
        <t><tt>ValidateInstance(instance)</tt> denotes the function returning <tt>true</tt> if all above predicates are met. Instance validation cannot tell how a group element was obtained, and so does not detect violations of <xref target="representation"/> (<xref target="sigma-ni-security"/>).</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. Serialization involves serializing each equation's image terms, then its right-hand side terms, each preceded by its count (<xref target="representation"/>). At the end, <tt>instance.elements</tt> are serialized (identity and generator are implicit). 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"/>).</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)
]]></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(3, 4) || Scalar.serialize([1])   # image: X
LE(1, 4) || LE(0, 4) || LE(1, 4)
         || Scalar.serialize([1])               # term: x * G
LE(1, 4) || LE(4, 4) || Scalar.serialize([1])   # image: Y
LE(1, 4) || LE(0, 4) || LE(2, 4)
         || Scalar.serialize([1])               # term: x * H
Group.serialize([H, X, Y])                      # statement elements
]]></artwork>
        <t>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>
        <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><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 how to select the session identifier (<xref target="sigma-proofs-tag"/>), how to produce a challenge (<xref target="challenge-derivation"/>), two flavors of non-interactive argument (NARG) string serialization (<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 <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> marker, <tt>DSFS</tt> (duplex sponge Fiat-Shamir) for batchable NARG strings or <tt>CMPT</tt> for compact NARG strings, and the ciphersuite identifier (<xref target="ciphersuites"/>).</t>
        <t>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 prover and the verifier each construct the tag (or session identifier). Neither should accept a session identifier supplied by an untrusted 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 and verifier derive the challenge as follows:</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 (<xref target="ciphersuites"/>).</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>
        <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>
        <t><tt>VerifyBatchable(tag, instance, narg_string)</tt> accepts the proof only if:</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>
      </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>.</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"/>), which always returns an accepting transcript, 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. expected_challenge = DeriveChallenge(tag, instance,
     Group.serialize(commitment))
8. return challenge == expected_challenge
]]></artwork>
      </section>
      <section anchor="batch-verification">
        <name>Batch verification</name>
        <t>Batch verification <strong>MAY</strong> verify multiple batchable NARG strings more efficiently than individual verification. It can also improve efficiency for a single instance with several equations. Batch verification does not affect the prover or the NARG string. It checks a single random linear combination of the verification equations. 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>For <tt>batching_randomness</tt> elements drawn uniformly from a set of <tt>2^t</tt> scalars, a false NARG string is accepted with probability at most <tt>2^-t</tt>, as in batch verification of Ed25519 signatures <xref target="BDLSY11"/>; below, <tt>t = 128</tt>.</t>
        <t>The following procedure derives batching randomness deterministically. Alternatively, batching randomness <strong>MAY</strong> be 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. Omitting any of the instances or NARG strings (i.e., prover messages) 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 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, and an application may fall back to verifying the NARG strings individually.</t>
        <t>The batching randomness elements <strong>MAY</strong> be replaced by the successive powers <tt>1, mu, mu^2, ...</tt> of a single 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. Step 7 then 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 their <tt>LE2IP</tt> value. An invalid batch is then accepted with probability at most <tt>(K - 1)/2^128</tt>, rather than <tt>2^-128</tt>.</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. For example, implementations may use fixed-base multiplication tables or skip arithmetic for unused scalar variables and zero-coefficient terms (e.g., <tt>0 * x * G</tt>).</t>
      <t>Because <tt>num_scalars(instance)</tt> is determined by the largest scalar index, a sparse high index can make responses and NARG strings very large. Implementations <strong>SHOULD</strong> enforce application-specific limits before allocating resources.</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. The security considerations of <xref target="fiat-shamir"/> apply throughout.</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>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"/>.</t>
        <t>For example, consider the verifiable-decryption statement <tt>M + E1 = x * E0</tt>. Encoding only the image element <tt>F = M + E1</tt> omits <tt>M</tt> and <tt>E1</tt>. The resulting NARG string verifies unchanged for every pair <tt>(M', E1')</tt> with <tt>M' + E1' = F</tt>. An attacker can therefore reuse a proof for a different plaintext-ciphertext pair.</t>
        <t>Likewise, encoding <tt>Y = x * (E0 + E1)</tt> with the single base <tt>K = E0 + E1</tt>, instead of the two terms <tt>x * E0 + x * E1</tt>, lets the same NARG string verify for every pair <tt>(E0', E1')</tt> with <tt>E0' + E1' = K</tt>.</t>
        <t>Both encodings pass instance validation (<xref target="instance-validation"/>) but violate <xref target="representation"/>.</t>
        <t>The <em>challenge set</em> <tt>C</tt> is the full scalar field (<xref target="verifier"/>, <xref target="challenge-derivation"/>), so <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 <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>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"/>.</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>
      </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>An instance may have many valid witnesses. For example, <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> trivial from one another. Likewise, <tt>x * H - x * H</tt> is valid for any <tt>x</tt>. In general, the witnesses of an instance form a coset of the kernel of <tt>M</tt>, and a proof establishes knowledge of a witness only up to that kernel. It is the caller's responsibility to choose relations whose kernel is trivial, or for which finding a non-zero kernel element is computationally hard.</t>
        <t>The same holds for specific requirements on individual elements. For example, when <tt>H</tt> is the auxiliary generator of a Pedersen commitment, the caller must ensure that <tt>H</tt> is not the identity and that the committer knows no discrete-logarithm relation between <tt>H</tt> and <tt>G</tt>.</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><tt>ProverCommitment</tt> <strong>MUST</strong> draw fresh nonces on every invocation, even for the same instance and witness. 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><tt>ProverCommitment</tt> and <tt>ProverResponse</tt> <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 nonces), 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>All group and field operations whose inputs include secret values <strong>SHOULD</strong> be constant-time in those values. The secret values are the witness, the nonces, and the prover state that carries them. The NARG string is public, and the instance usually is too.</t>
        <t>Randomness <strong>SHOULD</strong> be derived using implementations that are constant-time with respect to the entropy drawn (<xref target="rng-definition"/>).</t>
        <t>Implementations <strong>MAY</strong> skip multiplications by coefficient <tt>1</tt>, or test instance coefficients for zero in variable time.</t>
        <t>The multi-scalar multiplication <tt>map(instance, nonces)</tt> in <tt>ProverCommitment</tt> <strong>SHOULD</strong> be constant-time with respect to its secret scalars. Its bases are public instance elements. Group libraries typically provide a separate interface for this guarantee. The variable-time algorithms of <xref target="efficiency-considerations"/> leak scalar bits through window sizes and iteration counts; partial knowledge of the nonces will compromise the witness <xref target="HowgraveGrahamS01"/> <xref target="JancarSSS20"/>.</t>
        <t>Keyed-verification credentials also require constant-time verification because the instance depends on the issuer's secret key. The secret enters the verification equation through the group elements. An MSM that is constant-time only with respect to the scalars is therefore insufficient: 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>For OR composition, the witness determines which clause is simulated (<xref target="core-interface"/>). 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><tt>Ne</tt> and <tt>Ns</tt> are the byte lengths of a serialized group element and scalar. The ciphersuite identifier fixes the group, the codecs, and the hash instantiation.</t>
      <t>For all ciphersuites, the scalar serialization length <tt>Ns = 32</tt> equals the smallest integer such that <tt>256^Ns &gt;= p</tt>, so each challenge consumes <tt>Ns + 16 = 48</tt> squeezed bytes (<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>.</t>
            </li>
            <li>
              <t><tt>serialize([A])</tt>: the group element serialization function <xref target="fiat-shamir"/> for <xref target="SEC1"/> (<tt>Ne = 33</tt>).</t>
            </li>
            <li>
              <t><tt>deserialize(buf)</tt>: the group element deserialization function of <xref target="fiat-shamir"/>, which inverts the conversion above. Every non-identity point <strong>MUST</strong> perform all checks of Section 5.6.2.3.4 of <xref target="NIST-SP-800-56A"/>. Deserialization <strong>MUST</strong> accept only compressed form, an <tt>Ne</tt>-byte string that begins with <tt>0x00</tt>, <tt>0x02</tt>, or <tt>0x03</tt>, as specified in <xref target="fiat-shamir"/>.</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"/> <xref target="PAIRING"/>.</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"/>: <tt>97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb</tt>.</t>
            </li>
            <li>
              <t><tt>serialize([A])</tt>: the compressed G1 serialization of Appendix C of <xref target="PAIRING"/> (<tt>Ne = 48</tt>).</t>
            </li>
            <li>
              <t><tt>deserialize(buf)</tt>: inverts the serialization above and <strong>MUST</strong> perform full point validation.</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>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <date day="2" month="November" year="2026"/>
            <abstract>
              <t>   This document describes the Fiat-Shamir transformation, which allows
   making a public-coin protocol non-interactive by means of a
   cryptographic hash function.

   It specifies how the hash function is employed, how prover messages
   are encoded as hash-function input, and how verifier messages are
   decoded from the hash function's output, as well as the serialization
   and deserialization of the non-interactive argument string.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-fiat-shamir-04"/>
        </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>Carnegie Mellon University</organization>
            </author>
            <date day="1" month="November" 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 they 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, its security level is
   estimated at approximately 100 bits 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 consider them at 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.  This memo also specifies the serialization and
   deserialization of the points and scalars that protocols exchange,
   restating a format that is already in widespread use, and states
   which of the remaining decisions belong to the calling protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-pairing-friendly-curves-15"/>
        </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="Brands00" target="https://www.credentica.com/mit/Chapter3.pdf">
          <front>
            <title>Rethinking Public Key Infrastructures and Digital Certificates: Building in Privacy</title>
            <author fullname="Stefan Brands">
              <organization/>
            </author>
            <date year="2000"/>
          </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="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>
            <author fullname="Greg M. Bernstein" initials="G. M." surname="Bernstein">
              <organization>Grotto Networking</organization>
            </author>
            <date day="29" month="October" 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-14"/>
        </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="30" month="October" 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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-bbs-blind-signatures-05"/>
        </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 1100?>

<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 duplex sponge suite with <tt>Suite</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. <tt>Tag</tt> is a name: its value is the US-ASCII tag itself, not its hexadecimal encoding. 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="rng-definition"/>).</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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
Witness =
  9b7b9af133b35ea96e662c4662956909fe465084fe929506980e025022d750be
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
Witness =
  9b7b9af133b35ea96e662c4662956909fe465084fe929506980e025022d750be
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d245
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
Witness =
  b4fbb257ea2f224915a82a630ff348069e2b25bafdcf6255322c9fa0dfb6340a
NargString =
  0203ed31e0d73b821eba236b903f83ddd6e60e59a77249462be32fc43ab4d5dd
  7e038ad4a96b49f6e29ea0afcb6a329632b5e3cdea70137e965515219da19be4
  49763209aa1f8c3a6b82ae4ddeed64c2d28003b242c54090ef09c4322ef66a98
  2b43
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
Witness =
  b4fbb257ea2f224915a82a630ff348069e2b25bafdcf6255322c9fa0dfb6340a
NargString =
  5439ce3609b91a4dd9b27b10e62b469a6e7ddba5b8a6aac7239d53f16e6837c0
  3c0e0bdd00091a39a38c4b3d184b518b1e796eca262dc570eafaf449117a3c42
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 =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0206c16fcf4c4017adb8908fb2ec0aba8ea9edd683ae38eac52d59f040956be8
  f803e8372937cb2d0d9d0d48263ecd0a1d4b96207bceb3806739757fcad774f9
  2642
Witness =
  25c9fd63403d0da31081857537ade64b637c80ed2338639148a9938b3562ea06
  afc354c8985ee3cb61b83af2f7a5bb2abeb7d510db5168b6ede21b4910594a2b
NargString =
  03491976f248dcde9ecf9c4536754cb2e81b61be73999efd8e82d061cabf3a49
  4366bacc0e4766532738c1877a528d3f6711d61f36d2653200d1ddeacb1787af
  b90b3b192754bf116d386edcc7a93a8204a9a09ac8b4ca93b248dd5e8381ea4b
  3f
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 =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0206c16fcf4c4017adb8908fb2ec0aba8ea9edd683ae38eac52d59f040956be8
  f803e8372937cb2d0d9d0d48263ecd0a1d4b96207bceb3806739757fcad774f9
  2642
Witness =
  25c9fd63403d0da31081857537ade64b637c80ed2338639148a9938b3562ea06
  afc354c8985ee3cb61b83af2f7a5bb2abeb7d510db5168b6ede21b4910594a2b
NargString =
  c865818d664aed2b586a5c7a70ee09d435e351651b8b82993f53f3bc1751c29b
  655e3006c14693c0ac8e29a37108b52b795cbb4d9afc657669195508253e531f
  8b71106f53cb395aafc38d209214a1edb2f3312da0992a48809561beca62b03e
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000007000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000005000000000000000000000000000000
  0000000000000000000000000000000000000001010000000600000000000000
  0000000000000000000000000000000000000000000000000000000102120b29
  125003d5d494503fd47fa4057e761c1cb1632e8965233b8f8dfadd9d2503dc92
  fe87397abd7e0beded9099032d680f46280672afeb1682e46b45e046d5b302a2
  8a33dc8792cb198a9d7942eb1a34909373a5f382e8e68983a54f6fba75875502
  76d70754e0a8f249a41695d5db16f8765d27a46a19dfcd8c1fdc7ac5896f46f5
  03ccdb0adda1a852cac38054215e298b8d4b19823e3a66b9a80e44d063935de4
  09028ef1cfa2468871b4b5116a6709c8df1f722180fc4fc1ad6e5db991660be7
  8915
Witness =
  1242ef15dea6fafe29b8d3e9ba859d0489744d46cc8b52563c445dcd0ee62854
  b80c18e412222e458decdfbecd398b8036df12500008fac1a8f16eecb517bf54
NargString =
  03e2aa1a7e5b705690b8fc4859dc9353a8ca262c6f11016306a9a84664e55f48
  fc0268b6aeff56dbd1517e0721f62a59fe09fa2f523972ad06f3a6ccd75d82f8
  6e95feccdea380011cfaf162a975e3929461986246665e4860d2be13aa728e89
  c3d12751b3994e7cf5466e4f75ef681dc1e001e3dce43eac5126ad42bae707ef
  d9ab
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000007000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000005000000000000000000000000000000
  0000000000000000000000000000000000000001010000000600000000000000
  0000000000000000000000000000000000000000000000000000000102120b29
  125003d5d494503fd47fa4057e761c1cb1632e8965233b8f8dfadd9d2503dc92
  fe87397abd7e0beded9099032d680f46280672afeb1682e46b45e046d5b302a2
  8a33dc8792cb198a9d7942eb1a34909373a5f382e8e68983a54f6fba75875502
  76d70754e0a8f249a41695d5db16f8765d27a46a19dfcd8c1fdc7ac5896f46f5
  03ccdb0adda1a852cac38054215e298b8d4b19823e3a66b9a80e44d063935de4
  09028ef1cfa2468871b4b5116a6709c8df1f722180fc4fc1ad6e5db991660be7
  8915
Witness =
  1242ef15dea6fafe29b8d3e9ba859d0489744d46cc8b52563c445dcd0ee62854
  b80c18e412222e458decdfbecd398b8036df12500008fac1a8f16eecb517bf54
NargString =
  889b772b3a090bb4849222bf7a05abe7667bb0412096e01963e210131c863f63
  55ef1a932490ec8366d551e3b99c0d34035f15226508f20add6ac87c8b67e223
  7bff9c0768b0e1bbad32a578661ca76331845dec445660b21ac394cb7555e413
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 =
  0100000001000000060000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000004000000000000000000000000000000000000000000000000000000
  0000000000000001030000000500000000000000000000000000000000000000
  000000000000000000000000000000010202eaa274def05ab048396033e7f2d7
  638851a60131af9759a016e3eff592941c02b4f47e54f51d447c160ecf71c456
  a8e0d513d593c07bfaac23a373a4b51ca868034f75a59df8f7f10f97fcd9bdaf
  24a3b0c5ea403167929f4fcab9d4e3f483747c02f86566f754588d585264dac4
  f3650cf8ff53ec716ed21dfd07213058d8fc78020390ef88459ded35acdbe56d
  986dad595f45a8b6f190bbce3ddb5908308f6115b5
Witness =
  af35a44a86ed7403467f49203e8c79501e70f039b113cd1753993f84977d95ac
  13cadbba0e76ff85edd77b7340ba0396e45671dff7229dc424faa180dba435ba
  334d189229fa64202a6182e85d80497f21f250fa467ded4cf8152154af76c241
  0a3c8706d1a6d4623d89b5b9213c59e1163975d6ef7abc8311682ddfe6d7390b
NargString =
  03206f70cc509ce8660cca8caa1f3b403f143c006705fe72daf4cb083be82495
  849b21cc13b4e40300b3b63a03fa86eac1f0871dd619d227e90bfd3c34ff0ddf
  68d7ffcf46bd1df8fa709d07ebdb91298850f2c699b56e40288fa3bd0d4a1fcc
  bf3e7ad849735256a9769fc193d6db1a2ac3d5408cb33d880fbbcf5afabab790
  fffe64c2ccb2ec789305b9d03cc01fbc47ee06dd924f173e241529c6ae9c8289
  c8
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 =
  0100000001000000060000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000004000000000000000000000000000000000000000000000000000000
  0000000000000001030000000500000000000000000000000000000000000000
  000000000000000000000000000000010202eaa274def05ab048396033e7f2d7
  638851a60131af9759a016e3eff592941c02b4f47e54f51d447c160ecf71c456
  a8e0d513d593c07bfaac23a373a4b51ca868034f75a59df8f7f10f97fcd9bdaf
  24a3b0c5ea403167929f4fcab9d4e3f483747c02f86566f754588d585264dac4
  f3650cf8ff53ec716ed21dfd07213058d8fc78020390ef88459ded35acdbe56d
  986dad595f45a8b6f190bbce3ddb5908308f6115b5
Witness =
  af35a44a86ed7403467f49203e8c79501e70f039b113cd1753993f84977d95ac
  13cadbba0e76ff85edd77b7340ba0396e45671dff7229dc424faa180dba435ba
  334d189229fa64202a6182e85d80497f21f250fa467ded4cf8152154af76c241
  0a3c8706d1a6d4623d89b5b9213c59e1163975d6ef7abc8311682ddfe6d7390b
NargString =
  7f3c332fa51b54e86031e45088c3b206ad16e2c4f0ae3bb552d8019acf9dd79c
  712d4b7c77f44ea5a14983dfdcba7e5aaef846fc071afdd709ea2aef9213ff31
  84352110ec1f5899e3318c8af86ca78ecec22ac31d8b0899ca729393bf64cebe
  2f9316401b7ab6ce1026d5ff9b7e163cbd8b787ccada0ab82e251da8e3f965c6
  c18b76d9839f72867d0251abec4f3461501b0208c808386cbcc935c0480f5153
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000005000000
  0000000000000000000000000000000000000000000000000000000000000001
  0400000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000300000000000000000000000000000000000000
  000000000000000000000000000000010372462b86837aaadb6ec2348fc4a602
  9f7ae77e9aea238017bebbbe469dd299be039f3ab1733887055e7f18884bc8d6
  66d2461925888f366009aeefcaaffd94900e02597c2dd8b7bd7c2c9864efa356
  ed285103582e75c001fbd8400aaf618790fa93036d21e24e585051080212d7ee
  b3884dcb28017e91d50967bcd432bbd9a8cf4986
Witness =
  14375a0f9d92dd6fd4b67cb11de6f81b54c101f6e846cd8817dce6db7b30fb4c
NargString =
  02f2de68f98653dc53ef1832f363b62fd68837f7b5d17080e068e4450ef35bc5
  2f036ae8948f8836f4c38bf16298de1179a4641f6a11e2222457160ff4f8963b
  728673acec1e1c9afabd9a0ebee222254f1743c01d201b1d6606021707206e15
  dba1
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000005000000
  0000000000000000000000000000000000000000000000000000000000000001
  0400000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000300000000000000000000000000000000000000
  000000000000000000000000000000010372462b86837aaadb6ec2348fc4a602
  9f7ae77e9aea238017bebbbe469dd299be039f3ab1733887055e7f18884bc8d6
  66d2461925888f366009aeefcaaffd94900e02597c2dd8b7bd7c2c9864efa356
  ed285103582e75c001fbd8400aaf618790fa93036d21e24e585051080212d7ee
  b3884dcb28017e91d50967bcd432bbd9a8cf4986
Witness =
  14375a0f9d92dd6fd4b67cb11de6f81b54c101f6e846cd8817dce6db7b30fb4c
NargString =
  1a0c7624f3e260f60248904f040be8030d35f3ffa2aa753edb89d0d39e45b093
  80dfe181f95f6f29fb356f862551f7e5acb26f7f320fd5026095b1109cd2cea4
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000103f56baee56b8f80b4bae59bb48c615a7b34ab47
  c8f0de3fe6bc23706511a90a0d037100a881faf4f73982c7e3113810c6e56a69
  c42c98562a121c15ad1951c8eafa031def6155fd67b1be8e4fd49c7227e576c1
  abe0886e5d6a928a015f5d8f08e436
Witness =
  45d78f1fff7555932001aa84fb525f9caa8a0949bb8406aaacdd9ce9f06dfdea
NargString =
  029e903a7f21e67b403658a8b55c2097d0b5ec918a10b4ac965dbbddca20d216
  d50374b96946905242651598a20721cce60aaa1a1d84f4f4644ad1abb2ea61eb
  435fc1db75038db1a9038b3c5945bbaa57bd059fca461e88fcdc4741e7ff8aa3
  ea8d
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000103f56baee56b8f80b4bae59bb48c615a7b34ab47
  c8f0de3fe6bc23706511a90a0d037100a881faf4f73982c7e3113810c6e56a69
  c42c98562a121c15ad1951c8eafa031def6155fd67b1be8e4fd49c7227e576c1
  abe0886e5d6a928a015f5d8f08e436
Witness =
  45d78f1fff7555932001aa84fb525f9caa8a0949bb8406aaacdd9ce9f06dfdea
NargString =
  90e1393e4c16ab77543b188b8d9f6277891b0ebc3b01eeeacdfd5d38b827bd7b
  a10708aa11af6334ceeabed21f2e2e0216a69b16e1bea40976189d215933173c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  047e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  067e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  077e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  02ffffffff000000010000000000000000000000010000000000000000000000
  04a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
Expected = reject
]]></artwork>
          <t>The padded identity commitment decodes successfully, but the
verification equation fails.</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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0000000000000000000000000000000000000000000000000000000000000000
  00a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0200000000000000000000000000000000000000000000000000000000000000
  01a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c00
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d245
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
  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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d245
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
Expected = reject
]]></artwork>
          <t>The empty relation, with no equations and no image, is valid.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/empty_relation/batchable/E0
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = empty_relation-DSFS-with-sigma-proofs_Shake128_P256
Instance = 00000000
NargString = ""
Expected = accept
]]></artwork>
          <t>The instance and proof are accepted even though scalar index 1 appears
in no equation.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E1
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  031ac02e1fd7d885b1e5eb1811abd9c4d03eee8eada37d9c1a860ca3c649b8e2
  a302ccab62b6a53592a5bc088188532faa9eee974c21150d6276da6c6d924b6e
  2dc1
NargString =
  033d85fedbddfd463f0392eeea57107720404fbce572e420fe54fba77bad18b4
  b9834260ba32314f5942fada9807725a84612213e0d9cd077a408152cc8888ce
  1d53c677da45813656460981b5486f84b75cac23d94fd31d62b1b700f5c0ac94
  f5a9a8aff056ca55160b48736276aa8c5d6cdc502147814b99bad208d3e9cdfc
  ef
Expected = accept
]]></artwork>
          <t>Because scalar index 1 is unconstrained, changing <tt>response[1]</tt> in a valid
proof produces another valid proof.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E1b
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  031ac02e1fd7d885b1e5eb1811abd9c4d03eee8eada37d9c1a860ca3c649b8e2
  a302ccab62b6a53592a5bc088188532faa9eee974c21150d6276da6c6d924b6e
  2dc1
NargString =
  033d85fedbddfd463f0392eeea57107720404fbce572e420fe54fba77bad18b4
  b9834260ba32314f5942fada9807725a84612213e0d9cd077a408152cc8888ce
  1d53c677da45813656460981b5486f84b75cac23d94fd31d62b1b700f5c0ac94
  f6a9a8aff056ca55160b48736276aa8c5d6cdc502147814b99bad208d3e9cdfc
  ef
Expected = accept
]]></artwork>
          <t>The instance and proof are accepted when the image terms X + (-X) sum to
the identity.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E2
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_trivial_equation-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000002000000020000000000000000000000000000000000000000000000
  0000000000000000000000010300000000000000000000000000000000000000
  0000000000000000000000000000000101000000000000000100000000000000
  00000000000000000000000000000000000000000000000000000001031db20b
  c00c5012329627c85174b00ade13788636ce3ce3842e0fc1dde4179ca5021db2
  0bc00c5012329627c85174b00ade13788636ce3ce3842e0fc1dde4179ca5
NargString =
  022fb88456a6a7f8d974b129ec99f3745ffd9e3dcbae9771815571d4c4087a12
  088aa155e5f5e22708f62eec3e7425026489340ed065e835229f1a5010637696
  d9
Expected = accept
]]></artwork>
          <t>An instance containing the identity element is accepted.</t>
          <artwork><![CDATA[
Id = sigma-protocols/p256/discrete_logarithm/batchable/E3
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_P256
Flavor = batchable
Tag = instance_identity_element-DSFS-with-sigma-proofs_Shake128_P256
Instance =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0000000000000000000000000000000000000000000000000000000000000000
  0003871d14718441e23004e5c432427775bde2e9244f75550e839d210556bde1
  cad0
NargString =
  02b9d1353c5f3bf39418f2ea4bb8f8ba63cef1e8cc7eb14f51242c31ec17765a
  5fd2995d319c4066ae5a6e462b6df73d7a3fa96528f6df4f06427792f5fbf918
  173d803b926c49616e4505826af6862afd0746974c0cc0305f57a35580738a76
  8e
Expected = accept
]]></artwork>
          <t>Instance validation fails if a term references element index 3 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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000030000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d245
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d245
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  0203ed31e0d73b821eba236b903f83ddd6e60e59a77249462be32fc43ab4d5dd
  7e038ad4a96b49f6e29ea0afcb6a329632b5e3cdea70137e965515219da19be4
  49763209aa1f8c3a6b82ae4ddeed64c2d28003b242c54090ef09c4322ef66a98
  2b43
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000030000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000010000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  0203ed31e0d73b821eba236b903f83ddd6e60e59a77249462be32fc43ab4d5dd
  7e038ad4a96b49f6e29ea0afcb6a329632b5e3cdea70137e965515219da19be4
  49763209aa1f8c3a6b82ae4ddeed64c2d28003b242c54090ef09c4322ef66a98
  2b43
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  5439ce3609b91a4dd9b27b10e62b469a6e7ddba5b8a6aac7239d53f16e6837c0
  3c0e0bdd00091a39a38c4b3d184b518b1e796eca262dc570eafaf449117a3c42
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000030000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000010000000000000000000000000000000000000000000000
  00000000000000000000000103a0d262ccb556df026581adf2ea6ea52cf69ca3
  9f0644b89e43471cb40d921b0503dc308f6d1c515121d2334015b95254336a60
  8a78031809b31099aadadcb566350241d6b25cf581b93fb4f769f1d88aa571df
  e9d3f2e451b2f779e8da710ae0015b
NargString =
  5439ce3609b91a4dd9b27b10e62b469a6e7ddba5b8a6aac7239d53f16e6837c0
  3c0e0bdd00091a39a38c4b3d184b518b1e796eca262dc570eafaf449117a3c42
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001039db6eb62700691
  c3580fbda8fc7ee33f6cfdd5b43203507c1b0533b15d0d1b7e
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001039db6eb62700691
  c3580fbda8fc7ee33f6cfdd5b43203507c1b0533b15d0d1b7e
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d245
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  93bac806a40bf7649bd000f052d04ddbc3e5c407e7d895f2818d01076c070d13
  a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a687360c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  0221f8d84da0727022bf043b23de7c67590535109a3a6c24f4fba9c8732190c6
  ea10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d
  15
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  037e00143a98c515388e00397c050c46729f010e30752f00172c2e9444cd323e
  19a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0d
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2
  96a3e0ebd45a2bcf4ccdbaf720aaf57161612abc4ce2ad1d97ff004483a68736
  0c
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  00000000000000000000000000000000000000000000000103f0f109368d010f
  5adf85ad7ce620a87291f3d4cabcf72fd8d2b91bc50f541fa8
NargString =
  b8cec3a2142ed5c54a25d45364ba64224da03989a3ed7a52b86a1301b936d246
  10f48a666ddbd87883648ad4cde196d8c158cb288b280c7532e3602f6a0c5d15
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
Witness =
  641c3cdcc72c9b3a84b85df5808de5f37cf4489ca15f1cffdfd105b780ec0682
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
Witness =
  641c3cdcc72c9b3a84b85df5808de5f37cf4489ca15f1cffdfd105b780ec0682
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a3
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
Witness =
  4a27c7be9fb7612efe553eb66c7120b978433c35625c00c9c530da6e7214db08
NargString =
  b13432cd2a44f3287e1ee64986f77cfd30bc6e27cb5bb245e5e0d5cd74d7ea59
  d64b17f3e612b0a5790bad93d77ea46291f38f62b25f78dae74200765604f560
  b5b0459b45404eb953e498497a94757841739571c4fa83ba5b27fb2cd9c01c20
  1a4ac38aaf591abd139d65113c0b2a3cb3a7ee334333c3aeb276be865bc882ff
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
Witness =
  4a27c7be9fb7612efe553eb66c7120b978433c35625c00c9c530da6e7214db08
NargString =
  54486ea1d23b4ed1d4f95ac91f40fa886d21e7a1e713995985317a4ca4527948
  0fc8441bb086ca503e23c9f822b929cd95300380f3c8317f1055307be6f9317f
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 =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  98a75ce3f191eebaed9f6a49b445f423ac6ba6dd2caad41ff2d5a05db9531f35
  0d9125914ddacd670af9e851d44c05239482122220076c1aa251a964e649aec8
  3af91fb2660b1e1dd1932353a88020c3ef09a805be4d8af09a094eaf2263695f
Witness =
  513794634e24e09f9eb668c0c1f4dfd6857e303b6b8bc5d08bae5a19e3961ed3
  27b79d17769ee1f8c1d774380a3acdb8d70c96f4869fa17fdcaf7a5729804a12
NargString =
  a35cdeff7ecb8c09e2527e98c6da38d23d8f9ac25affe1be3fec9976428f0b83
  7b8b9c62b8726f4ee3522e59a64e6b405597ff3de7cb4ae1a417c1f08d0639a6
  8ebe8e5bc51ed8a6970015ef1cc351bb24eabe50b56878852d1bde4bfcd6bf0f
  a486f3e222eea874127a330fc28ce05a
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 =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  98a75ce3f191eebaed9f6a49b445f423ac6ba6dd2caad41ff2d5a05db9531f35
  0d9125914ddacd670af9e851d44c05239482122220076c1aa251a964e649aec8
  3af91fb2660b1e1dd1932353a88020c3ef09a805be4d8af09a094eaf2263695f
Witness =
  513794634e24e09f9eb668c0c1f4dfd6857e303b6b8bc5d08bae5a19e3961ed3
  27b79d17769ee1f8c1d774380a3acdb8d70c96f4869fa17fdcaf7a5729804a12
NargString =
  574f37a678d3ba2a0262943f0fb804b79396dc20ed5cd55b06dedd720264dd86
  6135f5eb6141b6fccee7b89180d4ca7e02c8fb0d49547d5005078f10cf0105df
  3308d2f5c16f3f3d6efe0b78f5c385524956a1be8c05d71625e3a3e5ea01aa54
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000007000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000005000000000000000000000000000000
  0000000000000000000000000000000000000001010000000600000000000000
  0000000000000000000000000000000000000000000000000000000192e906e9
  85c25121c422faf4c618bd1a1b9a31a563997e0300fc79a90752ec3423b0b607
  7a8f1efbf89c4feee7e6f55b85fe8aa4926c2c83d53466c50d7e61f51b071708
  e0886e493aec496695ca47ec167c232c892c4dbfb5ab7f62208af10489f0a331
  1573d65bc23cb94ff627e7e5855348e476b5d6a2b7fa4daa31d77c20f7a6f44b
  059d3fe72dde06ec2b3e29f4973cf3101e95d7c046d2984c5bde86e5ca114357
  ef165d2d15018d420aa35a96c109631357d5c2f61997cb3004b5a0d49785c04c
  35f1feccfe251efff48c5dcedfaffbab72620d295c0fce75698a7d07ae46d5f4
  b2f44602f8cb21af77c53e07b3134ce7555cb8088050c52848913e400eb19141
  6af4356dadc545c7e12333ebe29658ab0c3a01d890f9ff0a250bc926
Witness =
  6633fad945a9da933660070571afb1deb184bb2d24f542bdee864493dcb30027
  05f1a4f40164cbbe8b8a33038ad8458afb6b262c0691f7442b1fb2ad253b60c3
NargString =
  93a9baa8ac481ad40ffb0c046c03cc8d05f698c9cce9f24aa004f86d8f2b1756
  304a4c9e213c36b95628c1e606d2f448b5f0c6903de76e160f034500b499cb05
  ea59240e4e616206e444b2f3842a30a78a50ee8551dda8fb532d07b3f9411895
  2267c889108a952e1f9a30660ba533b1c0891ed3d046507a6fbbf7fdc3bca35c
  5035d9683c31fd56c5e98146674b07558e1f2994b9b314aff3ba4000ebf627e0
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000007000000000000000000000000000000000000000000000000000000
  0000000000000001020000000000000005000000000000000000000000000000
  0000000000000000000000000000000000000001010000000600000000000000
  0000000000000000000000000000000000000000000000000000000192e906e9
  85c25121c422faf4c618bd1a1b9a31a563997e0300fc79a90752ec3423b0b607
  7a8f1efbf89c4feee7e6f55b85fe8aa4926c2c83d53466c50d7e61f51b071708
  e0886e493aec496695ca47ec167c232c892c4dbfb5ab7f62208af10489f0a331
  1573d65bc23cb94ff627e7e5855348e476b5d6a2b7fa4daa31d77c20f7a6f44b
  059d3fe72dde06ec2b3e29f4973cf3101e95d7c046d2984c5bde86e5ca114357
  ef165d2d15018d420aa35a96c109631357d5c2f61997cb3004b5a0d49785c04c
  35f1feccfe251efff48c5dcedfaffbab72620d295c0fce75698a7d07ae46d5f4
  b2f44602f8cb21af77c53e07b3134ce7555cb8088050c52848913e400eb19141
  6af4356dadc545c7e12333ebe29658ab0c3a01d890f9ff0a250bc926
Witness =
  6633fad945a9da933660070571afb1deb184bb2d24f542bdee864493dcb30027
  05f1a4f40164cbbe8b8a33038ad8458afb6b262c0691f7442b1fb2ad253b60c3
NargString =
  3c12ee5aa74164a9699993afa265de4f734701e2bf7e52871fe0c46d85ea5332
  016e79f8c0a0e2057d4716afc9ccad6b3662b6142e9446493449c36d6707e4c8
  0e38bc5378a73d3c495a268b95d9db8da1943b2ce498fbc81cfc2045b652563d
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 =
  0100000001000000060000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000004000000000000000000000000000000000000000000000000000000
  0000000000000001030000000500000000000000000000000000000000000000
  00000000000000000000000000000001a1d2f5b67fab08902ded92336405309c
  6b37f32b3e435ed7b0213555f58fa1f55394ddf070c7b2c1ffeb9a4e72043ce3
  a6c3922e0802086d57687391066cf25827154b05982bc17b585272d98ba7a3be
  222acb845fef67fc29ae0e9aae085c7ab40ee516a7d08c3a178c5ff6818c598b
  ed05176adcd57e5ef03fca4d7f3db3a457b47529cd2af4a47845b38e0de2df1d
  b2c01bd2aa2ff4b0cbe41e8b04de59ce28d60849621b7409a19d51c7ef83ca68
  f1d6b1f78665c9735477bb4f354880a0a81862f2e43f3c01765ce2104b0f1f22
  8bc890da4a3ae973d7a14a7584af797b9526062591b1735f4bd01396beaad8ea
Witness =
  28288611c102591a64e5d092e2ce83cc10f8d15f094f1342e7d74bd13b85da56
  148a573a14e1c0c340ed3b0505ef72f3e308410156ed657b6690662bf22b73c6
  393c117132d5a600b63968dfd4b03480b89cf5aff74ec52749a6086b50878c62
  1e6ea7c86713a9e429396b2be43a403ed1d435367f157b9c8370e9f223ba479a
NargString =
  977956f7bad0c7473dfffc0fc9c83e6a875dc84944c8d7e6d43e37111f26b4ce
  1e34dc254886cf4560b5ca988c8b4a11449c6fd5d9601c5fbd14a018e5940351
  647c89107a21ba6fc220b134ec48b7be382f9d655c9822ac1aa4807eb71c24b2
  98e4a1971c047631d60e397b7e982c2164c5d5c94a91cf7913df0902155e3f72
  396afb0422e4dac53bdce18e7f5f9c1762325f28231f631507f2e863bd4561c5
  8bc82f735c039cafb912fe8bd2da47e1
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 =
  0100000001000000060000000000000000000000000000000000000000000000
  0000000000000000000000010400000000000000020000000000000000000000
  0000000000000000000000000000000000000000000000010100000003000000
  0000000000000000000000000000000000000000000000000000000000000001
  0200000004000000000000000000000000000000000000000000000000000000
  0000000000000001030000000500000000000000000000000000000000000000
  00000000000000000000000000000001a1d2f5b67fab08902ded92336405309c
  6b37f32b3e435ed7b0213555f58fa1f55394ddf070c7b2c1ffeb9a4e72043ce3
  a6c3922e0802086d57687391066cf25827154b05982bc17b585272d98ba7a3be
  222acb845fef67fc29ae0e9aae085c7ab40ee516a7d08c3a178c5ff6818c598b
  ed05176adcd57e5ef03fca4d7f3db3a457b47529cd2af4a47845b38e0de2df1d
  b2c01bd2aa2ff4b0cbe41e8b04de59ce28d60849621b7409a19d51c7ef83ca68
  f1d6b1f78665c9735477bb4f354880a0a81862f2e43f3c01765ce2104b0f1f22
  8bc890da4a3ae973d7a14a7584af797b9526062591b1735f4bd01396beaad8ea
Witness =
  28288611c102591a64e5d092e2ce83cc10f8d15f094f1342e7d74bd13b85da56
  148a573a14e1c0c340ed3b0505ef72f3e308410156ed657b6690662bf22b73c6
  393c117132d5a600b63968dfd4b03480b89cf5aff74ec52749a6086b50878c62
  1e6ea7c86713a9e429396b2be43a403ed1d435367f157b9c8370e9f223ba479a
NargString =
  4d9aa10203635029f4b5660d7581ca586b680bb8e4e0dea51a320c9987eb92c1
  247cafafc3a38956eda46d44d5f2c152bd6dd32d4b3949b2ea7e1d478a2c3139
  223cb902c61527fb3b5dbf24c3119f233d1185cfeac53e76ee1d91b469329026
  51206b7d52ec720c8550d99690d12396ccb57c71c9e8aeb8bb08cfe18f4bd177
  1150a1f75523d9be368cd560b653e94d643c7cbfa9cf3f21ebddb16e92ed6842
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000005000000
  0000000000000000000000000000000000000000000000000000000000000001
  0400000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000300000000000000000000000000000000000000
  00000000000000000000000000000001a73aa2551fd1f24865adb5b9a84f63ef
  b8d2cab44fcf21dfa9e587dcabff2a0ffa36a93a82df2027ec32288160f0ebd3
  835f420c8a573cde22b41e8b427fda9427e9ab5d6bca17cdc4d045c8dd37091a
  a7315f499646c01861faf1a96f863776a002ade8d4092fd89a457856e9b7afd6
  cbe26135981799f75042353f6e9a3eabf205e3788417e21d67741f16b69837c5
  86309903b1709ca1b7aca43326415b5bf7e9eb8f259c631913fc55b3a78021cc
  bdfde509aa8168b3d949ef129247cfd9
Witness =
  6f92d7965b9cb245c7656316af218d42c5625f5234bbbd3eba630c9d6f058a76
NargString =
  abc0eca21b6faea727caf039722661724aa0ffa84df6cff0540292c4b339b2cb
  d8a06d8b64846bd48d9f194be457a14785c969bc6583aea3aa84fb9a1be42b90
  3a9de7be864d9f50f3ab7cf4c1fa4465ac65ee456fb7c652048ba4a0658d3ef8
  3932baa472c5fe3123b685602a178184dbc7fb6b370e3d99e96f0538505a0e3f
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000005000000
  0000000000000000000000000000000000000000000000000000000000000001
  0400000000000000000000000000000000000000000000000000000000000000
  0000000101000000000000000300000000000000000000000000000000000000
  00000000000000000000000000000001a73aa2551fd1f24865adb5b9a84f63ef
  b8d2cab44fcf21dfa9e587dcabff2a0ffa36a93a82df2027ec32288160f0ebd3
  835f420c8a573cde22b41e8b427fda9427e9ab5d6bca17cdc4d045c8dd37091a
  a7315f499646c01861faf1a96f863776a002ade8d4092fd89a457856e9b7afd6
  cbe26135981799f75042353f6e9a3eabf205e3788417e21d67741f16b69837c5
  86309903b1709ca1b7aca43326415b5bf7e9eb8f259c631913fc55b3a78021cc
  bdfde509aa8168b3d949ef129247cfd9
Witness =
  6f92d7965b9cb245c7656316af218d42c5625f5234bbbd3eba630c9d6f058a76
NargString =
  07fe88a2053c95ee4a31eaa345759823de788fda4e421afa501f99f1eeee8d45
  2580e6e5f90db9bcfdacd138569f0d34d65e55612e9ffada52f8c8192da67fcf
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000199dab5463df27b0f83b0608d830294a57f53d279
  fd3c5b719bd25ca5bb9a25a57787f6c92bb933ccaa421588ee4554ff8673f08e
  10bee9fe8e7eb4f6a1ef0b60571e84c26710a2d4b0bacf0a49033dc814b2c0c9
  3d1e83025f0d9fde75835ac4b1aa95d5868f12734c8183e2222f3c321bd19403
  802e635dd2c12731e366be9e5e37af51c283afb582fa8a153f494b1c
Witness =
  48775faa1051b0df070268dee5c4163b9635ebecb049f9016f3538423a7d227c
NargString =
  abc30c203650564c3318f34ca0a4140728631799358f1004bff7708e2e0e1c80
  e5d3550cf546bd78734f35c50a0ef599b3f2f83ece52e1d93bdaff1f9344b03f
  c5b0f324f0a397f4ba8d10d7bb954e9ae884eaa07dd11d942f925f14ebdd3e29
  11a3025eb36866da1582915d58453ac0a7417975461551c8e00feea8300a75a1
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  00000000000000000000000199dab5463df27b0f83b0608d830294a57f53d279
  fd3c5b719bd25ca5bb9a25a57787f6c92bb933ccaa421588ee4554ff8673f08e
  10bee9fe8e7eb4f6a1ef0b60571e84c26710a2d4b0bacf0a49033dc814b2c0c9
  3d1e83025f0d9fde75835ac4b1aa95d5868f12734c8183e2222f3c321bd19403
  802e635dd2c12731e366be9e5e37af51c283afb582fa8a153f494b1c
Witness =
  48775faa1051b0df070268dee5c4163b9635ebecb049f9016f3538423a7d227c
NargString =
  480ec4269c8eb04a690a0d7403cfe3691abc6b90d402711b6e648b3e6b7e13c5
  70ca654bad6cf0d4aff13430fbc73c733232c1f54b48220e049364bd97925ed3
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  221df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  9a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f624
  1eabfffeb153ffffb9feffffffffaaaf3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
Expected = reject
]]></artwork>
          <t>The identity commitment decodes successfully, but the verification
equation fails.</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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  c000000000000000000000000000000000000000000000000000000000000000
  000000000000000000000000000000003115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  8000000000000000000000000000000000000000000000000000000000000000
  000000000000000000000000000000003115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  8000000000000000000000000000000000000000000000000000000000000000
  000000000000000000000000000000013115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcba5039d308e6dfdfa0222b201365e5b5d
  db6172e5397491469bbaad735d5041d9
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  9f424194b766297dcece44b127286e59441dfcb1ab94a3f47e1f56241cd3e7a4
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d800
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a3
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
  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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a3
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de81
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  0000000000000000000000000000000000000000000000000000000000000000
  0000000000000000000000000000000000000000000000000000000000000000
Expected = reject
]]></artwork>
          <t>The empty relation, with no equations and no image, is valid.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/empty_relation/batchable/E0
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = empty_relation-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance = 00000000
NargString = ""
Expected = accept
]]></artwork>
          <t>The instance and proof are accepted even though scalar index 1 appears
in no equation.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E1
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag =
  instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  a52f63244810b5e28b235f33df487fce15bc509eac539e19275e1a0c1ae36de1
  79fa412292007a1d6df975de5b8ca0a6a62b428f90a014557c5744b69c6303d0
  db7a9c876dd15743738b432a9dd1cfad79790d101eedee3bb441bccd262db1c0
NargString =
  8a31aa9ace6268707d6a0213fdf4bd9a4231fc4fec35338998a38b5334723d84
  f3c46d55c6ff9104aba7bde3e38b46cd35415233a45b898ad465829ec6e3c86d
  0f5a45255b5fef90d256e8db2a3bcbba66858f9cdea27fe6bc9cfbfe2e4eca09
  bb6d4d55df818226c6bdb9dab30f31522a273883c88ffb850eaaba4771dff310
  13c9967e133f399633cab20cc4e252cc
Expected = accept
]]></artwork>
          <t>Because scalar index 1 is unconstrained, changing <tt>response[1]</tt> in a valid
proof produces another valid proof.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E1b
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag =
  instance_unconstrained_scalar-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010200000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  a52f63244810b5e28b235f33df487fce15bc509eac539e19275e1a0c1ae36de1
  79fa412292007a1d6df975de5b8ca0a6a62b428f90a014557c5744b69c6303d0
  db7a9c876dd15743738b432a9dd1cfad79790d101eedee3bb441bccd262db1c0
NargString =
  8a31aa9ace6268707d6a0213fdf4bd9a4231fc4fec35338998a38b5334723d84
  f3c46d55c6ff9104aba7bde3e38b46cd35415233a45b898ad465829ec6e3c86d
  0f5a45255b5fef90d256e8db2a3bcbba66858f9cdea27fe6bc9cfbfe2e4eca09
  bb6d4d55df818226c6bdb9dab30f31532a273883c88ffb850eaaba4771dff310
  13c9967e133f399633cab20cc4e252cc
Expected = accept
]]></artwork>
          <t>The instance and proof are accepted when the image terms X + (-X) sum to
the identity.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E2
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = instance_trivial_equation-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000002000000020000000000000000000000000000000000000000000000
  0000000000000000000000010300000000000000000000000000000000000000
  0000000000000000000000000000000101000000000000000100000000000000
  00000000000000000000000000000000000000000000000000000001b8d20484
  960f1741eabb4d0dd0c43e72931d646c09440bf1880a1720daaa3308e7634661
  77aa88c313f8a9ad1e406c0e98d20484960f1741eabb4d0dd0c43e72931d646c
  09440bf1880a1720daaa3308e763466177aa88c313f8a9ad1e406c0e
NargString =
  8bf4a4e7cca2a2f88859d0b012289500a49db0b5e4e5df3d778248435ed8b51d
  0fb3ca489c9f45e8811bb4cc8d0096f96ad6f36b97912382f39758d4e9f591a8
  c1d24c1f3d42a2535161c7b7a9c556a3
Expected = accept
]]></artwork>
          <t>An instance containing the identity element is accepted.</t>
          <artwork><![CDATA[
Id = sigma-protocols/bls12381/discrete_logarithm/batchable/E3
Function = SigmaProof
Ciphersuite = sigma-proofs_Shake128_BLS12381
Flavor = batchable
Tag = instance_identity_element-DSFS-with-sigma-proofs_Shake128_BLS12381
Instance =
  0100000001000000030000000000000000000000000000000000000000000000
  0000000000000000000000010200000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  c000000000000000000000000000000000000000000000000000000000000000
  00000000000000000000000000000000b8722b4b2a3cc66976d848739df2bfb6
  6ae371da496a1e239add4646c35c8b8758409ad4b6312b74d4a98bb83284cb87
NargString =
  adc1c8943d8bfa5ab165ff1ed2c0f45f71567a404849da3e0b9fbd37266681c1
  089d6d9b33116aebdab2972d0cb6db130e30cc66fcdf68ad4c1738b178949d26
  13d1da71694e047813cc6ae1fca5233927cda7474b204eb305b1a34bd03641e0
  2c6d7bfc0ebb26b1ad58c6721af9c04d
Expected = accept
]]></artwork>
          <t>Instance validation fails if a term references element index 3 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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000030000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a3
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a3
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  b13432cd2a44f3287e1ee64986f77cfd30bc6e27cb5bb245e5e0d5cd74d7ea59
  d64b17f3e612b0a5790bad93d77ea46291f38f62b25f78dae74200765604f560
  b5b0459b45404eb953e498497a94757841739571c4fa83ba5b27fb2cd9c01c20
  1a4ac38aaf591abd139d65113c0b2a3cb3a7ee334333c3aeb276be865bc882ff
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000030000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000010000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  b13432cd2a44f3287e1ee64986f77cfd30bc6e27cb5bb245e5e0d5cd74d7ea59
  d64b17f3e612b0a5790bad93d77ea46291f38f62b25f78dae74200765604f560
  b5b0459b45404eb953e498497a94757841739571c4fa83ba5b27fb2cd9c01c20
  1a4ac38aaf591abd139d65113c0b2a3cb3a7ee334333c3aeb276be865bc882ff
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 =
  0200000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  0000000000000000000000000000000000000000000000010100000004000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000030000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  54486ea1d23b4ed1d4f95ac91f40fa886d21e7a1e713995985317a4ca4527948
  0fc8441bb086ca503e23c9f822b929cd95300380f3c8317f1055307be6f9317f
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 =
  0200000001000000040000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000030000000000000000000000
  0000000000000000000000000000000000000000000000010100000002000000
  0000000000000000000000000000000000000000000000000000000000000001
  0100000000000000010000000000000000000000000000000000000000000000
  000000000000000000000001b8a52d4f929a5fc9a27b16941d102b632bac0b06
  61265ed04ec9e59d35480f93d4ebefc5af6a06090964444a5ed9abfdac2a3348
  158e801ab8f31490543b66ddf04a103dd0bc7f41194f72b575b62d08900aaf6e
  7ba8f3672c1b7064b19ecf968f3af22d60210b724fc400f8b8e8547a3f82ba01
  7d24199087b0bd1941c21f4c6afa8e1d636914790ee4b80e44908926
NargString =
  54486ea1d23b4ed1d4f95ac91f40fa886d21e7a1e713995985317a4ca4527948
  0fc8441bb086ca503e23c9f822b929cd95300380f3c8317f1055307be6f9317f
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001b94ba65546846b43
  9edbfc9da84c1c2d2af3d0ede8c88ec50fce2e1c3f782e932205982683f0802a
  4dce313610bbb2db
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001b94ba65546846b43
  9edbfc9da84c1c2d2af3d0ede8c88ec50fce2e1c3f782e932205982683f0802a
  4dce313610bbb2db
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a3
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  4db5f29ea248a1ad0a3c952da4f772d6c79feaa1fb574a09cd526ecdf4feacef
  3115f5dd64d080b1cee8d9f92cbc835887a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  b87d072b8238866651b08da8276e9ea30125617a5ac1b7fcb6934f43bdfed513
  4624ffe8040caccc46560bd101c6488849a94d7454a6bbaab6124a4573fb6849
  83886d1d876989f5d218700c99de8195
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  a21df433ede15a7e0bb0d8501e24c6c41ba6c36f387bd9961bcbc1acddda5ece
  0abe8338bef0293d96d924dafd80ddcb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d9
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac58
  6c55e83ff97a1aeffb3af00adb22c6bb3115f5dd64d080b1cee8d9f92cbc8358
  87a3cee2397635479bbaad745d5041d8
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 =
  0100000001000000020000000000000000000000000000000000000000000000
  0000000000000000000000010100000000000000010000000000000000000000
  000000000000000000000000000000000000000000000001ac2de2d5ca1310a4
  3b8c5adee4632e69c117edbc6c0e9a259efbefd6e5aedc86a4185f06e74a63bf
  a648c1c4e8b4b444
NargString =
  2b549a418dc8ac359b946ca91d869653f06058aeab9647f57e1f56251cd3e7a4
  49a94d7454a6bbaab6124a4573fb684983886d1d876989f5d218700c99de8195
Expected = reject
]]></artwork>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
+4o6enqVMH6bZL75Vbt7SZO9xMhgPWpatQ1VPUnJmcnYD4AewX2eA2FdYtpz
363aYk7akQp+AsDmqytFhu0lfW1N5XdOb2e5bl0I9fWwdkqXJTgmX+c9onTT
VxG/ZqzsVlvU6j52nVRJsDBtDOg7c0mqns0xHWgvzaUOGgGO9/RSBABiiYkK
3gIln2l6XdKG+nKNmkTtUsWE9a1h5Ua1stDo9LlMYHNerbZnaGBbTXIMKNRg
DW5Qs9frsUffQbuv3ui6zCfylJESAUfUOKDsXj6tLj/HpAP0hdnrnVs7W8H0
nBLWso1t8ur6c5M/gQl8+hxURH55WS51u5r2BW4X3OzfXMzR7qrAGUWmCdTI
eWrfbSPsovyFFFiVh01IiO2Ytpf2vWmWeCFv9rmo8mMMQ6uBdPM/UVMnkKJc
5gNrIXRL3RWZzuecJfAPnBneut5Tq9YUdR33pvfmK7LcK6AlrCFZYifYhhWk
8mqlyVbxWNPaBJ6TVWU3CWm6a3FNJZ+dqa0z6zoTePfY0lobSu4tx1T1GXQ6
R2nD49oict4Lp48ST1O5vzoDT2zRytxgq8YrNECsGgjncKnYiwWl5apq4diR
bpLAt4YSFlrVsxq2QjUhYvnitA5V3+m3ZY9Ja5l4VT3KC9Wmub2+jx//KC5W
aV2vltMnSUQk+ErUtRvozlrXsHSTOW7x7oODqSFtNEGbnBau+dANK02jWiqs
aleEmAO3Sxk+487Dlq98pynbjhPcauNku8OVK17dRr23YA8w6fsHQ9/1/aGf
jKOI4NUyqDSbtg77C66fHjkPEFiUebucqzvUSf3su0ya7iGrWzc76LtG9E56
c7K3S2CSwCG5SwiLPtXB7Pnv8VaC3x+Zrrjq6mmY9CFfvEwX1lyogh1SZMnw
Za1Ql+5wikTTpW49FwjPD5uhddsCTgnge6Z0swEjChUG7t4+bXF/NonIc9G6
F3pge6w2XGGmb+xWN318y4DGZ+dyY91rswOnq13YPHA7wIEPDHSeznQ3K70L
UFVFXff6dPcrqulWd+aVfRdHqWYaVm2A3NzW9yJQmGAL6N66wm6nIfPeRF68
xMa78+vpr86/Of7fhv7Ybe7ntUtO+kvfTpuWVvREl6Me0vVQ2C0FFIumz7++
KfjImPKwYzgHlRbT7JS4WE13w2PFJIK7EbmAToYlKtnKDtYVfIxcGxjQvCmr
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
JKk2y7BKFcGOUvbDJD3dPIamIuzMTkcdtvEJ93UIizS6a2eGb7eJWdm7sKE1
q1jm4z0/bbyqF3Ox3X/xtdPyeu/ONVxuJVrueS79fs1M60kSMRo9Uk/0KBEu
zJg6lLPV2C6xhegzPJXHXQtsoBnWW6olN1iD0VlNdaClbHkgH87qnu7mWhbG
gyPMijJfJKLYMgfjn3ZZuDZdL2niPw+JcZ90FFMCxvMU1aupfyLvDktbzPz1
MJrFsdHXJ8dn71ZqZEu72OXm2nS9KLsIVcfOQk7aNGdcHImZGcUHW5xTw8QI
2+lJmy7V2gLsh/bIzoN0pTZVqw2fXXpfSUy6ySYWJ463URl/2mnv+83eL84A
ttTe4Qm1994//dOGCfLj//yLNjbpRZ20ejiffvqFx4unPL2Lebc86jg/r6rG
fO2Ttlibg4sjhONgIUl+vv1+P//LomTbf16kIZhf7sOrVbW2/3F0/P5QOvQL
jzefT9vZ+bS9VDh+oXn+0t4cHZ+cnOeh2Xt9wLwp6Jd8KG/fHfLo9Owf/zg8
OJJy8upteffLL7cZ96pPT+WpVqNyqYLltVs9qi87v+XlGpY1F83iqLEYZRPL
pgK1MwTzkOgFM9NKCkO1GmJWNdagk1am2gHm32OKLwEdSoOHMjBhmKdWhVET
FsYNcBBxATYXctM6Sq8tNCUZdp5lVBkdzq5IbzBsp5MfKkh0JdhKgAEGwH6b
k1RdBRu8VKkxON1s662BLOZqS3I1+T58UqmLHzbCGbqU0SM/dBujj66VrzEp
aSokcxWLgEJ9OAukEdawFFWr6skrlldHp50GJDUbhk2x9pwDcK02zfqPvXiZ
8h+oUiVZm/BcymTb85S1oRcgoeq9VaunwpM9uK6SqrqJsA5kNmgpWc9AkcQt
IRFjGXPiXcysoNsjPL5XTve0aUf5mVv89m75vva+tePeYO0peF29qFhkuJCg
V7KlOWfoFcsSpzBz3V1lveQ6GiadwI8VzusiGtNuZ+3PwdpN9S6zE+hMadbn
ml1oJcPEQg4eZCcon4qUmgNouY+ihw/GayhSvEk7hYWV7GiaeAJaKYAdL9r5
aEcNyeUEmRtAuVMMoDCwe6NTVKrl3CXpvPHgxu+Xc/XV+VydokAOD04/XjLi
KYPJorb1jLWt9765sRT2t3ez2UP5r6fzy2h8ywjTTdZYfIussVtySqCIXTvx
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
31qvFnlbt9W2stW9b26wzAd7xVXdtx9vKX74mYrMPEEZmZ2FPXQpZTgm7XY1
hmBy7A1W41zVhhvMPB+JCT5a1aVmV+xwy1Itblmqhb18zFItny6QeHwkLD0N
n4MnUB+UmuxiYo/v3skRjej0GDJvUTV0mjDbu6bf7VzTXa6vyXC+jIpmSt3P
upZ2s4hHoFGdnmDiluXyP22P1vYIBvVAL7QzqPMGdwb1+Q3q2bqqFbt7qKPa
sTv1Em3qORTi41g9Jyd0bio7IfSpa2cqn9FU7mEjywX0cnj46u9ycryaPguD
+e3sfHVhCjldrQzulROZ8ePbGs7vdz7mU9fXZDj37OUjPOj1Jm6JtJC3704/
ngeGLyO/j47XUh3TSPCLg7fltXxPdzN5n7sdG2Xj+6vG1/TNT+pJBcrl+z5E
nJyP+aXXOfvNb24Ltz8PbeeQLbwzQWXxMXxDWOH69M3x2es3y1zR+EqXDzM9
Md5yMt87OFof/O2F5E/6KQcac3P1zPu4C2YL+fyR9P3F4z2WLPwy6uOsmn7U
+jg8Owhsci5pVb2YVI31w1powRRHgxaszas85U7JorOJXnRRUH5iA6Qi45Pz
AG4Zk1kAp+ge+sjRd/EAPxZyK8FUFsNi5LN23sfmo3M18Pimsl1NS/yx5AbH
3LvGH22EiHTWlIyf24AAzJGpWCBGIU/F1sp6gK11E0xnDvdr24zMoFxyaRJM
gJOPPRTmZBqdCVvAM5jBjSmTwTQgWHPGF1LFP11kPS9C97BMPut9C2NkrVxh
iFsXy/yxYCYsE6m9sUyKVBO+313gyRppQSyQnBsXaniWMfS+MiUTHsD4AMXL
qq0Qz9DTIXkMS+tSDCPpastt1CFGnGDkGBZfa+gOvegj6WRMaKH2yth+q4bF
/Q2+CVqDO6YxKuS6gPcUFyPEPBMnM9TOguEERpPbYfEva1upRjW4FONNa5sQ
50f04WwuV5EEAH3JFL8n3zl6zZG/2AXV3AU9uqytiVj9rAkR/3g6xrMmMx4D
ieoOitaNewdFOyj6jFBknxCK7kJ+3r+RhSybiOTsVE7ezmd/nX03++bVX7+d
zc/ezk6P907XYn8fAXLMk7LMc7zBZPrbQTncX9G2bbHmivXe9boNax4vW8an
BNrDsUYzy4Zyk0nloIaOjmHo1XXVu2rOSjSZeWOZ/SI7p+rQzDeoo1G9FCa/
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
HvP/D/UFMdfAkwIA

-->

</rfc>
