In our recent blog, Threshold Cryptography II, we explored the FROST protocol for threshold EdDSA. Compared to EdDSA, threshold ECDSA is significantly more complex due to the difficulty of securely distributing the signature’s non-linear terms. This issue was addressed in GG18 [3] using the Multiplicative-to-Additive (MtA) secret share conversion protocol and Paillier additively homomorphic encryption scheme, enabling a secure and efficient threshold signature scheme.
This protocol enhances fault tolerance and security guarantees, making it suitable for decentralized use cases such as cross-chain bridges, multiparty computation (MPC) wallets, and other blockchain applications that require resilience against single points of failure when nodes (parties) are performing cryptographic signing operations.
Binance tss-lib [1] is a Go implementation of threshold ECDSA protocol based on GG18 [3]. It performs distributed key generation and a 9-round signing protocol, allowing any subset of KaTeX can only parse string typed expression
t+1 out of KaTeX can only parse string typed expression
n participants to jointly produce a valid ECDSA signature without reconstructing the secret key.
This third post in the Threshold Cryptography series provides a bird’s-eye view of the 9-round threshold ECDSA protocol implemented in tss-lib [1]. Detailed exposition of the underlying MtA secret share conversion protocol and zero-knowledge proofs will follow in the next two posts.
ECDSA
Elliptic Curve Digital Signature Algorithm (ECDSA) is an elliptic curve variant of the Digital Signature Algorithm (DSA). It operates over a cyclic group KaTeX can only parse string typed expression
G of large prime order KaTeX can only parse string typed expression
q, generated by a curve base point KaTeX can only parse string typed expression
g on the elliptic curve. Additionally, a cryptographic hash function KaTeX can only parse string typed expression
H maps arbitrary strings to elements in the prime field KaTeX can only parse string typed expression
Zq. The notation KaTeX can only parse string typed expression
+ stands for curve point addition and KaTeX can only parse string typed expression
∙ stands for scalar multiplication with a curve point. The secret key is a nonzero scalar KaTeX can only parse string typed expression
x∈Zq∗ (i.e., nonzero elements in KaTeX can only parse string typed expression
Zq), and its public key is the curve point KaTeX can only parse string typed expression
y=x∙g∈G.
Signature Generation
- Given a message
KaTeX can only parse string typed expression
M, compute the hash KaTeX can only parse string typed expression
m=H(M)∈Zq.
- Select a random nonce
KaTeX can only parse string typed expression
k∈Zq∗.
- Compute point
KaTeX can only parse string typed expression
R=k−1∙g∈G and let KaTeX can only parse string typed expression
r∈Zq be its KaTeX can only parse string typed expression
x-coordinate.
- Then compute
KaTeX can only parse string typed expression
s=k⋅(m+x⋅r) mod KaTeX can only parse string typed expression
q.
- The ECDSA signature is
KaTeX can only parse string typed expression
σ=(r,s) where both KaTeX can only parse string typed expression
r and KaTeX can only parse string typed expression
s are scalars in KaTeX can only parse string typed expression
Zq.
Signature Verification
- Given a signature
KaTeX can only parse string typed expression
σ=(r,s), verify KaTeX can only parse string typed expression
r,s∈Zq.
- Compute
KaTeX can only parse string typed expression
R′=(m⋅s−1)∙g+(r⋅s−1)∙y, where KaTeX can only parse string typed expression
m=H(M)∈Zq and KaTeX can only parse string typed expression
y is the public key.
- The signature
KaTeX can only parse string typed expression
σ is valid if the KaTeX can only parse string typed expression
x-coordinate of KaTeX can only parse string typed expression
R′ equals to KaTeX can only parse string typed expression
r.
Challenge in ECDSA Threshold Signing
Unlike EdDSA, the challenge to create threshold ECDSA lies in the nonlinear terms KaTeX can only parse string typed expression
k−1 and KaTeX can only parse string typed expression
k⋅x during the signature generation. Simply distributing the nonce KaTeX can only parse string typed expression
k=∑iki and private key KaTeX can only parse string typed expression
x=∑iωi among KaTeX can only parse string typed expression
t+1 parties do not directly yield signature shares.
To get around with it, the Bar-Ilan and Beaver inversion trick was utilized in the MtA protocol of GG18 [3] by introducing a random value KaTeX can only parse string typed expression
γ, then computing KaTeX can only parse string typed expression
δ=k⋅γ, and rewriting KaTeX can only parse string typed expression
k−1=δ−1⋅γ.
If KaTeX can only parse string typed expression
γ=∑iγi is additively shared among the KaTeX can only parse string typed expression
t+1 parties, then KaTeX can only parse string typed expression
δ=k⋅γ=∑iki⋅∑iγi=∑i,jki⋅γj is publicly revealed, while KaTeX can only parse string typed expression
σσ=k⋅x=∑iki⋅∑iωi=∑i,jki⋅ωj remains secretly shared.
Defining intermediate values KaTeX can only parse string typed expression
δi=ki∑jγj=ki⋅γi+ki⋅∑i=jγj and KaTeX can only parse string typed expression
σi=ki⋅ωi+ki⋅∑i=jωj, then KaTeX can only parse string typed expression
δ=∑iδi and KaTeX can only parse string typed expression
σ=∑iσi, so each party holds one share KaTeX can only parse string typed expression
δi and KaTeX can only parse string typed expression
σi.
As long as the multiplicative shares KaTeX can only parse string typed expression
a⋅b (i.e., each term KaTeX can only parse string typed expression
ki⋅γj in KaTeX can only parse string typed expression
ki⋅∑i=jγj and KaTeX can only parse string typed expression
ki⋅ωj in KaTeX can only parse string typed expression
ki⋅∑i=jωj) can be converted to additive share KaTeX can only parse string typed expression
α and KaTeX can only parse string typed expression
β such that KaTeX can only parse string typed expression
a⋅b=α+β, then each party will hold the additive shares KaTeX can only parse string typed expression
δi and KaTeX can only parse string typed expression
σi of the product KaTeX can only parse string typed expression
δ=k⋅γ and KaTeX can only parse string typed expression
σ=k⋅x.
9-Round Threshold ECDSA
Binance tss-lib [1] assumes two types of communication channels: a broadcast channel for disseminating messages to all parties except for itself, and a peer-to-peer (p2p) channel for secure, private communication between two individual parties.
The implementation of the threshold ECDSA over the Secp256k1 curve operates in 9 rounds with two additional offline stages, prepare and finalize. In each round, parties validate and process messages received from peers via broadcast or p2p channels, then generate and transmit new messages accordingly.
It assumes that a secret key is distributed to KaTeX can only parse string typed expression
n parties (for example, with methods on secret sharing schemes in the first post) so that each holds a secret share and any KaTeX can only parse string typed expression
t+1 parties or more could reconstruct the private key. At the beginning of the protocol, the parties in the group prepared to participate in the signing are predetermined and the group size is KaTeX can only parse string typed expression
≥t+1. For simplicity, we assume that only KaTeX can only parse string typed expression
t+1 parties KaTeX can only parse string typed expression
P1,⋯,Pt+1 in the group participate in the ECDSA threshold signing.
Prepare
Given the KaTeX can only parse string typed expression
t+1 parties, each party KaTeX can only parse string typed expression
Pi converts its Shamir secret share to additive secret share by multiplying the KaTeX can only parse string typed expression
i-th Lagrange coefficient KaTeX can only parse string typed expression
λi=∑j=1,i=jt+1pj−pipj, where KaTeX can only parse string typed expression
pj is the participant identifier associated to KaTeX can only parse string typed expression
Pj used in the key sharing (Note that the first post on distributed key generation assumes KaTeX can only parse string typed expression
pj=j for simplicity). Additionally, KaTeX can only parse string typed expression
Pi computes all the public key shares of the KaTeX can only parse string typed expression
t+1 parties by taking scalar multiplication with the Lagrange coefficients.
Refer to GG18 [3], Page 11:

