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	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}