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