Skip to content

Commit 10f32fd

Browse files
Add more threshold test cases
Signed-off-by: Marcus Brandenburger <[email protected]>
1 parent def1082 commit 10f32fd

File tree

1 file changed

+113
-5
lines changed

1 file changed

+113
-5
lines changed

test/tbls/tbls_test.go

Lines changed: 113 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func TestThresholdBLS(t *testing.T) {
5353
}
5454
}()
5555

56-
shares, start := keygen(t, parties, n)
56+
shares, start := keygen(t, parties, n, n-1)
5757

5858
elapsed := time.Since(start)
5959
t.Log("DKG elapsed", elapsed)
@@ -115,6 +115,114 @@ func TestThresholdBLS(t *testing.T) {
115115
}
116116
}
117117

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+
118226
func TestBenchmark(t *testing.T) {
119227
var commParties []*comm.Party
120228
var signers []*tlsgen.CertKeyPair
@@ -138,7 +246,7 @@ func TestBenchmark(t *testing.T) {
138246
}
139247
}()
140248

141-
shares, start := keygen(t, parties, n)
249+
shares, start := keygen(t, parties, n, n-1)
142250

143251
elapsed := time.Since(start)
144252
t.Log("DKG elapsed", elapsed)
@@ -264,7 +372,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
264372
}
265373
}()
266374

267-
shares, start := keygen(b, parties, n)
375+
shares, start := keygen(b, parties, n, n-1)
268376

269377
elapsed := time.Since(start)
270378
b.Log("DKG elapsed", elapsed)
@@ -351,7 +459,7 @@ func BenchmarkParallelInvocation(b *testing.B) {
351459
var gsig []byte
352460
var gerr error
353461

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) {
355463
var wg sync.WaitGroup
356464
wg.Add(len(parties))
357465

@@ -362,7 +470,7 @@ func keygen(t TestingT, parties []MpcParty, n int) ([][]byte, time.Time) {
362470
for i, p := range parties {
363471
go func(i int, p MpcParty) {
364472
defer wg.Done()
365-
secretShareData, err := p.KeyGen(ctx, len(parties), n-1)
473+
secretShareData, err := p.KeyGen(ctx, len(parties), threshold)
366474
shares[i] = secretShareData
367475
assert.NoError(t, err)
368476
assert.NotNil(t, secretShareData)

0 commit comments

Comments
 (0)