This is a mentored internship position to produce a bridge bandwidth scanner for The Tor Project.

The Tor Network has what are called "Bandwidth Authorities": volunteer-run machines which build circuits through permutations of all the relays in the network to connect back to themselves and request files of different sizes, in order to statistically determine the likely maximum bandwidth capacity of each relay. For the relay bandwidth scanners, the circuit used for testing look like this:

BW → A → B → BW

Where A is the relay being measured, B is a relay believed to possess equal or greater bandwidth than A (otherwise the circuit would bottleneck at B), and BW is the Bandwidth Authority doing the measurement.

The intern is responsible for designing and implementing a similar system for measuring the bandwidth of Tor bridge relays.

Design Constraints

The bridge bandwidth scanner produced should meet the following design/implementation constraints:

Must be implemented in one of the following memory-safe languages: Python; Rust; Another $LANGUAGE, but you'll have a lot of convincing to do. Must run as a daemon; Must produce a measured bandwidths file identical (or nearly identical) in syntax to the measured bandwidth files currently produced by relay bandwidth authorities ( sample format .

Please be aware if you choose Rust, that The Tor Project does not yet currently have nearly as many tools and libraries written in Rust. For example, you'll need to implement (at least a fraction of) bridge descriptor parsing (whereas in Python you'll be able to outsource this to Stem ) and circuit construction through Tor's ControlPort (also outsourceable in Python to txtorcon ). If you choose Rust, I will gladly help you implement these functionalities in separate crates (this will make it easier for us to expand upon them more, later on).

Please also be aware that, while there is better library support in Python, using txtorcon will require knowledge of Twisted, an asynchronous framework known for being… well… twisted.

Other constraints on the project are:

During the course of the work, the intern should attend weekly tor dev meetings (on irc.oftc.net in #tor-dev on Mondays at 17:00 UTC), or otherwise send brief weekly status reports should be sent to tor-project@lists.torproject.org and the mentor(s). The position is remote and may take place in any location of the intern's choice. (Optionally, you're welcome to arrange with your mentor(s) to work in person, but we cannot allocate funds towards travel expenses at this time.) The length of the internship project is negotiable (between 1 and 3 months), and the (non-negotiable, sorry) compensation is $3000 USD. Applications must be received by midnight UTC on Monday 26 June 2017. It is not necessary to be (or have been) a student to apply.

Prerequisite Skills/Knowledge

Reasonable ability to communicate w.r.t. technical matters in English, German, or French (in that order of preference);

Python, Rust, or $LANGUAGE;

Basic knowledge of how a circuit is constructed through the Tor Network;

Basic knowledge of Tor bridges and anti-censorship infrastructure.

Applicants with the following demonstrable skills/knowledge will be prioritised:

Public code samples in the language of choice;

Contributions of (integration) tests to an open source project (again, preferably in the language of choice);

Asynchronous programming.

How To Apply

The mentor(s) for this project are:

Isis Agora Lovecruft < isis@torproject.org

Please apply by sending an email whose subject contains the phrase "Bridge Bandwidth Scanner Internship" and includes the following information to isis@torproject.org:

A brief description of yourself and/or a résumé;

Links to, or attachments of, sample code you've authored; If you are unable to provide code, please, in the $LANGUAGE you are choosing to do the project in, write a SOCKS5 (RFC 1928) proxy which (assuming there is no encryption, non-trivial encodings, or compression on the underlying protocol being transported, e.g. the underlying protocol is plaintext HTTP requests or something similar), upon receiving a connection from a client, rewrites the destination's response to change all gendered pronouns to those of some other gender. Your sample code should: Compile and/or run without errors; Demonstrate an ability to write networking code; Demonstrate the ability to do text manipulation in a safe and efficient manner; Show an understanding of how a basic proxy application functions; It is entirely permissible to use libraries to achieve the goal. For the blocking and asynchronous settings respectively, in Rust one might look at rust-socks or socks5-rs, and pysocks5 or txsocksx for Python.

A brief proposal for how you would implement this project (it's okay to be vague and/or include questions, part of the internship will involve mentoring and continual feedback);