better readability and error handling
This commit is contained in:
parent
4975d23502
commit
4bc034f24a
@ -17,8 +17,8 @@ func main() {
|
|||||||
encoding := flag.String("encoding", "base64", "Encoding: base64 or hex")
|
encoding := flag.String("encoding", "base64", "Encoding: base64 or hex")
|
||||||
secret := flag.String("secret", "", "The secret to split (for split mode)")
|
secret := flag.String("secret", "", "The secret to split (for split mode)")
|
||||||
sharesStr := flag.String("shares", "", "Comma-separated shares (for combine mode)")
|
sharesStr := flag.String("shares", "", "Comma-separated shares (for combine mode)")
|
||||||
N := flag.Int("n", 5, "Total number of shares")
|
n := flag.Int("n", 5, "Total number of shares")
|
||||||
T := flag.Int("t", 3, "Number of shares needed to reconstruct the secret")
|
t := flag.Int("t", 3, "Number of shares needed to reconstruct the secret")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
switch *mode {
|
switch *mode {
|
||||||
@ -31,9 +31,9 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
inputSecret = strings.TrimSpace(inputSecret)
|
inputSecret = strings.TrimSpace(inputSecret)
|
||||||
splitSecret(inputSecret, *N, *T, *encoding)
|
splitSecret(inputSecret, *n, *t, *encoding)
|
||||||
} else {
|
} else {
|
||||||
splitSecret(*secret, *N, *T, *encoding)
|
splitSecret(*secret, *n, *t, *encoding)
|
||||||
}
|
}
|
||||||
case "combine":
|
case "combine":
|
||||||
if *sharesStr == "" {
|
if *sharesStr == "" {
|
||||||
|
21
shamir.go
21
shamir.go
@ -36,10 +36,6 @@ func newPolynomial(intercept, degree uint8) (*polynomial, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *polynomial) evaluate(x uint8) uint8 {
|
func (p *polynomial) evaluate(x uint8) uint8 {
|
||||||
if x == 0 {
|
|
||||||
return p.coeffs[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
result := p.coeffs[len(p.coeffs)-1]
|
result := p.coeffs[len(p.coeffs)-1]
|
||||||
for i := len(p.coeffs) - 2; i >= 0; i-- {
|
for i := len(p.coeffs) - 2; i >= 0; i-- {
|
||||||
result = gfAdd(gfMult(result, x), p.coeffs[i])
|
result = gfAdd(gfMult(result, x), p.coeffs[i])
|
||||||
@ -65,15 +61,10 @@ func Split(secret []byte, n, t int) ([][]byte, error) {
|
|||||||
return nil, ErrEmptySecret
|
return nil, ErrEmptySecret
|
||||||
}
|
}
|
||||||
|
|
||||||
xCoords := make([]uint8, n)
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
xCoords[i] = uint8(i + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
shares := make([][]byte, n)
|
shares := make([][]byte, n)
|
||||||
for i := range shares {
|
for i := range shares {
|
||||||
shares[i] = make([]byte, len(secret)+1)
|
shares[i] = make([]byte, len(secret)+1)
|
||||||
shares[i][len(secret)] = xCoords[i]
|
shares[i][len(secret)] = uint8(i + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, b := range secret {
|
for i, b := range secret {
|
||||||
@ -82,8 +73,8 @@ func Split(secret []byte, n, t int) ([][]byte, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for j := 0; j < n; j++ {
|
for j := range shares {
|
||||||
shares[j][i] = p.evaluate(xCoords[j])
|
shares[j][i] = p.evaluate(uint8(j + 1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,12 +171,10 @@ func gfDiv(a, b uint8) (uint8, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func gfInverse(a uint8) uint8 {
|
func gfInverse(a uint8) uint8 {
|
||||||
var inv uint8
|
|
||||||
for b := uint8(1); b != 0; b++ {
|
for b := uint8(1); b != 0; b++ {
|
||||||
if gfMult(a, b) == 1 {
|
if gfMult(a, b) == 1 {
|
||||||
inv = b
|
return b
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return inv
|
return 0 // This should never be reached if the input is non-zero
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user