-
Notifications
You must be signed in to change notification settings - Fork 1
/
sss.go
51 lines (41 loc) · 1.43 KB
/
sss.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
package sss
import (
"errors"
"math/big"
"github.com/amousa11/sss/utils"
)
// GenerateShares generates a number of shares which can only be recovered by the minimum number of shares
func GenerateShares(minimum int, shares int, prime *big.Int) (*big.Int, []*utils.Point, error) {
poly := make([]*big.Int, minimum)
points := make([]*utils.Point, shares)
if minimum > shares {
return nil, nil, errors.New("Minimum number of shares specified is greater than the total number of shares")
}
if minimum < 2 {
return nil, nil, errors.New("Minimum number of shares specified is greater than the total number of shares")
}
for i := 0; i < minimum; i++ { // should be i < shares.
coefficients, e := utils.GenerateRandomBigInt(32)
if e != nil {
return nil, nil, e
}
coefficients.Mod(coefficients, prime)
poly[i] = coefficients
}
for i := 0; i < shares; i++ {
randXValue, e := utils.GenerateRandomBigInt(32)
if e != nil {
return nil, nil, e
}
point := randXValue
points[i] = utils.EvaluatePolynomial(poly, point, prime)
}
return poly[0], points, nil
}
// RecoverSecret recovers a secret given an array of *utils.Points and a prime modulus for the Field the points reside in
func RecoverSecret(points []*utils.Point, prime *big.Int) (*big.Int, error) {
if len(points) < 2 {
return nil, errors.New("Requires at least 2 shares to recover a secret")
}
return utils.LagrangeInterpolate(big.NewInt(0), points, prime), nil
}