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 := 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 := blindsecp256k1.Blind(m, signerR)
163
164	r := make(map[string]interface{})
165	r["mBlinded"] = mBlinded.String()
166	r["uA"] = user.A.String()
167	r["uB"] = user.B.String()
168	r["uFx"] = user.F.X.String()
169	r["uFy"] = user.F.Y.String()
170	return r
171}
172
173func unblind(this js.Value, values []js.Value) interface{} {
174	sBlindStr := values[0].String()
175	uAStr := values[1].String()
176	uBStr := values[2].String()
177	uFxStr := values[3].String()
178	uFyStr := values[4].String()
179
180	sBlind := stringToBigInt(sBlindStr)
181	uA := stringToBigInt(uAStr)
182	uB := stringToBigInt(uBStr)
183	uFx := stringToBigInt(uFxStr)
184	uFy := stringToBigInt(uFyStr)
185
186	uF := &blindsecp256k1.Point{
187		X: uFx,
188		Y: uFy,
189	}
190
191	u := &blindsecp256k1.UserSecretData{
192		A: uA,
193		B: uB,
194		F: uF,
195	}
196
197	sig := blindsecp256k1.Unblind(sBlind, u)
198
199	r := make(map[string]interface{})
200	r["s"] = sig.S.String()
201	r["fx"] = sig.F.X.String()
202	r["fy"] = sig.F.Y.String()
203	return r
204}
205
206func verify(this js.Value, values []js.Value) interface{} {
207	mStr := values[0].String()
208	sigSStr := values[1].String()
209	sigFxStr := values[2].String()
210	sigFyStr := values[3].String()
211	qxStr := values[4].String()
212	qyStr := values[5].String()
213
214	m := stringToBigInt(mStr)
215	sigS := stringToBigInt(sigSStr)
216	sigFx := stringToBigInt(sigFxStr)
217	sigFy := stringToBigInt(sigFyStr)
218	qx := stringToBigInt(qxStr)
219	qy := stringToBigInt(qyStr)
220
221	q := &blindsecp256k1.PublicKey{
222		X: qx,
223		Y: qy,
224	}
225	sig := &blindsecp256k1.Signature{
226		S: sigS,
227		F: &blindsecp256k1.Point{
228			X: sigFx,
229			Y: sigFy,
230		},
231	}
232	verified := blindsecp256k1.Verify(m, sig, q)
233
234	r := verified
235	return r
236}