Skip to content
Snippets Groups Projects
README.md 3.5 KiB
Newer Older
Bridgestrap
===========

Bridgestrap implements an API (for machines) and a Web interface (for people)
to test Tor bridge lines by making a Tor instance fetch the bridges'
descriptor.

Installation
------------

First, install the Golang binary:

      go install

Then, run the binary:

      bridgestrap

By default, bridgestrap will listen on port 5000.  To use its Web interface
Philipp Winter's avatar
Philipp Winter committed
(don't forget to turn it on by using the `-web` switch), point your browser to
the address and port that bridgestrap is listening on.  Use the argument
`-addr` to listen to a custom address and port.
Clients send one or more bridge lines to the following API, using an HTTP GET
request, and place the bridge lines in the request body:
      https://HOST/bridge-state
The request body must look as follows:
      {"bridge_lines": ["BRIDGE_LINE_1", ..., "BRIDGE_LINE_N"]}
The "BRIDGE_LINE" strings in the list may contain any bridge line (excluding
the "Bridge" prefix) that tor accepts.  Here are a few examples:
* `1.2.3.4:1234`
* `1.2.3.4:1234 1234567890ABCDEF1234567890ABCDEF12345678`
* `obfs4 1.2.3.4:1234 cert=fJRlJc0T7i2Qkw3SyLQq+M6iTGs9ghLHK65LBy/MQewXJpNOKFq63Om1JHVkLlrmEBbX1w iat-mode=0`

You can test bridgestrap's API over the command line as follows:

      curl -X GET localhost:5000/bridge-state -d '{"bridge_lines": ["BRIDGE_LINE"]}'

You can also use the script test-bridge-lines in the "script" directory to test
a batch of bridge lines.

Output
------

The service responds with the following JSON:

      {
        "bridge_results": {
          "BRIDGE_LINE_1": {
Philipp Winter's avatar
Philipp Winter committed
            "functional": BOOL,
            "last_tested": "STRING",
            "error": "STRING", (only present if "functional" is false)
          },
          ...
          "BRIDGE_LINE_N": {
            ...
          }
        },
        "error": "STRING", (only present if the entire test failed)
In a nutshell, the "bridge_results" dictionary maps bridge lines (as they were
provided in the request) to a dictionary consisting of three keys: "functional"
is set to "true" if tor could fetch the bridge's descriptor.  If tor was unable
to fetch the bridge's descriptor, "functional" is set to "false" and the
"error" key maps to an error string.  The key "last_tested" maps to a string
representation (in ISO 8601 format) of the UTC time and date the bridge was
last tested.
In addition to the "bridge_results" dictionary, the response may contain an
optional "error" key if the entire test failed (e.g. if bridgestrap failed to
communicate with its tor instance).  Finally, "time" is a float that represents
the number of seconds that the test took.
Here are a few examples:
      "bridge_results": {
      },
      "error": "something truly ominous happened",
      "time": 0.32
      "bridge_results": {
        "obfs4 1.2.3.4:1234 cert=fJRlJc0T7i2Qkw3SyLQq+M6iTGs9ghLHK65LBy/MQewXJpNOKFq63Om1JHVkLlrmEBbX1w iat-mode=0": {
          "functional": true,
          "last_tested": "2020-11-12T19:42:16.736853122Z"
        },
        "1.2.3.4:1234": {
          "functional": false,
          "last_tested": "2020-11-10T09:44:45.877531581Z",
          "error": "timed out waiting for bridge descriptor"
        }
      },
      "time": 3.1824
      "bridge_results": {
        "1.2.3.4:1234 1234567890ABCDEF1234567890ABCDEF12345678": {
          "functional": false,
          "last_tested": "2020-11-10T09:44:45.877531581Z",
          "error": "timed out waiting for bridge descriptor"
        }
      },
      "time": 0