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