|
|
# go-shamirsecretsharing [![Go Report Card](https://goreportcard.com/badge/github.com/arnaucube/shamirsecretsharing)](https://goreportcard.com/report/github.com/arnaucube/shamirsecretsharing) [![GoDoc](https://godoc.org/github.com/arnaucube/shamirsecretsharing?status.svg)](https://godoc.org/github.com/arnaucube/shamirsecretsharing)
Shamir's Secret Sharing in Go lib + WASM lib
This directory contains a Go lang implementation of Shamir's Secret Sharing, and a compiled Web Assembly version from the Go code to be used from the browser.
- https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing
## Wasm usage
Compile to wasm, inside the `wasm` directory, execute: ``` GOARCH=wasm GOOS=js go build -o shamirsecretsharing.wasm shamirsecretsharing-wasm-wrapper.go ```
Add the file `wasm_exec.js` in the directory: ``` cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" . ```
Call the library from javascript: ```js // Create shares from a secret // nNeededShares: number of secrets needed // nShares: number of shares // p: random point // k: secret to share createShares(nNeededShares, nShares, p, k); ```
## Usage from Go
```go // define secret to share k, ok := new(big.Int).SetString("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 10) assert.True(t, ok)
// define random prime p, err := rand.Prime(rand.Reader, bits/2) assert.Nil(t, err)
// define how many shares want to generate nShares := big.NewInt(int64(6))
// define how many shares are needed to recover the secret nNeededShares := big.NewInt(int64(3))
// create the shares shares, err := Create( nNeededShares, nShares, p, big.NewInt(int64(k))) assert.Nil(t, err)
// select shares to use var sharesToUse [][]*big.Int sharesToUse = append(sharesToUse, shares[2]) sharesToUse = append(sharesToUse, shares[1]) sharesToUse = append(sharesToUse, shares[0])
// recover the secret using Lagrange Interpolation secr := LagrangeInterpolation(sharesToUse, p)
// check that the restored secret matches the original secret if !bytes.Equal(k.Bytes(), secr.Bytes()) { fmt.Println("reconstructed secret not correspond to original secret") } ```
|