Skip to content

Commit 7eaaa2a

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

File tree

3 files changed

+128
-12
lines changed

3 files changed

+128
-12
lines changed

test/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/IBM/TSS/mpc/bls v0.0.0-20230831100430-0b667a5e3f1c
99
github.com/stretchr/testify v1.8.4
1010
go.uber.org/zap v1.24.0
11+
gonum.org/v1/gonum v0.14.0
1112
)
1213

1314
require (

test/go.sum

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@ bou.ke/monkey v1.0.1 h1:zEMLInw9xvNakzUUPjfS4Ds6jYPqCFx3m7bRmG5NH2U=
22
bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg=
33
github.com/IBM/TSS v0.0.0-20230829210007-7d14382e6520 h1:yNUHLKPCUy3r8jTtHgL1XLI/Ls9p9pqPyufgn2u/Nxk=
44
github.com/IBM/TSS v0.0.0-20230829210007-7d14382e6520/go.mod h1:wGdNkjuFEVFx96kkq8at32/6jx4mxK/v1Uuv2NXL6KE=
5-
github.com/IBM/TSS/mpc/binance/ecdsa v0.0.0-20230829113924-1fdc6af426a6 h1:fsBM5FsNnqD2dLuYy6M18dhNvTtHGeaa708vetJp8N0=
6-
github.com/IBM/TSS/mpc/binance/ecdsa v0.0.0-20230829113924-1fdc6af426a6/go.mod h1:x1sVGyOg5o3WKA2zXE3U9xFL118sv34UkR1iLko/Sxw=
75
github.com/IBM/TSS/mpc/binance/ecdsa v0.0.0-20230831100430-0b667a5e3f1c h1:50RbYqPzlfz4b6VBSpDRTKAXr7W4iOUCYlJVG3xu8Z4=
86
github.com/IBM/TSS/mpc/binance/ecdsa v0.0.0-20230831100430-0b667a5e3f1c/go.mod h1:x1sVGyOg5o3WKA2zXE3U9xFL118sv34UkR1iLko/Sxw=
9-
github.com/IBM/TSS/mpc/binance/eddsa v0.0.0-20230829113924-1fdc6af426a6 h1:O7IajpefjgELGC9a5ngZJsd91dvx86DWbg4vFLgBxds=
10-
github.com/IBM/TSS/mpc/binance/eddsa v0.0.0-20230829113924-1fdc6af426a6/go.mod h1:52sjVGVEFhbZZCMNIggMmgiYdntup7KCguOcJ3E1xS4=
117
github.com/IBM/TSS/mpc/binance/eddsa v0.0.0-20230831100430-0b667a5e3f1c h1:s/MhAuV9WWxfOE6b6hpXN+iIMBTskfH1Rt6voRElV7I=
128
github.com/IBM/TSS/mpc/binance/eddsa v0.0.0-20230831100430-0b667a5e3f1c/go.mod h1:52sjVGVEFhbZZCMNIggMmgiYdntup7KCguOcJ3E1xS4=
139
github.com/IBM/mathlib v0.0.3-0.20230822192135-eacb031f2534 h1:czEcwFbFXczHL8gGyMb6zzL40vyVcrB2vuHR/eWGgUo=
@@ -72,8 +68,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
7268
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7369
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
7470
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
75-
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
7671
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
72+
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
7773
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
7874
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
7975
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -184,7 +180,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
184180
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
185181
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
186182
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
187-
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
183+
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
188184
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
189185
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
190186
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -193,8 +189,9 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
193189
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
194190
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
195191
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
196-
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
197192
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
193+
gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0=
194+
gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU=
198195
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
199196
google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
200197
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=

test/tbls/tbls_test.go

Lines changed: 123 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3334
func 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+
118236
func 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) {
351469
var gsig []byte
352470
var 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

Comments
 (0)