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 signer := &blindsecp256k1v0.SignerPublicData{signerQ, signerR}
61 mBlinded, user := blindsecp256k1v0.Blind(m, signer)
62
63 r := make(map[string]interface{})
64 r["mBlinded"] = mBlinded.String()
65 r["uA"] = user.A.String()
66 r["uB"] = user.B.String()
67 r["uC"] = user.C.String()
68 r["uC"] = user.C.String()
69 r["uFx"] = user.F.X.String()
70 r["uFy"] = user.F.Y.String()
71 return r
72}
73
74func unblindv0(this js.Value, values []js.Value) interface{} {
75 sBlindStr := values[0].String()
76 mStr := values[1].String()
77 uBStr := values[2].String()
78 uCStr := values[3].String()
79 uFxStr := values[4].String()
80 uFyStr := values[5].String()
81
82 sBlind := stringToBigInt(sBlindStr)
83 m := stringToBigInt(mStr)
84 uB := stringToBigInt(uBStr)
85 uC := stringToBigInt(uCStr)
86 uFx := stringToBigInt(uFxStr)
87 uFy := stringToBigInt(uFyStr)
88
89 uF := &blindsecp256k1v0.Point{
90 X: uFx,
91 Y: uFy,
92 }
93
94 u := &blindsecp256k1v0.UserSecretData{
95 // A not needed to Unblind
96 B: uB,
97 C: uC,
98 F: uF,
99 }
100
101 sig := blindsecp256k1v0.Unblind(sBlind, m, u)
102
103 r := make(map[string]interface{})
104 r["s"] = sig.S.String()
105 r["fx"] = sig.F.X.String()
106 r["fy"] = sig.F.Y.String()
107 return r
108}
109func blind(this js.Value, values []js.Value) interface{} {
110 mStr := values[0].String()
111 signerQxStr := values[1].String()
112 signerQyStr := values[2].String()
113 signerRxStr := values[3].String()
114 signerRyStr := values[4].String()
115
116 m := stringToBigInt(mStr)
117 signerQx := stringToBigInt(signerQxStr)
118 signerQy := stringToBigInt(signerQyStr)
119 signerRx := stringToBigInt(signerRxStr)
120 signerRy := stringToBigInt(signerRyStr)
121
122 signerQ := &blindsecp256k1.PublicKey{
123 X: signerQx,
124 Y: signerQy,
125 }
126 signerR := &blindsecp256k1.Point{
127 X: signerRx,
128 Y: signerRy,
129 }
130
131 signer := &blindsecp256k1.SignerPublicData{signerQ, signerR}
132 mBlinded, user := blindsecp256k1.Blind(m, signer)
133
134 r := make(map[string]interface{})
135 r["mBlinded"] = mBlinded.String()
136 r["uA"] = user.A.String()
137 r["uB"] = user.B.String()
138 r["uFx"] = user.F.X.String()
139 r["uFy"] = user.F.Y.String()
140 return r
141}
142
143func unblind(this js.Value, values []js.Value) interface{} {
144 sBlindStr := values[0].String()
145 mStr := values[1].String()
146 uAStr := values[2].String()
147 uBStr := values[3].String()
148 uFxStr := values[4].String()
149 uFyStr := values[5].String()
150
151 sBlind := stringToBigInt(sBlindStr)
152 m := stringToBigInt(mStr)
153 uA := stringToBigInt(uAStr)
154 uB := stringToBigInt(uBStr)
155 uFx := stringToBigInt(uFxStr)
156 uFy := stringToBigInt(uFyStr)
157
158 uF := &blindsecp256k1.Point{
159 X: uFx,
160 Y: uFy,
161 }
162
163 u := &blindsecp256k1.UserSecretData{
164 A: uA,
165 B: uB,
166 F: uF,
167 }
168
169 sig := blindsecp256k1.Unblind(sBlind, m, u)
170
171 r := make(map[string]interface{})
172 r["s"] = sig.S.String()
173 r["fx"] = sig.F.X.String()
174 r["fy"] = sig.F.Y.String()
175 return r
176}