# Snowflake [![Build Status](https://travis-ci.org/keroserene/snowflake.svg?branch=master)](https://travis-ci.org/keroserene/snowflake) A Pluggable Transport using WebRTC **Table of Contents** - [Status](#status) - [Usage](#usage) - [Dependencies](#dependencies) - [More Info](#more-info) - [Building a Snowflake](#building-a-snowflake) - [Appendix](#appendix) - [-- Testing directly via WebRTC Server --](#---testing-directly-via-webrtc-server---) - [-- Via Browser Proxy --](#---via-browser-proxy---) ### Status Successfully & automatically bootstraps with a WebRTC transport, using HTTP signaling (with optional domain fronting) speaking to a multitude of volunteer "snowflakes". Still lots of work to do. ### Usage ``` cd client/ go get go build tor -f torrc ``` This should start the client plugin, bootstrapping to 100% using WebRTC. #### Dependencies Client: - [go-webrtc](https://github.com/keroserene/go-webrtc). - Go 1.5.* (1.6 is not yet supported. See [Issue #22](https://github.com/keroserene/snowflake/issues/22)) Proxy: - [CoffeeScript](coffeescript.org) --- #### More Info The client uses the following `torrc` options: ``` ClientTransportPlugin snowflake exec ./client \ --url https://snowflake-reg.appspot.com/ \ --front www.google.com ``` Which allows it to speak to the Broker, get matched with a "snowflake" browser proxy, and negotiate a WebRTC PeerConnection. To see logs, do `tail -F snowflake.log` in a second terminal. You can modify the `torrc` to use your own broker, or remove the options entirely which will default to the old copy paste method (see `torrc-manual`): ``` ClientTransportPlugin snowflake exec ./client --meek ``` Also, it is possible to connect directly to the go-webrtc server plugin (skipping all the browser snowflake / broker stuff - see appendix) #### Building a Snowflake This will only work if there are any browser snowflakes running at all. To run your own, first make sure coffeescript is installed. Then, build with: ``` cd proxy/ cake build ``` (Type `cake` by itself to see possible commands) Then, start a local http server in the `proxy/build/` in any way you like. For instance: ``` cd build/ python -m http.server ``` Open a browser tab to `0.0.0.0:8000/snowflake.html`. TODO: Turn the snowflake proxy into a more deployable badge. ### Appendix ##### -- Testing directly via WebRTC Server -- Using the server plugin uses an HTTP server that simulates the interaction that a client would have with a broker. Using the browser proxy (which will soon be the only way) requires copy and pasting between 3 terminals and a browser tab. Edit server/torrc and add "-http 127.0.0.1:8080" to the end of the ServerTransportPlugin line: ``` ServerTransportPlugin snowflake exec ./server -http 127.0.0.1:8080 ``` ``` cd server/ go build tor -f torrc ``` Edit client/torrc and add "-url http://127.0.0.1:8080" to the end of the ClientTransportPlugin line: ``` ClientTransportPlugin snowflake exec ./client -url http://127.0.0.1:8080/ ``` ##### -- Via Browser Proxy -- Open up three terminals for the **client:** A: `tor -f torrc SOCKSPort auto` B: `cat > signal` C: `tail -F snowflake.log` Then, in the browser proxy: - Look for the offer in terminal C; copy and paste it into the browser. - Copy and paste the answer generated in the browser back to terminal B. - Once WebRTC successfully connects, the browser terminal should turn green. Shortly after, the tor client should bootstrap to 100%. More documentation on the way. Also available at: [torproject.org/pluggable-transports/snowflake](https://gitweb.torproject.org/pluggable-transports/snowflake.git/)