<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-irtf-cfrg-bbs-blind-signatures-05" submissionType="IETF" category="info" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="Blind BBS Signatures">Blind BBS Signatures</title><seriesInfo value="draft-irtf-cfrg-bbs-blind-signatures-05" stream="IETF" status="informational" name="Internet-Draft"></seriesInfo>
<author initials="V." surname="Kalos" fullname="Vasilis Kalos"><organization>MATTR</organization><address><postal><street></street>
</postal><email>vasilis.kalos@mattr.global</email>
</address></author><author initials="G." surname="Bernstein" fullname="Greg M. Bernstein"><organization>Grotto Networking</organization><address><postal><street></street>
</postal><email>gregb@grotto-networking.com</email>
</address></author><date/>
<area>Internet</area>
<workgroup>CFRG</workgroup>

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

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>Blind signatures are cryptographic protocols that allow for a signer to create a signature over content without actually knowing the content. They form a useful cryptographic primitive particularly in situations that are privacy sensitive. The concept has existed for quite some time and is well explained in Chaum's 1985 popular article &quot;Security without identification: transaction systems to make big brother obsolete&quot; <xref target="Chaum85"></xref>. In <xref target="RFC9474"></xref>, &quot;RSA Blind Signatures&quot;, the RSA signature scheme was extended to provide for blind signing. In this document the BBS digital signature scheme, as defined in <xref target="I-D.irtf-cfrg-bbs-signatures"></xref>, is extended to provide blind BBS signatures.</t>
<t>Like BBS signatures blind BBS signatures work with a three party model of <em>Signer</em>, <em>Prover</em>, and <em>Verifier</em>. The blind BBS protocol defined here has the following useful properties:</t>

<ol spacing="compact">
<li>Provides a signature over an ordered set of messages from the <em>Prover</em> that are kept secret from the <em>Signer</em> via a statistically hiding cryptographic commitment.</li>
<li>The <em>Signer</em> will produce a signature for the <em>Prover</em>, only if the later can prove knowledge of the set of messages they choose. This will be done through a zero-knowledge proof-of-knowledge of the ordered set of secret <em>Prover</em> messages. The <em>Signer</em> will not issue a signature without this proof of knowledge.</li>
<li>The Blind BBS signature produced is of the same size as current BBS signatures based on the same elliptic curve.</li>
<li>In addition to the <em>Prover</em> provided secret messages, the <em>Signer</em> can optionally sign over an additional ordered set of messages of their choosing. This is sometimes know as a &quot;partially blind&quot; signature.</li>
<li>Using the Blind BBS signature created by the <em>Signer</em> the <em>Prover</em> can disclose any subset of both the secret <em>Prover</em> messages or the <em>Signer</em>'s messages and prove that these were in the signed sets.</li>
<li>Without knowledge of the ordered set of secret messages no selective disclosure proof can be generated even solely for a subset of the <em>Signer</em> messages. (within the security assumptions of the BBS signature scheme).</li>
</ol>
<t>While the core BBS protocol allows a prover to either disclose or withhold a message from a verifier, this specification allows for <strong>committed disclosure</strong> of a message <xref target="Vision2025"></xref>. In this case, the prover provides a commitment (computationally binding and perfectly hiding) to the message along with proof that the commitment corresponds to a particular message in the signature. This enables a prover to demonstrate properties of credential attributes without revealing the underlying attribute values.</t>
<t>The idea behind this committed-disclosure extension for BBS is that it also accommodates further zero-knowledge proof (ZKP) extensions for predicate proofs -- e.g. range proofs or different pseudonyms -- in a modular, plug-and-play style. Such extensions are out of scope of this specification.</t>

<section anchor="blind-bbs-protocol-overview"><name>Blind BBS Protocol Overview</name>
<t>The presented protocol, compared to the scheme defined in <xref target="I-D.irtf-cfrg-bbs-signatures"></xref>, introduces an additional communication step between the <em>Prover</em> and the <em>Signer</em>. An overview of the protocol is given below.</t>

<ol spacing="compact">
<li>The <em>Prover</em> will start by constructing a &quot;hiding&quot; commitment to the ordered set of messages they want to get a signature on (i.e., a commitment which reveals no information about the committed values), together with a proof of correctness of that commitment.</li>
<li>The <em>Prover</em> will send the (commitment, proof) pair to the <em>Signer</em>, who, upon receiving the pair, will attempt to verify the commitment's proof of correctness.</li>
<li>If successful, they will use it in generating a blind BBS signature over the messages committed by the <em>Prover</em>, including the <em>Signer</em>'s own messages if any.</li>
<li>The <em>Signer</em> will send the blind signature along with its additional ordered messages (if any) to the <em>Prover</em></li>
<li>The <em>Prover</em> can choose to selectively disclose or commit to any subset of either its own messages, kept secret from the <em>Signer</em> and messages provided by the <em>Signer</em> in the signature. They also furnish a ZKP that the these disclosed messages were included in the signature.</li>
<li>The <em>Verifier</em> verifies the proof received from the <em>Prover</em> based on the <em>Signer</em>'s public key.</li>
</ol>
<t>Note: Cryptographic <em>commitments</em> are used for two distinct purposes in this specification. One, as a mechanism for the prover to get a blind signature from an signer, i.e., the prover is getting a signature over some data it is not revealing to the signer. And, two, as mechanism to furnish less information from the prover to the verifier by providing a commitment along with a ZKP about that commitment.  For example, instead of providing a date of birth, the prover provides a commitment to that date of birth along with ZKP that indicates that the provers age lies in a particular range.</t>
<t>Below is a basic diagram describing the main entities involved in the scheme.</t>
<figure><name>Basic diagram capturing the main entities involved in using the scheme.
</name>
<sourcecode type="ascii-art"><![CDATA[ (3) Blind Sign                                          (1) Commit
     +-----                                                +-----
     |    |                                                |    |
     |    |                                                |    |
     |   \ /                                               |   \ /
  +----------+                                          +-----------+
  |          |                                          |           |
  |          |                                          |           |
  |          |<-(2)* Commitment + Proof of Correctness--|           |
  |  Signer  |                                          |   Prover  |
  |          |--(4)* Send signature + msgs + coms------>|           |
  |          |                                          |           |
  |          |                                          |           |
  +----------+                                          +-----------+
                                                              |
                                                              |
                                                              |
                                                      (5)* Send proof
                                                              +
                                                       disclosed msgs
                                                              |
                                                              |
                                                             \ /
                                                        +-----------+
                                                        |           |
                                                        |           |
                                                        |           |
                                                        |  Verifier |
                                                        |           |
                                                        |           |
                                                        |           |
                                                        +-----------+
                                                           |   / \
                                                           |    |
                                                           |    |
                                                           +-----
                                                      (6) ProofVerify
]]></sourcecode>
</figure>
<t><strong>Note</strong> The protocols implied by the items annotated by an asterisk are out of scope for this specification</t>
<t>This document, in addition to defining the operation for creating and verifying a commitment, also details a core signature generation operation, different from the one presented in <xref target="I-D.irtf-cfrg-bbs-signatures"></xref>, meant to handle the computation of the blind signature. The document will also define a new BBS Interface, which is needed to handle the different inputs, i.e., messages committed by the <em>Prover</em> or chosen by the Signer etc.. The signature verification and proof generation and verification core cryptographic operations however, will work as described in <xref target="I-D.irtf-cfrg-bbs-signatures"></xref>.</t>
</section>

<section anchor="example-blind-bbs-applications"><name>Example Blind BBS Applications</name>
<t>By allowing the <em>Prover</em> to acquire a valid signature over messages not known to the Signer, blind signatures address some limitations of their plain digital signature counterparts. In the BBS Signature scheme, knowledge of a valid signature and set of signed messages allows generation of BBS proofs. As a result, a signature compromise (for example by a Signer database leakage, a phishing attack etc.,) can lead to impersonation of the <em>Prover</em> by malicious actors (especially in cases involving &quot;long-lived&quot; signatures, as in digital credentials applications etc.,). Using Blind BBS Signatures on the other hand, the <em>Prover</em> can commit to a secret message (for example, a private key) before issuance, guaranteeing that no one will be able to generate a valid BBS proof without knowledge of that secret message.</t>
<t>Furthermore, applications like Privacy Pass (<xref target="I-D.ietf-privacypass-protocol"></xref>) may require a signature to be &quot;scoped&quot; to a specific audience or session (as to require &quot;fresh&quot; signatures for different sessions etc.,). However, simply sending an audience or session identifier to the Signer (to be included in the signature), will compromise the privacy guarantees that these applications try to enforce. Using blind signing, the Prover will be able to require signatures bound to those values, without having to reveal them to the Signer.</t>
</section>

<section anchor="example-committed-disclosure-applications"><name>Example Committed Disclosure Applications</name>
<t>Privacy is enhanced via the <strong>committed disclosure</strong> mechanism along with an external ZKP proof of some predicate. In this case rather than selectively disclosing a signed message to the verifier the prover provides a (computationally binding and perfectly hiding) commitment along with a ZKP concerning some aspect (the predicate) of the committed value.</t>
<t>For an example, consider a prover who must demonstrate that they are over 18 years old. Rather than revealing the credential attribute containing their date of birth, the prover generates a proof consisting of:</t>

<ol spacing="compact">
<li>A BBS presentation proof according to step 5 of <xref target="blind-bbs-protocol-overview"></xref>, in which the corresponding attribute remains hidden,</li>
<li>The commitment <tt>C</tt> as part of the above proof,</li>
<li>A proof of knowledge of the opening of <tt>C</tt>, together with a proof that the committed value is equal to the hidden message contained in the BBS signature,</li>
<li>An additional range proof <tt>P</tt> showing that the committed birth date in <tt>C</tt> corresponds to an age greater than or equal to 18.</li>
</ol>
<t>The generation of predicate proofs (item 4) is outside the scope of this specification. However, this specification defines:</t>

<ul spacing="compact">
<li>How Pedersen commitments are generated for attributes subject to predicates (item 2),</li>
<li>How equality proofs between committed values and credential attributes are constructed (item 3).</li>
</ul>
<t>For this reason, the <tt>BlindProofGen</tt> procedure outputs, in addition to the proof <tt>proof</tt> sent to the verifier, the tuple <tt>add_zkp_info</tt>, containing the committed messages and the opening information required to reconstruct Pedersen commitments. This information is never sent to the verifier. Instead, it is retained by the prover and later used to generate predicate proofs.</t>
<t>Committed disclosure allows for the modular addition of proving possession of a device key, range proofs, and pseudonyms as discussed in <xref target="Vision2025"></xref>. These would all be implemented as an additional predicate ZKP along with the committed disclosure ZKP specified here.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>Terminology defined by <xref target="I-D.irtf-cfrg-bbs-signatures"></xref> applies to this draft.</t>
<t>Additionally, the following terminology is used throughout this document:</t>

<dl spacing="compact">
<dt>blind_signature</dt>
<dd>The blind digital signature output.</dd>
<dt>commitment</dt>
<dd>A point of G1, representing a Pedersen commitment (<xref target="P91"></xref>) constructed over a vector of messages, as described e.g., in <xref target="BG18"></xref>.</dd>
<dt>committed_messages</dt>
<dd>A list of messages committed by the Prover to a commitment.</dd>
<dt>commitment_proof</dt>
<dd>A zero knowledge proof of correctness of a commitment, consisting of a scalar value, a possibly empty set of scalars (of length equal to the number of committed_messages, see above) and another scalar, in that order.</dd>
<dt>secret_prover_blind</dt>
<dd>A random scalar used to blind (i.e., randomize) the commitment constructed by the prover.</dd>
<dt>signer_blind</dt>
<dd>A random scalar used by the signer to optionally re-blind the received commitment.</dd>
<dt>NONE</dt>
<dd>An empty function input indicator, used to specify that one of the OPTIONAL inputs of a procedure is not provided by the calling operation.</dd>
</dl>
</section>

<section anchor="notation"><name>Notation</name>
<t>Notation defined by <xref target="I-D.irtf-cfrg-bbs-signatures"></xref> applies to this draft.</t>
<t>Additionally, the following notation and primitives are used:</t>

<dl spacing="compact">
<dt>list.append(elements)</dt>
<dd>Append either a single element or a list of elements to the end of a list, maintaining the same order of the list's elements as well as the appended elements. For example, given <tt>list = [a, b, c]</tt> and <tt>elements = [d, a]</tt>, the result of <tt>list.append(elements)</tt> will be <tt>[a, b, c, d, a]</tt>.</dd>
</dl>
</section>
</section>

<section anchor="conventions"><name>Conventions</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they appear in all capitals, as shown here.</t>
</section>

<section anchor="bbs-signature-scheme-operations"><name>BBS Signature Scheme Operations</name>
<t>This document makes use of various operations defined by the BBS Signature Scheme document <xref target="I-D.irtf-cfrg-bbs-signatures"></xref>. For clarity, whenever an operation will be used defined in <xref target="I-D.irtf-cfrg-bbs-signatures"></xref>, it will be prefixed by &quot;BBS.&quot; (e.g., &quot;BBS.CoreVerify&quot; etc.). More specifically, the operations used are the following:</t>

<ul spacing="compact">
<li><tt>BBS.octets_to_point_E1</tt>: Refers to the <tt>octets_to_point_E1</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="1.2"></xref>.</li>
<li><tt>BBS.CoreVerify</tt>: Refers to the <tt>CoreVerify</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="3.6.2"></xref>.</li>
<li><tt>BBS.ProofInit</tt>: Refers to the <tt>ProofInit</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="3.7.2"></xref>.</li>
<li><tt>BBS.ProofFinalize</tt>: Refers to the <tt>ProofFinalize</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="3.7.3"></xref>.</li>
<li><tt>BBS.ProofVerifyInit</tt>: Refers to the <tt>ProofVerifyInit</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="3.7.4"></xref>.</li>
<li><tt>BBS.create_generators</tt>: Refers to the <tt>create_generators</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.1.1"></xref>.</li>
<li><tt>BBS.calculate_random_scalars</tt>: Refers to the <tt>calculate_random_scalars</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.1"></xref>.</li>
<li><tt>BBS.hash_to_scalar</tt>: Refers to the <tt>hash_to_scalar</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.2"></xref>.</li>
<li><tt>BBS.calculate_domain</tt>: Refers to the <tt>calculate_domain</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.3"></xref>.</li>
<li><tt>BBS.serialize</tt>: Refers to the <tt>serialize</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.5.1"></xref>.</li>
<li><tt>BBS.signature_to_octets</tt>: Refers to the <tt>signature_to_octets</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.5.2"></xref>.</li>
<li><tt>BBS.octets_to_signature</tt>: Refers to the <tt>octets_to_signature</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.5.3"></xref>.</li>
<li><tt>BBS.octets_to_proof</tt>: Refers to the <tt>octets_to_proof</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.5.5"></xref>.</li>
<li><tt>BBS.octets_to_pubkey</tt>: Refers to the <tt>octets_to_pubkey</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.2.5.6"></xref>.</li>
</ul>
</section>

<section anchor="scheme-definition"><name>Scheme Definition</name>

<section anchor="commitment-operations"><name>Commitment Operations</name>

<section anchor="commitment-computation"><name>Commitment Computation</name>
<t>This operation is used by the Prover to create a <tt>commitment</tt> to a set of messages (<tt>committed_messages</tt>), that they intend to include in the blind signature. Note that this operation returns both the serialized combination of the commitment and its proof of correctness (<tt>commitment_with_proof</tt>), as well as the random scalar used to blind the commitment (<tt>secret_prover_blind</tt>).</t>

<artwork><![CDATA[(commitment_with_proof, secret_prover_blind) = Commit(
                                                   committed_messages,
                                                   api_id)

Inputs:

- committed_messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not supplied
                    it defaults to the empty array ("()").
- api_id (OPTIONAL), octet string. If not supplied it defaults to the
                     empty octet string ("").

Outputs:

- (commitment_with_proof, secret_prover_blind), a tuple comprising from
                                                an octet string and a
                                                random scalar in that
                                                order.

Procedure:

1. committed_message_scalars = messages_to_scalars(
                                             committed_messages, api_id)

2. blind_generators = BBS.create_generators(
                                  length(committed_message_scalars) + 1,
                                  "BLIND_" || api_id)

3. return CoreCommit(blind_generators,
                             committed_message_scalars, api_id)
]]></artwork>
</section>

<section anchor="commitment-validation-and-deserialization"><name>Commitment Validation and Deserialization</name>
<t>The following is a helper operation used by the <tt>BlindSign</tt> procedure (<xref target="blind-signature-generation"></xref>) to validate an optional commitment. If a <tt>commitment</tt> is not supplied, or if it is the <tt>Identity_G1</tt>, the following operation will return the <tt>Identity_G1</tt> as the &quot;default&quot; commitment point, which will be ignored by all computations during <tt>BlindSign</tt>.</t>

<artwork><![CDATA[commitment = deserialize_and_validate_commit(commitment_with_proof,
                                               blind_generators, api_id)

Inputs:

- commitment_with_proof (OPTIONAL), octet string. If it is not supplied
                                    it defaults to the empty octet
                                    string ("").
- blind_generators (OPTIONAL), vector of points of G1. If it is not
                               supplied it defaults to the empty set
                               ("()").
- api_id (OPTIONAL), octet string. If not supplied it defaults to the
                     empty octet string ("").

Outputs:

- commitment, a point of G1; or INVALID.

Procedure:

1. if commitment_with_proof is the empty string (""), return Identity_G1

2. com_res = octets_to_commitment_with_proof(commitment_with_proof)
3. if com_res is INVALID, return INVALID

4. (commitment, commitment_proof) = com_res
5. if length(commitment_proof[1]) + 1 != length(blind_generators),
                                                          return INVALID

6. validation_res = CoreCommitVerify(commitment, commitment_proof,
                                               blind_generators, api_id)
7. if validation_res is INVALID, return INVALID
8. return commitment
]]></artwork>
</section>
</section>

<section anchor="blind-bbs-signatures-interface"><name>Blind BBS Signatures Interface</name>
<t>The following section defines a BBS Interface for blind BBS signatures. The identifier of the Interface is defined as <tt>ciphersuite_id || BLIND_H2G_HM2S_</tt>, where <tt>ciphersuite_id</tt> is the unique identifier of the BBS ciphersuite used, as defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="6"></xref>. Each BBS Interface MUST define operations to map the input messages to scalar values and to create the generator set, required by the core operations. The input messages to the defined Interface will be mapped to scalars using the <tt>messages_to_scalars</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.1.2"></xref>. The generators will be created using the <tt>create_generators</tt> operation defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="4.1.1"></xref>.</t>
<t>Other than the <tt>BlindSign</tt> operation defined in <xref target="blind-signature-generation"></xref>, which uses the <tt>FinalizeBlindSign</tt> procedure, defined in <xref target="finalize-blind-sign"></xref>, all other interface operations defined in this section use the core operations defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="3.6"></xref>.</t>

<section anchor="blind-signature-generation"><name>Blind Signature Generation</name>
<t>This operation returns a BBS blind signature from a secret key (SK), over a <tt>header</tt>, a set of <tt>messages</tt> and optionally a commitment value (see <xref target="terminology"></xref>). If supplied, the commitment value must be accompanied by its proof of correctness (<tt>commitment_with_proof</tt>, as outputted by the <tt>Commit</tt> operation defined in <xref target="commitment-computation"></xref>).</t>
<t>The <tt>BlindSign</tt> operation makes use of the <tt>FinalizeBlindSign</tt> procedure defined in <xref target="finalize-blind-sign"></xref> and the <tt>B_calculate</tt> procedure defined in <xref target="calculate-b-value"></xref>. The <tt>B_calculate</tt> is defined to return an array of elements, to establish extendability of the scheme by allowing the <tt>B_calculate</tt> operation to return more elements than just the point to be signed.</t>

<artwork><![CDATA[blind_signature = BlindSign(SK, PK, commitment_with_proof, header,
                                                               messages)

Inputs:

- SK (REQUIRED), a secret key in the form outputted by the KeyGen
                 operation.
- PK (REQUIRED), an octet string of the form outputted by SkToPk
                 provided the above SK as input.
- commitment_with_proof (OPTIONAL), an octet string, representing a
                                    serialized commitment and
                                    commitment_proof, as the first
                                    element outputted by the Commit
                                    operation. If not supplied, it
                                    defaults to the empty string ("").
- header (OPTIONAL), an octet string containing context and application
                     specific information. If not supplied, it defaults
                     to an empty string ("").
- messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not supplied, it
                    defaults to the empty array ("()").

Parameters:

- api_id, the octet string ciphersuite_id || "BLIND_H2G_HM2S_", where
          ciphersuite_id is defined by the ciphersuite and
          "BLIND_H2G_HM2S_"is an ASCII string composed of 15 bytes.
- (octet_point_length, octet_scalar_length), defined by the ciphersuite.

Outputs:

- blind_signature, a blind signature encoded as an octet string; or
                   INVALID.


Deserialization:

1. L = length(messages)

// calculate the number of blind generators used by the commitment,
// if any.
2. M = length(commitment_with_proof)
3. if M != 0, M = M - octet_point_length - 2 * octet_scalar_length
4. M = M / octet_scalar_length
5. if M < 0, return INVALID

Procedure:

1.  generators = BBS.create_generators(L + 1, api_id)
2.  blind_generators = BBS.create_generators(M + 1, "BLIND_" || api_id)

3.  commitment = deserialize_and_validate_commit(commitment_with_proof,
                                               blind_generators, api_id)
4.  if commitment is INVALID, return INVALID

5.  message_scalars = messages_to_scalars(messages, api_id)

6.  res = B_calculate(PK, generators, blind_generators, commitment, message_scalars, header, api_id)
7.  if res is INVALID, return INVALID
8.  (B) = res

9.  blind_sig = FinalizeBlindSign(SK, B, api_id)
10. if blind_sig is INVALID, return INVALID
11. return blind_sig
]]></artwork>
</section>

<section anchor="blind-signature-verification"><name>Blind Signature Verification</name>
<t>This operation validates a blind BBS signature (<tt>signature</tt>), given the Signer's public key (<tt>PK</tt>), a header (<tt>header</tt>), a set of messages (<tt>messages</tt>), including first the messages chosen by the Issuer and then the ones chosen (and committed to) by the Prover and if used, the <tt>secret_prover_blind</tt> as returned by the <tt>Commit</tt> operation (<xref target="commitment-computation"></xref>).</t>
<t>This operation makes use of the <tt>CoreVerify</tt> operation as defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="3.6.2"></xref>.</t>

<artwork><![CDATA[result = VerifyBlindSign(PK, signature, header, messages,
                          blind_messages, secret_prover_blind)

Inputs:

- PK (REQUIRED), an octet string of the form outputted by the SkToPk
                 operation.
- signature (REQUIRED), an octet string of the form outputted by the
                        Sign operation.
- header (OPTIONAL), an octet string containing context and application
                     specific information. If not supplied, it defaults
                     to an empty string.
- messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not supplied, it
                    defaults to the empty array "()".
- blind_messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not supplied, it
                    defaults to the empty array "()".
- secret_prover_blind (OPTIONAL), a scalar value. If not supplied it
                                  defaults to zero "0".


Parameters:

- api_id, the octet string ciphersuite_id || "BLIND_H2G_HM2S_", where
          ciphersuite_id is defined by the ciphersuite and
          "BLIND_H2G_HM2S_"is an ASCII string composed of 15 bytes.

Outputs:

- result: either VALID or INVALID

Deserialization:

1. L = length(messages)
2. M = length(blind_messages)

Procedure:

1. generators = BBS.create_generators(L + 1, api_id)
2. blind_generators = BBS.create_generators(M + 1, "BLIND_" || api_id)

3. signer_scalars = messages_to_scalars(messages, api_id)

4. committed_message_scalars = messages_to_scalars(blind_messages,
                    api_id)

5. proof_scalars = signer_scalars.append(secret_prover_blind)
                                          .append(committed_message_scalars)

6. res = BBS.CoreVerify(PK,
                        signature,
                        generators.append(blind_generators),
                        header,
                        proof_scalars,
                        api_id)
7. return res
]]></artwork>
</section>

