From 7cd17a82a54aeb9e2f29b5c890533a25c20b03e6 Mon Sep 17 00:00:00 2001 From: Lucas Menendez Date: Fri, 5 Apr 2024 00:28:47 +0200 Subject: [PATCH] initial webassembly demo --- cmd/webassembly/main.go | 72 +++++++++++++++++++++++++++++++++++++++++ web/index.html | 30 +++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 cmd/webassembly/main.go create mode 100644 web/index.html diff --git a/cmd/webassembly/main.go b/cmd/webassembly/main.go new file mode 100644 index 0000000..024408d --- /dev/null +++ b/cmd/webassembly/main.go @@ -0,0 +1,72 @@ +//go:build js && wasm +// +build js,wasm + +package main + +import ( + "encoding/json" + "fmt" + "syscall/js" + + "github.com/lucasmenendez/gosss" +) + +const ( + // js names + jsClassName = "GoSSS" + jsHideMethod = "hide" + jsRecoverMethod = "recover" + // required number of arguments for each method + hidedNArgs = 3 // msg, nshares, minshares + recoverdNArgs = 1 // shares +) + +func wasmError(err error) js.Value { + return js.Global().Call("throwError", js.ValueOf(err.Error())) +} + +func main() { + gosssClass := js.ValueOf(map[string]interface{}{}) + gosssClass.Set(jsHideMethod, js.FuncOf(func(this js.Value, p []js.Value) interface{} { + if len(p) != hidedNArgs { + return wasmError(fmt.Errorf("invalid number of arguments")) + } + msg := p[0].String() + nshares := p[1].Int() + minshares := p[2].Int() + // hide the message + shares, err := gosss.HideMessage([]byte(msg), &gosss.Config{ + Shares: nshares, + Min: minshares, + }) + if err != nil { + return wasmError(err) + } + jsonShares, err := json.Marshal(shares) + if err != nil { + return wasmError(err) + } + return string(jsonShares) + })) + + gosssClass.Set(jsRecoverMethod, js.FuncOf(func(this js.Value, p []js.Value) interface{} { + if len(p) != recoverdNArgs { + return wasmError(fmt.Errorf("invalid number of arguments")) + } + // recover the shares from the json string + var shares []string + if err := json.Unmarshal([]byte(p[0].String()), &shares); err != nil { + return wasmError(err) + } + // recover the message + msg, err := gosss.RecoverMessage(shares, nil) + if err != nil { + return wasmError(err) + } + return string(msg) + })) + + js.Global().Set(jsClassName, gosssClass) + // keep the program running forever + select {} +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..b614a19 --- /dev/null +++ b/web/index.html @@ -0,0 +1,30 @@ + + + Go Shamir Secret Sharing demo + + + + + + +