Skip to content

Differentiation or Not Between Prover and Signer Messages #12

@Wind4Greg

Description

@Wind4Greg

Blind BBS signatures support what are called "partially blind signatures" where the signature issued by the signer covers "blinded messages" from the Prover as well as "non-blinded" messages from the Signer. Since BBS provides for selective disclosure the Prover selects a subset (including none) of all these messages to reveal to the Verifier.

Two mutually exclusive features related to privacy/security of the resulting BBS proof are possible: (a) the Verifier knows which of the signed disclosed messages that it receives comes from the Prover and which come from the Signer, or (b) the Verifier cannot determine which messages are attributable to the Prover or the Signer, i.e., they only know that the messages are signed and come from either source.

For two prime applications of Blind BBS signatures (in a credential context) (1) "anonymous holder binding", (2) BBS pseudonyms, the verifier needs to be assured of which messages came from the Prover and which from the Signer. However, this may not be the case in all applications and this issue opens a discussion on how both "differentiation" and "non-differentiation" of message source could be achieved.

Technical Background

BBS signatures and related BBS blind commitment are based on combining "messages" with generators. For Blind BBS this involves generators for the Prover and the Signer to use with their respective messages. Two fundamental approaches:

  1. A "single set of generators" used by both Prover and Signer, i.e., generated with a call to BBS.create_generators(generators_number, api_id) using one api_id and having this list of generators divided between the Prover and the Signer.
    1. Simple if the number of messages and committed messages is well know and fixed for an application.
    2. More complicated for the Signer if the number of prover messages can be very large and variable (per Prover).
    3. No Differentiation between Prover messages and Signer messages. Feature or Bug depending on application needs. Verifier will not know which came from Prover versus Signer.
  2. Two "sets of generators" one for use by the Prover in committing messages and one for use by Signer for "signer messages". These are generated with calls to BBS.create_generators(generators_number, api_id) with two different api_ids.
    1. Signer and Prover "generator spaces" are kept separate, i.e., Prover cannot influence generators used by Signer for signer messages.
    2. Signer will know number of prover messages if receives and verifiers "commitment with proof" so the number of Prover messages is not hidden.
    3. Verifier must know the number of Prover (committed) messages to create both sets of generators (it gets the total number from the proof).
    4. Prover committed messages and Signer messages clearly differentiated, i.e., the Verifier knows which disclosed messages came from the Prover compared to Signer. This is a Feature or a Bug depending on application.
    5. Current Blind BBS Applications (a) Anonymous Holder Binding, and (b) Pseudonyms are based on this differentiation. These are based on non-disclosed secrets known to the Prover and not the Signer. In addition for Pseudonyms the list of secrets can be of variable size per signature.

Current API

BBS Core operations and Blind BBS core operations are agnostic this approach since they take "generators" as parameters. The following summarizes the current API with key function calls.

Prover

Prover knows how many committed messages but may not know how many messages, i.e., signer provided messages. prior to receiving blind signature from Signer.

  • Commit(committed_messages, api_id)
    • CoreCommit(committed_message_scalars,blind_generators, api_id)
  • VerifyBlindSign(PK, signature, header, messages, committed_messages, secret_prover_blind)
  • BlindProofGen(PK,signature,header, ph,messages, committed_messages,disclosed_indexes, disclosed_commitment_indexes, secret_prover_blind)

Signer

May or may not know ahead of time how many committed messages from prover. Gets number of committed messages from the commitment_with_proof data. Uses this to create blind generators in validation of commitment. All generators are used in the domain computation (BBS core).

  • BlindSign(SK, PK, commitment_with_proof, header, messages),
    • generators = BBS.create_generators(L + 1, api_id)
    • blind_generators = BBS.create_generators(M + 1, "BLIND_" || api_id)
    • deserialize_and_validate_commit(commitment_with_proof, blind_generators, api_id)
    • B_calculate(generators, commit, message_scalars)
    • FinalizeBlindSign(SK, PK, B, generators, blind_generators, header, api_id)
      • BBS.calculate_domain(PK, Q_1, (H_1, ..., H_L, J_1, ..., J_M), header, api_id) where Q_1, H_1 to H_L are from the generators, and J_1 to J_M are from the blind generators.

Verifier

The total number of messages comes "encoded" in the proof. To verify the proof a full set of generators (generators used by signer, and blind generators) is needed by the verifier. When using "separate" generator sets the number, L, of blind generators must be furnished as in the API below.

  • BlindProofVerify(PK, proof, header, ph, L, disclosed_messages, disclosed_committed_messages, disclosed_indexes, disclosed_committed_indexes)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions