From a16a4b43a5adc6dd8db3e052b2aa6ce4bc068cfd Mon Sep 17 00:00:00 2001 From: Serene Han Date: Wed, 30 Dec 2015 09:54:20 -0800 Subject: [PATCH] begin JS "snowflake" proxy --- .gitignore | 4 + README.md | 8 ++ proxy/koch.jpg | Bin 0 -> 95584 bytes proxy/snowflake.html | 78 ++++++++++++++ proxy/snowflake.js | 239 +++++++++++++++++++++++++++++++++++++++++++ webrtc-client.go | 3 + 6 files changed, 332 insertions(+) create mode 100644 .gitignore create mode 100644 proxy/koch.jpg create mode 100644 proxy/snowflake.html create mode 100644 proxy/snowflake.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60ceebc --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.swp +*.swo +*.swn +ignore/ diff --git a/README.md b/README.md index 609b3da..3ded99b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ # snowflake-pt +WebRTC Pluggable Transport + +### Usage + +`go build webrtc-client.go` +`tor -f torrc` + +More documentation on the way. diff --git a/proxy/koch.jpg b/proxy/koch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf210efc941edc5675d91a7b80a53f56a60b851c GIT binary patch literal 95584 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ℜ1$}GiY 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 y%)`hErtkZ_?7}WxJ!6j}%6>3&Do + + + + + + + +
+ +
+ + +
+
+ + + diff --git a/proxy/snowflake.js b/proxy/snowflake.js new file mode 100644 index 0000000..d6fc025 --- /dev/null +++ b/proxy/snowflake.js @@ -0,0 +1,239 @@ +/* +JS WebRTC proxy +Copy-paste signaling. +*/ + +// DOM elements +var $chatlog, $input, $send, $name; + +var config = { + iceServers: [ + { urls: ["stun:stun.l.google.com:19302"] } + ] +} + +// Chrome / Firefox compatibility +window.PeerConnection = window.RTCPeerConnection || + window.mozRTCPeerConnection || window.webkitRTCPeerConnection; +window.RTCIceCandidate = window.RTCIceCandidate || window.mozRTCIceCandidate; +window.RTCSessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription; + +var pc; // PeerConnection +var answer; +// Janky state machine +var MODE = { + INIT: 0, + CONNECTING: 1, + CHAT: 2 +} +var currentMode = MODE.INIT; + +// Signalling channel - just tells user to copy paste to the peer. +var Signalling = { + send: function(msg) { + log("---- Please copy the below to peer ----\n"); + log(JSON.stringify(msg)); + log("\n"); + }, + receive: function(msg) { + var recv; + try { + recv = JSON.parse(msg); + } catch(e) { + log("Invalid JSON."); + return; + } + if (!pc) { + start(false); + } + var desc = recv['sdp'] + var ice = recv['candidate'] + if (!desc && ! ice) { + log("Invalid SDP."); + return false; + } + if (desc) { receiveDescription(recv); } + if (ice) { receiveICE(recv); } + } +} + +function welcome() { + log("== snowflake JS proxy =="); + log("Input offer from the snowflake client:"); +} + +function start(initiator) { + username + ": " + msg; + log("Starting up RTCPeerConnection..."); + pc = new PeerConnection(config, { + optional: [ + { DtlsSrtpKeyAgreement: true }, + { RtpDataChannels: false }, + ], + }); + pc.onicecandidate = function(evt) { + var candidate = evt.candidate; + // Chrome sends a null candidate once the ICE gathering phase completes. + // In this case, it makes sense to send one copy-paste blob. + if (null == candidate) { + log("Finished gathering ICE candidates."); + Signalling.send(pc.localDescription); + return; + } + } + pc.onnegotiationneeded = function() { + sendOffer(); + } + pc.ondatachannel = function(dc) { + console.log(dc); + channel = dc.channel; + log("Data Channel established... "); + prepareDataChannel(channel); + } + + // Creating the first data channel triggers ICE negotiation. + if (initiator) { + channel = pc.createDataChannel("test"); + prepareDataChannel(channel); + } +} + +// Local input from keyboard into chat window. +function acceptInput(is) { + var msg = $input.value; + switch (currentMode) { + case MODE.INIT: + if (msg.startsWith("start")) { + start(true); + } else { + Signalling.receive(msg); + } + break; + case MODE.CONNECTING: + Signalling.receive(msg); + break; + case MODE.CHAT: + var data = msg; + log(data); + channel.send(data); + break; + default: + log("ERROR: " + msg); + } + $input.value = ""; + $input.focus(); +} + +// Chrome uses callbacks while Firefox uses promises. +// Need to support both - same for createAnswer below. +function sendOffer() { + var next = function(sdp) { + log("webrtc: Created Offer"); + offer = sdp; + pc.setLocalDescription(sdp); + } + var promise = pc.createOffer(next); + if (promise) { + promise.then(next); + } +} + +function sendAnswer() { + var next = function (sdp) { + log("webrtc: Created Answer"); + answer = sdp; + pc.setLocalDescription(sdp) + } + var promise = pc.createAnswer(next); + if (promise) { + promise.then(next); + } +} + +function receiveDescription(desc) { + var sdp = new RTCSessionDescription(desc); + try { + err = pc.setRemoteDescription(sdp); + } catch (e) { + log("Invalid SDP message."); + return false; + } + log("SDP " + sdp.type + " successfully received."); + if ("offer" == sdp.type) { + sendAnswer(); + } + return true; +} + +function receiveICE(ice) { + var candidate = new RTCIceCandidate(ice); + try { + pc.addIceCandidate(candidate); + } catch (e) { + log("Could not add ICE candidate."); + return; + } + log("ICE candidate successfully received: " + ice.candidate); +} + +function waitForSignals() { + currentMode = MODE.CONNECTING; +} + +function prepareDataChannel(channel) { + channel.onopen = function() { + log("Data channel opened!"); + startChat(); + } + channel.onclose = function() { + log("Data channel closed."); + currentMode = MODE.INIT; + $chatlog.className = ""; + log("------- chat disabled -------"); + } + channel.onerror = function() { + log("Data channel error!!"); + } + channel.onmessage = function(msg) { + var recv = msg.data; + console.log(msg); + // Go sends only raw bytes. + if ("[object ArrayBuffer]" == recv.toString()) { + var bytes = new Uint8Array(recv); + line = String.fromCharCode.apply(null, bytes); + } else { + line = recv; + } + line = line.trim(); + log(line); + } +} + +// Get DOM elements and setup interactions. +function init() { + console.log("loaded"); + // Setup chatwindow. + $chatlog = document.getElementById('chatlog'); + $chatlog.value = ""; + + $send = document.getElementById('send'); + $send.onclick = acceptInput + + $input = document.getElementById('input'); + $input.focus(); + $input.onkeydown = function(e) { + if (13 == e.keyCode) { // enter + $send.onclick(); + } + } + welcome(); +} + +var log = function(msg) { + $chatlog.value += msg + "\n"; + console.log(msg); + // Scroll to latest. + $chatlog.scrollTop = $chatlog.scrollHeight; +} + +window.onload = init; diff --git a/webrtc-client.go b/webrtc-client.go index 09df4fb..b17ac70 100644 --- a/webrtc-client.go +++ b/webrtc-client.go @@ -35,6 +35,9 @@ func handler(conn *pt.SocksConn) error { return err } + // For now, the Go client is always the offerer. + // TODO: Copy paste signaling + pc.OnNegotiationNeeded = func() { // log.Println("OnNegotiationNeeded") go func() {