Skip to content

Commit 29e6d04

Browse files
committed
test: add cases for secp256k1
1 parent 581781f commit 29e6d04

File tree

3 files changed

+117
-44
lines changed

3 files changed

+117
-44
lines changed

mpc/binance/ecdsa/mpc_test.go

Lines changed: 62 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ import (
1818
"time"
1919

2020
"github.com/bnb-chain/tss-lib/v2/tss"
21+
"github.com/btcsuite/btcd/btcec/v2"
22+
s256k1 "github.com/btcsuite/btcd/btcec/v2"
23+
btcecdsa "github.com/btcsuite/btcd/btcec/v2/ecdsa"
24+
"github.com/decred/dcrd/dcrec/secp256k1/v4"
2125
"github.com/stretchr/testify/assert"
2226
"go.uber.org/zap"
2327
)
@@ -109,45 +113,76 @@ func (parties parties) Mapping() map[string]*tss.PartyID {
109113
}
110114

111115
func TestTSS(t *testing.T) {
112-
pA := NewParty(1, elliptic.P256(), logger("pA", t.Name()))
113-
pB := NewParty(2, elliptic.P256(), logger("pB", t.Name()))
114-
pC := NewParty(3, elliptic.P256(), logger("pC", t.Name()))
116+
curves := []elliptic.Curve{
117+
elliptic.P256(),
118+
s256k1.S256(),
119+
}
120+
121+
for _, tc := range curves {
122+
t.Run(tc.Params().Name, func(t *testing.T) {
123+
pA := NewParty(1, tc, logger("pA", t.Name()))
124+
pB := NewParty(2, tc, logger("pB", t.Name()))
125+
pC := NewParty(3, tc, logger("pC", t.Name()))
126+
127+
t.Logf("Created parties")
115128

116-
t.Logf("Created parties")
129+
parties := parties{pA, pB, pC}
130+
parties.init(senders(parties))
117131

118-
parties := parties{pA, pB, pC}
119-
parties.init(senders(parties))
132+
t.Logf("Running DKG")
120133

121-
t.Logf("Running DKG")
134+
t1 := time.Now()
135+
shares, err := parties.keygen()
136+
assert.NoError(t, err)
137+
t.Logf("DKG elapsed %s", time.Since(t1))
122138

123-
t1 := time.Now()
124-
shares, err := parties.keygen()
125-
assert.NoError(t, err)
126-
t.Logf("DKG elapsed %s", time.Since(t1))
139+
parties.init(senders(parties))
127140

128-
parties.init(senders(parties))
141+
parties.setShareData(shares)
142+
t.Logf("Signing")
129143

130-
parties.setShareData(shares)
131-
t.Logf("Signing")
144+
msgToSign := []byte("bla bla")
132145

133-
msgToSign := []byte("bla bla")
146+
t.Logf("Signing message")
147+
t1 = time.Now()
148+
sigs, err := parties.sign(digest(msgToSign))
149+
assert.NoError(t, err)
150+
t.Logf("Signing completed in %v", time.Since(t1))
151+
152+
sigSet := make(map[string]struct{})
153+
for _, s := range sigs {
154+
sigSet[string(s)] = struct{}{}
155+
}
156+
assert.Len(t, sigSet, 1)
134157

135-
t.Logf("Signing message")
136-
t1 = time.Now()
137-
sigs, err := parties.sign(digest(msgToSign))
138-
assert.NoError(t, err)
139-
t.Logf("Signing completed in %v", time.Since(t1))
158+
pk, err := parties[0].TPubKey()
159+
assert.NoError(t, err)
140160

141-
sigSet := make(map[string]struct{})
142-
for _, s := range sigs {
143-
sigSet[string(s)] = struct{}{}
161+
assert.True(t, verifySignature(tc.Params().Name, pk, msgToSign, sigs[0]))
162+
})
144163
}
145-
assert.Len(t, sigSet, 1)
164+
}
165+
166+
func verifySignature(curveName string, pk *ecdsa.PublicKey, msg []byte, sig []byte) bool {
167+
switch curveName {
168+
case elliptic.P256().Params().Name:
169+
return ecdsa.VerifyASN1(pk, digest(msg), sig)
170+
case s256k1.S256().Params().Name:
171+
// convert pk to s256k1.PublicKey
172+
xFieldVal, yFieldVal := new(secp256k1.FieldVal), new(secp256k1.FieldVal)
173+
xFieldVal.SetByteSlice(pk.X.Bytes())
174+
yFieldVal.SetByteSlice(pk.Y.Bytes())
175+
btcecPubKey := btcec.NewPublicKey(xFieldVal, yFieldVal)
176+
177+
signature, err := btcecdsa.ParseDERSignature(sig)
178+
if err != nil {
179+
return false
180+
}
146181

147-
pk, err := parties[0].TPubKey()
148-
assert.NoError(t, err)
182+
return signature.Verify(digest(msg), btcecPubKey)
183+
}
149184

150-
assert.True(t, ecdsa.VerifyASN1(pk, digest(msgToSign), sigs[0]))
185+
return false
151186
}
152187

153188
func senders(parties parties) []Sender {

test/binance/ecdsa_test.go

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,57 @@ import (
77
"testing"
88

99
ecdsa_scheme "github.com/IBM/TSS/mpc/binance/ecdsa"
10-
1110
. "github.com/IBM/TSS/types"
11+
s256k1 "github.com/btcsuite/btcd/btcec/v2"
12+
btcecdsa "github.com/btcsuite/btcd/btcec/v2/ecdsa"
1213

1314
"github.com/stretchr/testify/assert"
1415
)
1516

1617
func TestThresholdBinanceECDSA(t *testing.T) {
17-
n := 4
18+
curves := []elliptic.Curve{
19+
elliptic.P256(),
20+
s256k1.S256(),
21+
}
1822

19-
var verifySig signatureVerifyFunc
23+
for _, curve := range curves {
24+
t.Run(curve.Params().Name, func(t *testing.T) {
25+
n := 4
2026

21-
var signatureAlgorithms func([]*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer)
27+
var verifySig signatureVerifyFunc
28+
var signatureAlgorithms func([]*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer)
2229

23-
verifySig = verifySignatureECDSA
24-
signatureAlgorithms = func(loggers []*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer) {
25-
return ecdsaKeygenAndSign(elliptic.P256(), loggers)
26-
}
30+
verifySig = getVerifySignature(curve)
31+
signatureAlgorithms = func(loggers []*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer) {
32+
return ecdsaKeygenAndSign(curve, loggers)
33+
}
2734

28-
testScheme(t, n, signatureAlgorithms, verifySig, false)
35+
testScheme(t, n, signatureAlgorithms, verifySig, false)
36+
})
37+
}
2938
}
3039

3140
func TestFastThresholdBinanceECDSA(t *testing.T) {
32-
n := 4
41+
curves := []elliptic.Curve{
42+
elliptic.P256(),
43+
s256k1.S256(),
44+
}
3345

34-
var verifySig signatureVerifyFunc
46+
for _, curve := range curves {
47+
t.Run(curve.Params().Name, func(t *testing.T) {
48+
n := 4
3549

36-
var signatureAlgorithms func([]*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer)
50+
var verifySig signatureVerifyFunc
51+
var signatureAlgorithms func([]*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer)
3752

38-
verifySig = verifySignatureECDSA
39-
signatureAlgorithms = func(loggers []*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer) {
40-
return ecdsaKeygenAndSign(elliptic.P256(), loggers)
41-
}
53+
verifySig = getVerifySignature(curve)
54+
signatureAlgorithms = func(loggers []*commLogger) (func(uint16) KeyGenerator, func(uint16) Signer) {
55+
return ecdsaKeygenAndSign(curve, loggers)
56+
}
4257

43-
testScheme(t, n, signatureAlgorithms, verifySig, true)
58+
testScheme(t, n, signatureAlgorithms, verifySig, true)
59+
})
60+
}
4461
}
4562

4663
func ecdsaKeygenAndSign(curve elliptic.Curve, loggers []*commLogger) (func(id uint16) KeyGenerator, func(id uint16) Signer) {
@@ -54,6 +71,25 @@ func ecdsaKeygenAndSign(curve elliptic.Curve, loggers []*commLogger) (func(id ui
5471
return kgf, sf
5572
}
5673

74+
func getVerifySignature(curve elliptic.Curve) func(pkBytes []byte, t *testing.T, msg string, signature []byte) {
75+
switch curve.Params().Name {
76+
case s256k1.S256().Params().Name:
77+
return verifySignatureSecp256k1
78+
default:
79+
return verifySignatureECDSA
80+
}
81+
}
82+
83+
func verifySignatureSecp256k1(pkBytes []byte, t *testing.T, msg string, signature []byte) {
84+
pk, err := s256k1.ParsePubKey(pkBytes)
85+
assert.NoError(t, err)
86+
87+
sig, err := btcecdsa.ParseDERSignature(signature)
88+
assert.NoError(t, err)
89+
90+
assert.True(t, sig.Verify(sha256Digest([]byte(msg)), pk))
91+
}
92+
5793
func verifySignatureECDSA(pkBytes []byte, t *testing.T, msg string, signature []byte) {
5894
pk, err := x509.ParsePKIXPublicKey(pkBytes)
5995
assert.NoError(t, err)

test/go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ require (
4949
gopkg.in/yaml.v3 v3.0.1 // indirect
5050
)
5151

52+
replace github.com/IBM/TSS/mpc/binance/ecdsa => ../mpc/binance/ecdsa
53+
5254
replace github.com/IBM/TSS/mpc/bls => ../mpc/bls
5355

5456
replace github.com/agl/ed25519 => github.com/binance-chain/edwards25519 v0.0.0-20200305024217-f36fc4b53d43

0 commit comments

Comments
 (0)