@@ -14,22 +14,23 @@ func TestSecretSharing(tt *testing.T) {
14
14
t := uint (2 )
15
15
n := uint (5 )
16
16
17
- s := secretsharing .NewShamirSecretSharing (t )
17
+ ss := secretsharing .NewShamirSecretSharing (t )
18
18
19
- want := g .RandomScalar (rand .Reader )
20
- shares , err := s .Shard (rand .Reader , want , n )
19
+ secret := g .RandomScalar (rand .Reader )
20
+ shares , err := ss .Shard (rand .Reader , secret , n )
21
21
test .CheckNoErr (tt , err , "failed to shard a secret" )
22
22
test .CheckOk (len (shares ) == int (n ), "bad num shares" , tt )
23
23
24
24
tt .Run ("subsetSize" , func (ttt * testing.T ) {
25
25
// Test any possible subset size.
26
26
for k := 0 ; k <= int (n ); k ++ {
27
- got , err := s .Recover (shares [:k ])
27
+ got , err := secretsharing .Recover (t , shares [:k ])
28
28
if ! (int (t ) < k && k <= int (n )) {
29
29
test .CheckIsErr (ttt , err , "should not recover secret" )
30
30
test .CheckOk (got == nil , "not nil secret" , ttt )
31
31
} else {
32
32
test .CheckNoErr (ttt , err , "should recover secret" )
33
+ want := secret
33
34
if ! got .IsEqual (want ) {
34
35
test .ReportError (ttt , got , want , t , k , n )
35
36
}
@@ -45,8 +46,8 @@ func TestVerifiableSecretSharing(tt *testing.T) {
45
46
46
47
vs := secretsharing .NewFeldmanSecretSharing (t )
47
48
48
- want := g .RandomScalar (rand .Reader )
49
- shares , com , err := vs .Shard (rand .Reader , want , n )
49
+ secret := g .RandomScalar (rand .Reader )
50
+ shares , com , err := vs .Shard (rand .Reader , secret , n )
50
51
test .CheckNoErr (tt , err , "failed to shard a secret" )
51
52
test .CheckOk (len (shares ) == int (n ), "bad num shares" , tt )
52
53
test .CheckOk (len (com ) == int (t + 1 ), "bad num commitments" , tt )
@@ -60,12 +61,13 @@ func TestVerifiableSecretSharing(tt *testing.T) {
60
61
tt .Run ("subsetSize" , func (ttt * testing.T ) {
61
62
// Test any possible subset size.
62
63
for k := 0 ; k <= int (n ); k ++ {
63
- got , err := vs .Recover (shares [:k ])
64
+ got , err := secretsharing .Recover (t , shares [:k ])
64
65
if k <= int (t ) {
65
66
test .CheckIsErr (ttt , err , "should not recover secret" )
66
67
test .CheckOk (got == nil , "not nil secret" , ttt )
67
68
} else {
68
69
test .CheckNoErr (ttt , err , "should recover secret" )
70
+ want := secret
69
71
if ! got .IsEqual (want ) {
70
72
test .ReportError (ttt , got , want , t , k , n )
71
73
}
@@ -99,24 +101,59 @@ func TestVerifiableSecretSharing(tt *testing.T) {
99
101
})
100
102
}
101
103
104
+ func TestSplitter (tt * testing.T ) {
105
+ g := group .P256
106
+ t := uint (2 )
107
+ n := uint (5 )
108
+ secret := g .RandomScalar (rand .Reader )
109
+ sp := secretsharing .NewSplitter (rand .Reader , t , secret )
110
+
111
+ tt .Run ("recoverOk" , func (ttt * testing.T ) {
112
+ // Splitter can create shares at will, not exactly n many.
113
+ shares := []secretsharing.Share {
114
+ sp .Shard (rand .Reader ),
115
+ sp .Shard (rand .Reader ),
116
+ sp .Shard (rand .Reader ),
117
+ }
118
+ got , err := secretsharing .Recover (t , shares )
119
+ test .CheckNoErr (tt , err , "failed to recover the secret" )
120
+ want := secret
121
+ if ! got .IsEqual (want ) {
122
+ test .ReportError (tt , got , want , t , n )
123
+ }
124
+ })
125
+
126
+ tt .Run ("duplicatedFail" , func (ttt * testing.T ) {
127
+ // Panics if trying to recover duplicated shares.
128
+ share := sp .Shard (rand .Reader )
129
+ sameShares := []secretsharing.Share {share , share , share }
130
+ err := test .CheckPanic (func () {
131
+ got , err := secretsharing .Recover (t , sameShares )
132
+ test .CheckIsErr (tt , err , "must fail to recover the secret" )
133
+ test .CheckOk (got == nil , "must not recover" , tt )
134
+ })
135
+ test .CheckOk (err == nil , "must panic" , tt )
136
+ })
137
+ }
138
+
102
139
func BenchmarkSecretSharing (b * testing.B ) {
103
140
g := group .P256
104
141
t := uint (3 )
105
142
n := uint (5 )
106
143
107
144
s := secretsharing .NewShamirSecretSharing (t )
108
- want := g .RandomScalar (rand .Reader )
109
- shares , _ := s .Shard (rand .Reader , want , n )
145
+ secret := g .RandomScalar (rand .Reader )
146
+ shares , _ := s .Shard (rand .Reader , secret , n )
110
147
111
148
b .Run ("Shard" , func (b * testing.B ) {
112
149
for i := 0 ; i < b .N ; i ++ {
113
- _ , _ = s .Shard (rand .Reader , want , n )
150
+ _ , _ = s .Shard (rand .Reader , secret , n )
114
151
}
115
152
})
116
153
117
154
b .Run ("Recover" , func (b * testing.B ) {
118
155
for i := 0 ; i < b .N ; i ++ {
119
- _ , _ = s .Recover (shares )
156
+ _ , _ = secretsharing .Recover (t , shares )
120
157
}
121
158
})
122
159
}
@@ -127,18 +164,12 @@ func BenchmarkVerifiableSecretSharing(b *testing.B) {
127
164
n := uint (5 )
128
165
129
166
vs := secretsharing .NewFeldmanSecretSharing (t )
130
- want := g .RandomScalar (rand .Reader )
131
- shares , com , _ := vs .Shard (rand .Reader , want , n )
167
+ secret := g .RandomScalar (rand .Reader )
168
+ shares , com , _ := vs .Shard (rand .Reader , secret , n )
132
169
133
170
b .Run ("Shard" , func (b * testing.B ) {
134
171
for i := 0 ; i < b .N ; i ++ {
135
- _ , _ , _ = vs .Shard (rand .Reader , want , n )
136
- }
137
- })
138
-
139
- b .Run ("Recover" , func (b * testing.B ) {
140
- for i := 0 ; i < b .N ; i ++ {
141
- _ , _ = vs .Recover (shares )
172
+ _ , _ , _ = vs .Shard (rand .Reader , secret , n )
142
173
}
143
174
})
144
175
0 commit comments