go-blindsecp256k1/wasm/blindsecp256k1-wasm.go
wasm/blindsecp256k1-wasm.goRaw
1package main
2
3import (
4 "blindsecp256k1"
5 "fmt"
6 "math/big"
7 "syscall/js"
8)
9
10func main() {
11 c := make(chan struct{}, 0)
12 println("WASM blindsecp256k1 initialized")
13 registerCallbacks()
14 <-c
15}
16
17func registerCallbacks() {
18 js.Global().Set("blind", js.FuncOf(blind))
19 js.Global().Set("unblind", js.FuncOf(unblind))
20}
21
22func stringToBigInt(s string) *big.Int {
23 b, ok := new(big.Int).SetString(s, 10)
24 if !ok {
25 panic(fmt.Errorf("error parsing string *big.Int: %s", s))
26 }
27 return b
28}
29
30func blind(this js.Value, values []js.Value) interface{} {
31 mStr := values[0].String()
32 signerQxStr := values[1].String()
33 signerQyStr := values[2].String()
34 signerRxStr := values[3].String()
35 signerRyStr := values[4].String()
36
37 m := stringToBigInt(mStr)
38 signerQx := stringToBigInt(signerQxStr)
39 signerQy := stringToBigInt(signerQyStr)
40 signerRx := stringToBigInt(signerRxStr)
41 signerRy := stringToBigInt(signerRyStr)
42
43 signerQ := &blindsecp256k1.PublicKey{
44 X: signerQx,
45 Y: signerQy,
46 }
47 signerR := &blindsecp256k1.Point{
48 X: signerRx,
49 Y: signerRy,
50 }
51
52 signer := &blindsecp256k1.SignerPublicData{signerQ, signerR}
53 mBlinded, user := blindsecp256k1.Blind(m, signer)
54
55 r := make(map[string]interface{})
56 r["mBlinded"] = mBlinded.String()
57 r["uA"] = user.A.String()
58 r["uB"] = user.B.String()
59 r["uC"] = user.C.String()
60 r["uC"] = user.C.String()
61 r["uFx"] = user.F.X.String()
62 r["uFy"] = user.F.Y.String()
63 return r
64}
65
66func unblind(this js.Value, values []js.Value) interface{} {
67 sBlindStr := values[0].String()
68 mStr := values[1].String()
69 uBStr := values[2].String()
70 uCStr := values[3].String()
71 uFxStr := values[4].String()
72 uFyStr := values[5].String()
73
74 sBlind := stringToBigInt(sBlindStr)
75 m := stringToBigInt(mStr)
76 uB := stringToBigInt(uBStr)
77 uC := stringToBigInt(uCStr)
78 uFx := stringToBigInt(uFxStr)
79 uFy := stringToBigInt(uFyStr)
80
81 uF := &blindsecp256k1.Point{
82 X: uFx,
83 Y: uFy,
84 }
85
86 u := &blindsecp256k1.UserSecretData{
87 // A not needed to Unblind
88 B: uB,
89 C: uC,
90 F: uF,
91 }
92
93 sig := blindsecp256k1.Unblind(sBlind, m, u)
94
95 r := make(map[string]interface{})
96 r["s"] = sig.S.String()
97 r["fx"] = sig.F.X.String()
98 r["fy"] = sig.F.Y.String()
99 return r
100}