@@ -18,6 +18,10 @@ import (
18
18
"time"
19
19
20
20
"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"
21
25
"github.com/stretchr/testify/assert"
22
26
"go.uber.org/zap"
23
27
)
@@ -109,45 +113,76 @@ func (parties parties) Mapping() map[string]*tss.PartyID {
109
113
}
110
114
111
115
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" )
115
128
116
- t .Logf ("Created parties" )
129
+ parties := parties {pA , pB , pC }
130
+ parties .init (senders (parties ))
117
131
118
- parties := parties {pA , pB , pC }
119
- parties .init (senders (parties ))
132
+ t .Logf ("Running DKG" )
120
133
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 ))
122
138
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 ))
127
140
128
- parties .init (senders (parties ))
141
+ parties .setShareData (shares )
142
+ t .Logf ("Signing" )
129
143
130
- parties .setShareData (shares )
131
- t .Logf ("Signing" )
144
+ msgToSign := []byte ("bla bla" )
132
145
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 )
134
157
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 )
140
160
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
+ })
144
163
}
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
+ }
146
181
147
- pk , err := parties [ 0 ]. TPubKey ( )
148
- assert . NoError ( t , err )
182
+ return signature . Verify ( digest ( msg ), btcecPubKey )
183
+ }
149
184
150
- assert . True ( t , ecdsa . VerifyASN1 ( pk , digest ( msgToSign ), sigs [ 0 ]))
185
+ return false
151
186
}
152
187
153
188
func senders (parties parties ) []Sender {
0 commit comments