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}