@@ -28,6 +28,7 @@ import (
2828 "github.com/stretchr/testify/assert"
2929 "go.uber.org/zap"
3030 "go.uber.org/zap/zapcore"
31+ "gonum.org/v1/gonum/stat/combin"
3132)
3233
3334func TestThresholdBLS (t * testing.T ) {
@@ -53,7 +54,7 @@ func TestThresholdBLS(t *testing.T) {
5354 }
5455 }()
5556
56- shares , start := keygen (t , parties , n )
57+ shares , start := keygen (t , parties , n , n - 1 )
5758
5859 elapsed := time .Since (start )
5960 t .Log ("DKG elapsed" , elapsed )
@@ -115,6 +116,123 @@ func TestThresholdBLS(t *testing.T) {
115116 }
116117}
117118
119+ func TestThresholdBLSVarThreshold (t * testing.T ) {
120+ var tests = []struct {
121+ n , threshold , k int
122+ mustPass bool
123+ }{
124+ //{3, 1, 2, true}, // it seems that t=1 is invalid?!
125+ //{3, 2, 1, false},
126+ {3 , 2 , 2 , true },
127+ {3 , 2 , 3 , true },
128+ {5 , 2 , 2 , true },
129+ {5 , 2 , 3 , true },
130+ //{5, 3, 2, false},
131+ {5 , 3 , 3 , true },
132+ //{5, 4, 3, false},
133+ {5 , 4 , 4 , true },
134+ {5 , 4 , 5 , true },
135+ {7 , 5 , 5 , true },
136+ {15 , 10 , 11 , true },
137+ //{31, 21, 22, true}, // fails - DKG timeout
138+ }
139+
140+ for _ , tt := range tests {
141+ testThresholdBLSVarThreshold (t , tt .n , tt .threshold , tt .k , tt .mustPass )
142+ }
143+ }
144+
145+ func testThresholdBLSVarThreshold (t * testing.T , n , threshold , k int , mustPass bool ) {
146+ var commParties []* comm.Party
147+ var signers []* tlsgen.CertKeyPair
148+ var loggers []* commLogger
149+ var listeners []net.Listener
150+ var stopFuncs []func ()
151+
152+ members , certPool , loggers , signers , listeners , commParties , membershipFunc , parties , kgf := setup (t , n , loggers , signers , listeners , commParties )
153+
154+ for id := 1 ; id <= n ; id ++ {
155+ stop , s := createParty (id , kgf , signers [id - 1 ], n , certPool , listeners , loggers , commParties , membershipFunc )
156+ parties = append (parties , s )
157+ stopFuncs = append (stopFuncs , stop )
158+ }
159+
160+ defer func () {
161+ for _ , stop := range stopFuncs {
162+ stop ()
163+ }
164+ }()
165+
166+ shares , start := keygen (t , parties , n , threshold )
167+
168+ elapsed := time .Since (start )
169+ t .Log ("DKG elapsed" , elapsed )
170+
171+ // Create the threshold signers.
172+ thresholdSigners := make ([]* bls.TBLS , n )
173+ for id := 1 ; id <= n ; id ++ {
174+ thresholdSigners [id - 1 ] = & bls.TBLS {
175+ Logger : logger (id , t .Name ()),
176+ Party : uint16 (id ),
177+ }
178+ }
179+
180+ // Initialize them with a nil send function
181+ for i , signer := range thresholdSigners {
182+ signer .Init (members , threshold , nil )
183+ signer .SetShareData (shares [i ])
184+ }
185+
186+ var signatures [][]byte
187+
188+ // Sign a message
189+ msg := []byte ("Three can keep a secret, if two of them are dead." )
190+ digest := sha256Digest (msg )
191+ for _ , signer := range thresholdSigners {
192+ sig , err := signer .Sign (nil , digest )
193+ assert .NoError (t , err )
194+ signatures = append (signatures , sig )
195+ }
196+
197+ // check that all signers return the same pk?!
198+ var pk []byte
199+ for _ , signer := range thresholdSigners {
200+ pki , err := signer .ThresholdPK ()
201+ assert .NoError (t , err )
202+ if pk == nil {
203+ pk = pki
204+ } else {
205+ assert .Equal (t , pk , pki )
206+ }
207+ }
208+
209+ // create a verifier
210+ var v bls.Verifier
211+ err := v .Init (pk )
212+ assert .NoError (t , err )
213+
214+ var sig []byte
215+ for _ , p := range combin .Combinations (k , threshold ) {
216+ var sigs [][]byte
217+ var partyIDs []uint16
218+
219+ for _ , i := range p {
220+ sigs = append (sigs , signatures [i ])
221+ partyIDs = append (partyIDs , uint16 (i + 1 ))
222+ }
223+
224+ sig , err = v .AggregateSignatures (sigs , partyIDs )
225+ assert .NoError (t , err )
226+ }
227+
228+ err = v .Verify (digest , sig )
229+ if mustPass {
230+ assert .NoError (t , err )
231+ } else {
232+ assert .Error (t , err )
233+ }
234+ }
235+
118236func TestBenchmark (t * testing.T ) {
119237 var commParties []* comm.Party
120238 var signers []* tlsgen.CertKeyPair
@@ -138,7 +256,7 @@ func TestBenchmark(t *testing.T) {
138256 }
139257 }()
140258
141- shares , start := keygen (t , parties , n )
259+ shares , start := keygen (t , parties , n , n - 1 )
142260
143261 elapsed := time .Since (start )
144262 t .Log ("DKG elapsed" , elapsed )
@@ -264,7 +382,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
264382 }
265383 }()
266384
267- shares , start := keygen (b , parties , n )
385+ shares , start := keygen (b , parties , n , n - 1 )
268386
269387 elapsed := time .Since (start )
270388 b .Log ("DKG elapsed" , elapsed )
@@ -351,7 +469,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
351469var gsig []byte
352470var gerr error
353471
354- func keygen (t TestingT , parties []MpcParty , n int ) ([][]byte , time.Time ) {
472+ func keygen (t TestingT , parties []MpcParty , n int , threshold int ) ([][]byte , time.Time ) {
355473 var wg sync.WaitGroup
356474 wg .Add (len (parties ))
357475
@@ -362,7 +480,7 @@ func keygen(t TestingT, parties []MpcParty, n int) ([][]byte, time.Time) {
362480 for i , p := range parties {
363481 go func (i int , p MpcParty ) {
364482 defer wg .Done ()
365- secretShareData , err := p .KeyGen (ctx , len (parties ), n - 1 )
483+ secretShareData , err := p .KeyGen (ctx , len (parties ), threshold )
366484 shares [i ] = secretShareData
367485 assert .NoError (t , err )
368486 assert .NotNil (t , secretShareData )
0 commit comments