<section anchor="proof-generation"><name>Proof Generation</name>
<t>This operation creates a BBS proof, which is a zero-knowledge, proof-of-knowledge, of a BBS signature, while optionally disclosing any subset of the signed messages (either chosen by the Issuer or committed by the Prover). In addition, this operation can generate commitments to un-revealed messages and include with the BBS proof that these commitments correspond to specific un-revealed messages. These commitments can be used in subsequent ZKPs outside the scope of this specification .</t>
<t>When this operation furnishes disclosed commitment values it will also return an additional bundle of information for use in external ZKPs <xref target="Vision2025"></xref>.  This <em>add_zkp_info</em> includes the committed message scalars and the random scalars, from these the disclosed commitments may be recomputed. The  <em>add_zkp_info</em>  should never be exposed, i.e., it is NOT to be sent to the verifier. The <em>add_zkp_info</em> structure has the following form:</t>

<artwork><![CDATA[add_zkp_info = {
  committed_message_scalars: (REQUIRED) Array of Scalars,
  commitment_rands: (REQUIRED) Array of Scalars
}
]]></artwork>
<t>The operation will accept two sets of messages: <tt>issuer_messages</tt> from the issuer and the blind signed messages <tt>blind_messages</tt> from the prover.</t>
<t>Furthermore, the operation also expects the <tt>secret_prover_blind</tt> (as returned from the <tt>Commit</tt> operation defined in <xref target="commitment-computation"></xref>) value. If the BBS signature is generated using a commitment value, then the <tt>secret_prover_blind</tt> returned by the <tt>Commit</tt> operation used to generate the commitment should be provided to the <tt>ProofGen</tt> operation (otherwise the resulting proof will be invalid).</t>
<t>This operation makes use of the <tt>CoreProofGen</tt> operation as defined in <xref target="core-proof-generation"></xref>.</t>
<t>The operation will also accept two arrays that indicate the intended handling of each message, <tt>issuer_message_disclosures</tt> and  <tt>blind_message_disclosures</tt> respectively. Each entry corresponds to an issuer or blind message and can take one of the three values <tt>DISCLOSE</tt>, <tt>HIDE</tt> and <tt>COMMIT</tt>. A <tt>DISCLOSE</tt> value indicates that <tt>messages[i]</tt> will be revealed to the Verifier. Correspondingly, a <tt>HIDE</tt> value indicates that <tt>messages[i]</tt> will not be disclosed to the Verifier. Finally, a <tt>COMMIT</tt> value indicates that only a commitment to <tt>messages[i]</tt> will be disclosed to the Verifier, where  <tt>messages[i]</tt> is either <tt>issuer_messages</tt> or <tt>blind_messages</tt>.</t>
<t>An example of the <tt>issuer_message_disclosures</tt> input array is the following,</t>

<artwork><![CDATA[issuer_message_disclosures = [DISCLOSE, HIDE, HIDE, COMMIT, COMMIT,
    DISCLOSE,DISCLOSE, COMMIT, DISCLOSE
]
]]></artwork>

<artwork><![CDATA[[proof, add_zkp_info] = BlindProofGen(PK,
                      signature,
                      header,
                      ph,
                      issuer_messages,
                      blind_messages,
                      issuer_message_disclosures,
                      blind_message_disclosures,
                      secret_prover_blind)

Inputs:

- PK (REQUIRED), an octet string of the form outputted by the SkToPk
                 operation.
- signature (REQUIRED), an octet string of the form outputted by the
                        Sign operation.
- header (OPTIONAL), an octet string containing context and application
                     specific information. If not supplied, it defaults
                     to an empty string.
- ph (OPTIONAL), an octet string containing the presentation header. If
                 not supplied, it defaults to an empty string.
- issuer_messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not supplied, it
                    defaults to the empty array "()".
- blind_messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not supplied, it
                    defaults to the empty array "()".
- issuer_message_disclosures (OPTIONAL), a vector containing values of
                            DISCLOSE, HIDE or COMMIT.If not supplied, it
                            defaults to the empty map "{}".
- blind_message_disclosures (OPTIONAL), a vector containing values of
                            DISCLOSE, HIDE or COMMIT.If not supplied, it
                            defaults to the empty map "{}".
- secret_prover_blind (OPTIONAL), a scalar value. If not supplied it
                                  defaults to zero "0".


Parameters:

- api_id, the octet string ciphersuite_id || "BLIND_H2G_HM2S_", where
          ciphersuite_id is defined by the ciphersuite and
          "BLIND_H2G_HM2S_"is an ASCII string composed of 15 bytes.

Outputs:

- proof, an octet string; or INVALID.
- add_zkp_info, a structure containing an array of committed message scalars
                used in committed disclosure, and the array of random scalars
                used to create the respective commitments.

Deserialization:

1. L = length(issuer_messages)
2. if length(issuer_message_disclosures) != L, return INVALID
3. M = length(blind_messages)
4. if length(blind_message_disclosures) != M, return INVALID
5. if any value in issuer_message_disclosures is not one of DISCLOSE,
   HIDE, or COMMIT, return INVALID
6. if any value in blind_message_disclosures is not one of DISCLOSE,
   HIDE, or COMMIT, return INVALID

7. let issuer_disclosed_indexes be the integers i in 0..L - 1 so
   that issuer_message_disclosures[i] = DISCLOSE, in
   ascending order.
8. let issuer_commitment_indexes be the integers i in 0..L - 1 so
   that issuer_message_disclosures[i] = COMMIT, in
   ascending order.
9. let blind_disclosed_indexes be the integers i in 0..M - 1 so
   that blind_message_disclosures[i] = DISCLOSE, in
   ascending order.
10. let blind_commitment_indexes be the integers i in 0..M - 1 so
   that blind_message_disclosures[i] = COMMIT, in
   ascending order.

Procedure:

1. generators = BBS.create_generators(L + 1, api_id)
2. blind_generators = BBS.create_generators(M + 1, "BLIND_" || api_id)
3. issuer_scalars = messages_to_scalars(issuer_messages, api_id)
4. blind_scalars = messages_to_scalars(blind_messages, api_id)
6. proof_scalars = issuer_scalars.append(secret_prover_blind)
                                          .append(blind_scalars)

7. proof_disclosed_indexes = [] // empty array
8. proof_commitment_indexes = [] // empty array

9.  for (i = 0, i < length(issuer_disclosed_indexes), i++)
      proof_disclosed_indexes.append(issuer_disclosed_indexes[i])

10. for (i = 0, i < length(blind_disclosed_indexes), i++)
      proof_disclosed_indexes.append(blind_disclosed_indexes[i] + L + 1)

11.  for (i = 0, i < length(issuer_commitment_indexes), i++)
      proof_commitment_indexes.append(issuer_commitment_indexes[i])

12. for (i = 0, i < length(blind_commitment_indexes), i++)
      proof_commitment_indexes.append(blind_commitment_indexes[i] + L + 1)

13. proof_with_add_zkp_info = CoreProofGen(PK,
                        signature,
                        generators.append(blind_generators),
                        header,
                        ph,
                        proof_scalars,
                        proof_disclosed_indexes,
                        proof_commitment_indexes,
                        api_id)
14. return proof_with_add_zkp_info
]]></artwork>
</section>

<section anchor="proof-verification"><name>Proof Verification</name>
<t>The ProofVerify operation validates a BBS proof, given the Signer's public key (PK), a header and presentation header values, an array of disclosed messages (the ones provided by the Signer and the ones committed by the prover) and a map <tt>message_disclosures</tt> describing how each signed message index is presented to the Verifier. In addition, the <tt>BlindProofVerify</tt> operation defined in this section accepts the integer <tt>issuer_known_messages_no</tt>, representing the total number of signed messages known by the Signer.</t>
<t>This operation makes use of the <tt>CoreProofVerify</tt> operation as defined in <xref target="core-proof-verification"></xref>.</t>

<artwork><![CDATA[result = BlindProofVerify(PK,
                          proof,
                          header,
                          ph,
                          issuer_known_messages_no,
                          disclosed_messages,
                          message_disclosures)

Inputs:

- PK (REQUIRED), an octet string of the form outputted by the SkToPk
                 operation.
- proof (REQUIRED), an octet string of the form outputted by the
                    ProofGen operation.
- header (OPTIONAL), an optional octet string containing context and
                     application specific information. If not supplied,
                     it defaults to the empty octet string ("").
- ph (OPTIONAL), an octet string containing the presentation header. If
                 not supplied, it defaults to the empty octet
                 string ("").
- issuer_known_messages_no (OPTIONAL), a non-negative integer. If not
                                       supplied, it defaults to 0.
- disclosed_messages (OPTIONAL), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets. If not
                    supplied, it defaults to the empty array ("()").
- message_disclosures (OPTIONAL), a map between message indexes and one
                                   of the DISCLOSE, HIDE or COMMIT
                                   values. If not supplied, it defaults
                                   to the empty map "{}".

Parameters:

- api_id, the octet string ciphersuite_id || "BLIND_H2G_HM2S_", where
          ciphersuite_id is defined by the ciphersuite and
          "BLIND_H2G_HM2S_"is an ASCII string composed of 15 bytes.
- (octet_point_length, octet_scalar_length), defined by the ciphersuite.

Outputs:

- result, either VALID or INVALID.

Deserialization:

1. bbs_proof_len = OS2IP(proof[0..7])
2. undisclosed_msgs_no = (bbs_proof_len
                           - 3 * octet_point_length
                           - 4 * octet_scalar_length)
                           / octet_scalar_length
3. proof_msgs_no = undisclosed_msgs_no + length(disclosed_messages)
4. if proof_msgs_no == 0, return INVALID
5. total_msgs_no = proof_msgs_no - 1
6. if issuer_known_messages_no > total_msgs_no, return INVALID
7. if length(message_disclosures) != total_msgs_no, return INVALID
8. if the keys of message_disclosures are not exactly the integers
   0..total_msgs_no - 1, return INVALID
9. if any value in message_disclosures is not one of DISCLOSE, HIDE,
   or COMMIT, return INVALID

10. let disclosed_indexes be the integers i in 0..total_msgs_no - 1 so
   that message_disclosures[i] = DISCLOSE, in
   ascending order.
11. let commitment_indexes be the integers i in 0..total_msgs_no - 1 so
   that message_disclosures[i] = COMMIT, in
   ascending order.
12. if length(disclosed_indexes) != length(disclosed_messages),
    return INVALID
13. let proof_index(i) be i if i < issuer_known_messages_no,
    and i + 1 otherwise.
14. proof_disclosed_indexes = (proof_index(i) for i in disclosed_indexes)
15. proof_commitment_indexes = (proof_index(i) for i in commitment_indexes)


Procedure:

1. generators = BBS.create_generators(
                                  issuer_known_messages_no + 1, api_id)
2. blind_generators = BBS.create_generators(
                               total_msgs_no - issuer_known_messages_no + 1,
                               "BLIND_" || api_id)

3. message_scalars = messages_to_scalars(disclosed_messages, api_id)

4. result = CoreProofVerify(
                        PK,
                        proof,
                        generators.append(blind_generators),
                        header,
                        ph,
                        message_scalars,
                        proof_disclosed_indexes,
                        proof_commitment_indexes,
                        api_id)
5. return result
]]></artwork>
</section>
</section>

<section anchor="core-operations"><name>Core Operations</name>

<section anchor="core-commitment-computation"><name>Core Commitment Computation</name>

<artwork><![CDATA[(commitment_with_proof, secret_prover_blind) = CoreCommit(blind_generators,
                                              committed_message_scalars,
                                              api_id)

Inputs:

- blind_generators (REQUIRED), vector of pseudo-random points in G1.
- committed_message_scalars (OPTIONAL), a vector of scalars. If not supplied,
                                 it defaults to the empty array ("()").
- api_id (OPTIONAL), an octet string. If not supplied it defaults to the
                     empty octet string ("").


Deserialization:

1. M = length(committed_message_scalars)
2. if length(blind_generators) != M + 1, return INVALID
3. (Q_2, J_1, ..., J_M) = blind_generators
4. (msg_1, ..., msg_M) = committed_message_scalars
Procedure:

1. (secret_prover_blind, s~, m~_1, ..., m~_M)
                                         = BBS.calculate_random_scalars(M + 2)
2. C = J_1 * msg_1 + ... + J_M * msg_M + Q_2 * secret_prover_blind
3. Cbar = J_1 * m~_1 + ... + J_M * m~_M + Q_2 * s~

4. challenge = calculate_blind_challenge(C, Cbar, blind_generators,
                                                                 api_id)

5. s^ = s~ + secret_prover_blind * challenge
6. for i in (1, 2, ..., M): m^_i = m~_i + msg_i * challenge

7. proof = (s^, (m^_1, ..., m^_M), challenge)
8. commitment_with_proof = commitment_with_proof_to_octets(C, proof)
9. return (commitment_with_proof, secret_prover_blind)
]]></artwork>
</section>

<section anchor="core-commitment-verification"><name>Core Commitment Verification</name>
<t>This operation is used by the Signer to verify the correctness of a <tt>commitment_proof</tt> for a supplied <tt>commitment</tt>, over a list of points of G1 called the <tt>blind_generators</tt>, used to compute that commitment.</t>

