@@ -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,114 @@ 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
+ mustPass bool
122
+ }{
123
+ //{3, 1, 2, true}, // it seems that t=1 is invalid?!
124
+ {3 , 2 , 1 , false },
125
+ {3 , 2 , 2 , false },
126
+ {3 , 2 , 3 , true },
127
+ {5 , 2 , 3 , true },
128
+ {5 , 3 , 4 , true },
129
+ {5 , 4 , 5 , true },
130
+ {7 , 5 , 6 , true },
131
+ {15 , 10 , 11 , true },
132
+ {31 , 21 , 22 , true },
133
+ }
134
+
135
+ for _ , tt := range tests {
136
+ testThresholdBLSVarThreshold (t , tt .n , tt .threshold , tt .k , tt .mustPass )
137
+ }
138
+ }
139
+
140
+ func testThresholdBLSVarThreshold (t * testing.T , n , threshold , k int , mustPass bool ) {
141
+ var commParties []* comm.Party
142
+ var signers []* tlsgen.CertKeyPair
143
+ var loggers []* commLogger
144
+ var listeners []net.Listener
145
+ var stopFuncs []func ()
146
+
147
+ members , certPool , loggers , signers , listeners , commParties , membershipFunc , parties , kgf := setup (t , n , loggers , signers , listeners , commParties )
148
+
149
+ for id := 1 ; id <= n ; id ++ {
150
+ stop , s := createParty (id , kgf , signers [id - 1 ], n , certPool , listeners , loggers , commParties , membershipFunc )
151
+ parties = append (parties , s )
152
+ stopFuncs = append (stopFuncs , stop )
153
+ }
154
+
155
+ defer func () {
156
+ for _ , stop := range stopFuncs {
157
+ stop ()
158
+ }
159
+ }()
160
+
161
+ shares , start := keygen (t , parties , n , threshold )
162
+
163
+ elapsed := time .Since (start )
164
+ t .Log ("DKG elapsed" , elapsed )
165
+
166
+ // Create the threshold signers.
167
+ thresholdSigners := make ([]* bls.TBLS , n )
168
+ for id := 1 ; id <= n ; id ++ {
169
+ thresholdSigners [id - 1 ] = & bls.TBLS {
170
+ Logger : logger (id , t .Name ()),
171
+ Party : uint16 (id ),
172
+ }
173
+ }
174
+
175
+ // Initialize them with a nil send function
176
+ for i , signer := range thresholdSigners {
177
+ signer .Init (members , threshold , nil )
178
+ signer .SetShareData (shares [i ])
179
+ }
180
+
181
+ var signatures [][]byte
182
+
183
+ // Sign a message
184
+ msg := []byte ("Three can keep a secret, if two of them are dead." )
185
+ digest := sha256Digest (msg )
186
+ for _ , signer := range thresholdSigners {
187
+ sig , err := signer .Sign (nil , digest )
188
+ assert .NoError (t , err )
189
+ signatures = append (signatures , sig )
190
+ }
191
+
192
+ // check that all signers return the same pk?!
193
+ var pk []byte
194
+ for _ , signer := range thresholdSigners {
195
+ pki , err := signer .ThresholdPK ()
196
+ assert .NoError (t , err )
197
+ if pk == nil {
198
+ pk = pki
199
+ } else {
200
+ assert .Equal (t , pk , pki )
201
+ }
202
+ }
203
+
204
+ // create a verifier
205
+ var v bls.Verifier
206
+ err := v .Init (pk )
207
+ assert .NoError (t , err )
208
+
209
+ // aggregate k signatures using
210
+ var sig []byte
211
+ for i := 0 ; i < k ; i ++ {
212
+ for j := i + 1 ; j < k ; j ++ {
213
+ sig , err = v .AggregateSignatures ([][]byte {signatures [i ], signatures [j ]}, []uint16 {uint16 (i + 1 ), uint16 (j + 1 )})
214
+ assert .NoError (t , err )
215
+ }
216
+ }
217
+
218
+ err = v .Verify (digest , sig )
219
+ if mustPass {
220
+ assert .NoError (t , err )
221
+ } else {
222
+ assert .Error (t , err )
223
+ }
224
+ }
225
+
118
226
func TestBenchmark (t * testing.T ) {
119
227
var commParties []* comm.Party
120
228
var signers []* tlsgen.CertKeyPair
@@ -138,7 +246,7 @@ func TestBenchmark(t *testing.T) {
138
246
}
139
247
}()
140
248
141
- shares , start := keygen (t , parties , n )
249
+ shares , start := keygen (t , parties , n , n - 1 )
142
250
143
251
elapsed := time .Since (start )
144
252
t .Log ("DKG elapsed" , elapsed )
@@ -264,7 +372,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
264
372
}
265
373
}()
266
374
267
- shares , start := keygen (b , parties , n )
375
+ shares , start := keygen (b , parties , n , n - 1 )
268
376
269
377
elapsed := time .Since (start )
270
378
b .Log ("DKG elapsed" , elapsed )
@@ -351,7 +459,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
351
459
var gsig []byte
352
460
var gerr error
353
461
354
- func keygen (t TestingT , parties []MpcParty , n int ) ([][]byte , time.Time ) {
462
+ func keygen (t TestingT , parties []MpcParty , n int , threshold int ) ([][]byte , time.Time ) {
355
463
var wg sync.WaitGroup
356
464
wg .Add (len (parties ))
357
465
@@ -362,7 +470,7 @@ func keygen(t TestingT, parties []MpcParty, n int) ([][]byte, time.Time) {
362
470
for i , p := range parties {
363
471
go func (i int , p MpcParty ) {
364
472
defer wg .Done ()
365
- secretShareData , err := p .KeyGen (ctx , len (parties ), n - 1 )
473
+ secretShareData , err := p .KeyGen (ctx , len (parties ), threshold )
366
474
shares [i ] = secretShareData
367
475
assert .NoError (t , err )
368
476
assert .NotNil (t , secretShareData )
0 commit comments