arnaucube
arnaucube/shamirsecretsharingPublic Self-hosted repository
shamirsecretsharing/go-shamirsecretsharing/wasm/shamirsecretsharing-wasm-wrapper.go
go-shamirsecretsharing/wasm/shamirsecretsharing-wasm-wrapper.goRaw
  1package main
  2
  3import (
  4	"math/big"
  5	"syscall/js"
  6
  7	"github.com/arnaucube/shamirsecretsharing"
  8)
  9
 10func main() {
 11	c := make(chan struct{}, 0)
 12
 13	println("WASM Go Initialized")
 14	// register functions
 15	registerCallbacks()
 16	<-c
 17}
 18
 19func registerCallbacks() {
 20	js.Global().Set("createShares", js.FuncOf(createShares))
 21	js.Global().Set("lagrangeInterpolation", js.FuncOf(lagrangeInterpolation))
 22}
 23
 24func createShares(this js.Value, i []js.Value) interface{} {
 25	nNeededShares, ok := new(big.Int).SetString(i[0].String(), 10)
 26	if !ok {
 27		println("error parsing parameter in position 0")
 28	}
 29	nShares, ok := new(big.Int).SetString(i[1].String(), 10)
 30	if !ok {
 31		println("error parsing parameter in position 1")
 32	}
 33	p, ok := new(big.Int).SetString(i[2].String(), 10)
 34	if !ok {
 35		println("error parsing parameter in position 2")
 36	}
 37	// bits := 2048
 38	// p, err := rand.Prime(rand.Reader, bits/2) // move this out from wasm, it tooks too much time
 39	// if err != nil {
 40	//         println(err.Error())
 41	// }
 42	k, ok := new(big.Int).SetString(i[3].String(), 10)
 43	if !ok {
 44		println("error parsing parameter in position 3")
 45	}
 46	println("nNeededShares", nNeededShares.String())
 47	println("nShares", nShares.String())
 48	println("p", p.String())
 49	println("k (secret)", k.String())
 50	shares, err := shamirsecretsharing.Create(nNeededShares, nShares, p, k)
 51	if err != nil {
 52		println("error generating the shares")
 53		println(err.Error())
 54	}
 55	println("shares", shares)
 56	sharesStr := sharesToString(shares)
 57	println("sharesStr", sharesStr)
 58	return js.ValueOf(sharesStr)
 59}
 60
 61func sharesToString(shares [][]*big.Int) []string {
 62	var printString string
 63	var s []string
 64	for i := 0; i < len(shares); i++ {
 65		s = append(s, shares[i][0].String())
 66		s = append(s, shares[i][1].String())
 67		printString = printString + "[" + shares[i][0].String() + ", " + shares[i][1].String() + "]\n"
 68		println(shares[i][0].String())
 69		println(shares[i][1].String())
 70	}
 71	js.Global().Get("document").Call("getElementById", "sharesResult").Set("innerHTML", printString)
 72	return s
 73}
 74
 75func lagrangeInterpolation(this js.Value, i []js.Value) interface{} {
 76	p, ok := new(big.Int).SetString(i[0].String(), 10)
 77	if !ok {
 78		println("error parsing parameter in position 0 (p)")
 79	}
 80
 81	// parse the shares array
 82	var shares [][]*big.Int
 83	for n := 1; n < len(i); n = n + 2 {
 84		a, ok := new(big.Int).SetString(i[n].String(), 10)
 85		if !ok {
 86			println("error parsing parameter in position ", n)
 87		}
 88		b, ok := new(big.Int).SetString(i[n+1].String(), 10)
 89		if !ok {
 90			println("error parsing parameter in position ", n+1)
 91		}
 92		var share []*big.Int
 93		share = append(share, a)
 94		share = append(share, b)
 95		shares = append(shares, share)
 96	}
 97
 98	secr := shamirsecretsharing.LagrangeInterpolation(p, shares)
 99	println(secr.String())
100	return js.ValueOf(secr)
101}