This repository was archived by the owner on Nov 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsignature_test.go
93 lines (83 loc) · 2.25 KB
/
signature_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package tpke
import (
"math"
"math/rand"
"testing"
"time"
bls "github.com/kilic/bls12-381"
)
func TestSingleSignature(t *testing.T) {
s := rand.NewSource(time.Now().UnixNano())
r := rand.New(s)
fr, _ := bls.NewFr().Rand(r)
g1 := bls.NewG1()
sk := &PrivateKey{
fr: fr,
}
pk := &PublicKey{
pg1: g1.MulScalar(g1.New(), &bls.G1One, fr),
}
msg := []byte("pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza")
share := sk.SignShare(msg)
if !pk.VerifySigShare(msg, share) {
t.Fatalf("invalid signature")
}
}
func TestThresholdSignature(t *testing.T) {
size := 7
threshold := 5
dkg := NewDKG(size, threshold)
dkg.Prepare()
if err := dkg.VerifyPrepare(); err != nil {
t.Fatalf(err.Error())
}
sks := dkg.GetPrivateKeysFromPrepare()
pk := dkg.PublishGlobalPublicKey()
scaler := dkg.GetScaler()
// Test functionality
msg := []byte("pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza pizza")
shares := make(map[int]*SignatureShare)
for i := 1; i <= len(sks); i++ {
shares[i] = sks[i].SignShare(msg)
}
sig, err := AggregateAndVerifySig(pk, msg, threshold, shares, scaler)
if err != nil {
t.Fatalf(err.Error())
}
if sig == nil {
t.Fatalf("invalid signature")
}
// Test consistency
matrix := make([][]int, len(shares)) // size=len(shares)*threshold, including all rows
inputs := make([]*SignatureShare, len(shares)) // size=len(shares), including all shares
// Be aware of a random order of decryption shares
i := 0
for index, v := range shares {
row := make([]int, threshold)
for j := 0; j < threshold; j++ {
row[j] = int(math.Pow(float64(index), float64(j)))
}
matrix[i] = row
inputs[i] = v
i++
}
// Use different combinations to aggregate
combs := getCombs(len(shares), threshold)
sigs := make([]*Signature, 0)
for _, v := range combs {
m := make([][]int, threshold) // size=threshold*threshold, only seleted rows
s := make([]*SignatureShare, threshold) // size=threshold, only seleted shares
for i := 0; i < len(v); i++ {
m[i] = matrix[v[i]]
s[i] = inputs[v[i]]
}
sig := aggregateShares(m, s, scaler)
sigs = append(sigs, sig)
}
s0 := sigs[0]
for i := 1; i < len(sigs); i++ {
if !sigs[i].Equals(s0) {
t.Fatalf("different signature")
}
}
}