From 4ab7c44c5b47baafb426e551b97a93f36dc00bd8 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 12 Nov 2019 07:50:12 -0800 Subject: [PATCH] use base64 --- src/croc/croc.go | 100 +++++++++------- src/webrtc/websend/index.html | 212 +++++++++++++++++----------------- 2 files changed, 169 insertions(+), 143 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 36e24ab..86bbe16 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -3,6 +3,7 @@ package croc import ( "crypto/elliptic" "crypto/md5" + "encoding/base64" "encoding/json" "fmt" "time" @@ -85,6 +86,43 @@ func (c *Client) Unbundle(msg []byte, payload interface{}) (err error) { return } +// SendWebsocketMessage communicates using base64 +func (c *Client) SendWebsocketMessage(wsmsg WebsocketMessage, encrypt bool) (err error) { + var b []byte + if encrypt { + b, err = c.Bundle(wsmsg) + } else { + b, err = json.Marshal(wsmsg) + if err != nil { + log.Error(err) + return + } + } + bd := base64.StdEncoding.EncodeToString(b) + err = c.ws.WriteMessage(1, []byte(bd)) + return +} + +// ReceiveWebsocketMessage communicates using base64 +func (c *Client) ReceiveWebsocketMessage(decrypt bool) (wsmsg WebsocketMessage, err error) { + _, msg, err := c.ws.ReadMessage() + if err != nil { + log.Error(err) + return + } + b, err := base64.StdEncoding.DecodeString(string(msg)) + if decrypt { + err = c.Unbundle(b, &wsmsg) + if err != nil { + log.Error(err) + return + } + } else { + err = json.Unmarshal(b, &wsmsg) + } + return +} + // New establishes a new connection for transferring files between two instances. func New(ops Options) (c *Client, err error) { c = new(Client) @@ -107,6 +145,8 @@ func New(ops Options) (c *Client, err error) { return } + // connect to relay and determine + // whether it is receiver or offerer err = c.connectToRelay() if err != nil { return @@ -114,9 +154,10 @@ func New(ops Options) (c *Client, err error) { if c.IsOfferer { // offerer sends the first pake - c.ws.WriteJSON(WebsocketMessage{ + c.SendWebsocketMessage(WebsocketMessage{ + Message: "pake", Payload: c.Pake.Bytes(), - }) + }, false) } else { // answerer receives the first pake err = c.getPAKE(true) @@ -172,30 +213,19 @@ func New(ops Options) (c *Client, err error) { if err != nil { log.Error(err) } - var msg []byte - msg, err = c.Bundle(WebsocketMessage{Message: "offer", Payload: offerJSON}) - if err != nil { - log.Error(err) - return - } - err = c.ws.WriteMessage(websocket.BinaryMessage, msg) + err = c.SendWebsocketMessage( + WebsocketMessage{Message: "offer", Payload: offerJSON}, + true, + ) if err != nil { log.Error(err) return } // wait for the answer - _, msg, err = c.ws.ReadMessage() - if err != nil { - log.Error(err) - return - } var wsmsg WebsocketMessage - err = c.Unbundle(msg, &wsmsg) - if err != nil { - log.Error(err) - return - } + wsmsg, err = c.ReceiveWebsocketMessage(true) + err = setRemoteDescription(c.rtc, wsmsg.Payload) if err != nil { log.Error(err) @@ -203,18 +233,8 @@ func New(ops Options) (c *Client, err error) { } } else { // wait for the offer - var msg []byte - _, msg, err = c.ws.ReadMessage() - if err != nil { - log.Error(err) - return - } var wsmsg WebsocketMessage - err = c.Unbundle(msg, &wsmsg) - if err != nil { - log.Error(err) - return - } + wsmsg, err = c.ReceiveWebsocketMessage(true) err = setRemoteDescription(c.rtc, wsmsg.Payload) if err != nil { @@ -240,16 +260,15 @@ func New(ops Options) (c *Client, err error) { if err != nil { log.Error(err) } - msg, err = c.Bundle(WebsocketMessage{Message: "answer", Payload: answerJSON}) - if err != nil { - log.Error(err) - return - } - err = c.ws.WriteMessage(websocket.BinaryMessage, msg) + err = c.SendWebsocketMessage( + WebsocketMessage{Message: "answer", Payload: answerJSON}, + true, + ) if err != nil { log.Error(err) return } + } err = <-finished @@ -258,8 +277,7 @@ func New(ops Options) (c *Client, err error) { func (c *Client) getPAKE(keepSending bool) (err error) { // answerer receives the first pake - var p WebsocketMessage - err = c.ws.ReadJSON(&p) + p, err := c.ReceiveWebsocketMessage(false) if err != nil { log.Error(err) return @@ -271,9 +289,10 @@ func (c *Client) getPAKE(keepSending bool) (err error) { } if keepSending { // sends back PAKE bytes - err = c.ws.WriteJSON(WebsocketMessage{ + err = c.SendWebsocketMessage(WebsocketMessage{ + Message: "pake", Payload: c.Pake.Bytes(), - }) + }, false) } return } @@ -298,6 +317,7 @@ func (c *Client) connectToRelay() (err error) { return } + log.Debugf("connected and sending first message") c.ws.WriteJSON(WebsocketMessage{ Message: "offerer", }) diff --git a/src/webrtc/websend/index.html b/src/webrtc/websend/index.html index e6fd70a..ec68d11 100644 --- a/src/webrtc/websend/index.html +++ b/src/webrtc/websend/index.html @@ -30,119 +30,125 @@ Base64: