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