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 mStr := values[1].String()
85 uBStr := values[2].String()
86 uCStr := values[3].String()
87 uFxStr := values[4].String()
88 uFyStr := values[5].String()
89
90 sBlind := stringToBigInt(sBlindStr)
91 m := stringToBigInt(mStr)
92 uB := stringToBigInt(uBStr)
93 uC := stringToBigInt(uCStr)
94 uFx := stringToBigInt(uFxStr)
95 uFy := stringToBigInt(uFyStr)
96
97 uF := &blindsecp256k1.Point{
98 X: uFx,
99 Y: uFy,
100 }
101
102 u := &blindsecp256k1v0.UserSecretData{
103 // A not needed to Unblind
104 B: uB,
105 C: uC,
106 F: uF,
107 }
108
109 sig := blindsecp256k1v0.Unblind(sBlind, m, u)
110
111 r := make(map[string]interface{})
112 r["s"] = sig.S.String()
113 r["fx"] = sig.F.X.String()
114 r["fy"] = sig.F.Y.String()
115 return r
116}
117
118func verifyv0(this js.Value, values []js.Value) interface{} {
119 mStr := values[0].String()
120 sigSStr := values[1].String()
121 sigFxStr := values[2].String()
122 sigFyStr := values[3].String()
123 qxStr := values[4].String()
124 qyStr := values[5].String()
125
126 m := stringToBigInt(mStr)
127 sigS := stringToBigInt(sigSStr)
128 sigFx := stringToBigInt(sigFxStr)
129 sigFy := stringToBigInt(sigFyStr)
130 qx := stringToBigInt(qxStr)
131 qy := stringToBigInt(qyStr)
132
133 q := &blindsecp256k1.PublicKey{
134 X: qx,
135 Y: qy,
136 }
137 sig := &blindsecp256k1.Signature{
138 S: sigS,
139 F: &blindsecp256k1.Point{
140 X: sigFx,
141 Y: sigFy,
142 },
143 }
144 verified := blindsecp256k1.Verify(m, sig, q)
145
146 r := verified
147 return r
148}
149
150func blind(this js.Value, values []js.Value) interface{} {
151 mStr := values[0].String()
152 signerRxStr := values[1].String()
153 signerRyStr := values[2].String()
154
155 m := stringToBigInt(mStr)
156 signerRx := stringToBigInt(signerRxStr)
157 signerRy := stringToBigInt(signerRyStr)
158
159 signerR := &blindsecp256k1.Point{
160 X: signerRx,
161 Y: signerRy,
162 }
163
164 mBlinded, user := blindsecp256k1.Blind(m, signerR)
165
166 r := make(map[string]interface{})
167 r["mBlinded"] = mBlinded.String()
168 r["uA"] = user.A.String()
169 r["uB"] = user.B.String()
170 r["uFx"] = user.F.X.String()
171 r["uFy"] = user.F.Y.String()
172 return r
173}
174
175func unblind(this js.Value, values []js.Value) interface{} {
176 sBlindStr := values[0].String()
177 mStr := values[1].String()
178 uAStr := values[2].String()
179 uBStr := values[3].String()
180 uFxStr := values[4].String()
181 uFyStr := values[5].String()
182
183 sBlind := stringToBigInt(sBlindStr)
184 m := stringToBigInt(mStr)
185 uA := stringToBigInt(uAStr)
186 uB := stringToBigInt(uBStr)
187 uFx := stringToBigInt(uFxStr)
188 uFy := stringToBigInt(uFyStr)
189
190 uF := &blindsecp256k1.Point{
191 X: uFx,
192 Y: uFy,
193 }
194
195 u := &blindsecp256k1.UserSecretData{
196 A: uA,
197 B: uB,
198 F: uF,
199 }
200
201 sig := blindsecp256k1.Unblind(sBlind, m, u)
202
203 r := make(map[string]interface{})
204 r["s"] = sig.S.String()
205 r["fx"] = sig.F.X.String()
206 r["fy"] = sig.F.Y.String()
207 return r
208}
209
210func verify(this js.Value, values []js.Value) interface{} {
211 mStr := values[0].String()
212 sigSStr := values[1].String()
213 sigFxStr := values[2].String()
214 sigFyStr := values[3].String()
215 qxStr := values[4].String()
216 qyStr := values[5].String()
217
218 m := stringToBigInt(mStr)
219 sigS := stringToBigInt(sigSStr)
220 sigFx := stringToBigInt(sigFxStr)
221 sigFy := stringToBigInt(sigFyStr)
222 qx := stringToBigInt(qxStr)
223 qy := stringToBigInt(qyStr)
224
225 q := &blindsecp256k1.PublicKey{
226 X: qx,
227 Y: qy,
228 }
229 sig := &blindsecp256k1.Signature{
230 S: sigS,
231 F: &blindsecp256k1.Point{
232 X: sigFx,
233 Y: sigFy,
234 },
235 }
236 verified := blindsecp256k1.Verify(m, sig, q)
237
238 r := verified
239 return r
240}