arnaucube
arnaucube/shamirsecretsharingPublic Self-hosted repository
shamirsecretsharing/shamirsecretsharing.go
shamirsecretsharing.goRaw
 1package shamirsecretsharing
 2
 3import (
 4	"crypto/rand"
 5	"errors"
 6	"math/big"
 7)
 8
 9const (
10	// bits = 1024
11	bits = 2048
12)
13
14// Create calculates the secrets to share from given parameters
15// t: number of secrets needed
16// n: number of shares
17// p: random point
18// k: secret to share
19func Create(t, n, p, k *big.Int) (result [][]*big.Int, err error) {
20	if k.Cmp(p) > 0 {
21		return nil, errors.New("Error: need k<p. k: " + k.String() + ", p: " + p.String())
22	}
23	//generate the basePolynomial
24	var basePolynomial []*big.Int
25	basePolynomial = append(basePolynomial, k)
26	for i := 0; i < int(t.Int64())-1; i++ {
27		randPrime, err := rand.Prime(rand.Reader, bits/2)
28		if err != nil {
29			return result, err
30		}
31		basePolynomial = append(basePolynomial, randPrime)
32	}
33
34	//calculate shares, based on the basePolynomial
35	var shares []*big.Int
36	for i := 1; i < int(n.Int64())+1; i++ {
37		var pResultMod *big.Int
38		pResult := big.NewInt(int64(0))
39		for x, polElem := range basePolynomial {
40			if x == 0 {
41				pResult = pResult.Add(pResult, polElem)
42			} else {
43				iBigInt := big.NewInt(int64(i))
44				xBigInt := big.NewInt(int64(x))
45				iPowed := iBigInt.Exp(iBigInt, xBigInt, nil)
46				currElem := iPowed.Mul(iPowed, polElem)
47				pResult = pResult.Add(pResult, currElem)
48				pResultMod = pResult.Mod(pResult, p)
49			}
50		}
51		shares = append(shares, pResultMod)
52	}
53	//put the share together with his p value
54	result = packSharesAndI(shares)
55	return result, nil
56}
57
58func packSharesAndI(sharesString []*big.Int) (r [][]*big.Int) {
59	for i, share := range sharesString {
60		curr := []*big.Int{share, big.NewInt(int64(i + 1))}
61		r = append(r, curr)
62	}
63	return r
64}
65func unpackSharesAndI(sharesPacked [][]*big.Int) ([]*big.Int, []*big.Int) {
66	var shares []*big.Int
67	var i []*big.Int
68	for _, share := range sharesPacked {
69		shares = append(shares, share[0])
70		i = append(i, share[1])
71	}
72	return shares, i
73}