Round 1
Each party KaTeX can only parse string typed expression
Pi checks that the hash of message KaTeX can only parse string typed expression
m is within the range of the scalar field of the Secp256k1 curve, then every KaTeX can only parse string typed expression
Pi starts to run the MtA protocol with every other peer to convert the multiplicative shares to additive shares.
KaTeX can only parse string typed expression
Pi selects nonce share KaTeX can only parse string typed expression
ki∈Zq∗ and auxiliary random value KaTeX can only parse string typed expression
γi∈Zq∗.
- Computes point
KaTeX can only parse string typed expression
Γi=γi∙g and creates its commitment (i.e., hash of the point KaTeX can only parse string typed expression
Γi and a random value KaTeX can only parse string typed expression
r.).
- With every other
KaTeX can only parse string typed expression
Pj’s Paillier public key, KaTeX can only parse string typed expression
Pi invokes AliceInit() to encrypt the nonce share KaTeX can only parse string typed expression
ki (Alice’s share KaTeX can only parse string typed expression
a) and create range proof of KaTeX can only parse string typed expression
ki for each KaTeX can only parse string typed expression
Pj.
KaTeX can only parse string typed expression
Pi sends the encrypted value (ciphertext) of KaTeX can only parse string typed expression
ki and its range proof to every corresponding KaTeX can only parse string typed expression
Pj via the p2p channel.
KaTeX can only parse string typed expression
Pi broadcasts the commitment to KaTeX can only parse string typed expression
γi∙g.

