Intro
In a threshold signature scheme, a key is split into shares and a parameter is defined such that an adversary that compromises or fewer shares is unable to generate a signature and learns no information about the key. On the other hand, in a threshold optimal scheme, shares can be used to jointly issue a signature without ever reconstructing the key.
Overview
A standard way to identify malicious players is to require each player to prove in zero-knowledge that he is performing the protocol correctly, though alternative approaches exist.
Our key observation however is that if the abort happens during the preprocessing stage then the full signature has not been revealed yet (and indeed the message being signed may not even be known at this point). Therefore it is safe for the players to reveal the random choices they made during the protocol so far (that includes βopening upβ any encryption, etc.) so that their behavior can be verified, and bad players identified.
Moreover, an abort during the online stage can be easily attributed as the shares of the signature s that each player reveals can be easily checked to be correct against public information produced by the offline stage.
ECDSA Security
We assume a stronger notion of unforgeability for ECDSA. In this notion we allow the attacker to see the randomizer R before queriying the message during a chosen-message attack.
This is secure in the presence of a state compromise attack - where the adversary is allowed to see the internal state of the signer (but not its secret keys). This models the real-life situation in which the signer pre-computes all the randomizers βs in advance and stores them in regular memory (while keeping the secret key and the secret nonces in a protected memory). We assume that the adversary manages to read the regular memory contents (i.e. all the βs) and still will not be able to forge.
Additively Homomorphic Encryption
Uses Paillierβs additively homomorphic encryption scheme for additions - specifically it is additively homomorphic modulo a large integer :
- Given ciphertexts and there is an efficiently computable function such that .
- The existence of a ciphertext addition also implies a scalar multiplication operation, . Given an integer and a ciphertext then we have .
Recall the details of such scheme:
- Key-Gen: where and are randomly generated large primes of equal length.
- Decryption
- Homomorphic properties: Given two ciphertexts define . If then . Similarly, given a ciphertext and a number we have that .
Non-Malleable Equivocable Commitments
A trapdoor commitment scheme allows a sender to commit to a message with information-theoretic privacy. i.e., given the transcript of the commitment phase the receiver, even with infinite computing power, cannot guess the committed message better than at random.
This trapdoor should be hard to compute efficiently.
A non-interactive trapdoor commitment scheme consists of the following four algorithms:
- is the key generation algorithm, on input the security parameter it outputs a pair {, } where is the public key associated with the commitment scheme, and is called the trapdoor.
- is the commitment algorithm. On input and a message it outputs where are the coin tosses. is the commitment string, while is the decommitment string, which is kept secret until opening time.
- is the verification algorithm. On input , and it either outputs a message \perp$
- is the algorithm that opens a commitment in any possible way given the trapdoor information. It takes as input , strings , with , a message and a string . If then outputs such that .
Trapdoor commitments must satisfy:
- Correctness
- Information theoretic security
- Secure binding
Some commitment schemes are not concurrently secure and have a security definition that only holds for , ie. the adversary only sees 1 commitment. A stronger commitment scheme used here is to use any secure hash function and define the commitment to as for a uniformly chosen of length and assume that behaves as a random oracle.
Multiplicative-to-Additive Share Conversion Protocol
This protocol converts multiplicative shares of a secret into additive shares.
Assume that we have two parties Alice and Bob holding two secrets , respectively which we can think of as multiplicative shares of a secret . Alice and Bob would like to compute secret additive shares , of , that is random values such that with Alice holding (and ) and Bob holding (and ).
In the basic MtA protocol, the playerβs inputs are not verified, and the players can cause the protocol to produce an incorrect output by inputting the wrong values , . In the case when is public, the protocol can be enhanced to include an extra check that ensures that inputs the correct value - this protocol is called MtAwc (MtA βwith checkβ).
In this protocol, zero-knowledge range proofs and proofs of knowledge are used to verify the commitments. If the proofs fail to verify, the verifying party aborts. The verifier generates the parameters , and and prove the discrete log between and exist.
- The proofs are generated here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L239-L225
Q: Why is this share conversion necessary?
Feldman Verifiable Secret Sharing
In Shamirβs secret sharing scheme, to share a secret the dealer generates a random degree polynomial over such that . The secret shares are evaluations of the polynomial:
Each Player receives a share .
In a verifiable secret sharing scheme, auxiliary information is published that allows players to check that their shares are consistent and define a unique secret. Feldmanβs VSS is an extension of Shamir secret sharing in which the dealer also publishes in for all and in .
Using this auxiliary information, each Player can check its share for consistency by verifying:
in
If the check does not hold for any player, it raises a complaint and the protocol terminates.
Feldmanβs scheme does leak but nothing else.
Key Generation Protocol
Summary:
- In Phase 1, each player generates a random scalar and its corresponding public component, an EC point , and makes a public, verifiable commitment to that parameter.
- is necessary for the public commitment, and is meant to be kept private.
- In Phase 2, each player performs VSS of , and use the received shares from other players to create their own secret key share . Each key share has a corresponding public key
- In Phase 3, each player proves that they own .
Phase 1:
- Each Player chooses a random scalar and runs the commitment algorithm.
- is chosen here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L160
- The
public key(each Playerβs individual keypair is generated after the VSS in Phase 2) EC Point is generated here using https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L161 - The Paillier encryption key (and decryption key) are generated here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L162
- The Hash commitment to is made https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L241-L244.
- The user defined randomness is chosen here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L222
- Each Player broadcasts and .
Phase 2:
- Each Player broadcasts .
- Let be the value decommitted by . The Player performs a Feldman-VSS of the value with as the βfree term in the exponentβ.
- The (distributed) public key is set to . Each player adds the private shares received during the Feldman VSS protocols. The resulting values are a Shamirβs secret sharing of the (distributed) secret key . Note that the values are public.
Phase 3:
- Let be the RSA modulus associated with . Each player proves in ZK that he knows using Schnorrβs protocol, that is square-free, and that , generate the same group modulo .
- Discrete log proof of here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L362
- Doesnβt seem like ZenGo implemented the proofs for , and ?
Q: Does each need to be sufficiently large? Or just the prime needs to be large?
Signing Protocol
In summary:
- Start with additive sharings of , and use technique to create additive sharings of and , and by linear homomorphism, additive shares of . Then a βdistributed signature verificationβ check is performed on shares of to make sure they reconstruct a correct signature.
- Our first major observation is that we identify a new distributed verification check can be performed on the shares of and before the message is known, and therefore can be done in a pre-processing phase. If those sharings are consistent and correct, then it is safe to reveal shares of once the message is known. This will take just a single scalar multiplication per player and one communication round (i.e. each player sends just a single message) and no online interactivity is required.
- In Phase 0, each player transforms their share into share .
- In Phase 1, each player generates their own as multiplicative shares of , and broadcasts their commitment to (via its corresponding public point generated by )
- In Phase 2, MtA protocol is used to produce additive shares . These are then used to produce and .
- In Phase 3, is computed for use in Phase 4.
- In Phase 4, decommitments are presented and are computed.
- In Phase 5, 6 consistency checks are made based on ZK proofs.
- In Phase 7, the signature is produced using .
Preliminaries (Phase 0):
- Let be the set of players participating in the signature protocol.
- Assume . For the signing protocol we can share any ephemeral secrets using a secret sharing scheme, and do not need to use the general structure.
- Using the appropriate Langrangian coefficients each player in S can locally map its own share of into a share of , , i.e. . Since and are public values, all the players can compute .
- is computed here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L553
- Computes the contribution of this -th index towards the Lagrange basis polynomial evaluated at the zero point https://github.com/ZenGo-X/curv/blob/1a6541192f59aa447dc36cb13f88a5d09fd59dda/src/cryptographic_primitives/secret_sharing/feldman_vss.rs#L276
- is computed here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L558
- is computed here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L553
Phase 1:
- Each Player selects .
- Define and
- Note that and
- and chosen here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L561-L563
- Each Player computes and broadcasts .
Phase 2:
- Every pair of players engages in two multiplicative-to-additive share conversion subprotocols. Note that the first message for these protocols is the same and is only sent once.
- run MtA with shares respectively. Let and be the share received by player and respectively at the end of this protocol, ie.
- Player sets
- Note that the are a additive sharing of
- Step 1 of MtA against is done by here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L85
- Step 2 of MtA against is done by here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L150
- is set here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L265
- run MtAwc with shares , respectively. Let and be the share received by player and respectively at the end of this protocol, ie.
- Player sets
- Note that the are a additive sharing of
- Step 2 of MtA against is done by here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L157
- is set here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L267
Phase 3:
- Every Player broadcasts:
- and the players reconstruct . The players compute
- with and proves in ZK that he knows
- computed here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L268
- is just an alternative generator to .
- Uses (Chaum-)Pedersen proof https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/party_i.rs#L631
Phase 4:
- Each Player broadcasts their decommitment
- Let be the values decommitted by . The players compute and
- The players also compute
Phase 5:
- Each Player broadcasts and a ZK proof of consistency between and which each player sent as the first message of the MtA protocol in Phase 2. If the protocol aborts.
Phase 6:
- Each Player broadcasts and a ZK proof of consistency between and which each player sent in Phase 3. If the protocol aborts.
- ZK proof generated here https://github.com/ZenGo-X/multi-party-ecdsa/blob/c94065fbf37132dccc7955cf2627866e87c162bf/src/protocols/multi_party_ecdsa/gg_2020/state_machine/sign/rounds.rs#L529
- Uses the Homomorphic El Gamal Proof - proof of knowledge that a pair of group elements {D, E} form a valid homomorphic ElGamal encryption (βin the exponentβ) using public key .
Phase 7:
- Each Player broadcasts and set . If the signature is correct for , the players accept, otherwise they abort.
Identifying Aborts
Overview
A standard way to identify malicious players is to require each player to prove in zero-knowledge that he is performing the protocol correctly, though alternative approaches exist.
Our key observation however is that if the abort happens during the preprocessing stage then the full signature has not been revealed yet (and indeed the message being signed may not even be known at this point). Therefore it is safe for the players to reveal the random choices they made during the protocol so far (that includes βopening upβ any encryption, etc.) so that their behavior can be verified, and bad players identified.
Moreover, an abort during the online stage can be easily attributed as the shares of the signature that each player reveals can be easily checked to be correct against public information produced by the offline stage.
Key Generation
In the key generation protocol, there are two possible places that an abort can occur:
- Phase 2: If a player complains that the Feldman share it received is inconsistent and therefore does not verify correctly, the protocol will abort.
- Here there is ambiguity who the bad player is - whether the complainer is framing the complainee, or the complainee actually dealt a bad share.
- A simple identification method is simply to publish the dealt share (and the message signature) into the open and let everyone verify. This is fine because the key share hasnβt been used to sign yet.
- Phase 3: When each player is proving knowledge of and proving the correctness of their Paillier key, if one of these proofs fails to verify the protocol will abort.
Signing Protocol
In the signing protocol, there are places that an abort can occur:
- Phase 2: If the range proofs of the MtA / MtAwc or ZK proofs for MtAwc fail.
- Phase 3: If the ZK proof about fails
- Phase 4: If the decommitment fails to verify
- Phase 5: If the ZK proof about fails to verify
- Phase 5: If
- Phase 6: If the ZK proof about fails to verify
- Phase 6: If
- Phase 7: If the signature is not valid for the message .