@@ -53,7 +53,7 @@ func TestThresholdBLS(t *testing.T) {
53
53
}
54
54
}()
55
55
56
- shares , start := keygen (t , parties , n )
56
+ shares , start := keygen (t , parties , n , n - 1 )
57
57
58
58
elapsed := time .Since (start )
59
59
t .Log ("DKG elapsed" , elapsed )
@@ -115,6 +115,108 @@ func TestThresholdBLS(t *testing.T) {
115
115
}
116
116
}
117
117
118
+ func TestThresholdBLSVarThreshold (t * testing.T ) {
119
+ var tests = []struct {
120
+ n , threshold , k int
121
+ }{
122
+ {3 , 1 , 2 },
123
+ {3 , 2 , 3 },
124
+ {5 , 2 , 3 },
125
+ {7 , 5 , 6 },
126
+ {15 , 10 , 11 },
127
+ {31 , 21 , 22 },
128
+ }
129
+
130
+ for _ , tt := range tests {
131
+ testname := fmt .Sprintf ("n=%d,t=%d,k=%d" , tt .n , tt .threshold , tt .k )
132
+ t .Run (testname , func (t * testing.T ) {
133
+ testThresholdBLSVarThreshold (t , tt .n , tt .threshold , tt .k )
134
+ })
135
+ }
136
+ }
137
+
138
+ func testThresholdBLSVarThreshold (t * testing.T , n , threshold , k int ) {
139
+ var commParties []* comm.Party
140
+ var signers []* tlsgen.CertKeyPair
141
+ var loggers []* commLogger
142
+ var listeners []net.Listener
143
+ var stopFuncs []func ()
144
+
145
+ members , certPool , loggers , signers , listeners , commParties , membershipFunc , parties , kgf := setup (t , n , loggers , signers , listeners , commParties )
146
+
147
+ for id := 1 ; id <= n ; id ++ {
148
+ stop , s := createParty (id , kgf , signers [id - 1 ], n , certPool , listeners , loggers , commParties , membershipFunc )
149
+ parties = append (parties , s )
150
+ stopFuncs = append (stopFuncs , stop )
151
+ }
152
+
153
+ defer func () {
154
+ for _ , stop := range stopFuncs {
155
+ stop ()
156
+ }
157
+ }()
158
+
159
+ shares , start := keygen (t , parties , n , threshold )
160
+
161
+ elapsed := time .Since (start )
162
+ t .Log ("DKG elapsed" , elapsed )
163
+
164
+ // Create the threshold signers.
165
+ thresholdSigners := make ([]* bls.TBLS , n )
166
+ for id := 1 ; id <= n ; id ++ {
167
+ thresholdSigners [id - 1 ] = & bls.TBLS {
168
+ Logger : logger (id , t .Name ()),
169
+ Party : uint16 (id ),
170
+ }
171
+ }
172
+
173
+ // Initialize them with a nil send function
174
+ for i , signer := range thresholdSigners {
175
+ signer .Init (members , threshold , nil )
176
+ signer .SetShareData (shares [i ])
177
+ }
178
+
179
+ var signatures [][]byte
180
+
181
+ // Sign a message
182
+ msg := []byte ("Three can keep a secret, if two of them are dead." )
183
+ digest := sha256Digest (msg )
184
+ for _ , signer := range thresholdSigners {
185
+ sig , err := signer .Sign (nil , digest )
186
+ assert .NoError (t , err )
187
+ signatures = append (signatures , sig )
188
+ }
189
+
190
+ // check that all signers return the same pk?!
191
+ var pk []byte
192
+ for _ , signer := range thresholdSigners {
193
+ pki , err := signer .ThresholdPK ()
194
+ assert .NoError (t , err )
195
+ if pk == nil {
196
+ pk = pki
197
+ } else {
198
+ assert .Equal (t , pk , pki )
199
+ }
200
+ }
201
+
202
+ // create a verifier
203
+ var v bls.Verifier
204
+ err := v .Init (pk )
205
+ assert .NoError (t , err )
206
+
207
+ // aggregate k signatures using
208
+ var sig []byte
209
+ for i := 0 ; i < k ; i ++ {
210
+ for j := i + 1 ; j < k ; j ++ {
211
+ sig , err = v .AggregateSignatures ([][]byte {signatures [i ], signatures [j ]}, []uint16 {uint16 (i + 1 ), uint16 (j + 1 )})
212
+ assert .NoError (t , err )
213
+ }
214
+ }
215
+
216
+ err = v .Verify (digest , sig )
217
+ assert .NoError (t , err )
218
+ }
219
+
118
220
func TestBenchmark (t * testing.T ) {
119
221
var commParties []* comm.Party
120
222
var signers []* tlsgen.CertKeyPair
@@ -138,7 +240,7 @@ func TestBenchmark(t *testing.T) {
138
240
}
139
241
}()
140
242
141
- shares , start := keygen (t , parties , n )
243
+ shares , start := keygen (t , parties , n , n - 1 )
142
244
143
245
elapsed := time .Since (start )
144
246
t .Log ("DKG elapsed" , elapsed )
@@ -264,7 +366,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
264
366
}
265
367
}()
266
368
267
- shares , start := keygen (b , parties , n )
369
+ shares , start := keygen (b , parties , n , n - 1 )
268
370
269
371
elapsed := time .Since (start )
270
372
b .Log ("DKG elapsed" , elapsed )
@@ -351,7 +453,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
351
453
var gsig []byte
352
454
var gerr error
353
455
354
- func keygen (t TestingT , parties []MpcParty , n int ) ([][]byte , time.Time ) {
456
+ func keygen (t TestingT , parties []MpcParty , n int , threshold int ) ([][]byte , time.Time ) {
355
457
var wg sync.WaitGroup
356
458
wg .Add (len (parties ))
357
459
@@ -362,7 +464,7 @@ func keygen(t TestingT, parties []MpcParty, n int) ([][]byte, time.Time) {
362
464
for i , p := range parties {
363
465
go func (i int , p MpcParty ) {
364
466
defer wg .Done ()
365
- secretShareData , err := p .KeyGen (ctx , len (parties ), n - 1 )
467
+ secretShareData , err := p .KeyGen (ctx , len (parties ), threshold )
366
468
shares [i ] = secretShareData
367
469
assert .NoError (t , err )
368
470
assert .NotNil (t , secretShareData )
0 commit comments