Refer to GG18 [3], Page 11:

Refer to GG18 [3], Page 9:

Round 2
-
Each party KaTeX can only parse string typed expression
Pj invokes BobMid() to
- verify the range proof from round 1.
- report the party with invalid range proof.
- call ProveBob() to create its share
KaTeX can only parse string typed expression
βi,j and encrypt the share with KaTeX can only parse string typed expression
γj (Bob’s share KaTeX can only parse string typed expression
b) and KaTeX can only parse string typed expression
Pi’s Paillier public key, then generate the Bob proof.
- Aborts if an error occurs.
-
KaTeX can only parse string typed expression
Pj invokes BobMidWC() (i.e., MtA with check) to
- verify the range proof from round 1.
- report the party with invalid range proof.
- call ProveBob() to create its share
KaTeX can only parse string typed expression
νi,j and encrypt the share with its private key share KaTeX can only parse string typed expression
ωj (Bob’s share KaTeX can only parse string typed expression
b) and KaTeX can only parse string typed expression
Pi’s Paillier public key, then generate the Bob proof with check with an extra Schnorr proof to the KaTeX can only parse string typed expression
ωj.
- Aborts if an error occurs.
-
KaTeX can only parse string typed expression
Pj sends encrypted shares and Bob proofs to the corresponding peer KaTeX can only parse string typed expression
Pi.

Refer to GG18 [3], Page 9:

Round 3
-
Each party KaTeX can only parse string typed expression
Pi invokes AliceEnd() to
- verify the Bob proof.
- report the party with invalid Bob proof.
- decrypt the encrypted share and compute its share
KaTeX can only parse string typed expression
αi,j.
- Aborts if an error occurs.
-
Each party KaTeX can only parse string typed expression
Pi invokes AliceEndWC() to
- verify the Bob proof with check.
- report the party with invalid Bob proof with check.
- decrypt the encrypted share and compute its share
KaTeX can only parse string typed expression
μi,j.
- Aborts if an error occurs.
-
Each party KaTeX can only parse string typed expression
Pi computes the KaTeX can only parse string typed expression
δi=ki⋅γi+∑i=jαi,j+∑i=jβj,i and KaTeX can only parse string typed expression
σi=ki⋅ωi+∑i=jμi,j+∑i=jνj,i, where KaTeX can only parse string typed expression
ki⋅γj=αi,j+βi,j and KaTeX can only parse string typed expression
ki⋅ωj=μi,j+νi,j.
-
KaTeX can only parse string typed expression
Pi broadcasts KaTeX can only parse string typed expression
δi to other participants.

Refer to GG18 [3], Page 9:

Refer to GG18 [3], Page 11:

Round 4
- Each party
KaTeX can only parse string typed expression
Pi sums over all the KaTeX can only parse string typed expression
δi mod KaTeX can only parse string typed expression
q and computes its inverse mod KaTeX can only parse string typed expression
q.
KaTeX can only parse string typed expression
Pi creates a Schnorr proof to KaTeX can only parse string typed expression
γi.
KaTeX can only parse string typed expression
Pi broadcasts the Schnorr proof with the decommitment in round 1.

Refer to GG18 [3], Page 11:

