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}