<artwork><![CDATA[result = CoreCommitVerify(commitment, commitment_proof,
                                               blind_generators, api_id)

Inputs:

- commitment (REQUIRED), a commitment (see (#terminology)).
- commitment_proof (REQUIRED), a commitment_proof (see (#terminology)).
- blind_generators (REQUIRED), vector of pseudo-random points in G1.
- api_id (OPTIONAL), octet string. If not supplied it defaults to the
                     empty octet string ("").


Outputs:

- result: either VALID or INVALID

Deserialization:

1. (s^, commitments, cp) = commitment_proof

2. M = length(commitments)
3. (m^_1, ..., m^_M) = commitments

4. if length(blind_generators) != M + 1, return INVALID
5. (Q_2, J_1, ..., J_M) = blind_generators

Procedure:

1. Cbar = J_1 * m^_1 + ... + J_M * m^_M + Q_2 * s^ + commitment * (-cp)
2. cv = calculate_blind_challenge(commitment, Cbar, blind_generators,
                                                                 api_id)
3. if cv != cp, return INVALID
4. return VALID
]]></artwork>
</section>

<section anchor="finalize-blind-sign"><name>Finalize Blind Sign</name>
<t>This operation computes a blind BBS signature from a secret key (<tt>SK</tt>) and the
point to be signed (<tt>B</tt>). The operation also accepts the identifier of the BBS
Interface that calls this core operation.</t>

<artwork><![CDATA[blind_signature = FinalizeBlindSign(SK, B, api_id)

Inputs:

- SK (REQUIRED), a secret key in the form outputted by the KeyGen
                 operation.
- B (REQUIRED), a point of G1, different than Identity_G1.
- api_id (OPTIONAL), an octet string. If not supplied it defaults to the
                     empty octet string ("").

Outputs:

- blind_signature, a blind signature encoded as an octet string; or
                   INVALID.

Definitions:

1. signature_dst, an octet string representing the domain separation
                  tag: api_id || "H2S_" where "H2S_" is an ASCII string
                  composed of 4 bytes.

Procedure:

1. if B is Identity_G1, return INVALID
2. e_octs = BBS.serialize((SK, B))
3. e = BBS.hash_to_scalar(e_octs, signature_dst)
4. A = B * (1 / (SK + e))
5. return BBS.signature_to_octets((A, e))
]]></artwork>
</section>

<section anchor="core-proof-generation"><name>Core Proof Generation</name>
<t>The Proof Generation with extension, combines the BBS Proof Generation operations (i.e., <tt>BBS.ProofInit</tt> and <tt>BBS.ProofFinalize</tt>) with a proof of correctness of commitments over some of the signed messages. The commitments proof of correctness will similarly constitute of a initialization and finalization phase. The two proof protocols will use a common challenge, returned by the <tt>ProofChallengeCalculate</tt> operation described in <xref target="proof-challenge-calculation"></xref>. The result of the commitments proof of correctness initialization process will be an object of the following form</t>

<artwork><![CDATA[CommitmentInitRes = {
  commitments: (REQUIRED) Array of points in G1,
  commitments_proofs: (REQUIRED) Array of points in G1,
  commitment_indexes: (REQUIRED) Array of numbers
}
]]></artwork>
<t>Following, we describe the Proof Generation Procedure.</t>

<artwork><![CDATA[[proof, add_zkp_info] = CoreProofGen(PK, signature, generators,
                                     header, ph, messages,
                                     disclosed_indexes,
                                     commitment_indexes, api_id)

Inputs:

- PK (REQUIRED), an octet string of the form outputted by the SkToPk
                 operation.
- signature (REQUIRED), an octet string of the form outputted by the
                        Sign operation.
- generators (REQUIRED), vector of pseudo-random points in G1.
- header (OPTIONAL), an octet string containing context and application
                     specific information. If not supplied, it defaults
                     to the empty octet string ("").
- ph (OPTIONAL), an octet string containing the presentation_header. If
                 not supplied, it defaults to the empty octet
                 string ("").
- messages (OPTIONAL), a vector of scalars representing the messages.
                       If not supplied, it defaults to the empty
                       array ("()").
- disclosed_indexes (OPTIONAL), vector of non-negative integers in
                                ascending order. Indexes of disclosed
                                messages. If not supplied, it defaults
                                to the empty array ("()").
- commitment_indexes (OPTIONAL), vector of non-negative integers in
                                 ascending order. Indexes of committed
                                 messages. If not supplied, it defaults
                                 to the empty array ("()").
- api_id (OPTIONAL), an octet string. If not supplied it defaults to the
                     empty octet string ("").

Parameters:

- Y_0 and Y_1, fixed points of G1 computed as
  (Y_0, Y_1) = BBS.create_generators(2, "COM_DIS_" || api_id)

Outputs:

- proof, an octet string; or INVALID.
- add_zkp_info, a structure containing an array of committed message scalars
                used in committed disclosure, and the array of random scalars
                used to create the respective commitments.

Deserialization:

1. signature_result = BBS.octets_to_signature(signature)
2. if signature_result is INVALID, return INVALID
3. (A, e) = signature_result

4.  L = length(messages)
5. if commitment_indexes is not a strictly ascending list of integers
    in 0..L - 1, return INVALID
6. if disclosed_indexes is not a strictly ascending list of integers
    in 0..L - 1, return INVALID
7. if disclosed_indexes and commitment_indexes are not disjoint,
    return INVALID
8.  N = length(commitment_indexes)
9.  R = length(disclosed_indexes)
10. U = L - R
11. (i1, ..., iR) = disclosed_indexes
12. disclosed_messages = (messages[i1], ..., messages[iR])
13. undisclosed_indexes = (0, 1, ..., L - 1) \ disclosed_indexes
14. (j1, ..., jU) = undisclosed_indexes
15. undisclosed_messages = (messages[j1], ..., messages[jU])

Procedure:

//  Get all needed random scalars at once
1.  all_random_scalars = BBS.calculate_random_scalars(5 + U + 2*N)
2.  (r1, r2, e~, r1~, r3~, m~_j1, ..., m~_jU, s_1, ..., s_N,
                            s~_1, ..., s~_N) = all_random_scalars
3.  init_random_scalars = (r1, r2, e~, r1~, r3~, m~_j1, ..., m~_jU)

4.  init_res = BBS.ProofInit(PK,
                             signature_result,
                             generators,
                             init_random_scalars,
                             header,
                             messages,
                             undisclosed_indexes,
                             api_id)
5.  if init_res is INVALID, return INVALID


// Calculate the commitments and initiate the correctness proof

6.  for i in (1, 2, ..., N):
7.      idx = commitment_indexes[i]
8.      C_i = Y_0 * s_i + Y_1 * messages[idx]
9.      let k be the integer such that j_k == idx
10.     C~_i = Y_0 * s~_i + Y_1 * m~_k

11. commitment_init_res = {commitments: (C_1, ..., C_N),
                           commitments_proofs: (C~_1, ...,C~_N),
                           commitment_indexes: commitment_indexes}

12. challenge = ProofChallengeCalculate(init_res, commitment_init_res,
                                        disclosed_messages, disclosed_indexes,
                                        ph, api_id)
13. if challenge is INVALID, return INVALID

14. bbs_proof = BBS.ProofFinalize(init_res,
                                  challenge,
                                  e,
                                  init_random_scalars,
                                  undisclosed_messages)

// Finalize the commitment correctness proof
15. for i in (1, 2, ..., N): s^_i =  s~_i + challenge * s_i
16. commitments_proof = ((C_1, ..., C_N), (s^_1, ..., s^_N))

17. proof = proof_to_octets(bbs_proof, commitments_proof)
18. add_zkp_info = {committed_message_scalars:
                       (messages[commitment_indexes[1]], ...,
                        messages[commitment_indexes[N]]),
                    commitment_rands: (s_1, ..., s_N)}
19. return [proof, add_zkp_info]
]]></artwork>
</section>

<section anchor="core-proof-verification"><name>Core Proof Verification</name>

<artwork><![CDATA[result = CoreProofVerify(PK, proof, generators, header, ph,
                         disclosed_messages, disclosed_indexes,
                         commitment_indexes, api_id)

Inputs:

- PK (REQUIRED), an octet string of the form outputted by the SkToPk
                 operation.
- proof (REQUIRED), an octet string of the form outputted by the
                        ProofGen operation.
- generators (REQUIRED), vector of pseudo-random points in G1.
- header (OPTIONAL), an optional octet string containing context and
                     application specific information. If not supplied,
                     it defaults to the empty octet string ("").
- ph (OPTIONAL), an octet string containing the presentation_header. If
                 not supplied, it defaults to the empty octet
                 string ("").
- disclosed_messages (OPTIONAL), a vector of scalars representing the
                                 messages. If not supplied, it defaults
                                 to the empty array ("()").
- disclosed_indexes (OPTIONAL), vector of non-negative integers in
                                ascending order. Indexes of disclosed
                                messages. If not supplied, it defaults
                                to the empty array ("()").
- commitment_indexes (OPTIONAL), vector of non-negative integers in
                                 ascending order. Indexes of committed
                                 messages. If not supplied, it defaults
                                 to the empty array ("()").
- api_id (OPTIONAL), an octet string. If not supplied it defaults to the
                     empty octet string ("").

Parameters:

- Y_0 and Y_1, fixed points of G1 computed as (Y_0, Y_1) = BBS.create_generators(2, "COM_DIS_" || api_id)
- BP2, fixed point of G2, defined by the ciphersuite.

Outputs:

- result, either VALID or INVALID.

Deserialization:

1.  W = BBS.octets_to_pubkey(PK)
2.  if W is INVALID, return INVALID

3.  proof_res = octets_to_proof(proof, length(commitment_indexes))
4.  if proof_res is INVALID, return INVALID
5.  (bbs_proof_res, commitments_proof_res) = proof_res

6.  (Abar, Bbar, D, e^, r1^, r3^, hats, cp) = bbs_proof_res
7.  (commitments, commitments_proof) = commitments_proof_res

8.  N = length(commitments)
9.  if length(commitments_proof) != N, return INVALID
10. if length(commitment_indexes) != N, return INVALID
11. U = length(hats)
12. R = length(disclosed_indexes)
13. if length(disclosed_messages) != R, return INVALID
14. L = R + U

15. if commitment_indexes is not a strictly ascending list of integers
    in 0..L - 1, return INVALID

16. if disclosed_indexes is not a strictly ascending list of integers
    in 0..L - 1, return INVALID

17. if disclosed_indexes and commitment_indexes are not disjoint,
    return INVALID

18. undisclosed_indexes = (0, 1, ..., L - 1) \ disclosed_indexes
19. (j1, ..., jU) = undisclosed_indexes
20. (m^_j1, ..., m^_jU) = hats
21. (C_1, ... C_N) = commitments
22. (s^_1, ..., s^_N) = commitments_proof

Procedure:

1.  init_res = BBS.ProofVerifyInit(PK, bbs_proof_res, generators, header,
                                                   disclosed_messages,
                                                   disclosed_indexes,
                                                   api_id)
2.  if init_res is INVALID, return INVALID

3.  for i in (1, 2, ..., N):
4.      idx = commitment_indexes[i]
5.      let k be the integer such that j_k == idx
6.      C^_i = Y_0 * s^_i + Y_1 * m^_k - C_i * cp

7.  commitment_init_res = {commitments: (C_1, ..., C_N),
                           commitments_proofs: (C^_1, ...,C^_N),
                           commitment_indexes: commitment_indexes}

8.  challenge = ProofChallengeCalculate(init_res, commitment_init_res,
                                        disclosed_messages, disclosed_indexes,
                                        ph, api_id)
9.  if challenge is INVALID, return INVALID

10. if cp != challenge, return INVALID
11. if e(Abar, W) * e(Bbar, -BP2) != Identity_GT, return INVALID
12. return VALID
]]></artwork>
</section>
</section>
</section>

<section anchor="utilities"><name>Utilities</name>

<section anchor="messages-to-scalars"><name>Messages to Scalars</name>
<t>The <tt>messages_to_scalars</tt> operation is used to map a list of messages to their respective scalar values, which are required by the Blind BBS Signatures Interface in <xref target="blind-bbs-signatures-interface"></xref>. To accommodate additional ZKPs via the committed disclosure mechanism some messages may be treated as &quot;raw&quot; scalar values and others may be  &quot;hashed&quot;. Each raw message value has a corresponding flag to indicate how it should be processed by this operation.</t>

<artwork><![CDATA[msg_scalar = messages_to_scalars(messages, api_id)

Inputs:

- messages (REQUIRED), a vector of objects of the form
                    {flag: string, value: octets}, with flag values in
                    the set ["HASH", "RAW"], and value the raw
                    individual message octets.
- api_id (OPTIONAL), octet string. If not supplied it defaults to the
                     empty octet string ("").

Outputs:

- msg_scalars, a list of scalars.

Definitions:

1. map_dst, an octet string representing the domain separation tag:
            api_id || "MAP_MSG_TO_SCALAR_AS_HASH_" where
            "MAP_MSG_TO_SCALAR_AS_HASH_" is an ASCII string comprised of
            26 bytes.

ABORT if:

1. length(messages) > 2^64 - 1

Procedure:

1. L =  length(messages)
2. for i in (1, ..., L):
3.     if (messages[i].flag == "RAW")
4.        msg_scalar_i = OS2IP(messages[i].value)
5.      if (messages[i].flag == "HASH")
6.        msg_scalar_i = BBS.hash_to_scalar(messages[i].value, map_dst)
7. return (msg_scalar_1, ..., msg_scalar_L)
]]></artwork>
<t>The <tt>MAP_TO_SCALAR_ID</tt> of the above operation is defines as,</t>

<artwork><![CDATA[MAP_TO_SCALAR_ID = "RHM2S_"
]]></artwork>
<t>to  indicate that it can pass through &quot;Raw&quot; values as scalars, as well as &quot;Hash&quot; messages to scalars.</t>
</section>

<section anchor="calculate-b-value"><name>Calculate B value</name>

<artwork><![CDATA[res  = B_calculate(PK, generators, blind_generators, commitment,
                   message_scalars, header, api_id)

Inputs:

- PK (REQUIRED), an octet string of the form outputted by the SkToPk
                 operation.
- generators (REQUIRED), an array of at least one point from the
                         G1 group.
- blind_generators (OPTIONAL), vector of pseudo-random points in G1. If
                               not supplied it defaults to the empty
                               array.
- commitment (OPTIONAL), a point from the G1 group. If not supplied it
                         defaults to the Identity_G1 point.
- message_scalars (OPTIONAL), an array of scalar values. If not
                              supplied, it defaults to the empty
                              array ("()").
- header (OPTIONAL), an octet string containing context and application
                     specific information. If not supplied, it defaults
                     to an empty string.
- api_id (OPTIONAL), an octet string. If not supplied it defaults to the
                     empty octet string ("").

Parameters:

- P1, fixed point of G1, defined by the ciphersuite.

Outputs:

- res, an array of a single element from the G1 subgroup, or INVALID.

Deserialization:

1. L = length(message_scalars)
2. M = length(blind_generators) - 1
3. if length(generators) != L + 1, return INVALID
4. if M < 0, return INVALID
5. (Q_1, H_1, ..., H_L) = generators
6. (msg_1, ..., msg_L) = message_scalars
7. (Q_2, J_1, ..., J_M) = blind_generators

Procedure:

1. domain = BBS.calculate_domain(PK, Q_1, (H_1, ..., H_L, Q_2, J_1, ..., J_M),
                                                         header, api_id)
2. B = P1 + Q_1 * domain + H_1 * msg_1 + ... + H_L * msg_L + commitment
3. if B is Identity_G1, return INVALID
4. return (B)
]]></artwork>
</section>

<section anchor="blind-challenge-calculation"><name>Blind Challenge Calculation</name>

<artwork><![CDATA[challenge = calculate_blind_challenge(C, Cbar, generators, api_id)

Inputs:

- C (REQUIRED), a point of G1.
- Cbar (REQUIRED), a point of G1.
- generators (REQUIRED), an array of points from G1, of length at
                         least 1.
- api_id (OPTIONAL), octet string. If not supplied it defaults to the
                     empty octet string ("").

Definition:

- blind_challenge_dst, an octet string representing the domain
                       separation tag: api_id || "H2S_" where "H2S_" is
                       an ASCII string composed of 4 bytes.

Deserialization:

1. if length(generators) == 0, return INVALID
2. M = length(generators) - 1

Procedure:

1. c_arr = (M)
2. c_arr.append(generators)
3. c_octs = BBS.serialize(c_arr.append(C, Cbar))
4. return BBS.hash_to_scalar(c_octs, blind_challenge_dst)
]]></artwork>
</section>

<section anchor="proof-challenge-calculation"><name>Proof Challenge Calculation</name>

<artwork><![CDATA[challenge = ProofChallengeCalculate(init_res, commitment_init_res,
                                    disclosed_messages, disclosed_indexes,
                                    ph, api_id)

Inputs:
- init_res (REQUIRED), a ProofInitRes object representing the value
                       returned after initializing the proof generation
                       or verification operations.
- commitment_init_res (REQUIRED), a CommitmentInitRes representing the value
                                 returned after initializing the commitments
                                 proof of correctness generation or
                                 verification.
- disclosed_messages (OPTIONAL), a vector of scalars representing the
                                 messages. If not supplied, it defaults
                                 to the empty array ("()").
- disclosed_indexes (OPTIONAL), vector of non-negative integers in
                                ascending order. Indexes of disclosed
                                messages. If not supplied, it defaults
                                to the empty array ("()").
- ph (OPTIONAL), an octet string. If not supplied, it must default to
                 the empty octet string ("").
- api_id (OPTIONAL), an octet string. If not supplied it defaults to the
                     empty octet string ("").

Outputs:

- challenge, a scalar.

Definitions:

1. hash_to_scalar_dst, an octet string representing the domain
                       separation tag: api_id || "H2S_" where "H2S_" is
                       an ASCII string comprised of 4 bytes.

Deserialization:

1.  (Abar, Bbar, D, T1, T2, domain) = (init_res.Abar,
                                       init_res.Bbar,
                                       init_res.D,
                                       init_res.T1,
                                       init_res.T2,
                                       init_res.domain)

2.  R = length(disclosed_indexes)
3.  (i1, ..., iR) = disclosed_indexes
4. if length(disclosed_messages) != R, return INVALID
5.  (msg_i1, ..., msg_iR) = disclosed_messages

6.  N = length(commitment_init_res.commitments)
7.  if length(commitment_init_res.commitments_proofs) != N, return INVALID
8.  if length(commitment_init_res.commitment_indexes) != N, return INVALID
9.  (C_1, ..., C_N) = commitment_init_res.commitments
10. (C~_1, ...,C~_N) = commitment_init_res.commitments_proofs
11. (ci_1, ..., ci_N) = commitment_init_res.commitment_indexes

ABORT if:

1. R > 2^64 - 1
2. length(ph) > 2^64 - 1

Procedure:

1. c_arr = (R, i1, msg_i1, i2, msg_i2, ..., iR, msg_iR, Abar, Bbar,
                                                      D, T1, T2, domain)
2. c_octs = BBS.serialize(c_arr)

3. commitment_arr = (N, ci_1, C_1, C~_1, ..., ci_N, C_N, C~_N)
4. c_octs = c_octs || BBS.serialize(commitment_arr)

5. c_octs = c_octs || I2OSP(length(ph), 8) || ph
6. return BBS.hash_to_scalar(c_octs, hash_to_scalar_dst)
]]></artwork>
</section>

<section anchor="serialize"><name>Serialize</name>

<section anchor="commitment-with-proof-to-octets"><name>Commitment with Proof to Octets</name>

<artwork><![CDATA[commitment_octets = commitment_with_proof_to_octets(commitment, proof)

Inputs:

- commitment (REQUIRED), a point of G1.
- proof (REQUIRED), a vector comprising of a scalar, a possibly empty
                    vector of scalars and another scalar in that order.

Outputs:

- commitment_octets, an octet string or INVALID.

Procedure:

1. commitment_octs = BBS.serialize((commitment))
2. if commitment_octs is INVALID, return INVALID
3. (s^, (m^_1, ..., m^_M), challenge) = proof
4. proof_octs = BBS.serialize((s^, m^_1, ..., m^_M, challenge))
5. if proof_octs is INVALID, return INVALID
6. return commitment_octs || proof_octs
]]></artwork>
</section>

<section anchor="octets-to-commitment-with-proof"><name>Octets to Commitment with Proof</name>

<artwork><![CDATA[commitment = octets_to_commitment_with_proof(commitment_octs)

Inputs:

- commitment_octs (REQUIRED), an octet string in the form outputted from
                              the commitment_to_octets operation.

Parameters:

- (octet_point_length, octet_scalar_length), defined by the ciphersuite.
- r, non-negative integer. The prime order of the G1 and G2 groups,
      defined by the ciphersuite.
- subgroup_check_G1, operation that on input a point P returns VALID if
                     P is a valid point of the G1 subgroup, otherwise it
                     returns INVALID (see (#notation)).

Outputs:

- commitment, a commitment in the form (C, proof), where C a point of G1
              and a proof vector comprising of a scalar, a possibly
              empty vector of scalars and another scalar in that order.

Procedure:

1.  commitment_len_floor = octet_point_length + 2 * octet_scalar_length
2.  if length(commitment_octs) < commitment_len_floor, return INVALID

3.  C_octets = commitment_octs[0..(octet_point_length - 1)]
4.  C = octets_to_point_E1(C_octets)
5.  if C is INVALID, return INVALID
6.  if C == Identity_G1, return INVALID
7.  if subgroup_check_G1(C) returns INVALID, return INVALID

8.  j = 0
9.  index = octet_point_length
10. while index < length(commitment_octs):
11.     end_index = index + octet_scalar_length - 1
12.     s_j = OS2IP(commitment_octs[index, ..., end_index])
13.     if s_j = 0 or if s_j >= r, return INVALID
14.     index += octet_scalar_length
15.     j += 1

16. if index != length(commitment_octs), return INVALID
17. if j < 2, return INVALID
18. msg_commitments = ()
19. if j >= 3, set msg_commitments = (s_1, ..., s_(j-2))
20. return (C, (s_0, msg_commitments, s_(j-1)))
]]></artwork>
</section>

<section anchor="proof-to-octets"><name>Proof to Octets</name>

<artwork><![CDATA[proof_octets = proof_to_octets(bbs_proof_octs, commitments_proof)

Inputs:

- bbs_proof_octs (REQUIRED), an octet string.
- commitments_proof (REQUIRED), a tuple with two arrays, the first with
                                points in G1 and the second with Scalars

Outputs:

- proof_octets, an octet string.

Procedure:

1. (C, s^) = commitments_proof
2. oct = I2OSP(length(bbs_proof_octs), 8) || bbs_proof_octs ||
            BBS.serialize(C.append(s^))
3. return oct

]]></artwork>
</section>

<section anchor="octets-to-proof"><name>Octets to Proof</name>
<t>The <tt>octets_to_proof</tt> procedure, on input an octet string will return a BBS proof with commitments proof comprised from the following elements</t>

<ol spacing="compact">
<li>A BBS Proof</li>
<li>A tuple with two arrays. One array of points in G1, corresponding to the message commitments and one array with scalars, corresponding to the proof of correctness of the previous commitments.</li>
</ol>

<artwork><![CDATA[proof = octets_to_proof(proof_octets, commitments_count)

- proof_octets (REQUIRED), an octet string of the form outputted from
                           the proof_to_octets operation.
- commitments_count (REQUIRED), the number of committed disclosures in
                            the proof.

Parameters:

- int_octet_length = 8. The number of octets of encoded integers.
- r, non-negative integer. The prime order of the G1 and G2 groups,
      defined by the ciphersuite.
- octet_scalar_length, non-negative integer. The length of a scalar
                       octet representation, defined by the ciphersuite.
- octet_point_length, non-negative integer. The length of a point in G1
                      octet representation, defined by the ciphersuite.
- subgroup_check_G1, operation that on input a point P returns VALID if
                     P is a valid point of the G1 subgroup, otherwise it
                     returns INVALID (see (#notation)).

Outputs:

- proof, a proof value in the form described above or INVALID

Procedure:

1.  sidx = 0
2.  eidx = int_octet_length - 1
3.  if length(proof_octets) < eidx + 1, return INVALID
4.  bbs_proof_len = OS2IP(proof_octets[sidx, ..., eidx])

5.  sidx = eidx + 1
6.  eidx = sidx + bbs_proof_len - 1
7.  if length(proof_octets) < eidx + 1, return INVALID
8.  bbs_proof_octs = proof_octets[sidx, ..., eidx]
9.  bbs_proof = BBS.octets_to_proof(bbs_proof_octs)
10. if bbs_proof is INVALID, return INVALID

// Deserialize commitments_proof
11. N  = commitments_count
12. len_floor = eidx + 1 + N * (octet_point_length + octet_scalar_length)
13. if length(proof_octets) < len_floor, return INVALID

14. for i in (1..N)
15.     sidx = eidx + 1
16.     eidx = sidx + octet_point_length - 1
17.     C_i = BBS.octets_to_point_E1(proof_octets[sidx, ..., eidx])
18.     if C_i is INVALID or Identity_G1, return INVALID
19.     if subgroup_check_G1(C_i) returns INVALID, return INVALID

20. for i in (1..N)
21.     sidx = eidx + 1
22.     eidx = sidx + octet_scalar_length - 1
23.     s_i = OS2IP(proof_octets[sidx, ..., eidx])
24.     if s_i = 0 or if s_i >= r, return INVALID

25. commitments_proof = ((C_1, ..., C_N), (s_1, ..., s_N))

26. if length(proof_octets) not equal to eidx + 1, return INVALID
37. return (bbs_proof, commitments_proof)
]]></artwork>
</section>
</section>
</section>

<section anchor="privacy-considerations"><name>Privacy Considerations</name>
<t>The privacy considerations discussed in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="5"></xref> apply to this draft as well.</t>

<section anchor="total-number-and-index-of-committed-messages"><name>Total Number and Index of Committed Messages</name>
<t>When a Prover submits a commitment to the Signer, the Prover's committed messages are &quot;perfectly&quot; (statistically) hidden from the Signer. However, the proof of the committed messages, which is also sent from the Prover to the Signer, contains the number of committed messages.</t>
<t>In the proof sent from the Prover to the Verifier the number of committed messages can be inferred. In addition, indexes of disclosed and committed messages are revealed to the Verifier. In <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="5.2"></xref> the threats to unlinkability and mitigations for this information with respect to Signer messages is discussed. These threats and mitigations apply to the Prover total number of committed messages and the disclosed and committed indexes as well.</t>
</section>
</section>

<section anchor="application-considerations"><name>Application Considerations</name>

<section anchor="input-validity-checks"><name>Input Validity Checks</name>
<t>Applications using <tt>CoreProofGen</tt> (as defined in <xref target="core-proof-generation"></xref>) only as a subroutine of <tt>BlindProofGen</tt> (as defined in <xref target="proof-generation"></xref>), or <tt>CoreProofVerify</tt> (as defined in <xref target="core-proof-verification"></xref>) only as a subroutine of <tt>BlindProofVerify</tt> (as defined in <xref target="proof-verification"></xref>), can skip the checks of the <tt>commitment_indexes</tt> and <tt>disclosed_indexes</tt> inputs performed in the corresponding core operation, since the inputs provided by the calling operation will always have the correct form. However, if applications intend to use either core operation in different contexts, those checks must be applied.</t>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>Security considerations detailed in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="6"></xref> apply to this draft as well.</t>

<section anchor="prover-blind-factor"><name>Prover Blind Factor</name>
<t>The random scalar value <tt>secret_prover_blind</tt> calculated and returned by the <tt>Commit</tt> operation is responsible for &quot;hiding&quot; the committed messages (otherwise, in many practical applications, the Signer may be able to retrieve them). Furthermore, it guarantees that the entity generating the BBS proof (see <tt>BlindProofGen</tt> defined in <xref target="proof-generation"></xref>) has knowledge of that factor. As a result, the <tt>secret_prover_blind</tt> MUST remain private by the Prover and it MUST be generated using a cryptographically secure pseudo-random number generator. See <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="6.7"></xref> on recommendations and requirements for implementing the <tt>BBS.calculate_random_scalars</tt> operation (which is used to calculate the <tt>secret_prover_blind</tt> value).</t>
</section>

<section anchor="key-binding"><name>Key Binding</name>
<t>One natural use case for the blind signatures extension of the BBS scheme is key binding. In the context of BBS Signatures, key binding guarantees that only entities in control of a specific private key can compute BBS proofs. This can be achieved by committing to the private key prior to issuance, resulting in a BBS signature that includes that key as one of the signed messages. Creating a BBS proof from that signature will then require knowledge of that key (similar to any signed message). The Prover MUST NOT disclose that key as part of a proof generation procedure. Note also that the <tt>secret_prover_blind</tt> value returned by the <tt>Commit</tt> operation defined in <xref target="commitment-computation"></xref> (see <xref target="prover-blind-factor"></xref>), has a similar property, i.e., it's knowledge is required to generate a proof from a blind signature. Many applications however, requiring key binding, mandate that the same private key is used among multiple signatures, whereas the <tt>secret_prover_blind</tt> is uniquely generated for each blind signature issuance request. In those cases, a commitment to a private key must be used, as described above.</t>
</section>
</section>

<section anchor="ciphersuites"><name>Ciphersuites</name>
<t>This document uses the <tt>BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_</tt> and <tt>BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_</tt> defined in <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="7.2.1"></xref> and <xref target="I-D.irtf-cfrg-bbs-signatures" sectionFormat="of" section="7.2.2"></xref> correspondingly.</t>
</section>

<section anchor="test-vectors"><name>Test Vectors</name>

<section anchor="bls12-381-sha-256"><name>BLS12-381-SHA-256</name>

<section anchor="generators"><name>Generators</name>

<artwork><![CDATA[api_id = "BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_BLIND_H2G_HM2S_"

P1 = "a8ce256102840821a3e94ea9025e4662b205762f9776b3a766c872b948f1fd225e
      7c59698588e70d11406d161b4e28c9"
Q_1 = "8aa0382ea3cd294680e3425bb0bb9293210a4d3e94d8ba59096fcb24eb9b56546
       645bea83e170b078ff3cc5aeac18c49"

Generators = {

H_0 = "8065ec88f9bbee345b44e7825b2d602c91b0398b7c885d722450459c26efb1619
       eb4249428644b9e3d8d11d469d0c62b"
H_1 = "b96f3af9abcd3ee2228fbe97d4e5a0ef10aaf655c6889e284f27a732492ecdb64
       a91f92dbaa93f2a7fb550659935985f"
H_2 = "a99d1b53cc51738a46a7e1fe9b9d89a57977154dcccb7ce741eb779bf69ff655b
       110f0e97c4715616401e5a47d2c373a"
H_3 = "9791c624fec3d688975f9c9143f066404115e0dcc1e318ef4f5290c0103ee4a28
       57dbf9347d997ee507ab629216797f6"
H_4 = "8a472740d4968c831a3ad3d3c55ada8aca8478e4d0698ece52eff445d15aec1a4
       79332e34562e80831b9593c85b435ec"
H_5 = "b5102a6529b39de47c136de78a8697395e11013f8aa91f695f158009b52985ade
       e67a63fc354846b7f4b944349295c95"
H_6 = "845df3031a580f6c58b6d324f42f2158088a924dab9e77151851408a8bda31c26
       6000c10bc47cc38aa3ac24dad22462c"
H_7 = "b4296c820736cafb7c9229cf499788314a4578de69e88832ca39babe36c48073e
       61968ae320f9bae61079724a5271eac"
H_8 = "9253f55dacd9e144f6da37f4adb420773325d142d900a6ae7de851c2643532e0b
       9181ae3ee02fe8c123b10dd12822876"
H_9 = "979a52e753c367e3baa8826e7b74a23856abca5468ba5ce5719b4c57eb7e9ee87
       9935f98fbd6959661d3e866477063b2"

}
]]></artwork>
</section>

<section anchor="blind-generators"><name>Blind Generators</name>

<artwork><![CDATA[api_id = "BLIND_BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_BLIND_H2G_HM2S_"

P1 = "a8ce256102840821a3e94ea9025e4662b205762f9776b3a766c872b948f1fd225e
      7c59698588e70d11406d161b4e28c9"
Q_2 = "a347532dc0ba9b83e4f15f3eeb7dffd934f5fa4668d927fbcb68096d5a26f6e59
       f66681201be1c263af1a25b6749759c"

Blind Generators = {

J_0 = "af590ba56aa0e526a0763ae6926347dce988ffb9cc1a0b4510ada06fe08816f5c
       36a6c7007cc8558e5793f9a2cbae462"
J_1 = "a9a6e5f3093823745734a2195d80886f47185be6a3e4d00df2bd5996aa9d664e3
       4244ea15e9ad4c41d8825331fcfd5a3"
J_2 = "a6c1a8fd251a338e25d3ea4e09334ea250f0257783f2be4ce4406798ea9acbce4
       1e7648c7fb1409fcd822396f652c4e7"
J_3 = "80d1232ee4a5623d7ac5a3912c555f9f6f34716edfe156ae40b6ac19afba58dd1
       8556e49529e39da91aa806c9c55d493"
J_4 = "b8775d3d2f58cafd808d135de79367f34c9ad22a6a878631fd0b1383541999b16
       b6f3bae96ab51bb4ab25caf69462473"

}
]]></artwork>
</section>

<section anchor="commitment"><name>Commitment</name>
<t>Mocked random scalar parameters</t>

<artwork><![CDATA[seed = "3.141592653589793238462643383279"
dst = "BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_H2G_HM2S_COMMIT_MOCK_RANDOM_SC
       ALARS_DST_"
]]></artwork>

<section anchor="valid-no-committed-messages-commitment-with-proof"><name>valid no committed messages commitment with proof</name>

<artwork><![CDATA[blindMessages = [  ]
proverBlind = "1b6f406b17aaf92dc7deb911c7cae49756a6623b5c385b5ae6214d7e3
               d9597f7"

Trace:

s_tilde = "0b71f3e3fc1517bd763b180dc4f6d269da8c96fb5307653b77205c31e40c5
           21e"
m_tildes = [  ]

commitmentWithProof = "849d3cc626720202cbc1610fc01ab41ce32099af602def0c5
                       79f37dd18b485ef60719275a036bdd8120e7e938c8e1a3d4d
                       0322587441ccc5caf186001b45dd09ee159713c3e3ea0f411
                       f94a5d6665546562d09c093b687a129e464a57e18cdbf5306
                       bcabf3e7cc95f5ba98cdd9bf3768"
]]></artwork>
</section>

<section anchor="valid-multiple-committed-messages-commitment-with-proof"><name>valid multiple committed messages commitment with proof</name>

<artwork><![CDATA[blindMessages = [ [ "HASH", "5982967821da3c5983496214df36aa5e58de6fa2531
                 4af4cf4c00400779f08c3" ], [ "RAW", "a75d8b634891af92282
                 cc81a675972d1929d3149863c1fc0" ], [ "HASH", "835889a407
                 44813a892eff9deb1edaeb" ], [ "RAW", "e1ca9729410dc6ba"
                 ], [ "HASH", "" ] ]
proverBlind = "4fba5396baa36b2fde81d46a9b9ee89c425dbc5e1ffd65c20249afb4a
               bd37589"

Trace:

s_tilde = "2c78a955f6598824fc77bf6cb5a8b58204da0cadb499faf4bbee2d4fceadc
           0d1"
m_tildes = [ "2b8c33fb06580d8dffdc72212967ae75838859096abeea973cc0d9e80a
            c1946c", "2b9e86176d6a4c5b63fcd4a4ace793316c0f7adccdc888b308
            b5408bd6a21b89", "005c784be3f30d47393996fe596adbbe30aeb1d3a8
            d888b5075aa56d3b2be35c", "6b64079fac7b8d026520647b5764c5dbbe
            8b5486efb7791f5742511129c36a87", "41cbd69ac7603928be8e96d297
            56fe6763e5de8103c68eb484744ebb29bd2a1b" ]

commitmentWithProof = "a15c0dba015a5e68f63447b0a60e202ff9762a8776d30f6a4
                       d425e13adb97d19471e333b717fe7399a50794a82a9dc0a3c
                       ea65a2f95ada08c0d2c046707c631ccf714018882cb019736
                       f7f2dcff18c0401ff487f46fddf9087e122ecce539e983a85
                       1d7afcde02613a87f2866c1d385c5a9711b450c28b08d83ff
                       11ba63ac1422e624e594dba32afd0030580e72b433f1a559c
                       33d3b4b5c315fb3c1faacbf5d5e35ca04f95cc3475825789a
                       ee45c3efe38c71d9bda2954c79313037ca7412bb133ae87e9
                       98642cc31cffd437dac014193498e215afa415ef1f085252d
                       c15f6993f3c52d242b55a29adde95a4c6ebb05001d7ace3c2
                       220a191a630a2a3e31ebaf6ebebf7e55b5fe8372827d3b95905e37"
]]></artwork>
</section>
</section>

<section anchor="signature-test-vectors"><name>Signature Test Vectors</name>

<section anchor="valid-no-prover-committed-messages-no-signer-messages-signature"><name>valid no prover committed messages, no signer messages signature</name>

<artwork><![CDATA[Signature Label: signature001

secretKey = "60e55110f76883a13d030b2f6bd11883422d5abde717569fc0731f51237
             169fc"
publicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bbaa8fa1
             36f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632171d91aa8d46
             0acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db75c845d649ef3c4f63a
             ebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
messages = [  ]

commitmentWithProof = "849d3cc626720202cbc1610fc01ab41ce32099af602def0c5
                       79f37dd18b485ef60719275a036bdd8120e7e938c8e1a3d4d
                       0322587441ccc5caf186001b45dd09ee159713c3e3ea0f411
                       f94a5d6665546562d09c093b687a129e464a57e18cdbf5306
                       bcabf3e7cc95f5ba98cdd9bf3768"

blindMessages = [  ]

proverBlind = "1b6f406b17aaf92dc7deb911c7cae49756a6623b5c385b5ae6214d7e3
               d9597f7"

Trace:

B = "9964a978251fcc52c918dee3d8f102d2152fa7a805df85b1e91e0c45d4d8d7c02aa
     b78353a240176f6a33899b98b3379"
domain = "0b3a152bc770ff9e21f09ac58f59c99379ca0eeb61990ba666d994014085b3
          32"

signature = "ab54c35fb2af5c75d6368bc5772547e126d60a92205d011bb9ee5d11494
             32e91611fd376fe5b79d6ed7c2ba00a19b7434744945fd77bf02cd4628a
             6e5deeae50768116d55510251bb6a716a38340e184"
]]></artwork>
</section>

<section anchor="valid-multi-prover-committed-messages-no-signer-messages-signature"><name>valid multi prover committed messages, no signer messages signature</name>

<artwork><![CDATA[Signature Label: signature002

secretKey = "60e55110f76883a13d030b2f6bd11883422d5abde717569fc0731f51237
             169fc"
publicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bbaa8fa1
             36f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632171d91aa8d46
             0acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db75c845d649ef3c4f63a
             ebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
messages = [  ]

commitmentWithProof = "a15c0dba015a5e68f63447b0a60e202ff9762a8776d30f6a4
                       d425e13adb97d19471e333b717fe7399a50794a82a9dc0a3c
                       ea65a2f95ada08c0d2c046707c631ccf714018882cb019736
                       f7f2dcff18c0401ff487f46fddf9087e122ecce539e983a85
                       1d7afcde02613a87f2866c1d385c5a9711b450c28b08d83ff
                       11ba63ac1422e624e594dba32afd0030580e72b433f1a559c
                       33d3b4b5c315fb3c1faacbf5d5e35ca04f95cc3475825789a
                       ee45c3efe38c71d9bda2954c79313037ca7412bb133ae87e9
                       98642cc31cffd437dac014193498e215afa415ef1f085252d
                       c15f6993f3c52d242b55a29adde95a4c6ebb05001d7ace3c2
                       220a191a630a2a3e31ebaf6ebebf7e55b5fe8372827d3b95905e37"

blindMessages = [ [ "HASH", "5982967821da3c5983496214df36aa5e58de6fa2531
                 4af4cf4c00400779f08c3" ], [ "RAW", "a75d8b634891af92282
                 cc81a675972d1929d3149863c1fc0" ], [ "HASH", "835889a407
                 44813a892eff9deb1edaeb" ], [ "RAW", "e1ca9729410dc6ba"
                 ], [ "HASH", "" ] ]

proverBlind = "4fba5396baa36b2fde81d46a9b9ee89c425dbc5e1ffd65c20249afb4a
               bd37589"

Trace:

B = "93cdc8aae02518f4fe3c934c0a755917832fac273a73420ae3475bc625addf7199e
     6ce58b1975fd053acc32d8b6a9c91"
domain = "13c94073eb7dbd279f60d5907c19d83e4a9ae19f99d6b3ca020785730a3f37
          eb"

signature = "90664af67f17f2df73cc62dbca36f93ac84afc4b2b8a30e25cda5109df7
             41b0e040797e759047d6d3db907f096b768d207747cd45bb016bbc894d3
             13108a4abfb71e875d75237f2b170f83957a877025"
]]></artwork>
</section>

<section anchor="valid-no-prover-committed-messages-multiple-signer-messages-signature"><name>valid no prover committed messages, multiple signer messages signature</name>

<artwork><![CDATA[Signature Label: signature003

secretKey = "60e55110f76883a13d030b2f6bd11883422d5abde717569fc0731f51237
             169fc"
publicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bbaa8fa1
             36f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632171d91aa8d46
             0acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db75c845d649ef3c4f63a
             ebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
messages = [ [ "HASH", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e31
            0a1debdda4a45f02" ], [ "HASH", "c344136d9ab02da4dd5908bbba91
            3ae6f58c2cc844b802a6f811f5fb075f9b80" ], [ "RAW", "7372e9daa
            5ed31e6cd5c825eac1b855e84476a1d94932aa348e07b73" ], [ "RAW",
             "77fe97eb97a1ebe2e81e4e3597a3ee740a66e9ef2412472c" ], [ "HA
            SH", "496694774c5604ab1b2544eababcf0f53278ff50" ], [ "HASH",
             "515ae153e22aae04ad16f759e07237b4" ], [ "RAW", "d183ddc6e26
            65aa4e2f088af" ], [ "RAW", "ac55fb33a75909ed" ], [ "HASH", "
            96012096" ], [ "HASH", "" ] ]

commitmentWithProof = "849d3cc626720202cbc1610fc01ab41ce32099af602def0c5
                       79f37dd18b485ef60719275a036bdd8120e7e938c8e1a3d4d
                       0322587441ccc5caf186001b45dd09ee159713c3e3ea0f411
                       f94a5d6665546562d09c093b687a129e464a57e18cdbf5306
                       bcabf3e7cc95f5ba98cdd9bf3768"

blindMessages = [  ]

proverBlind = "1b6f406b17aaf92dc7deb911c7cae49756a6623b5c385b5ae6214d7e3
               d9597f7"

Trace:

B = "aeaec838afe164ff40badec6466a21f4cc12aa440f839cb8c5f07d1b07eae28ba1f
     dc33eafdffbb9d4f373f79c2ee0c9"
domain = "1430cf0a3d8a0519a9ecf47534b6026a7671935d9854ed5e68b42fdb543d5f
          7a"

signature = "94d2d67acef8a52e0d2adce2decf6f2d936f30e61ec61b93b9d3e0fd022
             d04e2b057ef1c9805a355d82aa10d51495f063cc821b29bb855f906215c
             62d64370ad252d42cae0e5616865c9f73e904c522e"
]]></artwork>
</section>

<section anchor="valid-multiple-signer-and-prover-committed-messages-signature"><name>valid multiple signer and prover committed messages signature</name>

<artwork><![CDATA[Signature Label: signature004

secretKey = "60e55110f76883a13d030b2f6bd11883422d5abde717569fc0731f51237
             169fc"
publicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bbaa8fa1
             36f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632171d91aa8d46
             0acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db75c845d649ef3c4f63a
             ebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
messages = [ [ "HASH", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e31
            0a1debdda4a45f02" ], [ "HASH", "c344136d9ab02da4dd5908bbba91
            3ae6f58c2cc844b802a6f811f5fb075f9b80" ], [ "RAW", "7372e9daa
            5ed31e6cd5c825eac1b855e84476a1d94932aa348e07b73" ], [ "RAW",
             "77fe97eb97a1ebe2e81e4e3597a3ee740a66e9ef2412472c" ], [ "HA
            SH", "496694774c5604ab1b2544eababcf0f53278ff50" ], [ "HASH",
             "515ae153e22aae04ad16f759e07237b4" ], [ "RAW", "d183ddc6e26
            65aa4e2f088af" ], [ "RAW", "ac55fb33a75909ed" ], [ "HASH", "
            96012096" ], [ "HASH", "" ] ]

commitmentWithProof = "a15c0dba015a5e68f63447b0a60e202ff9762a8776d30f6a4
                       d425e13adb97d19471e333b717fe7399a50794a82a9dc0a3c
                       ea65a2f95ada08c0d2c046707c631ccf714018882cb019736
                       f7f2dcff18c0401ff487f46fddf9087e122ecce539e983a85
                       1d7afcde02613a87f2866c1d385c5a9711b450c28b08d83ff
                       11ba63ac1422e624e594dba32afd0030580e72b433f1a559c
                       33d3b4b5c315fb3c1faacbf5d5e35ca04f95cc3475825789a
                       ee45c3efe38c71d9bda2954c79313037ca7412bb133ae87e9
                       98642cc31cffd437dac014193498e215afa415ef1f085252d
                       c15f6993f3c52d242b55a29adde95a4c6ebb05001d7ace3c2
                       220a191a630a2a3e31ebaf6ebebf7e55b5fe8372827d3b95905e37"

blindMessages = [ [ "HASH", "5982967821da3c5983496214df36aa5e58de6fa2531
                 4af4cf4c00400779f08c3" ], [ "RAW", "a75d8b634891af92282
                 cc81a675972d1929d3149863c1fc0" ], [ "HASH", "835889a407
                 44813a892eff9deb1edaeb" ], [ "RAW", "e1ca9729410dc6ba"
                 ], [ "HASH", "" ] ]

proverBlind = "4fba5396baa36b2fde81d46a9b9ee89c425dbc5e1ffd65c20249afb4a
               bd37589"

Trace:

B = "a619fe4a043ba95d97ce00f92e269c50dae3b18a8d4d271db7ebfa335abe89e9d5c
     d28b55b16da99b317bf65a573a0ef"
domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"

signature = "a6bf9f17edd7e7fc5d3e55aa82e0b833774611ecdd01dbf874f056adcb8
             33e4f52752d32716b7b6f4d29e9fa604520386396a96614639198b7f91d
             b5f5ba1aed9411d0d006506705d2283800d142b591"
]]></artwork>
</section>

<section anchor="valid-no-commitment-signature"><name>valid no commitment signature</name>

<artwork><![CDATA[Signature Label: signature005

secretKey = "60e55110f76883a13d030b2f6bd11883422d5abde717569fc0731f51237
             169fc"
publicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bbaa8fa1
             36f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632171d91aa8d46
             0acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db75c845d649ef3c4f63a
             ebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
messages = [ [ "HASH", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e31
            0a1debdda4a45f02" ], [ "HASH", "c344136d9ab02da4dd5908bbba91
            3ae6f58c2cc844b802a6f811f5fb075f9b80" ], [ "RAW", "7372e9daa
            5ed31e6cd5c825eac1b855e84476a1d94932aa348e07b73" ], [ "RAW",
             "77fe97eb97a1ebe2e81e4e3597a3ee740a66e9ef2412472c" ], [ "HA
            SH", "496694774c5604ab1b2544eababcf0f53278ff50" ], [ "HASH",
             "515ae153e22aae04ad16f759e07237b4" ], [ "RAW", "d183ddc6e26
            65aa4e2f088af" ], [ "RAW", "ac55fb33a75909ed" ], [ "HASH", "
            96012096" ], [ "HASH", "" ] ]

commitmentWithProof = "null"

blindMessages = "null"

proverBlind = "null"

Trace:

B = "a2359c13af15dd2e60cf53752158fc27122b70056352b190594cb7cbd3d69433472
     da4e5ec2e41dd662e18fdfc2ad374"
domain = "1430cf0a3d8a0519a9ecf47534b6026a7671935d9854ed5e68b42fdb543d5f
          7a"

signature = "a2dea6ba9888d0fd11707d12b1eb72725c693ec1be4afaddccad0cebb84
             5a8ed158ede75860656b4e21d4d588b01a51726b2ecd98d7ab9e02af39e
             9e8e47ae00bdc5d02549bebd9a96437b3450001cc8"
]]></artwork>
</section>
</section>

<section anchor="proof-test-vectors"><name>Proof Test Vectors</name>
<t>Mocked random scalar parameters</t>

<artwork><![CDATA[seed = "3.141592653589793238462643383279"
dst = "BBS_BLS12381G1_XMD:SHA-256_SSWU_RO_H2G_HM2S_PROOF_MOCK_RANDOM_SCA
       LARS_DST_"
]]></artwork>

<section anchor="valid-all-prover-committed-messages-and-signer-messages-revealed-proof"><name>valid all prover committed messages and signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =

0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"
5: "DISCLOSE"
6: "DISCLOSE"
7: "DISCLOSE"
8: "DISCLOSE"
9: "DISCLOSE"


blindMessageDisclosures  =

0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "2cf2bd257845b6138247ad87cb387aee347a9104fd1090f92e3b7559e855b068"
r_2 = "14f989abea9c9d0cbae6d72e2eb806ac7dbfcd08a8ed647ad5b8e16a83b94d4a"
e_tilde = "07e5d7e2b504d3e3075617400781df19831fac0763602bc494b3fe40dcdef
           b47"
r1_tilde = "35888226d06bd50f1901008bdf70b1472ad98304664828c6a0fa45b396cc
            a7d9"
r3_tilde = "21e5d2a43d0190ddee9319dab20ad1bfaacf7c12399ac384fe9bf1235c19
            1907"
m_tilde_scalars = [ "6683a44c7e1b057c7ce5e99dca9d71a091441b6c23ad9bfd45b
                   a23862f610cf7" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "269fee123a249969dd386b150dc3e299e30c2635a43ff72504091ae4c0e
             efe38"


L = "10"

proof = "0000000000000130b87c3055f468ceaadfc7d6f2ac1d98a327d4f951d36d9cb
         261c2301c83a9f02fab79fd7e8bf5d0b08a82377264586cd18ea08458804660
         ba0951656f7cbcc5cefda500af1b446441768b60a008ded2f54a15ee9df508b
         79cd7dc12216d7a9eff9247614bea18499fa258d3d5277d7ab1b2e994f7f179
         9dae3b25a36f88ed7030619bf3e2c2a0e398e15e0b4d8e0c592019ddf0b4aa4
         ef7cb1c8c3cced9469d456f8b26746f694852dfcf8e169a15afad69e26ea749
         a11296fc412ad9d70200ea5ecf1e5e647a2cecba39455a4ca00dd00aec3d84f
         5a973818e846479904b5b38d3842a788afd395605a471068baba24f498e0850
         ea5ba2978ebd5a9dcd1244112ea62b3165500f9c4b1fac6a5603bc84269fee1
         23a249969dd386b150dc3e299e30c2635a43ff72504091ae4c0eefe38"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-all-signer-messages-revealed-proof"><name>valid half prover committed messages and all signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"
5: "DISCLOSE"
6: "DISCLOSE"
7: "DISCLOSE"
8: "DISCLOSE"
9: "DISCLOSE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "5a113c961c5d21bd78b50c3079ea482f5e861c20be37899d26e2ba565ea67093"
r_2 = "1ce7fcf7fc75bffdf3cd0a284a5cd4acf6be87df552fa937f246a38e8c03af0b"
e_tilde = "286458907bcd8e3fc535ed9575531919d1942a907ef8ed10360e292fca5ad
           0bb"
r1_tilde = "40caa7858d917197f007c87ea7e80f638db1313b0e3d46612bb2e73798bb
            24c8"
r3_tilde = "6d30be5b88e8cb333e4872bdf0c4d7cffe4540eddf03eafaae3d4cb1f3ad
            1cda"
m_tilde_scalars = [ "342ddc1b4e04cef472c764f5bda8afae4b189e78ffcbb519075
                   a83e640c0100c", "51608282827ece21a8ed20b774e2ff129353
                   416006317c16e409e1a925540345", "0c1ff555f2b0f53e8859a
                   ff2947b22b1ef9d2be2c65621d8f6aa3252340fcaf2" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "414427dc3f3632e0cedcbfe2a030385c3b6c305a5a3cbd885b08d3db285
             45bfc"

L = "10"

proof = "0000000000000170b59ecf904e9b08474940bf79c8e05c564407663f9b500ef
         993792c6f975e126bf151b589c3d207411c2871a9a4103a89906269f69cefd9
         ea7cce305c2744e065b787d7dec03137002f045e6cb59278c927e893f0d648c
         f7d2e443317d0513d49968aec3bedda934d01af1e5fe747df32579186f6804f
         89a98ac938a6549b6f7e7eaf9ede526bc7bb938d0402d4f6b4c30dd5857cbe4
         95dac5ffcd5ee355e0405b299a2f69cf70cf78e5f40e68bd0fda43337def89f
         a34873a3f91ae4285759be62cd0f8e8898940c400010acb8ab51a85e215ce6c
         46b4dd1c1318de8777b620e5428543fd3d8326ea36d9e61691cfd5c3d91bab4
         0277ccf5f1c896e7be4cd747fea988f9678983b1de45231526a358ce085f72a
         a177f48a7c2f75b76ba4e51f2e922159143bb1c71c52add5c2edcd310050244
         1b39d11faf6243c08f97facb13b1db8a22052163ad7507794e13105fda41442
         7dc3f3632e0cedcbfe2a030385c3b6c305a5a3cbd885b08d3db28545bfc"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-all-signer-messages-revealed-proof-1"><name>valid half prover committed messages and all signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "034d543fdd164520876e558a77c102d4ad8bc99bf82ebe74590481473df2df56"
r_2 = "4a8334929ba48d36eb4ebc7f8bfa701b4d3f30ef25bc01e2a45ef9611c16037f"
e_tilde = "19726feed8e0e5ff22e4f5de19713977beceb12c3e85c1f3fb41cfe4a7237
           d1a"
r1_tilde = "73012dc2f14039c8de5853b26baab7b51280a3f41425416d78a1a91fbaae
            9bf2"
r3_tilde = "68263029bdc322a3d6460758135205dec58957ff3e5397276a2f0ffdc738
            d5e4"
m_tilde_scalars = [ "52638b8d190f9fd439188b22c903507cfe5282296c2c9f605f1
                   ef714afc14062", "2cbc33e381cf6ae09dbb6f1d08e3ea93a5aa
                   03c4a6574fd2fa2e879dc4deeca9", "1ec36e6be1c702255d9aa
                   4d590014b2b5de2f07d290c9551b66977cde157094b", "549161
                   2228a993693c79c11ae169dad9be4116a704ae9ed333ef96e3986
                   373a0", "6f4d920974d33c1e08c86b7f4b6bb7c58a5c0289d8d7
                   06a92d4855125ccedb70", "279717a2b1e1d34cccfddfe9c8e37
                   29f6e92e28197a09459c6dcd56e3920a0d7" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "43f138775ee20af0ff795928f9020d99be22b1da4e104b813c5e2e56482
             78af1"

L = "10"

proof = "00000000000001d0abf85461074c76b33d81156ccdab354e923e84477ce8db8
         dbc330431cee9c9585e44132dd00533329fc008e706b3c953b5b6ab8ca6a137
         a3c5b6ef60f537e999ab14dd37f8d1d8241288224b284f40d0509b74e65573c
         078edf74395b0491f18b8b9d3a97ae1ee38d7f394acf60a739a67b34e76a486
         40d153e27a5f54d2f1d4a2eb79ee618c0a7dc83a07c51e3a8e0a1d77df5ab72
         d6edcabb709b15c47abc52fb337231cd9eb5a0efb01a94d3ddca7418db71da7
         41d8109c21777c2cb2d3fee57e22b893601d9c59fb8eac08db891c048afc165
         d2a619051b3cad6fd866028105bb06e92cea6e07b25826d67e3f6890adb382e
         91b61ccf6cc88dd51750f6f726669068850290c4448514a70e1c48a860a5825
         b3c187f12686ff673637a3f6c10da8318240eba0f0b0d51ddd7dd27c917bc8b
         8af46c80606f88646228be7afdf6aeb961e90e7ad6481becd8aee9400615522
         e0489633e2a953f532fb325f9edf43ad43a1f0581d1e95ced30fe3fb812668a
         ed4995e81ab550cabb44c075e17753b08920541edfbe587eb5972d1afbbc458
         f7242aa3e21aa1bf85b7e400d65ec45551168f1d40e38843f1898823df71d43
         f138775ee20af0ff795928f9020d99be22b1da4e104b813c5e2e5648278af1"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-half-signer-messages-revealed-proof"><name>valid half prover committed messages and half signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"


Trace:

random_scalars:

r_1 = "6fe2700deae18571f365d5b549a03eca3a19414532982cdb173e6442f8488a82"
r_2 = "4cc007c238298166e67bcbc8332435b27f39879b75ab00ed5e6863f6296051a4"
e_tilde = "53f3c5e5ff89fb20a89d7fffa1198b13744d1ae78457119e5bb3da42d77bf
           e56"
r1_tilde = "14e6c0d53eba55936c1f1ff11d9775fde7bc366d1859cdbd9ec9f65510a1
            9b02"
r3_tilde = "0a3c38367bd4f42d8b44d988580b40ad1c929a3844fd92e0d2c2a7247962
            18b4"
m_tilde_scalars = [ "4e27cd534e2d06c2af769760a2651010d8f2495066c4a4bbf33
                   778f558c72b09", "2ea785a49f1b29d7f79323d5e369e3598665
                   c6e6ed1352797dcdd20b249d58fe", "438393d39c51a4efe0bf3
                   b53acf17a7b26724ad7de58ff8bd5fdf9dea0f5675e", "01d9d7
                   9da4918a57bd628cd625cba37cb3a278b419e04f5880c6cbc77c9
                   05c2f", "525ec7e60016e00e8e1d039d245bd7c44c4dbff8f566
                   deb9e902d10819edc0b5", "1a65097b4ef6145d0ca4c8257e193
                   afe8245c85a3cc934b1a28c876c7d65809f", "5f3a2f4d08763c
                   a6a6685aebb3eeb66a0887c750698b44ac17b7bed8ac3a1fd6",
                   "4c583e5e4fc913aa71989afc50cfd8c2024d64df96ed12c7ef82
                   d50ed4d8bb1b" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "51de4aba92436e77cd06c4c79416770b73dd1097f4790a9e6b35b4caf7c
             09cb2"


L = "10"

proof = "0000000000000210a189f65d2f5323725fe95598e36c27250547e1a726fbcb2
         0897eb87d36600c3638f736d49c682786cb1ac0c4f4e7aa7582eba8d4d1fe9e
         5b0aa6e0eec9384a267e5ea46ca77f5be4d53f25cd448594184f67b76865414
         2bae5b872e908bf25dda3a13d1479abbcc8a2478d1a5cd8c8b0b51b8a365e7f
         aac85966d9312bac4ed181ae0e29b1e12bf6eb2130eae233cfc13e18cbcfd80
         ab66b2546658d67332eb14cd20b3b53a83fef9704f68a794b25e202ad7350c1
         a275b8784a03418128964bb27638113c6f127f63a3f274ea82ad012c36b8c27
         a4b440c54c677bcdc8f092fbd53f591ef6c84a6f39484badd4c956c48f00f83
         483ec557e7d85f45cabd5d6650018d092e116a48aab518eec6983cde33a609e
         8f6a988d846d4ec60678837521a353983ea2e74c392d1d858ce6b20ee2ff777
         24acf12bc33223d059ca4c1d44d3b2fbedba73bf2e539018bbb78c7dfe1025f
         19e58630bf31965538248bbbcd19132869e501c9419eadcb89e8dd9c59d4e88
         217390a042297a95c3d3cb75cd7584fd38b806e12d0617a90bbb5a0cf40e649
         45a5191f945d40f1aaecf3e816d96baa314e647fdae3e7bc15cd2ee7ce82803
         045d99712f91ac49d43be2ae108c2e80def236b272a97bd506efff4b2e39767
         17e60c94ac0529fdd2f51a2053e5a8575834b65dc6ef5f091bee14d3c210f50
         51de4aba92436e77cd06c4c79416770b73dd1097f4790a9e6b35b4caf7c09cb
         2"
]]></artwork>
</section>

<section anchor="valid-no-prover-committed-messages-and-half-signer-messages-revealed-proof"><name>valid no prover committed messages and half signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature005.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"

blindMessageDisclosures  = []

Trace:

random_scalars:

r_1 = "034d543fdd164520876e558a77c102d4ad8bc99bf82ebe74590481473df2df56"
r_2 = "4a8334929ba48d36eb4ebc7f8bfa701b4d3f30ef25bc01e2a45ef9611c16037f"
e_tilde = "19726feed8e0e5ff22e4f5de19713977beceb12c3e85c1f3fb41cfe4a7237
           d1a"
r1_tilde = "73012dc2f14039c8de5853b26baab7b51280a3f41425416d78a1a91fbaae
            9bf2"
r3_tilde = "68263029bdc322a3d6460758135205dec58957ff3e5397276a2f0ffdc738
            d5e4"
m_tilde_scalars = [ "52638b8d190f9fd439188b22c903507cfe5282296c2c9f605f1
                   ef714afc14062", "2cbc33e381cf6ae09dbb6f1d08e3ea93a5aa
                   03c4a6574fd2fa2e879dc4deeca9", "1ec36e6be1c702255d9aa
                   4d590014b2b5de2f07d290c9551b66977cde157094b", "549161
                   2228a993693c79c11ae169dad9be4116a704ae9ed333ef96e3986
                   373a0", "6f4d920974d33c1e08c86b7f4b6bb7c58a5c0289d8d7
                   06a92d4855125ccedb70", "279717a2b1e1d34cccfddfe9c8e37
                   29f6e92e28197a09459c6dcd56e3920a0d7" ]

domain = "1430cf0a3d8a0519a9ecf47534b6026a7671935d9854ed5e68b42fdb543d5f
          7a"
challenge = "023ea5b4711ae66b6b87bc2063ba81d2a0db81c54d185a6625f90b8b2c9
             96a8c"

L = "10"

proof = "00000000000001d08d1c07be20b1c9bed4359ea5fc9f63ef00171c185ddad5d
         f62eca0e9919a981a46ea97221afc0ed55a39afb6710a14abac73b4f2dc5aec
         7219683f4a44d842a20d36eff0b61ba49906ba7ad163c8297fd84aa9d4a09b4
         699bc3a9d12eca61c0b8724f71c0a54cb6bf10b294dc7d7299a31a21f645468
         7aa0f8b9c50a023177e946947d0f8ec15f138b587c187e812353298a2f426c0
         0534367b25dbf4e25446c02a6261942c5a8daff2b9830a83a15a9716ee94aa5
         560f651884e74f8f144b9f457e4dd1a9fc1d7576353ecbe1741e36438e0b696
         840cfe134a61934c5d2652c3ebcb6d2b9f320855c7d8e488856f3f85c1c8d0c
         ae388e211e41acee0a7dbe9c02dd0f7795ea6bea507251732b8d6ed62b12c74
         e2091e11b4f70750c93d1ea23cca097ebf9504f934b6b1bfae0d2b94b6151d7
         d61a6176a1ffe54314f677a279a4dbd5ec29871e734755ce39dfe4aff103b65
         c9f78c23b0927faf59f322c1ca0052436fe25d1bb2a64b90aebe6abf61e612e
         fc5cfb546f4c0fcbbe9a757a2889d56ecf887b582a4e17ddeeb89d11e3bd279
         717a2b1e1d34cccfddfe9c8e3729f6e92e28197a09459c6dcd56e3920a0d702
         3ea5b4711ae66b6b87bc2063ba81d2a0db81c54d185a6625f90b8b2c996a8c"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-no-signer-messages-revealed-proof"><name>valid half prover committed messages and no signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "HIDE"
1: "HIDE"
2: "HIDE"
3: "HIDE"
4: "HIDE"
5: "HIDE"
6: "HIDE"
7: "HIDE"
8: "HIDE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "23d8b41f82e80a32c4606bf7198b6a85bfdcbb9a87773a54e668aa6cc50f4b60"
r_2 = "259cb8451e183911fd32701689c8da084a351cbc878edabb5c65892f5566cbee"
e_tilde = "0750d611202174343211411eb9aeb18d6b09057c51e9f9524cf1ec29a845a
           4c9"
r1_tilde = "519d28834203f545ce2e917b1428e59f4ca3e716351c2f03b9884bf3b84e
            e5d9"
r3_tilde = "664fd86f51bd56079f1f58e8f29881ca6881f9022b267a0842eb9bd66d8f
            f116"
m_tilde_scalars = [ "35c21b4641053b0e351cecc6b4f7aa9687771ea67785ba51ddb
                   13ee3d6616344", "2dec7bd3fcd718500184d41d750642b55d21
                   ea63b494bdf41011dca9d7075b57", "277ca0dcb0183675a981b
                   fa22e2ad09c8a61b23761575078374a9df40cb63237", "3376f3
                   1a419eb425ae5375029f0f1caba349467ff477c30aa6a577ffbab
                   c162b", "22808132ab0fea4b85a2b6621abc8f2e78b65f3417db
                   2e8350bec0a5d02f12f7", "68b417316ece357d32bd0e94f5211
                   a900abf5888ec25ad7762d40413d45a6ff5", "668d12f5ef2c39
                   1c0dc06f1f2c1451d710c743311cd213c268bd7b41085300d5",
                   "1f45ce8d90d44399aafe97bd024636747766b670004c366af6b1
                   9dfd211fdae9", "304b07fecf8dcc052c29b4d52934a031d4abd
                   ad430c4bd3ccc65028d4e26da8f", "02d05a55bcfe243c268154
                   cc03f548ffa461f84c4087c7bbb6284e4e07ffee53", "3e20f9d
                   1709e50cf709530e4e267f544eda9c4b9e214e4b133c20cda8477
                   ffe9", "6e41035b050e5ea1f97bc975eb5a63447470bc24639a7
                   f63269e8b3f5d8f94a3", "31dad9cf8ab3482296a766c4c6e2a9
                   7b2ad9e83cf8c83755940736235bea6e0e" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "6ebb930f95fccdf789b9bbf2809c8e3717afc7cffb7412b9a543cfd4e40
             a71c4"

L = "10"

proof = "00000000000002b0b4cff01cb8c3518cdf0ca7e32bcda95f1c6832b6b756424
         4ae4078f6eb83256a02b4e45c30874697dd2402d190ae947e867007e6140b41
         90b90e195da8168764ef1178706da0c890bc98d90badfcfbcb009ac7b903597
         773656251a24253d7f092a3daf8bc8e2c47ce844e23b8bf70fde76404d48ed9
         55833381ed45fa8af41cfe8f5d00dca31d77e0770125c8624fc140a9c416539
         db2b649323801b93731b2836589eb8986a27839b60831ead30d5135e112ccfa
         92f1e31a13c1b7181ddd3efdbdc959983ef6f5315cce2409b89d011d2c15d0e
         626041d3295dcbb65719b767055620acdb9fc39441bf27f99dde54264a27289
         77c076afa4e49383e160917f684840735715a3e301de6d5576bff15f44973ec
         250d88857e5563b4020de568820a4367b3a7ed1873818c2b16c404d0d22d37e
         5198d30e97f30529d385ad9ce2ab4f64d0bcfd4b0b0e58ab387826cc560334c
         6dca2223f4eb592bdf4c40b048ce09a5e0d8a34c0f3a99aeb70fdbe18f608da
         1ba9077eb74ba845614806a76cf3ecca5dedfdbf0ba3495b6aadd2da85d326d
         ef0fc83cd3199b138d04685dba54b53bbb02cc4ac37eabf7efcb3db4f038d1a
         67e7cfb52b6da7442a9a31252e46c270661e11fb990e8a1d4c3ff6d4969d083
         55191923fc14696d927818858da9713b504256f1e8f1499bbad1ba341e6acd0
         6b68dbd4ec98afc32ce373fcefb2206e6a60796c99238daf8d60acbfda9eed9
         a09f4c1c7dc271671e4e3aa2e26ffea890f3860aafac4d568a027c351693d04
         a56fb084ea56500646a96b9e8a4bfb37e2a83584ad5e2c5dd006a13459366f3
         29749f98331b30ccb65ef2e2ef006941526b18b856f73f8220e271de6b4b9ec
         582452b34970dc3079c0e4c1a3ab400e223cc54e64b942f885a0dcc2b7be633
         3e0516ebb930f95fccdf789b9bbf2809c8e3717afc7cffb7412b9a543cfd4e4
         0a71c4"
]]></artwork>
</section>

<section anchor="valid-no-prover-committed-messages-and-no-signer-messages-revealed-proof"><name>valid no prover committed messages and no signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature001.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures = []

blindMessageDisclosures  = []

Trace:

random_scalars:

r_1 = "2cf2bd257845b6138247ad87cb387aee347a9104fd1090f92e3b7559e855b068"
r_2 = "14f989abea9c9d0cbae6d72e2eb806ac7dbfcd08a8ed647ad5b8e16a83b94d4a"
e_tilde = "07e5d7e2b504d3e3075617400781df19831fac0763602bc494b3fe40dcdef
           b47"
r1_tilde = "35888226d06bd50f1901008bdf70b1472ad98304664828c6a0fa45b396cc
            a7d9"
r3_tilde = "21e5d2a43d0190ddee9319dab20ad1bfaacf7c12399ac384fe9bf1235c19
            1907"
m_tilde_scalars = [ "6683a44c7e1b057c7ce5e99dca9d71a091441b6c23ad9bfd45b
                   a23862f610cf7" ]

domain = "0b3a152bc770ff9e21f09ac58f59c99379ca0eeb61990ba666d994014085b3
          32"
challenge = "3b7bc3b309c394db951c3a822fc508103322979bf635c19a3bd8327a73e
             cc70b"

L = "0"

proof = "0000000000000130af607ae478e51503cd6b1fb1b4bcd7eef4edb78abc7bd7b
         5f29b62f0c82a85f2effb61c042bd645f6b5c580a073910a38c3495d1f76f6f
         6352732664ac3e7b69e4642edd51e3d33a0c6cd180cd79a491a3b2f96896163
         919bf4b416f70b0b199887cd6c27624f58ea23e6f295ea55483609763911e5b
         a090549e4a8e45bffd8a457102bce2dc4a36f582ce78ff84fc0a51ea4ed6b4a
         ce1479e6ad27594fac62a5ef196ec4e8721f30147c10f189ccf693e5c028b49
         5b671253ca77cc11b0c3f55ee4d4ab1d90588a01a6aaa5423b690125e34074c
         8c3f44052d5f51e1c8ff003ff208911cd884736b64f6d37d3224dba24903a41
         71563efc07f7817d4d7ed9d910166c5354ab24f1eb11ccb469487c873b7bc3b
         309c394db951c3a822fc508103322979bf635c19a3bd8327a73ecc70b"
]]></artwork>
</section>

<section anchor="valid-no-prover-commitment-and-half-signer-messages-revealed-proof"><name>valid no prover commitment and half signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature005.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  = null

L = "10"

proof = "00000000000001d08d1c07be20b1c9bed4359ea5fc9f63ef00171c185ddad5d
         f62eca0e9919a981a46ea97221afc0ed55a39afb6710a14abac73b4f2dc5aec
         7219683f4a44d842a20d36eff0b61ba49906ba7ad163c8297fd84aa9d4a09b4
         699bc3a9d12eca61c0b8724f71c0a54cb6bf10b294dc7d7299a31a21f645468
         7aa0f8b9c50a023177e946947d0f8ec15f138b587c187e812353298a2f426c0
         0534367b25dbf4e25446c02a6261942c5a8daff2b9830a83a15a9716ee94aa5
         560f651884e74f8f144b9f457e4dd1a9fc1d7576353ecbe1741e36438e0b696
         840cfe134a61934c5d2652c3ebcb6d2b9f320855c7d8e488856f3f85c1c8d0c
         ae388e211e41acee0a7dbe9c02dd0f7795ea6bea507251732b8d6ed62b12c74
         e2091e11b4f70750c93d1ea23cca097ebf9504f934b6b1bfae0d2b94b6151d7
         d61a6176a1ffe54314f677a279a4dbd5ec29871e734755ce39dfe4aff103b65
         c9f78c23b0927faf59f322c1ca0052436fe25d1bb2a64b90aebe6abf61e612e
         fc5cfb546f4c0fcbbe9a757a2889d56ecf887b582a4e17ddeeb89d11e3bd279
         717a2b1e1d34cccfddfe9c8e3729f6e92e28197a09459c6dcd56e3920a0d702
         3ea5b4711ae66b6b87bc2063ba81d2a0db81c54d185a6625f90b8b2c996a8c"
]]></artwork>
</section>

<section anchor="valid-partial-prover-reveal-messages-and-partial-signer-reveal-with-commitments-revealed-proof"><name>valid partial prover reveal messages and partial signer reveal with commitments revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "COMMIT"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "COMMIT"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "13c56cabf679ffcd59c41f3fe18ee4993ac4accba74037e01aafc5c0e79d8524"
r_2 = "2ad00067178fed38af012a1db49065e0135f7514acb184b15adc2f3bb3439c68"
e_tilde = "1bd3f8284098f0c0f5866aef55b05d982b6669570f496e633dd13c7f0e9ca
           87d"
r1_tilde = "727dc28ed4618e9fd6de9b0b0892176eb5ce745aaf927b1f1c830d0222ec
            6d89"
r3_tilde = "14766b8ccf4e93a3b457942a0d1892689c5d66cd36e67b8761fc9fc06521
            afda"
m_tilde_scalars = [ "55cd78757fab58eb75a8260d4a990233ab996a1be803cfec107
                   1981b037fbfa8", "5f22ca14b29e8217c2d80bffadba8fbe0e9a
                   72b08676d8805f494b01ee0a322d", "18916a46f8255442283f1
                   33902d5f16f4cd583f6b8e68b4f2651ae52792485af", "39c682
                   8e74bc304f475a70831781de4be5e876fd5a34a34df553666c14c
                   1b600", "54715e8092608f37043d85c2829eab964d0c8332ee8c
                   0e1d31991394e367adab", "377db8d23e45a90c39b57b9042584
                   b87e0e870d00002aabd2e2b7432b1ee81fe", "456503806bf43b
                   0766c629e5fee11956ed46232049e7a4fd29ec9f50212ceb88",
                   "1c79c4fc9e4f696101ae41ba5728a14a54fef180e92c71471e96
                   4c8dfc1813ab", "4c7fe9d2f777bfcd1cc185d8c252f75c4512c
                   3ad796a665d8737c1fbccdf5246", "58e4f89934eca37018857c
                   9967661294a68cfb4312214696a9e060d96a6ce3e3" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "2c1c7e0870c4bc1b2da93c1fb4380b8168fd0d1bed9fc2082128d0a4922
             0de9c"

L = "10"

proof = "00000000000002508b9a3add22f020d525bed93ce5e3e47652ed1fa4e067888
         cb43d07830a0eacfdcacf381841669e2a6a70ab0480617f9d9753074285346f
         c682c2b69efef9f15810076b43b6e51bf6ddebef2dedb7e0c4ea74cea646c4b
         7aba9b4a2d31dc21398987b6a0c5e8052f1255dc782e8ff64ae48273ca84ea6
         854a4e417762f305252ce745ffddfc02eaffc46c8cae544c5bf81f39bd06ac6
         bb156d9fa831544ec9e8fc25037480a0a7a3c0c4c0466850b3ec645d8c47139
         ee1cdda116b74b7d0ebac2f277bd4871ee7a789e4f234dad5f7eba1a89d7a6b
         89a053d820612bb50ade036a2c6bb706a0ae718752af654600a768d23df4fcc
         3263a00c7f24c733e53551249e4d4c94392aef9a776afc53ffadb6e23827049
         6d6129e02b417b095a575b608fede5fda3ee749eaefbd6be2108c8c8d13a994
         4b6eb54d525916eef2f363b7ddc012ba3faa031fa365256ed8d230a69536f15
         fd933456630bd70047df3e31d146ea0d02c38b2f39073a9296487cc381d371d
         c6a63ae457179a7e1fc6fc6eed82e0d15b5d1894cf0f6120cc50110348b96f5
         3088568a25d0755e8b4743950a7bedc3009d620f98c2d56fecb3cf74a1f0c3d
         7f77aee56be9dc0562999f92871fb08075c5c160291a65de34a246c921da505
         de5e550606aa83e3259945215be4e92970bd971346c5897dc82a8c79c9d0ab1
         2c49e690054c4122fd5988b51596e7dc6d6520308f4f93d4f204fd2ee7bf16f
         6311c41b29ce33537e69b575e8596d7f2eb0d749a38f89a54ad62c8712b2106
         512c1c7e0870c4bc1b2da93c1fb4380b8168fd0d1bed9fc2082128d0a49220d
         e9cb814e0cc7b4306e581f8bb5a6aa4e3d144fd04114eec890a871f11d6fa98
         605b2c8bc0ee58cca17d85992158824e5212a96a889f2a04b67ae653f983f39
         9aa552f90401dc3bfb3de3ae2f104e3a4604204adbf8c1de0d344441d12ffdb
         85980b32cf09e57830346c607e7277be83b3293a386a7f3c51348eb4c997312
         bbfc7353562ed33594d183668d7a34a1550342763a33ab9543854febc78f86f
         dbc147a5"
]]></artwork>
</section>

<section anchor="valid-partial-prover-reveal-and-commit-messages-and-partial-signer-reveal-proof"><name>valid partial prover reveal and commit messages and partial signer reveal proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "HIDE"
1: "COMMIT"
2: "DISCLOSE"
3: "COMMIT"
4: "HIDE"

Trace:

random_scalars:

r_1 = "13c56cabf679ffcd59c41f3fe18ee4993ac4accba74037e01aafc5c0e79d8524"
r_2 = "2ad00067178fed38af012a1db49065e0135f7514acb184b15adc2f3bb3439c68"
e_tilde = "1bd3f8284098f0c0f5866aef55b05d982b6669570f496e633dd13c7f0e9ca
           87d"
r1_tilde = "727dc28ed4618e9fd6de9b0b0892176eb5ce745aaf927b1f1c830d0222ec
            6d89"
r3_tilde = "14766b8ccf4e93a3b457942a0d1892689c5d66cd36e67b8761fc9fc06521
            afda"
m_tilde_scalars = [ "55cd78757fab58eb75a8260d4a990233ab996a1be803cfec107
                   1981b037fbfa8", "5f22ca14b29e8217c2d80bffadba8fbe0e9a
                   72b08676d8805f494b01ee0a322d", "18916a46f8255442283f1
                   33902d5f16f4cd583f6b8e68b4f2651ae52792485af", "39c682
                   8e74bc304f475a70831781de4be5e876fd5a34a34df553666c14c
                   1b600", "54715e8092608f37043d85c2829eab964d0c8332ee8c
                   0e1d31991394e367adab", "377db8d23e45a90c39b57b9042584
                   b87e0e870d00002aabd2e2b7432b1ee81fe", "456503806bf43b
                   0766c629e5fee11956ed46232049e7a4fd29ec9f50212ceb88",
                   "1c79c4fc9e4f696101ae41ba5728a14a54fef180e92c71471e96
                   4c8dfc1813ab", "4c7fe9d2f777bfcd1cc185d8c252f75c4512c
                   3ad796a665d8737c1fbccdf5246", "58e4f89934eca37018857c
                   9967661294a68cfb4312214696a9e060d96a6ce3e3" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "1ccf8c2be301706c89853662599a9f0afb219c1b4c8a1d147feaf252983
             eec3e"

L = "10"

proof = "00000000000002508b9a3add22f020d525bed93ce5e3e47652ed1fa4e067888
         cb43d07830a0eacfdcacf381841669e2a6a70ab0480617f9d9753074285346f
         c682c2b69efef9f15810076b43b6e51bf6ddebef2dedb7e0c4ea74cea646c4b
         7aba9b4a2d31dc21398987b6a0c5e8052f1255dc782e8ff64ae48273ca84ea6
         854a4e417762f305252ce745ffddfc02eaffc46c8cae544c5bf871b9d143c76
         57f8a1ce35ac503b2df09f1643b39d52ea9233010720f13f2f03b3fb859f4ed
         b874902f86f91f5204cee637c003db7b2059fa1960c80489efe23959dc6d49d
         5be1f07ffa90a8e65303749ba844ac286e6f4c61585109c039c8b7742ed40f8
         c40545e3002a098f9d5dee289f35d666195f2551742ae46124cf73476daecda
         a4f4324aef8a0106eb2ccaaca1be47441475357b2a62c8faeb31648c437d71a
         fecdfd2dcd0f7b6c470b83f626807315bda607fbb711368b78840a29232c668
         4d8c93abd2d45ddbf421219c5d58dcc8e0fcb2ec00dcc5f608dbccd68535980
         d611d9f57704ee5eabb45e68958d988b907214dfc358f7682b23ac42383b3ca
         e1fe77a7241ec8f5168e935aafde672ddf7def66254f244e51db12389d03860
         9d1fd36a30a861327ed425e4d5cc0c4ef2c8ded2434e46f763b3799c471c9d4
         8b2ec4978945e282e7c01ef8556e743931016e2b41f4657bba23b20a98b1ff7
         55d99bd85d1501854c71759a81d7731f087eda6e2d9f1a808f983c63e74949c
         95df4702a7c818b3e02a6a28b432ffc8bf20c08823874fbd26faf786833476e
         731ccf8c2be301706c89853662599a9f0afb219c1b4c8a1d147feaf252983ee
         c3ea95ba699639b85fda6d8a4dc974db629531c6957160b7b7c43e5ab7c7fc9
         5b94c70728888f037fe1f004a8b04af7deaca7d093607ad4d108f75dc3ab5cb
         9396643f2abc5e5f8c0133ae89de557d04c9eaab1c6fc548d960be51c47d79d
         7b64721919f9331bae0dc54b2db2d1e327cf4117a3fbeb9c69a7072551a7ec1
         3aca9321a8d68d505a83ac5676a532c00aa9a3963e1dfd0a5ff1d07d8d7486d
         47976075"
]]></artwork>
</section>

<section anchor="valid-partial-prover-reveal-and-commit-messages-and-partial-signer-reveal-and-commit-proof"><name>valid partial prover reveal and commit messages and partial signer reveal and commit proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "a820f230f6ae38503b86c70dc50b61c58a77e45c39ab25c0652bb
                   aa8fa136f2851bd4781c9dcde39fc9d1d52c9e60268061e7d7632
                   171d91aa8d460acee0e96f1e7c4cfb12d3ff9ab5d5dc91c277db7
                   5c845d649ef3c4f63aebc364cd55ded0c"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "COMMIT"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "COMMIT"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "HIDE"
1: "COMMIT"
2: "DISCLOSE"
3: "COMMIT"
4: "HIDE"

Trace:

random_scalars:

r_1 = "36da549f389f90672ed181a6d4f9ac4a5ffa3ab2c0c9271e0218ecb49dc2cdbf"
r_2 = "09215b10ada1532c53ee766e1e5300a059cf34b2c72d2ec8d17c91bc39493b45"
e_tilde = "692e671cffca680feda19596536d8771dfc8501651169e7d1d1b805c22472
           6c8"
r1_tilde = "250c1e5107f2231a820b34df55e8cda53b58a0790898b789cd67f935978c
            a116"
r3_tilde = "28b4406fd34b2691fa8935cfbe86a9f5636db1fa1e2a54b9d4ab4f079941
            aa71"
m_tilde_scalars = [ "5dbd2e327256ad3d4ec458ac8d48c24ee496932f4335cae002b
                   a32e3a3b751e9", "15efef852be4b590d89f302c09cdd27137f6
                   92a29477392ced9e770df7f52791", "51c656fed46277ed3fe81
                   cdcee25dc85563b3e36fd7ac3c53f9892238b761c43", "1e70d9
                   4076860c13a1780e9948c5808dfae29e366643642812de3ba3483
                   e9779", "4cb011dc6abc4106ed56782e06a35579561fe0aefc7e
                   af953b8039ac3a7e748f", "2a19dc4a7a00d8a4fef34846adbd6
                   0e678332173b6ccfae3c1f7e506a02ee7a6", "467752aa61ccaa
                   a50cff12114e644c344274b0d006d85579344c657965a1ba63",
                   "4a1777c2d0f29a73e929887a618f9795b0d4797da6b7c0ab4515
                   9373ce8e1a1f", "3e722909672751b3df85f53ddcdd3b7ebb843
                   773c7f455b1fc8e2381577f1f6b", "3d247b0c57b1f5905c358b
                   75056a6bfa15575d24d89e427b51bd6bf980d1a8c8", "0b24784
                   3bfe3ed6b50eb5bd675439d379c2a6790390f584e1c1f36e3458f
                   3045", "25c3dd696d8814e80af9b62d592a253185f99f2cd1eae
                   a27620154f0b19c4a09" ]

domain = "1207ed090723fa7e41c07e970ebb647d1d043079cc2a38c650c32234f18239
          36"
challenge = "5085ff914609bf6e68a23ea707f556669fa18bdf01cf9a7b63b793b9695
             61363"

L = "10"

proof = "00000000000002909292f5ad2b60ac8045f4e448199350bb83792788c6345e3
         ceca6d54266fb568ab0c967deed46ff46edd97e17d50425c391740f7e14947d
         04e0afeaed1e4b3efedbe807e30c28f13f54300c09d54af30e2515d0f0a728b
         b2b78588ad04a48e3e083461c17554af5952cf3c0e1999f13d8ef160c623753
         f27cb9b089bdc5b5af534a0d475fec7ad771ee5b047744ddc0ec1704e7c4ced
         a445c8f6ca7e9b0776a1eb5ee681bd4317bb372b0eabcb1e44a642c13ac6d81
         d60c92303c6be896b29159159f921382a5d808f2bc6773136019832b858523b
         c54479fc15bdcd39087aef9accc8b57e26af510f411a8680dc6303e719a8786
         693c69a60a655170d3f6131536ac746150caebc10230128284a69f1711d08be
         7b1a301e536665296fe3214b73b74403bedc1f7c8f615dc5c14eccacf173cd0
         bda1815dcb961973d97c59eefcfc9622ab5cc4c0bc8083a282de38786971c4f
         0f5d9346c3dc980aa124b67a903efc1e2446d8bf6dda8fc8e5ce39c0b7760b6
         86924db84b179e793895d26ced6658f9d4ea543a8d3d1294254dc802eaf9091
         05785e0d59c6bac3657fad78fd86d484655e5fd374dbb5f3f19b5d255e7bc42
         dac630c5e6acbdd8c867b29a25efb749139995385c73c4aabdb30b615382cd4
         82ba4c8df0796be21cbd7bac77f7d8aae88ad196b0a079b586097c09b6387f7
         3a3730145ab2ab59615513a2787ad763415256e2284919717140e675a2bac0a
         70a6a1add8252629804599ff267838f8354a73120b3671dfb1ea6df53fcba88
         29737d90e867d5e5b839b0965a3996e1606b300219f0e5e944b9163b953d74c
         7bb222750efd1a21700d6c30bcea4ebc8b48c9887f2036f0872d872a282ad4e
         12735085ff914609bf6e68a23ea707f556669fa18bdf01cf9a7b63b793b9695
         6136384dcddfd5d901991d8bbdd1a480689edc793205ff9c6f25e6a469cbda3
         71d7015debf8c0a3cc7db81a9a4fd0cbc3e67ca19bba1f73cf77a35f2ec39a5
         ea7ba6de26f9e22afa81b09e4d75d56b23ecccb0160b78eb27d832b0366c8a4
         388b308ba47f94fadae73575611fc6356c8c24a91dd3c44eb5f960510f5bbbc
         4165d7a4f6b33332eae7ba675959a1a5f3fc891bcb64908be9a4e0291c7dff5
         2abd23262510b535d5da156ffee6ad43530cffd5e10c836c8d0ebd8612ae89a
         ecddf14b424189f3ef391833973ea609d61eb39dc4dd044974566c5a1eacb42
         70a988dd083b0211dffb392033f4cb543a7515c3b4d4b8d7ec1521281b0625a
         98fa58aa412e056528c475126e2a31f675ffe9a14d13f42606fed14477fcd41
         6d249b794d007d3d9139a7cdd86ab661840e866a787cafb85a684bde0ba130e
         7888f8f4335c755"
]]></artwork>
</section>
</section>
</section>

<section anchor="bls12-381-shake-256"><name>BLS12-381-SHAKE-256</name>

<section anchor="generators-1"><name>Generators</name>

<artwork><![CDATA[api_id = "BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_BLIND_H2G_HM2S_"

P1 = "8929dfbc7e6642c4ed9cba0856e493f8b9d7d5fcb0c31ef8fdcd34d50648a56c79
      5e106e9eada6e0bda386b414150755"
Q1 = "98947e7a6283c629cb9721fe0aeb3c32252d307307ff0608a3c97331ca4b5669ab
      d19d90db94c58b446db705c09e7eac"

Generators = {

H_0 = "82999b68b153ad49c9ce47d178be8d82f122cd86c836d75120c3c775a44ba9532
       8a90beac7367c504f54a246f8e3205c"
H_1 = "8c7a5dbe9e899b76154f1c6cccea621b5532b93ce927a73d9ac44ef2d0eb006d9
       1587884ea111bbc0f66770a57a37d8a"
H_2 = "895ce03ec7b8ed0b6f6004d50d52132689793672b35a01d14ea4884796afa7b33
       e4b78d6489ede095cf8c202946da4f6"
H_3 = "b05ce29d4da638e0ea3f26fc673bbea1b343d240328ec278aaca12dcf9654983e
       14614a55407d2afb995f4ce145d9c3a"
H_4 = "a449a514d0e1bed84d2e8951fc7fc1596cf8f79397de06cedd00201412d0a81b6
       32b7f96b42b8323ad97d8fb80395bef"
H_5 = "aac7ea0084b8acef55530990952d3842d990d32512b8ab9e543afa7d46c66fda0
       94cb1bf84e7fc11153211c57e8e15e0"
H_6 = "a26ec4c96335f503aa698c32211c777c0f0df8692e2a107eb3a62901ca96f8e31
       2f5375afd52171ccddf738a09f1eda2"
H_7 = "84206f2773436ea438d308ef90aa2d2a08e3a2555225d9c4013be119d80fc7869
       d0ce6fa4ab7ac7b5371f8b499dd6109"
H_8 = "8ab206f6aa7bd7b96d946f3e87723ab4bd0a4bc42fd4d63e7a139f46e4f793540
       04e33f47e916988082c80e084b0375f"
H_9 = "b88931b5c26e1e6e5566addb734be441b6f4520868a8d8c2bc16b53c8ddda2c0c
       3ca217c5d8245f2b0646b874365d3fc"

}
]]></artwork>
</section>

<section anchor="blind-generators-1"><name>Blind Generators</name>

<artwork><![CDATA[api_id = "BLIND_BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_BLIND_H2G_HM2S_"

P1 = "8929dfbc7e6642c4ed9cba0856e493f8b9d7d5fcb0c31ef8fdcd34d50648a56c79
      5e106e9eada6e0bda386b414150755"
Q1 = "undefined"

Blind Generators = {

J_0 = "a9b4d7aadbfcab6e63f6d112366226c1e6b9ebac4a99fc015b444cb4768e1db1f
       3710b3088c0d00c74d264a2d07c4e06"
J_1 = "b78ce56f07607521ef84ab56dbc2c2e2fae0948ce91cb4e33af951ae4e9a4c8aa
       1b816b3b99987b2157cd442808222b5"
J_2 = "8f2a392c6fa4066ed4834f95400b2a69e6fc951d899805d5cf8c252379d5d0a9d
       aa9033b2c4e6a7c63ecaa4f236933ce"
J_3 = "83d6efbab354280eab4cf0feb9d064f5525c57a7ba709644df81d45596571147c
       383448bf44466129758dbccb43c4d29"
J_4 = "916d77f038fa7b5d8abc6533ef06c3cce2018677dfe36cc8fbcdcc0bfb471c18b
       b82eddc71e1156bd7740c1402e6be9c"

}
]]></artwork>
</section>

<section anchor="commitment-1"><name>Commitment</name>
<t>Mocked random scalar parameters</t>

<artwork><![CDATA[seed = "3.141592653589793238462643383279"
dst = "BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_H2G_HM2S_COMMIT_MOCK_RANDOM_
       SCALARS_DST_"
]]></artwork>

<section anchor="valid-no-committed-messages-commitment-with-proof-1"><name>valid no committed messages commitment with proof</name>

<artwork><![CDATA[blindMessages = [  ]
proverBlind = "30bd5c9bd2b61c44dd169c92cf28bb607830c56073f10e7a800c857cb
               05ec249"

Trace:

s_tilde = "4ead1c3cc9624bf2b82d6ce2dc1e8e7b664521f22faa543a78fc47d86fb04
           df3"
m_tildes = [  ]

commitmentWithProof = "b6389b0fdf04b9c35165acb11685e02193c53c3c1bb8ef3a9
                       404dcee1727a365a3ac6ba7fc32654101cc72cc0ee7d32b23
                       d2018bd6dc2f932c71d4401e763d4ed9999ee6c98837aa7db
                       e823050697dd744b05920ad0b6393e94f9b86e92d41940694
                       5f1e79d4be58dbaf9dc95237c951"
]]></artwork>
</section>

<section anchor="valid-multiple-committed-messages-commitment-with-proof-1"><name>valid multiple committed messages commitment with proof</name>

<artwork><![CDATA[blindMessages = [ [ "HASH", "5982967821da3c5983496214df36aa5e58de6fa2531
                 4af4cf4c00400779f08c3" ], [ "RAW", "a75d8b634891af92282
                 cc81a675972d1929d3149863c1fc0" ], [ "HASH", "835889a407
                 44813a892eff9deb1edaeb" ], [ "RAW", "e1ca9729410dc6ba"
                 ], [ "HASH", "" ] ]
proverBlind = "41fb2f74c30256398c927a262602b5ac3ebc6f84d9169476f8fcb1525
               c93b649"

Trace:

s_tilde = "4ead1c3cc9624bf2b82d6ce2dc1e8e7b664521f22faa543a78fc47d86fb04
           df3"
m_tildes = [  ]

commitmentWithProof = "9226bdcf56d5ee4b7c762c7fdbf92b7e06c9e8b38e5466846
                       c6fcf101540fb5f6847a3ac1d89a51e42a6cc4c6166995a39
                       73fac4e958df34b6d8fba2d9a5127c12d51644761cbd2c6f8
                       1bf8fda019eb312ae9ec8bbd8ce840d3bef6dff7189c95b6c
                       8418f9b0de630e1119bed6160c577058b26926d7b440d71c4
                       70a20f9c9fd858dcb794318bfa37d3bf10ec1656b27565e16
                       bcb3182edad94dec48a9bc35f8d5a6d8f9c83da5978c0d531
                       8f709ce12409d91d0abe7c87c8a85a56e1b7af3d8a700274d
                       0591f2f4c693cdf58eac25da5e50c09176e80cc0822aa5ad9
                       febb0e092bf95fa24993b847070778662d8736b4a8f3f803d
                       5db98f56a9da46b597b2b3140c9284f07031bdc3f53fe8d466d044"
]]></artwork>
</section>
</section>

<section anchor="blind-generators-2"><name>Blind Generators</name>

<artwork><![CDATA[api_id = "BLIND_BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_BLIND_H2G_HM2S_"

P1 = "8929dfbc7e6642c4ed9cba0856e493f8b9d7d5fcb0c31ef8fdcd34d50648a56c79
      5e106e9eada6e0bda386b414150755"
Q_2 = "a881a2d06ea464af4cf6c1177812f6d9d25f19fd68a3d6af2aadf065deca715d2
       906d1d1a5db76ba4ec843c6ad510f46"

Blind Generators = {

J_0 = "a9b4d7aadbfcab6e63f6d112366226c1e6b9ebac4a99fc015b444cb4768e1db1f
       3710b3088c0d00c74d264a2d07c4e06"
J_1 = "b78ce56f07607521ef84ab56dbc2c2e2fae0948ce91cb4e33af951ae4e9a4c8aa
       1b816b3b99987b2157cd442808222b5"
J_2 = "8f2a392c6fa4066ed4834f95400b2a69e6fc951d899805d5cf8c252379d5d0a9d
       aa9033b2c4e6a7c63ecaa4f236933ce"
J_3 = "83d6efbab354280eab4cf0feb9d064f5525c57a7ba709644df81d45596571147c
       383448bf44466129758dbccb43c4d29"
J_4 = "916d77f038fa7b5d8abc6533ef06c3cce2018677dfe36cc8fbcdcc0bfb471c18b
       b82eddc71e1156bd7740c1402e6be9c"

}
]]></artwork>
</section>

<section anchor="signature-test-vectors-1"><name>Signature Test Vectors</name>

<section anchor="valid-no-prover-committed-messages-no-signer-messages-signature-1"><name>valid no prover committed messages, no signer messages signature</name>

<artwork><![CDATA[secretKey = "2eee0f60a8a3a8bec0ee942bfd46cbdae9a0738ee68f5a64e7238311cf0
             9a079"
publicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62bd45949
             cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddbd619e419b99c
             2c41b38179eb001963bc3decaae0d9f702c7a8c004f207f46c734a5eae2
             e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
messages = [  ]

commitmentWithProof = "b6389b0fdf04b9c35165acb11685e02193c53c3c1bb8ef3a9
                       404dcee1727a365a3ac6ba7fc32654101cc72cc0ee7d32b23
                       d2018bd6dc2f932c71d4401e763d4ed9999ee6c98837aa7db
                       e823050697dd744b05920ad0b6393e94f9b86e92d41940694
                       5f1e79d4be58dbaf9dc95237c951"

blindMessages = [  ]

proverBlind = "30bd5c9bd2b61c44dd169c92cf28bb607830c56073f10e7a800c857cb
               05ec249"

B = "a44e7c8b4969cb821e48fc8ce3e295ed6a47923155edc19ff783993944863cd2e87
     12b72005f20bf51d7395c15832fc8"
domain = "48d64a62d7dbc8d88d643f15b3c8a1eed78afe3a80bc3e41bc2f92257b25f6
          d8"

signature = "94403c30badaccf53c4d5f6a15e66c98fe021c149254a5b54b75f15fe67
             4978897284db9fb6a8716fa17e69c80acfef45e56e7199abc42be2ba46c
             dfef5b30b3cc1ed12802225733183f02fc535a2127"
]]></artwork>
</section>

<section anchor="valid-multi-prover-committed-messages-no-signer-messages-signature-1"><name>valid multi prover committed messages, no signer messages signature</name>

<artwork><![CDATA[secretKey = "2eee0f60a8a3a8bec0ee942bfd46cbdae9a0738ee68f5a64e7238311cf0
             9a079"
publicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62bd45949
             cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddbd619e419b99c
             2c41b38179eb001963bc3decaae0d9f702c7a8c004f207f46c734a5eae2
             e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
messages = [  ]

commitmentWithProof = "9226bdcf56d5ee4b7c762c7fdbf92b7e06c9e8b38e5466846
                       c6fcf101540fb5f6847a3ac1d89a51e42a6cc4c6166995a39
                       73fac4e958df34b6d8fba2d9a5127c12d51644761cbd2c6f8
                       1bf8fda019eb312ae9ec8bbd8ce840d3bef6dff7189c95b6c
                       8418f9b0de630e1119bed6160c577058b26926d7b440d71c4
                       70a20f9c9fd858dcb794318bfa37d3bf10ec1656b27565e16
                       bcb3182edad94dec48a9bc35f8d5a6d8f9c83da5978c0d531
                       8f709ce12409d91d0abe7c87c8a85a56e1b7af3d8a700274d
                       0591f2f4c693cdf58eac25da5e50c09176e80cc0822aa5ad9
                       febb0e092bf95fa24993b847070778662d8736b4a8f3f803d
                       5db98f56a9da46b597b2b3140c9284f07031bdc3f53fe8d466d044"

blindMessages = [ [ "HASH", "5982967821da3c5983496214df36aa5e58de6fa2531
                 4af4cf4c00400779f08c3" ], [ "RAW", "a75d8b634891af92282
                 cc81a675972d1929d3149863c1fc0" ], [ "HASH", "835889a407
                 44813a892eff9deb1edaeb" ], [ "RAW", "e1ca9729410dc6ba"
                 ], [ "HASH", "" ] ]

proverBlind = "41fb2f74c30256398c927a262602b5ac3ebc6f84d9169476f8fcb1525
               c93b649"

B = "b4c0240281df75f3a0d20fa292c34bdbcbbe1eb3d9c863af22618eac3c8365eeb4d
     3d61c2100a48491edda2fbf3c29ab"
domain = "3600988bb64779f01c57bfb0524521bc241aa0fdfc92e1b892ac2066edccee
          f1"

signature = "92a5dd266ef163b7966d3849a87c38dc35cf7eb479a1c8d4fed2ae3b9a5
             66a04073015397328afcde816df3eb2903a004a48c883faac30833ce896
             9f4eff98ead5bd889f4b5904cb11666db1434fbe34"
]]></artwork>
</section>

<section anchor="valid-no-prover-committed-messages-multiple-signer-messages-signature-1"><name>valid no prover committed messages, multiple signer messages signature</name>

<artwork><![CDATA[secretKey = "2eee0f60a8a3a8bec0ee942bfd46cbdae9a0738ee68f5a64e7238311cf0
             9a079"
publicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62bd45949
             cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddbd619e419b99c
             2c41b38179eb001963bc3decaae0d9f702c7a8c004f207f46c734a5eae2
             e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
messages = [ [ "HASH", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e31
            0a1debdda4a45f02" ], [ "HASH", "c344136d9ab02da4dd5908bbba91
            3ae6f58c2cc844b802a6f811f5fb075f9b80" ], [ "RAW", "7372e9daa
            5ed31e6cd5c825eac1b855e84476a1d94932aa348e07b73" ], [ "RAW",
             "77fe97eb97a1ebe2e81e4e3597a3ee740a66e9ef2412472c" ], [ "HA
            SH", "496694774c5604ab1b2544eababcf0f53278ff50" ], [ "HASH",
             "515ae153e22aae04ad16f759e07237b4" ], [ "RAW", "d183ddc6e26
            65aa4e2f088af" ], [ "RAW", "ac55fb33a75909ed" ], [ "HASH", "
            96012096" ], [ "HASH", "" ] ]

commitmentWithProof = "b6389b0fdf04b9c35165acb11685e02193c53c3c1bb8ef3a9
                       404dcee1727a365a3ac6ba7fc32654101cc72cc0ee7d32b23
                       d2018bd6dc2f932c71d4401e763d4ed9999ee6c98837aa7db
                       e823050697dd744b05920ad0b6393e94f9b86e92d41940694
                       5f1e79d4be58dbaf9dc95237c951"

blindMessages = [  ]

proverBlind = "30bd5c9bd2b61c44dd169c92cf28bb607830c56073f10e7a800c857cb
               05ec249"

B = "9727619973b3bcdb84de34eacbb08e044fd093e8f5b77e9ddb217452aad1ece5ea9
     9e3fa154ddad0c3553e74263f1523"
domain = "62638964b2b8eb67c2635a8b87731e2f876e7e84fc4f051903022a731c5fe3
          b8"

signature = "943f2b13229411f97a7407ed37912a7584fa648aa1a6e55bb3c1b26d0c6
             19308df7a9dd235409139193b0588ec1b5cfc0089a8efb2df0b43019c39
             fd88bb6216d3915af1ae4643f5981b12ab40e3aff7"
]]></artwork>
</section>

<section anchor="valid-multiple-signer-and-prover-committed-messages-signature-1"><name>valid multiple signer and prover committed messages signature</name>

<artwork><![CDATA[secretKey = "2eee0f60a8a3a8bec0ee942bfd46cbdae9a0738ee68f5a64e7238311cf0
             9a079"
publicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62bd45949
             cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddbd619e419b99c
             2c41b38179eb001963bc3decaae0d9f702c7a8c004f207f46c734a5eae2
             e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
messages = [ [ "HASH", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e31
            0a1debdda4a45f02" ], [ "HASH", "c344136d9ab02da4dd5908bbba91
            3ae6f58c2cc844b802a6f811f5fb075f9b80" ], [ "RAW", "7372e9daa
            5ed31e6cd5c825eac1b855e84476a1d94932aa348e07b73" ], [ "RAW",
             "77fe97eb97a1ebe2e81e4e3597a3ee740a66e9ef2412472c" ], [ "HA
            SH", "496694774c5604ab1b2544eababcf0f53278ff50" ], [ "HASH",
             "515ae153e22aae04ad16f759e07237b4" ], [ "RAW", "d183ddc6e26
            65aa4e2f088af" ], [ "RAW", "ac55fb33a75909ed" ], [ "HASH", "
            96012096" ], [ "HASH", "" ] ]

commitmentWithProof = "9226bdcf56d5ee4b7c762c7fdbf92b7e06c9e8b38e5466846
                       c6fcf101540fb5f6847a3ac1d89a51e42a6cc4c6166995a39
                       73fac4e958df34b6d8fba2d9a5127c12d51644761cbd2c6f8
                       1bf8fda019eb312ae9ec8bbd8ce840d3bef6dff7189c95b6c
                       8418f9b0de630e1119bed6160c577058b26926d7b440d71c4
                       70a20f9c9fd858dcb794318bfa37d3bf10ec1656b27565e16
                       bcb3182edad94dec48a9bc35f8d5a6d8f9c83da5978c0d531
                       8f709ce12409d91d0abe7c87c8a85a56e1b7af3d8a700274d
                       0591f2f4c693cdf58eac25da5e50c09176e80cc0822aa5ad9
                       febb0e092bf95fa24993b847070778662d8736b4a8f3f803d
                       5db98f56a9da46b597b2b3140c9284f07031bdc3f53fe8d466d044"

blindMessages = [ [ "HASH", "5982967821da3c5983496214df36aa5e58de6fa2531
                 4af4cf4c00400779f08c3" ], [ "RAW", "a75d8b634891af92282
                 cc81a675972d1929d3149863c1fc0" ], [ "HASH", "835889a407
                 44813a892eff9deb1edaeb" ], [ "RAW", "e1ca9729410dc6ba"
                 ], [ "HASH", "" ] ]

proverBlind = "41fb2f74c30256398c927a262602b5ac3ebc6f84d9169476f8fcb1525
               c93b649"

B = "8a79e61543112d3815948c6ac3f1e6ce7ef8a2f39266d825c8c09f85abf3e645f58
     f19a66eece8653b282631c5516f4e"
domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"

signature = "8f094ab374ac787c29d7c796196e836f1938e3cb2dfbedaf5aa659d0a73
             c371b8d09557a71e44b6eae4d7948d6346e464dd3ca94db3c933d62eb61
             8b3653d946e84f501c87dd54f12d30a8ba8b22fbd1"
]]></artwork>
</section>

<section anchor="valid-no-commitment-signature-1"><name>valid no commitment signature</name>

<artwork><![CDATA[secretKey = "2eee0f60a8a3a8bec0ee942bfd46cbdae9a0738ee68f5a64e7238311cf0
             9a079"
publicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62bd45949
             cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddbd619e419b99c
             2c41b38179eb001963bc3decaae0d9f702c7a8c004f207f46c734a5eae2
             e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
messages = [ [ "HASH", "9872ad089e452c7b6e283dfac2a80d58e8d0ff71cc4d5e31
            0a1debdda4a45f02" ], [ "HASH", "c344136d9ab02da4dd5908bbba91
            3ae6f58c2cc844b802a6f811f5fb075f9b80" ], [ "RAW", "7372e9daa
            5ed31e6cd5c825eac1b855e84476a1d94932aa348e07b73" ], [ "RAW",
             "77fe97eb97a1ebe2e81e4e3597a3ee740a66e9ef2412472c" ], [ "HA
            SH", "496694774c5604ab1b2544eababcf0f53278ff50" ], [ "HASH",
             "515ae153e22aae04ad16f759e07237b4" ], [ "RAW", "d183ddc6e26
            65aa4e2f088af" ], [ "RAW", "ac55fb33a75909ed" ], [ "HASH", "
            96012096" ], [ "HASH", "" ] ]

commitmentWithProof = "null"

blindMessages = "null"

proverBlind = "null"

B = "8118eba64440216c1f1e0f1d7d511b26d2f65c6a0ee9d7a779b945f9a8b00a18ec6
     3a6884179dc7f506a4b549b250769"
domain = "62638964b2b8eb67c2635a8b87731e2f876e7e84fc4f051903022a731c5fe3
          b8"

signature = "a31594b430e1e8a60f8d5f7da334e4141a67b0955bf6cf4daeed3b43903
             4badd7313a4f82d787e675f4ce24ff9d90b8e5c9e53184c9bb291511626
             644ddbf2c749ebf8a3e8a433a43bc42330ec74326b"
]]></artwork>
</section>
</section>

<section anchor="proof-test-vectors-1"><name>Proof Test Vectors</name>
<t>Mocked random scalar parameters</t>

<artwork><![CDATA[seed = "3.141592653589793238462643383279"
dst = "BBS_BLS12381G1_XOF:SHAKE-256_SSWU_RO_H2G_HM2S_PROOF_MOCK_RANDOM_S
       CALARS_DST_"
]]></artwork>

<section anchor="valid-all-prover-committed-messages-and-signer-messages-revealed-proof-1"><name>valid all prover committed messages and signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =

0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"
5: "DISCLOSE"
6: "DISCLOSE"
7: "DISCLOSE"
8: "DISCLOSE"
9: "DISCLOSE"


blindMessageDisclosures  =

0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "49269fc9884182a1591f959e813384df71ffb220660cb2a4aa3956e27936d4d8"
r_2 = "66b80c544ba7563a7de236678d228a36195f2b483daec4c49470b63c7231cb11"
e_tilde = "6714fe17c1529464fd269b37dda00e6cdd2b82b592a497cc52e78f24930ef
           fda"
r1_tilde = "1da4b2f8fe1790bbff2efabd71c8ed624f9fedd10d62dc7a3ca1088657eb
            f220"
r3_tilde = "2354f9de39e2689b893f357e14cead4e405ab3486f188a0b5a503e733d00
            7588"
m_tilde_scalars = [ "42510c348487be3c19994565911729eafcd4804dacf25a7cb7b
                   7a634ddefc3b5" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "4f7882831cb2fad3929fbc6e8cfb4100bfb9215549240e0b8d70d978464
             9a9be"


L = "10"

proof = "0000000000000130b4ad4a326cb54137cda011506544ebb1eeb3eb0632cd6f9
         13fd6cae8288fbd8010163d9ee18d38deb798614ca1e43bc484f6e9576365f1
         ec96fbdcb412ee540d538b0d2302264a98a0710a227970bd1c064fcfcab256c
         2ae6c0574d77e1e9b0cb9c3ec3907ecc6c83d5101479a1e12efe80503ea2af8
         f95d7d02e95d4584fb47c1b3382b23aff17e081b21814a5c7fa913b3a7ffcf3
         4be863feb2b7fac755405bde5a9220045b96546928c86e2046709244825e9e6
         260379c64d6a601a1e00abe561daf68210e3a2eef6e82b3675376a627c969cd
         5d4eb514aea8223807f3d2abb4407896226c6d7d4045bf7535355021192965e
         2e67c02d96e1da4084483bbf09f4a9f1c55f1cbc978cfec66d8e862d4f78828
         31cb2fad3929fbc6e8cfb4100bfb9215549240e0b8d70d9784649a9be"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-all-signer-messages-revealed-proof-2"><name>valid half prover committed messages and all signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"
5: "DISCLOSE"
6: "DISCLOSE"
7: "DISCLOSE"
8: "DISCLOSE"
9: "DISCLOSE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "11119e21b175fb9fc7c17cbbaf9f5193ff29018deab299e0179517f518c887ca"
r_2 = "293d6d461a4cfd449607b211dcc500540c49cc73d6c77b1ec62eb982be4935b4"
e_tilde = "3bc9fe82bbca21200fbbff238cf666d79270bbfc9293ea3fed177ac128cff
           30e"
r1_tilde = "5224e6c760e66d54dae6fac6adee3edca19df9f12f84416980b5c2820b64
            7ffd"
r3_tilde = "723457f7d95dfeb89077f16f58f343b1d53b44d474004564a8cc9be5c5cd
            3244"
m_tilde_scalars = [ "107b5b89bc2574eed71a48bf869b094351bcb2a32fe4ed0f5c6
                   2b9063a086d4b", "6c757b1e66cc101e9e69c2a7c665d68ce191
                   93f11a28ac1efc0a41b5292a1a87", "635ef91197c84f74b14ef
                   14ed7b74ea6a2c4770a1f665cd545854330e3550221" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "540846e2fe862ccc6ad35ff8466b69e07da43e04dd87716d1ccd36c443a
             0b3e6"

L = "10"

proof = "0000000000000170b036270fce3339fb6b99bdc7ee64c084307857d7cab3d46
         011c5c07a186e4638e4eaa916067135bd3b86a4b9ab4eae13adcb59b0e35365
         2ab79b3ea9459cd7acd6a544d80a28e218c0e1573eeeec47a62c7d128aa0fcc
         f438e1e272906d1530e92a0a5d8cb91492e676c285326784d63c62aa1c6b2fb
         23af5f55349a5d88e75193f13a1f7abca035f3a3d4993689a65c089b9cfa7be
         1e0e12ae8409bc4f16fbab2445889af7a80cf6aec5ba5ae64c4f95458d7b66c
         6319713feef8661cd76124dd93c13a265bfca80af8625c5158667b16f7c147c
         64a8a8e1d5c968c86299bd4840cde2523acb61880a8bf70f1723d504a8a528e
         ecb5b952bdc374db6e196d31d6fade6a4f1db92eb1b1f95db8e2bf9861e1077
         a771d7ab2afcf08e096ed262a816c42ae958790cc72c973490f7859e136d32c
         7d5d731189619d26096bd725becfeaad822398ec1b7681ce190030527f54084
         6e2fe862ccc6ad35ff8466b69e07da43e04dd87716d1ccd36c443a0b3e6"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-all-signer-messages-revealed-proof-3"><name>valid half prover committed messages and all signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "DISCLOSE"
2: "DISCLOSE"
3: "DISCLOSE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "517c6ba25814e7e8a6b1e1e7a1eaefbd13a47b874a249094592b51295c896be6"
r_2 = "17d278dc4ff520d8bcde7c7f35e635c19d9d0e19e0f32e4900e4a69af300b2f6"
e_tilde = "658838c65c01e42cd39fe21885284cef7006630bf8b8ab9183bcc2d212778
           dee"
r1_tilde = "21e2ce874aaef017a9d67f01e432cd16bcf2794299e6594f5065b417d003
            9f42"
r3_tilde = "51a834a77851b6f5b476bd8ce9440019c0ba3b19a1739ae20e0834abca1f
            acd4"
m_tilde_scalars = [ "586ad615bf1d62d511c8737ebb6a0492e0769faed21e1fb23cb
                   bdf898b25ad55", "441e55f5927fb14f4059f4d4c7aad45b7234
                   9b50436cd8d2cd5ae3666ecd64dd", "10292482d9e08dc8d3a14
                   223dfdbe4a14433ddfbff0950732a12f99edd78efd9", "1acd79
                   00624f83027ee6c7700c579d10eaa0060dba6b943224709497173
                   94645", "4e525012cc1649cd7a6a4d3a16899e39b9d877243716
                   e6212effb6320294a382", "65f2bf6e3dcde2dece63dd45ffcde
                   cc8019f04664cb245f45ecdbc945e8a4772" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "67f3ac9365bfee42a5043571538f4b7a8b3ac48fffd48a4589c55cf49c4
             5f9f4"

L = "10"

proof = "00000000000001d0a0e9849dab1422feb216920557d8f58543c64df12ea2c0f
         fe7e03afb717289bf93e8164bff88b46bde5ee8565ddb196498a8329a5f19e9
         ac4d3a758507fbbb033aa512993cb648044c24110037c932561259d63a6aad8
         6a1beb644e5cd2c7325846c26aaf1dd25fb1c2718b3f90fb95044665aaf6e2d
         e7f67f9e74fec86f8e2e2f7df6cc99bc1c849c27561c9d17f0a92457fd57861
         2ca6420786c88d56058e9b9c99914d44a3a7710bc013d37eecada207810af84
         ac137fc2bead300ece38d8fc35e1d3e7b4ab30de1105a8fd136fe37173823a4
         12719add91021466523f9e0fa8d09711b550230cc5d7c1170ed78eb4146bb3b
         86257c85087e88fc2a53620ce3026f73a493bc8a90c16c59c73ace6f21b7105
         5b13bb769054fc419136deb598a31a3abd0b70b59f15f7bc8d0f7a6c14a309f
         58649f9023f6aae742724d500cba944250f0040462c4a9e786e743f788095c9
         1b080fcd925267cf07addb8e4bf3ecbbc3983d39fde27d05314b8b5fe59401f
         efa1e5e36cb1fea8162c0abeea2dd3eff9cc0924b4dce9f973e7bac62fba2e8
         ecf1a7735f9f3d2c263d93c873d375acdc842569d28a3a95785927c760a4c67
         f3ac9365bfee42a5043571538f4b7a8b3ac48fffd48a4589c55cf49c45f9f4"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-half-signer-messages-revealed-proof-1"><name>valid half prover committed messages and half signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"


Trace:

random_scalars:

r_1 = "11ac0d86f78a0bcdc7c20417d73522b46d20a8f7e3ac008d2d3bd77730614b34"
r_2 = "2697d76e223bda4ed35e2428030bac7c2ca77122e3bab7b5d6b8bffca307a3d3"
e_tilde = "0fc4a68d61483036dbf45878430cc8382283c481c8c1cd3c9d3fe9aec9263
           be3"
r1_tilde = "1baffa5c4d6187496310d4014bc9f15d0150f215868722186679b8e68d84
            b682"
r3_tilde = "05b85a30f2f49348d34ca44242820c77421979b9b312a05b0fab16690026
            d86a"
m_tilde_scalars = [ "6f7e7893731097ba853486fea7eb62f66e3e14be47b0565b388
                   c5a9170135b86", "45a4a12e1a7a518a63b66eebbce90605c29f
                   249f570c85685bc0232c8011fbf3", "2ca1dd61fa58bc6670268
                   750f5acdb19dbeca06ff2eb1a352d69e21318042772", "0c79f4
                   d9a6373202c102adf291522c06e2bf7f0da76f8e6cc3d6762bcc6
                   bee1f", "48f8c3fdcdde12d9949c6ba62661e5694363145f140b
                   e07d928b4ea9521a838b", "382d6baa8558a7cd49b2fb6ad3331
                   14d7d4842c1c29aa2fcb8d6159aa40e84f2", "53ae47dc3e3293
                   31a0cc2f46920d6f8b07f27afc4ad662ddad0e61d5e1b74751",
                   "6165660f8dde9349f501d169e463ddef10b94a248f2de5701966
                   e65ba16b656a" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "6739ea4434f5fe1fdaa4260603a32b194986ad0cc8141d5d3505569750d
             64b16"


L = "10"

proof = "000000000000021091940a6a8e983d305c91060065bf9479ac8c95f68d20ee5
         205e840ddcfcf6b7c267e1bc3d1e94a007a9ac727bd9730d5a4b605d9e729b0
         5c8a3767894583b655362f990a467c211bd81c31d5287acc605b8f0375721c6
         0272f7a1bf9a950d46fa7045ab1c9bef5d0b4a8d05ac06ccca4354ac75efb62
         5819405ec5bbc287e335c7629ea787d2c28403ee1b7b823c96091a88c1f46be
         9fb951f0927324c370f26d28f834782c9d8dfc8751112e27a851b594310a55d
         0ebd13f5c4997e5fbef29fc968d607488d97ba6115979a5be6343a6dd3d11b3
         0430b33c394f3d8516e82354cf604c33447853923d7d9741d327a021fea6339
         5ffd68a87865266df89bb9c905bbbe858cedb46ba8ee047f1010f4830987931
         223c62ef8a90be4e9b9e2d336d2827efd4c13a0d19eca3b07796bfda62ba179
         3534ae1402ba2d1beb1aac0fce0742cfc3e9de0d7a6d07ac3493cd453d264dc
         ef51e8b6551a5c5acd1b2a20b0fd3cfd002fefd86361008c992bd63c38a6abc
         027a9ff0ad576a60a7b25ac7f1839b2976538922ea0d0af019ba8e5fdf5417d
         3429e25f77c286dfdfbdc06be67509d99c0ca84e94ed702f4d99bab67a73952
         48b974725239f036cedd34c7927b07524574fbff693ba0fe726144edbd3ae07
         3cce1a6b8741e426fa985f9ff27fcdc0067c8e73157dea9b5e4a96881cb6d38
         6739ea4434f5fe1fdaa4260603a32b194986ad0cc8141d5d3505569750d64b1
         6"
]]></artwork>
</section>

<section anchor="valid-no-prover-committed-messages-and-half-signer-messages-revealed-proof-1"><name>valid no prover committed messages and half signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature005.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"

blindMessageDisclosures  = []

Trace:

random_scalars:

r_1 = "517c6ba25814e7e8a6b1e1e7a1eaefbd13a47b874a249094592b51295c896be6"
r_2 = "17d278dc4ff520d8bcde7c7f35e635c19d9d0e19e0f32e4900e4a69af300b2f6"
e_tilde = "658838c65c01e42cd39fe21885284cef7006630bf8b8ab9183bcc2d212778
           dee"
r1_tilde = "21e2ce874aaef017a9d67f01e432cd16bcf2794299e6594f5065b417d003
            9f42"
r3_tilde = "51a834a77851b6f5b476bd8ce9440019c0ba3b19a1739ae20e0834abca1f
            acd4"
m_tilde_scalars = [ "586ad615bf1d62d511c8737ebb6a0492e0769faed21e1fb23cb
                   bdf898b25ad55", "441e55f5927fb14f4059f4d4c7aad45b7234
                   9b50436cd8d2cd5ae3666ecd64dd", "10292482d9e08dc8d3a14
                   223dfdbe4a14433ddfbff0950732a12f99edd78efd9", "1acd79
                   00624f83027ee6c7700c579d10eaa0060dba6b943224709497173
                   94645", "4e525012cc1649cd7a6a4d3a16899e39b9d877243716
                   e6212effb6320294a382", "65f2bf6e3dcde2dece63dd45ffcde
                   cc8019f04664cb245f45ecdbc945e8a4772" ]

domain = "62638964b2b8eb67c2635a8b87731e2f876e7e84fc4f051903022a731c5fe3
          b8"
challenge = "5a997a57e4249363d93fe4a280d2a0272bb8c59438cc6945a4321051e3a
             666b9"

L = "10"

proof = "00000000000001d0a3c75432eedfbc1e22d19fb058f2f5dcd455d46581ec31d
         2f57aa45cf1564498c0e0568d84f23bc3d405800eb750427f8a5c3a126436c5
         006982be67829ccfa2fa506549964b4dc66371320686789988fb1e0aa0418cf
         cb928a3b9d54630455e9104f9a1862647dda61c9434a1aab7a4f20ec1331570
         ac293f81abf16df89823eb65addf97b1211f31d36ec6b675cfa21bc749faf87
         d1d41b2d40aa2657d136146bb20c5514b43ce3603a2d787eab3e47138c5dc16
         62d9b4e375b024f55262bd452495ec466f256271e62b1445a5eb8520773fcdf
         c67eac678eac338e5f1ac70da169b2e270a0f82e8acd81e257144c93aa51b2b
         b968d1537a52f275b3895b55d2634a27ea63b6fbfaa71082f42c60025ff4e3e
         e87a9f3d79905914592d0d22b1c9c5c85215d50712512695db0c18ed75160f3
         f0a7a3d5dba388e5d5c7047ecc8502145db4aaadfa15f64d41d2a0f7a341891
         858543793b426da3f6c6a25a07a57cb2eb0e9ffb83980a8e367f97d516c3b7f
         e2a715c8fed285fa8186891173de92889bb9d0f82dbd219504f0763a51f465f
         2bf6e3dcde2dece63dd45ffcdecc8019f04664cb245f45ecdbc945e8a47725a
         997a57e4249363d93fe4a280d2a0272bb8c59438cc6945a4321051e3a666b9"
]]></artwork>
</section>

<section anchor="valid-half-prover-committed-messages-and-no-signer-messages-revealed-proof-1"><name>valid half prover committed messages and no signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "HIDE"
1: "HIDE"
2: "HIDE"
3: "HIDE"
4: "HIDE"
5: "HIDE"
6: "HIDE"
7: "HIDE"
8: "HIDE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "72202656d242b95e869fbcd40581b1924183ac11ac323ebbe011d63536d8287c"
r_2 = "1b6f80e77f00fd46a7ab1e46be33db2582fbadbf8358e7dfb157c69f577b9063"
e_tilde = "48e116be2272e66dac308ec305869640dcc107d3de941659e7dfa80359a3a
           33d"
r1_tilde = "67dbca3425cd03873b9ef9240389de348618c4eb142eb963f03e99f5cc85
            755f"
r3_tilde = "38beeb508bc526d9f70af680eb5e747daf0b0abf9c5dd2da78a795eb082c
            891e"
m_tilde_scalars = [ "41e0af39eb876d842a6fa22e739bd8557782d8bc64f1e3e8caa
                   407acf21e9d83", "34318199184c1d1b0088b30f12b59b5be5ea
                   f0a6d4f1bd06cae1844ce79493db", "449a1a27becc253648046
                   95002bb8671d66119c6b47ca0090a42690f108b8743", "0db0eb
                   8b857927356955a1e251ad1df40e45427e8dd488b822608565a62
                   a5a31", "3030cf9de98a457fdfe9cfbe693e53a2eefbe6590557
                   b04bc5abcc981b2c5b53", "21e0abb919758a5b8bfd32cc6417b
                   36ca94d091a4ef4b6e9e6840a174ed193d4", "6d46722a4f82d8
                   7d5012bab944b18239571c6c20b7133b529d0cd81999251eee",
                   "38af70a2dc939db80ec191f993d38ce477fbf53f0de85c8676e0
                   bd32fb6529b9", "39c92b70c8e3635a623da5dfeccb3b2a706e8
                   179f1c94c5185f8cf3a4147f0e4", "1521952789a9f1a2c8e88d
                   102574fc3b11644dcd57e4658bcf37f44ba575a69f", "5ecc487
                   2b50ac3e9159dc3eef11260766090788a864607e669c50ebc489d
                   5a75", "68c917c66ecd829f333f0f9b12fcaf0c93e6f085fbb0d
                   490e1e1a43ba59d6a94", "60f3ae300246e53d20ec89d0bce7f4
                   ea8bb2f669f9b972f5e475401ab9a44ad1" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "3a5fd04a24fc68d202593d24dd856f93641ee8ecdbd652890c14bd65dc1
             51b23"

L = "10"

proof = "00000000000002b09435688407299f9ad2de7020fe49d2069fe9ed0c3a3c770
         31e4099f04874d5668a877c6a2e57b9e77a8dc69a1d93aa1ca36d6b435a9c69
         cf9d6127318d173e64254a6f4c7c1ea6c99d8e8583147c5e7a9a91233115baa
         0be7cb380d1adcf10cda14a5946c12f7bdd9865d58ec3c1143138c32b7fe967
         23cc39f89144731d151fec6750bce42fa7140c2a41fb00466a410d053576df3
         a49130abe028521df231e945b2b36bec91edfd44f19cb923e2d38365cc77752
         919a373da35c29b12cc30be86d7db6824387f312968d85f416cb016f6574cca
         46718af3c3020b932b4e6e85c4aed73efc84fdc306207373dd8174573d2feec
         38e37f2f534c603e9b2a1c8d6f32da5e8c0aab55d72cad1a89b2cdbc2007a16
         2df4858b467f73d40fa8483254952939ed7b5e9f9fc70282443beabd2139204
         76c542d4bf29bd2cbc860ce3cc246c021cb15d584be7009b49de09feef1e8e7
         34569b3f70e738aae7fa00d759cdca0bc5e6ec3b9a5ff3a42d7acf506a62b77
         da91f478bbad563485baa676794284727c89e302a1541b2d9ff4298ff46f07d
         029d280605791901e90607a6bb4f63e963a5ed7f3854290110534e083e6324f
         94fd44f0546e6c8480b2b613c9e99b60dde10c929d1b5287422b9369ee1ba06
         31a42e58efbd4910be0a16502c1671c2a107331d70d3e2eb3b61c386eb80280
         584b2d839243564727a3cca91a10a67e7cbf9edae71073e62d2ee80cc597941
         7123e918ef7105627a2744884bbe5ac6b892ba4eda7f0da7ec022023a68ba49
         065ef550b8c39fce30b6cf25c27b79427b61b92ef9933ec9113791a791c2f20
         05962bb5a28ecfc48139bb7fb4a29573e7ebd2920e1a33f68d12e2c490b9cfd
         f4ba66a70da86a19a73dd613d1239c4bdbee007995190ddd35292b978813aa8
         6f0673a5fd04a24fc68d202593d24dd856f93641ee8ecdbd652890c14bd65dc
         151b23"
]]></artwork>
</section>

<section anchor="valid-no-prover-committed-messages-and-no-signer-messages-revealed-proof-1"><name>valid no prover committed messages and no signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature001.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures = []

blindMessageDisclosures  = []

Trace:

random_scalars:

r_1 = "49269fc9884182a1591f959e813384df71ffb220660cb2a4aa3956e27936d4d8"
r_2 = "66b80c544ba7563a7de236678d228a36195f2b483daec4c49470b63c7231cb11"
e_tilde = "6714fe17c1529464fd269b37dda00e6cdd2b82b592a497cc52e78f24930ef
           fda"
r1_tilde = "1da4b2f8fe1790bbff2efabd71c8ed624f9fedd10d62dc7a3ca1088657eb
            f220"
r3_tilde = "2354f9de39e2689b893f357e14cead4e405ab3486f188a0b5a503e733d00
            7588"
m_tilde_scalars = [ "42510c348487be3c19994565911729eafcd4804dacf25a7cb7b
                   7a634ddefc3b5" ]

domain = "48d64a62d7dbc8d88d643f15b3c8a1eed78afe3a80bc3e41bc2f92257b25f6
          d8"
challenge = "329b14d70f37d23895ff5b2272d78014bec1b84de650309617d809f43c1
             6a193"

L = "0"

proof = "00000000000001308d08bbf00f2596822d0beec4e8ee59ab961f62e22a9c8dd
         9d4740607cc9ae6f685905e5fc1ccf5d9392aa2fe715e0fc6b40a3b4226c9b1
         0056bc4aa35af62675f33ffcc8fedf908e9f593f00e649ed8a654a90148e51b
         7ea63b51af34ff3462a94732490e46d1e4224170547054875531b746fe25fe2
         de3bb70190d0c72e6aaec93a3057b69aca25c96e0e0e698ceacd1e04a82b0aa
         243f595374c9dca3519902802a30f2cfd7e5afb28752a44c820a02e381aa13b
         ade5c0ce22d6a6b9729526bdd823702e265aeca9f59ae62760cb3640a1dd7e0
         ca74656a586ce2c368cd3a593f9c9e7683e477ca1312a0cbca5aa0f1d2def4f
         653b0c57ad78468ee234e0298a3504973dfb4e2dc5ee3b419450b7d5329b14d
         70f37d23895ff5b2272d78014bec1b84de650309617d809f43c16a193"
]]></artwork>
</section>

<section anchor="valid-no-prover-commitment-and-half-signer-messages-revealed-proof-1"><name>valid no prover commitment and half signer messages revealed proof</name>

<artwork><![CDATA[Based on signature: "signature005.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  = null

L = "10"

proof = "00000000000001d0a3c75432eedfbc1e22d19fb058f2f5dcd455d46581ec31d
         2f57aa45cf1564498c0e0568d84f23bc3d405800eb750427f8a5c3a126436c5
         006982be67829ccfa2fa506549964b4dc66371320686789988fb1e0aa0418cf
         cb928a3b9d54630455e9104f9a1862647dda61c9434a1aab7a4f20ec1331570
         ac293f81abf16df89823eb65addf97b1211f31d36ec6b675cfa21bc749faf87
         d1d41b2d40aa2657d136146bb20c5514b43ce3603a2d787eab3e47138c5dc16
         62d9b4e375b024f55262bd452495ec466f256271e62b1445a5eb8520773fcdf
         c67eac678eac338e5f1ac70da169b2e270a0f82e8acd81e257144c93aa51b2b
         b968d1537a52f275b3895b55d2634a27ea63b6fbfaa71082f42c60025ff4e3e
         e87a9f3d79905914592d0d22b1c9c5c85215d50712512695db0c18ed75160f3
         f0a7a3d5dba388e5d5c7047ecc8502145db4aaadfa15f64d41d2a0f7a341891
         858543793b426da3f6c6a25a07a57cb2eb0e9ffb83980a8e367f97d516c3b7f
         e2a715c8fed285fa8186891173de92889bb9d0f82dbd219504f0763a51f465f
         2bf6e3dcde2dece63dd45ffcdecc8019f04664cb245f45ecdbc945e8a47725a
         997a57e4249363d93fe4a280d2a0272bb8c59438cc6945a4321051e3a666b9"
]]></artwork>
</section>

<section anchor="valid-partial-prover-reveal-messages-and-partial-signer-reveal-with-commitments-revealed-proof-1"><name>valid partial prover reveal messages and partial signer reveal with commitments revealed proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "COMMIT"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "COMMIT"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"

Trace:

random_scalars:

r_1 = "2782e9be32645456d20a01a8ce5dd233b8049efe8d25eafdb8576f4e8d85826a"
r_2 = "180ea80200b800d1cb672bc1aa52e2e6ecf0acaf794b810f3c16e8b07c413f5e"
e_tilde = "6aeddf95a081d0bfab06a327980dcfdae5b3dd977cdfee4fdf1b340ee8e4b
           617"
r1_tilde = "3eb55f0e3a5017408bab63ac12547727d762f7121ee217f484e48507c4c6
            4165"
r3_tilde = "0707d3931ba4c72a4bf4f9dd75cac1bc489fb7ce207fd45eac7e58834427
            d66e"
m_tilde_scalars = [ "11f580b98813f609f6099d00f35412ae67aa1aa5c35cec654da
                   7fd04eb023616", "3d33bc719b4b5ff24fe54b281a3618589120
                   06eff78184deffbf6769ca87b9a4", "2a2fe081ccd47b8a669e8
                   6232470b13a5157931bfb3b770dac1080bcccd28d81", "6d0e83
                   53ed62e613e6223334709ad0e146efb9c522633daf44840a2b542
                   4195c", "4a1742ed19312608a1095a476a5fc2533b3df79d065c
                   62494f7a0fe9aef2f455", "58d11e68c4ee775d999f69bc33efc
                   83c7557423420b48cf915d772c975c9fcab", "50886691287e05
                   5accbec2696c2fb20e9072d704461dc358261d30116f78eca2",
                   "080126141ef0de78e1454319dc179a72f95d98e8e1c5912d71a0
                   9f6113bfd6a9", "3983a595dde792593983b34198422b2d2f132
                   15cb4803b510cd4e59ca0297f0f", "34c8e1e41b5718d9dc8223
                   2ea9fd6895601c5366dfdc65a1f58e9b0bc40472cc" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "6aeaf3d45c2ffe3bac998540892d582307d8c3d3b1a4871d2553602bda5
             8cd34"

L = "10"

proof = "0000000000000250b3c15b3fa826872d123f77cd0a8e89247e37cb2825e020a
         a4aca922860d5432ea7d03fcd47cda83eec4233226bce148b8500d2197a2130
         09e17b13ec07ce482858726aca823b41a5506b814757087382ce448208b9fe4
         5774aa9adf8e84aef20b0c3f96d0ad0442ac53705dbc38a7992541db7efe45f
         fea22c407100793568d5ddf912e98761860381926f881a114ed013f155fe73b
         995bb205dc7b290eac5ad0d66aa31dcd02f9c8e33ccbca9d83a7547c5b6c801
         3f026bc714dbf6e061c8c5915bd2d4c10738ad3971e3b36db306bf2e3c31751
         db3d60633ebac1bc83696e852d6a3a044ea01762bbe8d617549ccfb15c8321d
         f79e47bfb1618b5247267ddc4681345d602b4235697c40d394182d1e11c3258
         a1f0f55cda7d0647f6e87967037d35db446d53f1bd81e29ae0263961a5aa72b
         a1e0d7602d04fa2465b5a0fafaad4ed85e06c7cfe76aa7ecdad4c1c0f14360a
         47e8259de5a975a518568653ffd4813650581a34258131eeeb5ab9a391d2024
         513d59cca08c3b56f838a8a606ecfdcc3b0c4ab1ed0290d953ddc5afb0003e6
         fcc9ef5b2646582bdab20f661e166cd1d189c1bbb69503cb6a0ff60e1fbd02d
         7391e38d1fd3c867b04f1921a798d929f5fa4f10a3976170d9484641aa23dd6
         9c201156e2d1447bac35951c863bd5bc22dacfb5ec8501491e5cdbf06ca09ca
         6e5c507fc966b6a2c9fc63d8bb648b82f9e1df454cb3ce6d61d2b5bd45635ce
         757fc75e66eb753ad22a23142306ce499a1c6b6276b97d4d5922e1fd4e1f154
         e46aeaf3d45c2ffe3bac998540892d582307d8c3d3b1a4871d2553602bda58c
         d34a802b21fdc6130d845f22e2630fd0c2339bf7fea16b9ea94bd6ec29fc3da
         5177763acd329715e5f2c7d1d0c27b053ac1b5ab55e70df9b26274beafce67e
         fa0d3393f3542a4798e89fcbedbfdb9d45d0501b78efe0fc3c2af4b6c123b4c
         9b2ee606624d4478aca3bd61da216a4ec4abd61964d46539c534087d50078c4
         136854d3ba0d9e984e91dfebf4651c0d6c142f1c89d1839f8b664b21e1833f5
         78db03e5"
]]></artwork>
</section>

<section anchor="valid-partial-prover-reveal-and-commit-messages-and-partial-signer-reveal-proof-1"><name>valid partial prover reveal and commit messages and partial signer reveal proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "DISCLOSE"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "DISCLOSE"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "HIDE"
1: "COMMIT"
2: "DISCLOSE"
3: "COMMIT"
4: "HIDE"

Trace:

random_scalars:

r_1 = "2782e9be32645456d20a01a8ce5dd233b8049efe8d25eafdb8576f4e8d85826a"
r_2 = "180ea80200b800d1cb672bc1aa52e2e6ecf0acaf794b810f3c16e8b07c413f5e"
e_tilde = "6aeddf95a081d0bfab06a327980dcfdae5b3dd977cdfee4fdf1b340ee8e4b
           617"
r1_tilde = "3eb55f0e3a5017408bab63ac12547727d762f7121ee217f484e48507c4c6
            4165"
r3_tilde = "0707d3931ba4c72a4bf4f9dd75cac1bc489fb7ce207fd45eac7e58834427
            d66e"
m_tilde_scalars = [ "11f580b98813f609f6099d00f35412ae67aa1aa5c35cec654da
                   7fd04eb023616", "3d33bc719b4b5ff24fe54b281a3618589120
                   06eff78184deffbf6769ca87b9a4", "2a2fe081ccd47b8a669e8
                   6232470b13a5157931bfb3b770dac1080bcccd28d81", "6d0e83
                   53ed62e613e6223334709ad0e146efb9c522633daf44840a2b542
                   4195c", "4a1742ed19312608a1095a476a5fc2533b3df79d065c
                   62494f7a0fe9aef2f455", "58d11e68c4ee775d999f69bc33efc
                   83c7557423420b48cf915d772c975c9fcab", "50886691287e05
                   5accbec2696c2fb20e9072d704461dc358261d30116f78eca2",
                   "080126141ef0de78e1454319dc179a72f95d98e8e1c5912d71a0
                   9f6113bfd6a9", "3983a595dde792593983b34198422b2d2f132
                   15cb4803b510cd4e59ca0297f0f", "34c8e1e41b5718d9dc8223
                   2ea9fd6895601c5366dfdc65a1f58e9b0bc40472cc" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "216ec851c795e6ff1222ed33a45f19900d441ba7b9188670bc21ce52012
             aa506"

L = "10"

proof = "0000000000000250b3c15b3fa826872d123f77cd0a8e89247e37cb2825e020a
         a4aca922860d5432ea7d03fcd47cda83eec4233226bce148b8500d2197a2130
         09e17b13ec07ce482858726aca823b41a5506b814757087382ce448208b9fe4
         5774aa9adf8e84aef20b0c3f96d0ad0442ac53705dbc38a7992541db7efe45f
         fea22c407100793568d5ddf912e98761860381926f881a114ed039e629253d3
         e32f5657b9c73681446b379c072a1bcffc4c241fa3d869c88285007b167dd3d
         04a796af81633ec657fa6829249484bdcc6ec0e7f7ad40332c40062fd61b05e
         b3cd71a5f8ba0d270281208973ada7fcfd28964760dcb91457f75e1661ab89f
         16a8bf945f9a844c08df77200750943ad76dfbfdb8d5ae6ffc9d5dd513dcfb4
         aefe66ab8aa097c47aa21268eba661855c22e13ddf6a1e799e71fc6ca432847
         39d4543f433cf09fa2f1d42f30846a2553de910a0fad4448d4a34872db199be
         caa0ea8cfbacd580f7ef80824f545d33b3b359366bb68418d044f2d32b4555c
         e7907e5d238f57821ae8488122fc16467771f8bfc47b146b5130af4e8dd1347
         130a72d79144df638694def9b26dd8e6e13ce3d44c92daff439ca3abcad2022
         5db08dbecafe0fdbf75241d9cbbc446df3119202ff4d23c1c88024594dfcfe1
         5264d335b86c568313123967f611b7fe2e1dda3c6da24b8a9ca626f36cb6e6e
         331050a6f6a63863d4e6ee65a00216da211dbe68d890541d37016a3ce74bedf
         a400e86878083166092fae3cf881ec93e3b24d33bd23fc7d3ba7fdc52c4600c
         48216ec851c795e6ff1222ed33a45f19900d441ba7b9188670bc21ce52012aa
         506a68bbf8db730ed7615ddf1a25f1c9c57425e41ac3c0d0352c1dee6f02106
         9e7cf99272896f2245f5bdc6a18fba6e15f2b07615ce675a7fc368eb70ab1e1
         1845b76bb402f07a7d56aa78df3cd8f6b14332e72c18c0cfd09b300d908436a
         2b28104dbaff76a84c919987fddb9b781ec3e447ea13b220da96961874da00b
         f997a1d6ce5188e2c76cf31c50971214e58a048836b0ab932c5f9928e9c032b
         dbcee314"
]]></artwork>
</section>

<section anchor="valid-partial-prover-reveal-and-commit-messages-and-partial-signer-reveal-and-commit-proof-1"><name>valid partial prover reveal and commit messages and partial signer reveal and commit proof</name>

<artwork><![CDATA[Based on signature: "signature004.json"
signerPublicKey = "92d37d1d6cd38fea3a873953333eab23a4c0377e3e049974eb62b
                   d45949cdeb18fb0490edcd4429adff56e65cbce42cf188b31bddb
                   d619e419b99c2c41b38179eb001963bc3decaae0d9f702c7a8c00
                   4f207f46c734a5eae2e8e82833f3e7ea5"

header = "11223344556677889900aabbccddeeff"
presentationHeader =  "bed231d880675ed101ead304512e043ade9958dd0241ea70b4b3957fba941501"

messageDisclosures =
0: "DISCLOSE"
1: "HIDE"
2: "COMMIT"
3: "HIDE"
4: "DISCLOSE"
5: "HIDE"
6: "COMMIT"
7: "HIDE"
8: "DISCLOSE"
9: "HIDE"


blindMessageDisclosures  =
0: "HIDE"
1: "COMMIT"
2: "DISCLOSE"
3: "COMMIT"
4: "HIDE"

Trace:

random_scalars:

r_1 = "51d82c331c107ff0ec2cc984b04aa9d13d92861c1c919814442fd9e75ea0c97e"
r_2 = "3094e5ca6ae1d37d74085dcda8e5ce99d6899609c971a8f949d7fa0f07f8163e"
e_tilde = "592473903d4941b79e9cd8a9082d657a702b52b7ec4aaeb769543ce1702c3
           a73"
r1_tilde = "6b060e329a747312be65708b8fe952370ed43ef35ede56291ac1993a76c9
            1b9a"
r3_tilde = "0b38eeec29ba401b5b06e104efb0712e606dae7950fb15eeb6a62ce79ed6
            b35e"
m_tilde_scalars = [ "26ebc99e75b801b34ec1ca7cb6c0f3c75372603733e1f6f9ede
                   a418afedef556", "3b7214a3de4022ec5201abe1a05d5af7255e
                   d228130b98b9c8f81f9a1fbe8c3a", "6d176fd7a8d623aec1b46
                   069e10a5014c5142fc8a97755e180bbbf2ba035c6ac", "0f242a
                   1cfc288fe9ab050efa47479f7948c5b645826943333397642e35e
                   b6650", "594c3a7cc210923b362111d3f9685730c63718fe5037
                   d3b1096f3cbe9a0f24f6", "440551fa36c690167fb4c41ca8754
                   8bc6ce83510166d2a73e15c939020660ce1", "288df8e01efc80
                   e3610862c4b64def52e6952d7c1bbed957e6c3439abcd732fa",
                   "1fc7e9a781febf203ea3b6ed9a878465503e2d0b3c2a8c97fae8
                   17d799fa8cfe", "0292baaf5d34008ec85b7c1454f35e563f90e
                   e5a88040e833604b56b1549b77d", "5b80ee08c378d5c352f0b5
                   8ac13bf84fd367f90fe2365b12f8eff04af2b48f06", "7305500
                   bb62676d9fc5d0d282e5252c0e3480574c230e568f4225fb374e0
                   62dc", "65f0cdd3aae3b80ca225f1313d4343c159ce9811262ac
                   379c0e9960d02a44c06" ]

domain = "04ad1197bffbb54ae41c1d43c61dc29325c2dc771d5cc7dba67907b17f564a
          04"
challenge = "0fa9d00653306cccfa9f0e562c4d799beb13e2b1447ff0b0e14f2de0c12
             0781a"

L = "10"

proof = "0000000000000290a7d08f28b98735369d05034b495a261ed1831a5e3e2bc63
         cff3164ef5351bdb4d32f0c5dc23f4426bb65cb989e2da85ba3b79b57cb2224
         744c828d919d32209ff84d6d2c055c58cb896c1f0f063626abd663cd9377298
         5d86b5a82e4f7f6e3dcb2030797145c7f545dc4e57cd8b755f817b8057f28ee
         f7ded03eea1f26d2f0aa74e1a5b6d6a9e055b21a1057d1b916a131ceb5aa3bf
         bd1608dfde195aba5783479abdeafcfd6eacc56edd611ac73163e63587d48ec
         a8ffccf2ab2d718f358314e97fb117d1833958ee7fdc77ec3d7afd4d1148c0f
         3975fddf4692b5c78de91424ae42a1e4570195023210c1807bf1df05615e7c3
         5e1decc7a23d4da10c8271dcc32498db493c378e63c72102cf5289bf2d4afb2
         ac62d14669fdfc1bc9443707b99cf254f8d9f583213b8f837abe35fec10722a
         4c27551bf837cc5f2e9adb0c0884d72ad41bcfd2f0d77be260025d901a6a706
         1c877ff05de14ba714a790ce2784d3a122cd83d9611c157c6bcab5e6b7c4850
         5a74608b76b67f2106460f4454fc2c1a6bfa5c0af13b41ef976696163f021b9
         751a2e71d605f46563cef0d76c0362c30ba113a176624852d5746a383a07466
         a43a744e68f62eceb70925bc4bd2363b80564b368696e3a1f152ad67a7681e3
         f4f37caf752b38bdda40bf37858d5c6506c0e437acedde69e41952468917192
         6bab2a9e30635bf638e577c0d2fb6487859fe885098da24e336e0845f5dda0c
         f1262e415a928974b94e31925c0981c57b121c4152cfccb3b3e5c4740662ff3
         0f07e0b642772a4f1d2e940ab9312d73f1b694245bca1f58eab8b93f84bd99d
         65830196814b0b2b00fdc9abf8a399f4e9f5afc1cdd40f425067c17a520ad74
         81290fa9d00653306cccfa9f0e562c4d799beb13e2b1447ff0b0e14f2de0c12
         0781a997bacc26cab2d3df4e8078cb35c39170a8c849f06dd0ea3f2fad894d0
         ec3844e53a54da461a543d443406f068b504f6abe18a64c10f7eaab2c717d76
         cc6e6aab1d1c75d330df47cafd595f6c85e49c99950286839f816e3d73986bd
         d3e204809468e7bcea1ecb47c0f3564c02cc7154024ef50d83911ab7d55a24a
         7208922161282ce09b44d82c33f06039818c750b192fee31f9144419d6da713
         97a129bb8c58523fe74eae18b5279e96e035d09c63332ccc2818fb2615adc7d
         67d9ebaeeb036169ae91ee29294011958790df045d165354c6afee75a3036fb
         357ba313b9a2378c5e51a44c7abb93d6f3f6162bc9a07a7019e56e2d440edac
         335fc0ac08d306d74ee988a8738171765a2d5e01c1fd9f7d124402aeac69534
         5338cfb269d679408d2c26103092025a3397c0b3521767e046a5bc37f8e32b9
         53769ff68ac53a0"
]]></artwork>
</section>
</section>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>This document does not make any requests of IANA.</t>
</section>

</middle>

<back>
<references><name>References</name>
<references><name>Normative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.irtf-cfrg-bbs-signatures.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
</references>
<references><name>Informative References</name>
<reference anchor="BG18" target="https://link.springer.com/chapter/10.1007/978-3-319-76581-5_19">
  <front>
    <title>Efficient Batch Zero-Knowledge Arguments for Low Degree Polynomials</title>
    <author fullname="Jonathan Bootle" initials="J." surname="Bootle">
      <organization>University College London</organization>
    </author>
    <author fullname="Jens Groth" initials="J." surname="Groth">
      <organization>University College London</organization>
    </author>
    <date year="2018"></date>
  </front>
  <seriesInfo name="In" value="CRYPTO"></seriesInfo>
</reference>
<reference anchor="Chaum85" target="https://dl.acm.org/doi/pdf/10.1145/4372.4373">
  <front>
    <title>Security without identification: transaction systems to make big brother obsolete</title>
    <author fullname="David Chaum" initials="D." surname="Chaum"></author>
    <date year="1985"></date>
  </front>
  <seriesInfo name="In" value="Commun. ACM"></seriesInfo>
  <seriesInfo name="vol" value="10"></seriesInfo>
  <seriesInfo name="pages" value="1030-1044"></seriesInfo>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-privacypass-protocol.xml"/>
<reference anchor="P91" target="https://ia.cr/2023/275">
  <front>
    <title>Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing</title>
    <author fullname="Torden Pryds Pedersen" initials="T." surname="Pedersen">
      <organization>Aarhus University</organization>
    </author>
    <date year="1991"></date>
  </front>
  <seriesInfo name="In" value="CRYPTO"></seriesInfo>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9474.xml"/>
<reference anchor="Vision2025" target="https://eprint.iacr.org/2025/1981">
  <front>
    <title>Vision: A Modular Framework for Anonymous Credential Systems</title>
    <author fullname="Anja Lehmann" surname="Lehmann"></author>
    <author fullname="Andrey Sidorenko" surname="Sidorenko"></author>
    <author fullname="Alexandros Zacharakis" surname="Zacharakis"></author>
    <date year="2025"></date>
  </front>
</reference>
</references>
</references>

<section anchor="document-history"><name>Document History</name>
<t>-00</t>

<ul spacing="compact">
<li>Initial Version</li>
</ul>
<t>-01</t>

<ul spacing="compact">
<li>Change <tt>committed_messages</tt> to <tt>committed_message_scalars</tt> in <tt>CoreCommit</tt></li>
<li>Added explanatory text</li>
<li>Added test vectors</li>
</ul>
<t>-02</t>

<ul spacing="compact">
<li>Expanded privacy and security considerations</li>
<li>Updated the introduction</li>
</ul>
<t>-03</t>

<ul spacing="compact">
<li>Add committed disclosure functionality and explanatory text</li>
<li>Editorial fixes</li>
</ul>
<t>-04</t>

<ul spacing="compact">
<li>Fixed generator counts, scalar ordering, and disclosure indexing in blind signature and proof operations</li>
<li>Corrected inputs, outputs, and undefined variables in core operations</li>
<li>Unified commitment terminology and simplified proof serialization</li>
<li>Add message_to_scalar function that supports &quot;raw&quot; scalar pass through</li>
<li>API updates for BlindVerify, ProofGen for separate issuer and blind messages</li>
<li>Update test vectors (not independently verified yet)</li>
<li>Editorial fixes</li>
</ul>
<t>-05</t>

<ul spacing="compact">
<li>More editorial fixes</li>
<li>Formalize BBS.serialize call in proof_to_octets</li>
<li>Fix and improve array formatting in test vectors</li>
</ul>
</section>

</back>

</rfc>