Round 5
- Each party
KaTeX can only parse string typed expression
Pi verifies KaTeX can only parse string typed expression
Pj's commitment and extracts KaTeX can only parse string typed expression
Γj from it, then verifies its Schnorr proof.
KaTeX can only parse string typed expression
Pi computes the curve point KaTeX can only parse string typed expression
R=δ−1∙(∑jΓj) (equal to KaTeX can only parse string typed expression
k−1∙g) and gets its KaTeX can only parse string typed expression
x-coordinate, KaTeX can only parse string typed expression
r.
KaTeX can only parse string typed expression
Pi computes its signature share KaTeX can only parse string typed expression
si=m⋅ki+r⋅σi with the hash of the signing message KaTeX can only parse string typed expression
m and the share KaTeX can only parse string typed expression
σi.
KaTeX can only parse string typed expression
Pi selects random values KaTeX can only parse string typed expression
li, KaTeX can only parse string typed expression
ρi, then computes KaTeX can only parse string typed expression
Vi=si∙R+li∙g, KaTeX can only parse string typed expression
Ai=ρi∙g and creates hash commitment to KaTeX can only parse string typed expression
Vi, KaTeX can only parse string typed expression
Ai.
KaTeX can only parse string typed expression
Pi broadcasts the hash commitment.

Refer to GG18 [3], Page 11:

Round 6
- Each party
KaTeX can only parse string typed expression
Pi creates Schnorr proof to KaTeX can only parse string typed expression
si,li with KaTeX can only parse string typed expression
Vi=si∙R+li∙g and Schnorr proof to KaTeX can only parse string typed expression
ρi with KaTeX can only parse string typed expression
Ai=ρi∙g.
KaTeX can only parse string typed expression
Pi broadcasts the decommitment in round 5 and Schnorr proofs.

Refer to GG18 [3], Page 11 and 12:

Round 7
- Each party
KaTeX can only parse string typed expression
Pi verifies the hash commitment to KaTeX can only parse string typed expression
Vi and KaTeX can only parse string typed expression
Ai.
KaTeX can only parse string typed expression
Pi verifies the Schnorr proofs.
- Reports the party with invalid Bob proof with check. Aborts if it fails.
KaTeX can only parse string typed expression
Pi computes KaTeX can only parse string typed expression
V=(−m)∙g+(−r)∙y+∑jVj and KaTeX can only parse string typed expression
A=∑jAj.
KaTeX can only parse string typed expression
Pi continues to compute KaTeX can only parse string typed expression
Ui=ρi∙V and KaTeX can only parse string typed expression
Ti=li∙A.
KaTeX can only parse string typed expression
Pi creates the hash commitment to KaTeX can only parse string typed expression
Ui and KaTeX can only parse string typed expression
Ti.
KaTeX can only parse string typed expression
Pi broadcasts the hash commitment.

Refer to GG18 [3], Page 12:

Round 8
- Each party
KaTeX can only parse string typed expression
Pi broadcasts the decommitment to KaTeX can only parse string typed expression
Vi and KaTeX can only parse string typed expression
Ai from round 7.

Refer to GG18 [3], Page 12:

Round 9
- Each party
KaTeX can only parse string typed expression
Pi computes KaTeX can only parse string typed expression
U=∑jUj and KaTeX can only parse string typed expression
T=∑jTj.
KaTeX can only parse string typed expression
Pi verifies if KaTeX can only parse string typed expression
U==T. Aborts if it is not.
- Until this point, it is safe for
KaTeX can only parse string typed expression
Pi to broadcast its signature share KaTeX can only parse string typed expression
si.

Refer to GG18 [3], Page 12:

Finalize
- Each party
KaTeX can only parse string typed expression
Pi computes KaTeX can only parse string typed expression
s=∑jsj.
KaTeX can only parse string typed expression
Pi creates the signature KaTeX can only parse string typed expression
(r,s) and converts it to a standard format with recovery ID to prevent signature malleability.
KaTeX can only parse string typed expression
Pi verifies the newly created signature to ensure it is valid.
Conclusion
This post provides a high-level overview of the 9-round threshold ECDSA scheme implemented in Binance tss-lib [1]. The technical details on the MtA secret share conversion protocol and zero-knowledge proofs utilized in the protocol will be covered in the following two posts.
References
- Binance: https://github.com/bnb-chain/tss-lib
- Binance: Binance Open-Sources Threshold Signature Scheme Library
- Rosario Gennaro, Steven Goldfeder, 2018: Fast Multiparty Threshold ECDSA with Fast Trustless Setup (GG18)
- Ran Canetti, Rosario Gennaro, Steven Goldfeder, Nikolaos Makriyannis, Udi Peled, 2021: UC Non-Interactive, Proactive, Threshold ECDSA with Identifiable Aborts (CGGMP21)