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