go-blindsecp256k1/wasm/blindsecp256k1-wasm.go
wasm/blindsecp256k1-wasm.goRaw
1package main
2
3import (
4 "fmt"
5 "math/big"
6 "syscall/js"
7
8 "github.com/arnaucube/go-blindsecp256k1"
9
10 blindsecp256k1v0 "github.com/arnaucube/go-blindsecp256k1/v0"
11)
12
13func main() {
14 c := make(chan struct{}, 0)
15 println("WASM blindsecp256k1 initialized")
16 registerCallbacks()
17 <-c
18}
19
20func registerCallbacks() {
21 js.Global().Set("wasmReady", js.FuncOf(ready))
22
23 // blindv0 & unblindv0 uses:
24 // http://www.isecure-journal.com/article_39171_47f9ec605dd3918c2793565ec21fcd7a.pdf
25 js.Global().Set("wasmBlindv0", js.FuncOf(blindv0))
26 js.Global().Set("wasmUnblindv0", js.FuncOf(unblindv0))
27 js.Global().Set("wasmVerifyv0", js.FuncOf(verifyv0))
28
29 // blind & unblind uses: https://sci-hub.do/10.1109/ICCKE.2013.6682844
30 js.Global().Set("wasmBlind", js.FuncOf(blind))
31 js.Global().Set("wasmUnblind", js.FuncOf(unblind))
32 js.Global().Set("wasmVerify", js.FuncOf(verify))
33}
34
35func stringToBigInt(s string) *big.Int {
36 b, ok := new(big.Int).SetString(s, 10)
37 if !ok {
38 panic(fmt.Errorf("error parsing string *big.Int: %s", s))
39 }
40 return b
41}
42
43func ready(this js.Value, values []js.Value) interface{} {
44 return "ready"
45}
46
47func blindv0(this js.Value, values []js.Value) interface{} {
48 mStr := values[0].String()
49 signerQxStr := values[1].String()
50 signerQyStr := values[2].String()
51 signerRxStr := values[3].String()
52 signerRyStr := values[4].String()
53
54 m := stringToBigInt(mStr)
55 signerQx := stringToBigInt(signerQxStr)
56 signerQy := stringToBigInt(signerQyStr)
57 signerRx := stringToBigInt(signerRxStr)
58 signerRy := stringToBigInt(signerRyStr)
59
60 signerQ := &blindsecp256k1.PublicKey{
61 X: signerQx,
62 Y: signerQy,
63 }
64 signerR := &blindsecp256k1.Point{
65 X: signerRx,
66 Y: signerRy,
67 }
68
69 mBlinded, user := blindsecp256k1v0.Blind(m, signerQ, signerR)
70
71 r := make(map[string]interface{})
72 r["mBlinded"] = mBlinded.String()
73 r["uA"] = user.A.String()
74 r["uB"] = user.B.String()
75 r["uC"] = user.C.String()
76 r["uC"] = user.C.String()
77 r["uFx"] = user.F.X.String()
78 r["uFy"] = user.F.Y.String()
79 return r
80}
81
82func unblindv0(this js.Value, values []js.Value) interface{} {
83 sBlindStr := values[0].String()
84 uBStr := values[1].String()
85 uCStr := values[2].String()
86 uFxStr := values[3].String()
87 uFyStr := values[4].String()
88
89 sBlind := stringToBigInt(sBlindStr)
90 uB := stringToBigInt(uBStr)
91 uC := stringToBigInt(uCStr)
92 uFx := stringToBigInt(uFxStr)
93 uFy := stringToBigInt(uFyStr)
94
95 uF := &blindsecp256k1.Point{
96 X: uFx,
97 Y: uFy,
98 }
99
100 u := &blindsecp256k1v0.UserSecretData{
101 // A not needed to Unblind
102 B: uB,
103 C: uC,
104 F: uF,
105 }
106
107 sig := blindsecp256k1v0.Unblind(sBlind, u)
108
109 r := make(map[string]interface{})
110 r["s"] = sig.S.String()
111 r["fx"] = sig.F.X.String()
112 r["fy"] = sig.F.Y.String()
113 return r
114}
115
116func verifyv0(this js.Value, values []js.Value) interface{} {
117 mStr := values[0].String()
118 sigSStr := values[1].String()
119 sigFxStr := values[2].String()
120 sigFyStr := values[3].String()
121 qxStr := values[4].String()
122 qyStr := values[5].String()
123
124 m := stringToBigInt(mStr)
125 sigS := stringToBigInt(sigSStr)
126 sigFx := stringToBigInt(sigFxStr)
127 sigFy := stringToBigInt(sigFyStr)
128 qx := stringToBigInt(qxStr)
129 qy := stringToBigInt(qyStr)
130
131 q := &blindsecp256k1.PublicKey{
132 X: qx,
133 Y: qy,
134 }
135 sig := &blindsecp256k1.Signature{
136 S: sigS,
137 F: &blindsecp256k1.Point{
138 X: sigFx,
139 Y: sigFy,
140 },
141 }
142 verified := blindsecp256k1.Verify(m, sig, q)
143
144 r := verified
145 return r
146}
147
148func blind(this js.Value, values []js.Value) interface{} {
149 mStr := values[0].String()
150 signerRxStr := values[1].String()
151 signerRyStr := values[2].String()
152
153 m := stringToBigInt(mStr)
154 signerRx := stringToBigInt(signerRxStr)
155 signerRy := stringToBigInt(signerRyStr)
156
157 signerR := &blindsecp256k1.Point{
158 X: signerRx,
159 Y: signerRy,
160 }
161
162 mBlinded, user, err := blindsecp256k1.Blind(m, signerR)
163 if err != nil {
164 panic(err)
165 }
166
167 r := make(map[string]interface{})
168 r["mBlinded"] = mBlinded.String()
169 r["uA"] = user.A.String()
170 r["uB"] = user.B.String()
171 r["uFx"] = user.F.X.String()
172 r["uFy"] = user.F.Y.String()
173 return r
174}
175
176func unblind(this js.Value, values []js.Value) interface{} {
177 sBlindStr := values[0].String()
178 uAStr := values[1].String()
179 uBStr := values[2].String()
180 uFxStr := values[3].String()
181 uFyStr := values[4].String()
182
183 sBlind := stringToBigInt(sBlindStr)
184 uA := stringToBigInt(uAStr)
185 uB := stringToBigInt(uBStr)
186 uFx := stringToBigInt(uFxStr)
187 uFy := stringToBigInt(uFyStr)
188
189 uF := &blindsecp256k1.Point{
190 X: uFx,
191 Y: uFy,
192 }
193
194 u := &blindsecp256k1.UserSecretData{
195 A: uA,
196 B: uB,
197 F: uF,
198 }
199
200 sig := blindsecp256k1.Unblind(sBlind, u)
201
202 r := make(map[string]interface{})
203 r["s"] = sig.S.String()
204 r["fx"] = sig.F.X.String()
205 r["fy"] = sig.F.Y.String()
206 return r
207}
208
209func verify(this js.Value, values []js.Value) interface{} {
210 mStr := values[0].String()
211 sigSStr := values[1].String()
212 sigFxStr := values[2].String()
213 sigFyStr := values[3].String()
214 qxStr := values[4].String()
215 qyStr := values[5].String()
216
217 m := stringToBigInt(mStr)
218 sigS := stringToBigInt(sigSStr)
219 sigFx := stringToBigInt(sigFxStr)
220 sigFy := stringToBigInt(sigFyStr)
221 qx := stringToBigInt(qxStr)
222 qy := stringToBigInt(qyStr)
223
224 q := &blindsecp256k1.PublicKey{
225 X: qx,
226 Y: qy,
227 }
228 sig := &blindsecp256k1.Signature{
229 S: sigS,
230 F: &blindsecp256k1.Point{
231 X: sigFx,
232 Y: sigFy,
233 },
234 }
235 verified := blindsecp256k1.Verify(m, sig, q)
236
237 r := verified
238 return r
239}