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
 10func main() {
 11	c := make(chan struct{}, 0)
 12	println("WASM blindsecp256k1 initialized")
 13	registerCallbacks()
 14	<-c
 15}
 16
 17func registerCallbacks() {
 18	js.Global().Set("blind", js.FuncOf(blind))
 19	js.Global().Set("unblind", js.FuncOf(unblind))
 20}
 21
 22func stringToBigInt(s string) *big.Int {
 23	b, ok := new(big.Int).SetString(s, 10)
 24	if !ok {
 25		panic(fmt.Errorf("error parsing string *big.Int: %s", s))
 26	}
 27	return b
 28}
 29
 30func blind(this js.Value, values []js.Value) interface{} {
 31	mStr := values[0].String()
 32	signerQxStr := values[1].String()
 33	signerQyStr := values[2].String()
 34	signerRxStr := values[3].String()
 35	signerRyStr := values[4].String()
 36
 37	m := stringToBigInt(mStr)
 38	signerQx := stringToBigInt(signerQxStr)
 39	signerQy := stringToBigInt(signerQyStr)
 40	signerRx := stringToBigInt(signerRxStr)
 41	signerRy := stringToBigInt(signerRyStr)
 42
 43	signerQ := &blindsecp256k1.PublicKey{
 44		X: signerQx,
 45		Y: signerQy,
 46	}
 47	signerR := &blindsecp256k1.Point{
 48		X: signerRx,
 49		Y: signerRy,
 50	}
 51
 52	signer := &blindsecp256k1.SignerPublicData{signerQ, signerR}
 53	mBlinded, user := blindsecp256k1.Blind(m, signer)
 54
 55	r := make(map[string]interface{})
 56	r["mBlinded"] = mBlinded.String()
 57	r["uA"] = user.A.String()
 58	r["uB"] = user.B.String()
 59	r["uC"] = user.C.String()
 60	r["uC"] = user.C.String()
 61	r["uFx"] = user.F.X.String()
 62	r["uFy"] = user.F.Y.String()
 63	return r
 64}
 65
 66func unblind(this js.Value, values []js.Value) interface{} {
 67	sBlindStr := values[0].String()
 68	mStr := values[1].String()
 69	uBStr := values[2].String()
 70	uCStr := values[3].String()
 71	uFxStr := values[4].String()
 72	uFyStr := values[5].String()
 73
 74	sBlind := stringToBigInt(sBlindStr)
 75	m := stringToBigInt(mStr)
 76	uB := stringToBigInt(uBStr)
 77	uC := stringToBigInt(uCStr)
 78	uFx := stringToBigInt(uFxStr)
 79	uFy := stringToBigInt(uFyStr)
 80
 81	uF := &blindsecp256k1.Point{
 82		X: uFx,
 83		Y: uFy,
 84	}
 85
 86	u := &blindsecp256k1.UserSecretData{
 87		// A not needed to Unblind
 88		B: uB,
 89		C: uC,
 90		F: uF,
 91	}
 92
 93	sig := blindsecp256k1.Unblind(sBlind, m, u)
 94
 95	r := make(map[string]interface{})
 96	r["s"] = sig.S.String()
 97	r["fx"] = sig.F.X.String()
 98	r["fy"] = sig.F.Y.String()
 99	return r
100}