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 blindsecp256k1v0 "blindsecp256k1/v0"
10)
11
12func main() {
13 c := make(chan struct{}, 0)
14 println("WASM blindsecp256k1 initialized")
15 registerCallbacks()
16 <-c
17}
18
19func registerCallbacks() {
20 // blindv0 & unblindv0 uses:
21 // http://www.isecure-journal.com/article_39171_47f9ec605dd3918c2793565ec21fcd7a.pdf
22 js.Global().Set("blindv0", js.FuncOf(blindv0))
23 js.Global().Set("unblindv0", js.FuncOf(unblindv0))
24
25 // blind & unblind uses: https://sci-hub.do/10.1109/ICCKE.2013.6682844
26 js.Global().Set("blind", js.FuncOf(blind))
27 js.Global().Set("unblind", js.FuncOf(unblind))
28}
29
30func stringToBigInt(s string) *big.Int {
31 b, ok := new(big.Int).SetString(s, 10)
32 if !ok {
33 panic(fmt.Errorf("error parsing string *big.Int: %s", s))
34 }
35 return b
36}
37
38func blindv0(this js.Value, values []js.Value) interface{} {
39 mStr := values[0].String()
40 signerQxStr := values[1].String()
41 signerQyStr := values[2].String()
42 signerRxStr := values[3].String()
43 signerRyStr := values[4].String()
44
45 m := stringToBigInt(mStr)
46 signerQx := stringToBigInt(signerQxStr)
47 signerQy := stringToBigInt(signerQyStr)
48 signerRx := stringToBigInt(signerRxStr)
49 signerRy := stringToBigInt(signerRyStr)
50
51 signerQ := &blindsecp256k1v0.PublicKey{
52 X: signerQx,
53 Y: signerQy,
54 }
55 signerR := &blindsecp256k1v0.Point{
56 X: signerRx,
57 Y: signerRy,
58 }
59
60 mBlinded, user := blindsecp256k1v0.Blind(m, signerQ, signerR)
61
62 r := make(map[string]interface{})
63 r["mBlinded"] = mBlinded.String()
64 r["uA"] = user.A.String()
65 r["uB"] = user.B.String()
66 r["uC"] = user.C.String()
67 r["uC"] = user.C.String()
68 r["uFx"] = user.F.X.String()
69 r["uFy"] = user.F.Y.String()
70 return r
71}
72
73func unblindv0(this js.Value, values []js.Value) interface{} {
74 sBlindStr := values[0].String()
75 mStr := values[1].String()
76 uBStr := values[2].String()
77 uCStr := values[3].String()
78 uFxStr := values[4].String()
79 uFyStr := values[5].String()
80
81 sBlind := stringToBigInt(sBlindStr)
82 m := stringToBigInt(mStr)
83 uB := stringToBigInt(uBStr)
84 uC := stringToBigInt(uCStr)
85 uFx := stringToBigInt(uFxStr)
86 uFy := stringToBigInt(uFyStr)
87
88 uF := &blindsecp256k1v0.Point{
89 X: uFx,
90 Y: uFy,
91 }
92
93 u := &blindsecp256k1v0.UserSecretData{
94 // A not needed to Unblind
95 B: uB,
96 C: uC,
97 F: uF,
98 }
99
100 sig := blindsecp256k1v0.Unblind(sBlind, m, u)
101
102 r := make(map[string]interface{})
103 r["s"] = sig.S.String()
104 r["fx"] = sig.F.X.String()
105 r["fy"] = sig.F.Y.String()
106 return r
107}
108func blind(this js.Value, values []js.Value) interface{} {
109 mStr := values[0].String()
110 signerRxStr := values[1].String()
111 signerRyStr := values[2].String()
112
113 m := stringToBigInt(mStr)
114 signerRx := stringToBigInt(signerRxStr)
115 signerRy := stringToBigInt(signerRyStr)
116
117 signerR := &blindsecp256k1.Point{
118 X: signerRx,
119 Y: signerRy,
120 }
121
122 mBlinded, user := blindsecp256k1.Blind(m, signerR)
123
124 r := make(map[string]interface{})
125 r["mBlinded"] = mBlinded.String()
126 r["uA"] = user.A.String()
127 r["uB"] = user.B.String()
128 r["uFx"] = user.F.X.String()
129 r["uFy"] = user.F.Y.String()
130 return r
131}
132
133func unblind(this js.Value, values []js.Value) interface{} {
134 sBlindStr := values[0].String()
135 mStr := values[1].String()
136 uAStr := values[2].String()
137 uBStr := values[3].String()
138 uFxStr := values[4].String()
139 uFyStr := values[5].String()
140
141 sBlind := stringToBigInt(sBlindStr)
142 m := stringToBigInt(mStr)
143 uA := stringToBigInt(uAStr)
144 uB := stringToBigInt(uBStr)
145 uFx := stringToBigInt(uFxStr)
146 uFy := stringToBigInt(uFyStr)
147
148 uF := &blindsecp256k1.Point{
149 X: uFx,
150 Y: uFy,
151 }
152
153 u := &blindsecp256k1.UserSecretData{
154 A: uA,
155 B: uB,
156 F: uF,
157 }
158
159 sig := blindsecp256k1.Unblind(sBlind, m, u)
160
161 r := make(map[string]interface{})
162 r["s"] = sig.S.String()
163 r["fx"] = sig.F.X.String()
164 r["fy"] = sig.F.Y.String()
165 return r
166}