diff --git a/html/index.html b/html/index.html index 47935ef..cbeb9fd 100644 --- a/html/index.html +++ b/html/index.html @@ -26,6 +26,7 @@ } var croc = { + "key": "", "pake": "", }; var sharedPassphrase = "pass123" @@ -36,8 +37,13 @@ if (event.data == "initiated") { socket.send(JSON.stringify({ "m": "room", "ps": sharedPassphrase })) } else if (event.data == "initpake") { - croc.pake = pakeInit(sharedPassphrase, "1"); - socket.send(JSON.stringify({ "m": "initpake", "ps": croc.pake })) + croc.pake = pakeInit(sharedPassphrase, "0"); + socket.send( + messageEncode(croc.key, JSON.stringify({ "t": "pake", "b": croc.pake })) + ) + } else { + msgJSON = messageDecode(croc.key, event.data); + console.log(msgJSON); } }; const socketOpenListener = (event) => { diff --git a/html/main.go b/html/main.go index 05b091a..cd6504b 100644 --- a/html/main.go +++ b/html/main.go @@ -1,4 +1,4 @@ -package main +package main //go:generate cp /usr/local/go/misc/wasm/wasm_exec.js . @@ -24,11 +24,86 @@ import ( "time" "github.com/pkg/errors" + "github.com/schollz/croc/v6/src/compress" "github.com/schollz/croc/v6/src/crypt" + "github.com/schollz/croc/v6/src/message" log "github.com/schollz/logger" "github.com/schollz/pake/v2" ) +// messageEncode(key, Message) +// returns base64 encoded, encrypts if key != nil +func messageEncode(this js.Value, inputs []js.Value) interface{} { + // initialize sender P ("1" indicates sender) + if len(inputs) != 2 { + return js.Global().Get("Error").New("need weakPassphrase, role") + } + var m message.Message + err := json.Unmarshal([]byte(inputs[1].String()), &m) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + b, err := json.Marshal(m) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + b = compress.Compress(b) + if inputs[0].String() != "" { + var key []byte + key, err = base64.StdEncoding.DecodeString(inputs[0].String()) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + + b, err = crypt.Encrypt(b, key) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + } + return base64.StdEncoding.EncodeToString(b) +} + +// messageDecode(key, encodedMessage) +// returns base64 encoded, encrypts if key != nil +func messageDecode(this js.Value, inputs []js.Value) interface{} { + // initialize sender P ("1" indicates sender) + if len(inputs) != 2 { + return js.Global().Get("Error").New("need key, encodedmessage") + } + var key []byte + key = nil + var err error + if inputs[0].String() != "" { + key, err = base64.StdEncoding.DecodeString(inputs[0].String()) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + } + + b, err := base64.StdEncoding.DecodeString(inputs[1].String()) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + m, err := message.Decode(key, b) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + + bJSON, err := json.Marshal(m) + if err != nil { + log.Error(err) + return js.Global().Get("Error").New(err.Error()) + } + return string(bJSON) +} + // pakeInit(weakPassphrase, role) // returns: pakeBytes func pakeInit(this js.Value, inputs []js.Value) interface{} { @@ -162,6 +237,8 @@ func main() { js.Global().Set("pakePublic", js.FuncOf(pakePublic)) js.Global().Set("pakeUpdate", js.FuncOf(pakeUpdate)) js.Global().Set("pakeSessionKey", js.FuncOf(pakeSessionKey)) + js.Global().Set("messageEncode", js.FuncOf(messageEncode)) + js.Global().Set("messageDecode", js.FuncOf(messageDecode)) fmt.Println("Initiated") <-c -} \ No newline at end of file +} diff --git a/src/webrelay/webrelay.go b/src/webrelay/webrelay.go index 649799b..fd6caf2 100644 --- a/src/webrelay/webrelay.go +++ b/src/webrelay/webrelay.go @@ -2,6 +2,7 @@ package webrelay import ( "bytes" + "encoding/base64" "encoding/json" "net/http" "strings" @@ -105,9 +106,25 @@ func receive(conn *websocket.Conn) (err error) { log.Error(err) return } - } else if bu.Message == "initpake" { - log.Debug("got init pake data") - + } + } + b, errBase64 := base64.StdEncoding.DecodeString(string(message)) + if errBase64 == nil { + log.Debug("parsing base64 bytes") + err = com.Send(b) + if err != nil { + log.Error(err) + return + } + b, err = com.Receive() + if err != nil { + log.Error(err) + return + } + err = conn.WriteMessage(websocket.TextMessage, []byte(base64.StdEncoding.EncodeToString(b))) + if err != nil { + log.Error(err) + return } }