arnaucube
arnaucube/go-blindsecp256k1Public Self-hosted repository
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}