summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/FAQ4
-rw-r--r--doc/HACKING400
-rw-r--r--doc/Makefile.am83
-rw-r--r--doc/TODO4
-rw-r--r--doc/TODO.0211
-rw-r--r--doc/TODO.02277
-rw-r--r--doc/TODO.external196
-rw-r--r--doc/TODO.future10
-rwxr-xr-xdoc/asciidoc-helper.sh65
-rw-r--r--doc/codecon04.mgp357
-rw-r--r--doc/design-paper/Makefile.am26
-rw-r--r--doc/design-paper/blocking.html2112
-rw-r--r--doc/design-paper/blocking.pdfbin156628 -> 0 bytes
-rw-r--r--doc/design-paper/blocking.tex1894
-rw-r--r--doc/design-paper/cell-struct.eps189
-rw-r--r--doc/design-paper/cell-struct.fig49
-rw-r--r--doc/design-paper/cell-struct.pdfbin6175 -> 0 bytes
-rw-r--r--doc/design-paper/cell-struct.pngbin6090 -> 0 bytes
-rw-r--r--doc/design-paper/challenges.pdfbin199621 -> 0 bytes
-rw-r--r--doc/design-paper/challenges.tex1505
-rw-r--r--doc/design-paper/challenges2.tex1612
-rw-r--r--doc/design-paper/graphnodes.eps168
-rw-r--r--doc/design-paper/graphnodes.pdfbin62261 -> 0 bytes
-rw-r--r--doc/design-paper/graphtraffic.eps143
-rw-r--r--doc/design-paper/graphtraffic.pdfbin62459 -> 0 bytes
-rw-r--r--doc/design-paper/interaction.eps463
-rw-r--r--doc/design-paper/interaction.fig122
-rw-r--r--doc/design-paper/interaction.pdfbin35540 -> 0 bytes
-rw-r--r--doc/design-paper/interaction.pngbin29362 -> 0 bytes
-rw-r--r--doc/design-paper/latex8.bst1124
-rw-r--r--doc/design-paper/llncs.cls1016
-rw-r--r--doc/design-paper/sptor.tex353
-rw-r--r--doc/design-paper/tor-design.bib1493
-rw-r--r--doc/design-paper/tor-design.html2488
-rw-r--r--doc/design-paper/tor-design.pdfbin175246 -> 0 bytes
-rw-r--r--doc/design-paper/tor-design.tex1988
-rw-r--r--doc/design-paper/usenix.sty98
-rw-r--r--doc/design-paper/usenixsubmit.cls7
-rw-r--r--doc/privoxy-osx-universal-binary.txt18
-rw-r--r--doc/roadmaps/2008-12-19-roadmap-full.pdfbin178487 -> 0 bytes
-rw-r--r--doc/roadmaps/2009-03-11-performance.pdfbin1018633 -> 0 bytes
-rw-r--r--doc/roadmaps/roadmap-2007.pdfbin119462 -> 0 bytes
-rw-r--r--doc/roadmaps/roadmap-2007.tex690
-rw-r--r--doc/roadmaps/roadmap-future.pdfbin72297 -> 0 bytes
-rw-r--r--doc/roadmaps/roadmap-future.tex895
-rw-r--r--doc/rump-fc04.mgp175
-rw-r--r--doc/spec/Makefile.am2
-rw-r--r--doc/spec/address-spec.txt20
-rw-r--r--doc/spec/bridges-spec.txt1
-rw-r--r--doc/spec/control-spec-v0.txt1
-rw-r--r--doc/spec/control-spec.txt283
-rw-r--r--doc/spec/dir-spec-v1.txt1
-rw-r--r--doc/spec/dir-spec-v2.txt1
-rw-r--r--doc/spec/dir-spec.txt565
-rw-r--r--doc/spec/path-spec.txt252
-rw-r--r--doc/spec/proposals/000-index.txt39
-rw-r--r--doc/spec/proposals/001-process.txt13
-rw-r--r--doc/spec/proposals/098-todo.txt2
-rw-r--r--doc/spec/proposals/099-misc.txt2
-rw-r--r--doc/spec/proposals/100-tor-spec-udp.txt2
-rw-r--r--doc/spec/proposals/101-dir-voting.txt2
-rw-r--r--doc/spec/proposals/102-drop-opt.txt2
-rw-r--r--doc/spec/proposals/103-multilevel-keys.txt2
-rw-r--r--doc/spec/proposals/104-short-descriptors.txt2
-rw-r--r--doc/spec/proposals/105-handshake-revision.txt2
-rw-r--r--doc/spec/proposals/106-less-tls-constraint.txt2
-rw-r--r--doc/spec/proposals/107-uptime-sanity-checking.txt2
-rw-r--r--doc/spec/proposals/108-mtbf-based-stability.txt2
-rw-r--r--doc/spec/proposals/109-no-sharing-ips.txt2
-rw-r--r--doc/spec/proposals/110-avoid-infinite-circuits.txt2
-rw-r--r--doc/spec/proposals/111-local-traffic-priority.txt2
-rw-r--r--doc/spec/proposals/112-bring-back-pathlencoinweight.txt2
-rw-r--r--doc/spec/proposals/113-fast-authority-interface.txt2
-rw-r--r--doc/spec/proposals/114-distributed-storage.txt2
-rw-r--r--doc/spec/proposals/115-two-hop-paths.txt2
-rw-r--r--doc/spec/proposals/116-two-hop-paths-from-guard.txt2
-rw-r--r--doc/spec/proposals/117-ipv6-exits.txt2
-rw-r--r--doc/spec/proposals/118-multiple-orports.txt2
-rw-r--r--doc/spec/proposals/119-controlport-auth.txt2
-rw-r--r--doc/spec/proposals/120-shutdown-descriptors.txt2
-rw-r--r--doc/spec/proposals/121-hidden-service-authentication.txt2
-rw-r--r--doc/spec/proposals/122-unnamed-flag.txt2
-rw-r--r--doc/spec/proposals/123-autonaming.txt2
-rw-r--r--doc/spec/proposals/124-tls-certificates.txt2
-rw-r--r--doc/spec/proposals/125-bridges.txt2
-rw-r--r--doc/spec/proposals/126-geoip-reporting.txt2
-rw-r--r--doc/spec/proposals/127-dirport-mirrors-downloads.txt2
-rw-r--r--doc/spec/proposals/128-bridge-families.txt2
-rw-r--r--doc/spec/proposals/129-reject-plaintext-ports.txt2
-rw-r--r--doc/spec/proposals/130-v2-conn-protocol.txt2
-rw-r--r--doc/spec/proposals/131-verify-tor-usage.txt2
-rw-r--r--doc/spec/proposals/132-browser-check-tor-service.txt2
-rw-r--r--doc/spec/proposals/134-robust-voting.txt22
-rw-r--r--doc/spec/proposals/135-private-tor-networks.txt2
-rw-r--r--doc/spec/proposals/137-bootstrap-phases.txt2
-rw-r--r--doc/spec/proposals/138-remove-down-routers-from-consensus.txt2
-rw-r--r--doc/spec/proposals/140-consensus-diffs.txt11
-rw-r--r--doc/spec/proposals/141-jit-sd-downloads.txt8
-rw-r--r--doc/spec/proposals/142-combine-intro-and-rend-points.txt2
-rw-r--r--doc/spec/proposals/143-distributed-storage-improvements.txt2
-rw-r--r--doc/spec/proposals/145-newguard-flag.txt2
-rw-r--r--doc/spec/proposals/146-long-term-stability.txt2
-rw-r--r--doc/spec/proposals/147-prevoting-opinions.txt2
-rw-r--r--doc/spec/proposals/148-uniform-client-end-reason.txt2
-rw-r--r--doc/spec/proposals/149-using-netinfo-data.txt6
-rw-r--r--doc/spec/proposals/150-exclude-exit-nodes.txt1
-rw-r--r--doc/spec/proposals/151-path-selection-improvements.txt161
-rw-r--r--doc/spec/proposals/152-single-hop-circuits.txt2
-rw-r--r--doc/spec/proposals/153-automatic-software-update-protocol.txt2
-rw-r--r--doc/spec/proposals/154-automatic-updates.txt2
-rw-r--r--doc/spec/proposals/155-four-hidden-service-improvements.txt2
-rw-r--r--doc/spec/proposals/156-tracking-blocked-ports.txt2
-rw-r--r--doc/spec/proposals/157-specific-cert-download.txt2
-rw-r--r--doc/spec/proposals/158-microdescriptors.txt209
-rw-r--r--doc/spec/proposals/159-exit-scanning.txt2
-rw-r--r--doc/spec/proposals/160-bandwidth-offset.txt105
-rw-r--r--doc/spec/proposals/161-computing-bandwidth-adjustments.txt174
-rw-r--r--doc/spec/proposals/162-consensus-flavors.txt188
-rw-r--r--doc/spec/proposals/163-detecting-clients.txt115
-rw-r--r--doc/spec/proposals/164-reporting-server-status.txt91
-rw-r--r--doc/spec/proposals/165-simple-robust-voting.txt133
-rw-r--r--doc/spec/proposals/166-statistics-extra-info-docs.txt391
-rw-r--r--doc/spec/proposals/167-params-in-consensus.txt47
-rw-r--r--doc/spec/proposals/168-reduce-circwindow.txt134
-rw-r--r--doc/spec/proposals/169-eliminating-renegotiation.txt404
-rw-r--r--doc/spec/proposals/170-user-path-config.txt95
-rw-r--r--doc/spec/proposals/172-circ-getinfo-option.txt138
-rw-r--r--doc/spec/proposals/173-getinfo-option-expansion.txt101
-rw-r--r--doc/spec/proposals/174-optimistic-data-server.txt242
-rw-r--r--doc/spec/proposals/ideas/xxx-bwrate-algs.txt106
-rw-r--r--doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt138
-rw-r--r--doc/spec/proposals/ideas/xxx-encrypted-services.txt18
-rw-r--r--doc/spec/proposals/ideas/xxx-hide-platform.txt2
-rw-r--r--doc/spec/proposals/ideas/xxx-port-knocking.txt2
-rw-r--r--doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt2
-rw-r--r--doc/spec/proposals/ideas/xxx-using-spdy.txt143
-rw-r--r--doc/spec/proposals/ideas/xxx-what-uses-sha1.txt139
-rwxr-xr-xdoc/spec/proposals/reindex.py2
-rw-r--r--doc/spec/rend-spec.txt612
-rw-r--r--doc/spec/socks-extensions.txt1
-rw-r--r--doc/spec/tor-spec.txt39
-rw-r--r--doc/spec/version-spec.txt1
-rw-r--r--doc/tor-gencert.186
-rw-r--r--doc/tor-gencert.1.txt90
-rw-r--r--doc/tor-osx-dmg-creation.txt145
-rw-r--r--doc/tor-resolve.138
-rw-r--r--doc/tor-resolve.1.txt45
-rw-r--r--doc/tor-win32-mingw-creation.txt42
-rw-r--r--doc/tor.1.in1519
-rw-r--r--doc/tor.1.txt1436
-rw-r--r--doc/torify.1.txt50
-rw-r--r--doc/translations.txt87
152 files changed, 6685 insertions, 21939 deletions
diff --git a/doc/FAQ b/doc/FAQ
deleted file mode 100644
index 3a7db3ae66..0000000000
--- a/doc/FAQ
+++ /dev/null
@@ -1,4 +0,0 @@
-This file is obsolete. Check out the online FAQ at the wiki
-for more accurate and complete questions and answers:
-http://wiki.noreply.org/wiki/TheOnionRouter/TorFAQ
-
diff --git a/doc/HACKING b/doc/HACKING
index 50b5d80d18..486fe6d10a 100644
--- a/doc/HACKING
+++ b/doc/HACKING
@@ -1,41 +1,189 @@
+Hacking Tor: An Incomplete Guide
+================================
-0. Useful tools.
+Getting started
+---------------
-0.0 The buildbot.
+For full information on how Tor is supposed to work, look at the files in
+doc/spec/ .
- http://tor-buildbot.freehaven.net:8010/
+For an explanation of how to change Tor's design to work differently, look at
+doc/spec/proposals/001-process.txt .
- - Down because nickm isn't running services at home any more. ioerror says
- he will resurrect it.
+For the latest version of the code, get a copy of git, and
-0.1. Useful command-lines that are non-trivial to reproduce but can
-help with tracking bugs or leaks.
+ git clone git://git.torproject.org/git/tor .
-dmalloc -l ~/dmalloc.log
-(run the commands it tells you)
-./configure --with-dmalloc
+We talk about Tor on the or-talk mailing list. Design proposals and
+discussion belong on the or-dev mailing list. We hang around on
+irc.oftc.net, with general discussion happening on #tor and development
+happening on #tor-dev.
+
+How we use Git branches
+-----------------------
+
+Each main development series (like 0.2.1, 0.2.2, etc) has its main work
+applied to a single branch. At most one series can be the development series
+at a time; all other series are maintenance series that get bug-fixes only.
+The development series is built in a git branch called "master"; the
+maintenance series are built in branches called "maint-0.2.0", "maint-0.2.1",
+and so on. We regularly merge the active maint branches forward.
+
+For all series except the development series, we also have a "release" branch
+(as in "release-0.2.1"). The release series is based on the corresponding
+maintenance series, except that it deliberately lags the maint series for
+most of its patches, so that bugfix patches are not typically included in a
+maintenance release until they've been tested for a while in a development
+release. Occasionally, we'll merge an urgent bugfix into the release branch
+before it gets merged into maint, but that's rare.
+
+If you're working on a bugfix for a bug that occurs in a particular version,
+base your bugfix branch on the "maint" branch for the first _actively
+developed_ series that has that bug. (Right now, that's 0.2.1.) If you're
+working on a new feature, base it on the master branch.
+
+
+How we log changes
+------------------
+
+When you do a commit that needs a ChangeLog entry, add a new file to
+the "changes" toplevel subdirectory. It should have the format of a
+one-entry changelog section from the current ChangeLog file, as in
+
+ o Major bugfixes:
+ - Fix a potential buffer overflow. Fixes bug 9999; bugfix on
+ 0.3.1.4-beta.
+
+To write a changes file, first categorize the change. Some common categories
+are: Minor bugfixes, Major bugfixes, Minor features, Major features, Code
+simplifications and refactoring. Then say what the change does. If
+it's a bugfix, mention what bug it fixes and when the bug was
+introduced. To find out which Git tag the change was introduced in,
+you can use "git describe --contains <sha1 of commit>".
+
+If at all possible, try to create this file in the same commit where
+you are making the change. Please give it a distinctive name that no
+other branch will use for the lifetime of your change.
+
+When Roger goes to make a release, he will concatenate all the entries
+in changes to make a draft changelog, and clear the directory. He'll
+then edit the draft changelog into a nice readable format.
+
+What needs a changes file?::
+ A not-exhaustive list: Anything that might change user-visible
+ behavior. Anything that changes internals, documentation, or the build
+ system enough that somebody could notice. Big or interesting code
+ rewrites. Anything about which somebody might plausibly wonder "when
+ did that happen, and/or why did we do that" 6 months down the line.
+
+Why use changes files instead of Git commit messages?::
+ Git commit messages are written for developers, not users, and they
+ are nigh-impossible to revise after the fact.
+
+Why use changes files instead of entries in the ChangeLog?::
+ Having every single commit touch the ChangeLog file tended to create
+ zillions of merge conflicts.
+
+Useful tools
+------------
+
+These aren't strictly necessary for hacking on Tor, but they can help track
+down bugs.
+
+The buildbot
+~~~~~~~~~~~~
+
+https://buildbot.vidalia-project.net/one_line_per_build
+
+Dmalloc
+~~~~~~~
+
+The dmalloc library will keep track of memory allocation, so you can find out
+if we're leaking memory, doing any double-frees, or so on.
+
+ dmalloc -l ~/dmalloc.log
+ (run the commands it tells you)
+ ./configure --with-dmalloc
+
+Valgrind
+~~~~~~~~
valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
-0.2. Running gcov for unit test coverage
+(Note that if you get a zillion openssl warnings, you will also need to
+pass --undef-value-errors=no to valgrind, or rebuild your openssl
+with -DPURIFY.)
+Running gcov for unit test coverage
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+-----
make clean
make CFLAGS='-g -fprofile-arcs -ftest-coverage'
- ./src/or/test
+ ./src/test/test
cd src/common; gcov *.[ch]
cd ../or; gcov *.[ch]
+-----
+
+Then, look at the .gcov files. '-' before a line means that the
+compiler generated no code for that line. '######' means that the
+line was never reached. Lines with numbers were called that number
+of times.
+
+Profiling Tor with oprofile
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The oprofile tool runs (on Linux only!) to tell you what functions Tor is
+spending its CPU time in, so we can identify berformance pottlenecks.
+
+Here are some basic instructions
+
+ - Build tor with debugging symbols (you probably already have, unless
+ you messed with CFLAGS during the build process).
+ - Build all the libraries you care about with debugging symbols
+ (probably you only care about libssl, maybe zlib and Libevent).
+ - Copy this tor to a new directory
+ - Copy all the libraries it uses to that dir too (ldd ./tor will
+ tell you)
+ - Set LD_LIBRARY_PATH to include that dir. ldd ./tor should now
+ show you it's using the libs in that dir
+ - Run that tor
+ - Reset oprofiles counters/start it
+ * "opcontrol --reset; opcontrol --start", if Nick remembers right.
+ - After a while, have it dump the stats on tor and all the libs
+ in that dir you created.
+ * "opcontrol --dump;"
+ * "opreport -l that_dir/*"
+ - Profit
+
- Then, look at the .gcov files. '-' before a line means that the
- compiler generated no code for that line. '######' means that the
- line was never reached. Lines with numbers were called that number
- of times.
+Coding conventions
+------------------
-1. Coding conventions
+Patch checklist
+~~~~~~~~~~~~~~~
-1.0. Whitespace and C conformance
+If possible, send your patch as one of these (in descending order of
+preference)
+
+ - A git branch we can pull from
+ - Patches generated by git format-patch
+ - A unified diff
+
+Did you remember...
+
+ - To build your code while configured with --enable-gcc-warnings?
+ - To run "make check-spaces" on your code?
+ - To write unit tests, as possible?
+ - To base your code on the appropriate branch?
+ - To include a file in the "changes" directory as appropriate?
+
+Whitespace and C conformance
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Invoke "make check-spaces" from time to time, so it can tell you about
+deviations from our C whitespace style. Generally, we use:
- Invoke "make check-spaces" from time to time, so it can tell you about
- deviations from our C whitespace style. Generally, we use:
- Unix-style line endings
- K&R-style indentation
- No space before newlines
@@ -52,15 +200,17 @@ valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
"puts (x)".
- Function declarations at the start of the line.
- We try hard to build without warnings everywhere. In particular, if you're
- using gcc, you should invoke the configure script with the option
- "--enable-gcc-warnings". This will give a bunch of extra warning flags to
- the compiler, and help us find divergences from our preferred C style.
+We try hard to build without warnings everywhere. In particular, if you're
+using gcc, you should invoke the configure script with the option
+"--enable-gcc-warnings". This will give a bunch of extra warning flags to
+the compiler, and help us find divergences from our preferred C style.
-1.0.1. Getting emacs to edit Tor source properly.
+Getting emacs to edit Tor source properly
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Hi, folks! Nick here. I like to put the following snippet in my .emacs
- file:
+Nick likes to put the following snippet in his .emacs file:
+
+-----
(add-hook 'c-mode-hook
(lambda ()
(font-lock-mode 1)
@@ -80,90 +230,99 @@ valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
(set-variable 'c-basic-offset 8)
(set-variable 'tab-width 8))
))))
+-----
- You'll note that it defaults to showing all trailing whitespace. The
- "cond" test detects whether the file is one of a few C free software
- projects that I often edit, and sets up the indentation level and tab
- preferences to match what they want.
+You'll note that it defaults to showing all trailing whitespace. The "cond"
+test detects whether the file is one of a few C free software projects that I
+often edit, and sets up the indentation level and tab preferences to match
+what they want.
- If you want to try this out, you'll need to change the filename regex
- patterns to match where you keep your Tor files.
+If you want to try this out, you'll need to change the filename regex
+patterns to match where you keep your Tor files.
- If you *only* use emacs to edit Tor, you could always just say:
+If you use emacs for editing Tor and nothing else, you could always just say:
- (add-hook 'c-mode-hook
+-----
+ (add-hook 'c-mode-hook
(lambda ()
(font-lock-mode 1)
(set-variable 'show-trailing-whitespace t)
(set-variable 'indent-tabs-mode nil)
(set-variable 'c-basic-offset 2)))
+-----
- There is probably a better way to do this. No, we are probably not going
- to clutter the files with emacs stuff.
+There is probably a better way to do this. No, we are probably not going
+to clutter the files with emacs stuff.
-1.1. Details
- Use tor_malloc, tor_free, tor_strdup, and tor_gettimeofday instead of their
- generic equivalents. (They always succeed or exit.)
+Functions to use
+~~~~~~~~~~~~~~~~
- You can get a full list of the compatibility functions that Tor provides by
- looking through src/common/util.h and src/common/compat.h. You can see the
- available containers in src/common/containers.h. You should probably
- familiarize yourself with these modules before you write too much code,
- or else you'll wind up reinventing the wheel.
+We have some wrapper functions like tor_malloc, tor_free, tor_strdup, and
+tor_gettimeofday; use them instead of their generic equivalents. (They
+always succeed or exit.)
- Use 'INLINE' instead of 'inline', so that we work properly on Windows.
+You can get a full list of the compatibility functions that Tor provides by
+looking through src/common/util.h and src/common/compat.h. You can see the
+available containers in src/common/containers.h. You should probably
+familiarize yourself with these modules before you write too much code, or
+else you'll wind up reinventing the wheel.
-1.2. Calling and naming conventions
+Use 'INLINE' instead of 'inline', so that we work properly on Windows.
- Whenever possible, functions should return -1 on error and 0 on success.
+Calling and naming conventions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- For multi-word identifiers, use lowercase words combined with
- underscores. (e.g., "multi_word_identifier"). Use ALL_CAPS for macros and
- constants.
+Whenever possible, functions should return -1 on error and 0 on success.
- Typenames should end with "_t".
+For multi-word identifiers, use lowercase words combined with
+underscores. (e.g., "multi_word_identifier"). Use ALL_CAPS for macros and
+constants.
- Function names should be prefixed with a module name or object name. (In
- general, code to manipulate an object should be a module with the same
- name as the object, so it's hard to tell which convention is used.)
+Typenames should end with "_t".
- Functions that do things should have imperative-verb names
- (e.g. buffer_clear, buffer_resize); functions that return booleans should
- have predicate names (e.g. buffer_is_empty, buffer_needs_resizing).
+Function names should be prefixed with a module name or object name. (In
+general, code to manipulate an object should be a module with the same name
+as the object, so it's hard to tell which convention is used.)
- If you find that you have four or more possible return code values, it's
- probably time to create an enum. If you find that you are passing three or
- more flags to a function, it's probably time to create a flags argument
- that takes a bitfield.
+Functions that do things should have imperative-verb names
+(e.g. buffer_clear, buffer_resize); functions that return booleans should
+have predicate names (e.g. buffer_is_empty, buffer_needs_resizing).
-1.3. What To Optimize
+If you find that you have four or more possible return code values, it's
+probably time to create an enum. If you find that you are passing three or
+more flags to a function, it's probably time to create a flags argument that
+takes a bitfield.
- Don't optimize anything if it's not in the critical path. Right now,
- the critical path seems to be AES, logging, and the network itself.
- Feel free to do your own profiling to determine otherwise.
+What To Optimize
+~~~~~~~~~~~~~~~~
-1.4. Log conventions
+Don't optimize anything if it's not in the critical path. Right now, the
+critical path seems to be AES, logging, and the network itself. Feel free to
+do your own profiling to determine otherwise.
- http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#LogLevels
+Log conventions
+~~~~~~~~~~~~~~~
- No error or warning messages should be expected during normal OR or OP
- operation.
+https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#LogLevels
- If a library function is currently called such that failure always
- means ERR, then the library function should log WARN and let the caller
- log ERR.
+No error or warning messages should be expected during normal OR or OP
+operation.
- [XXX Proposed convention: every message of severity INFO or higher should
- either (A) be intelligible to end-users who don't know the Tor source; or
- (B) somehow inform the end-users that they aren't expected to understand
- the message (perhaps with a string like "internal error"). Option (A) is
- to be preferred to option (B). -NM]
+If a library function is currently called such that failure always means ERR,
+then the library function should log WARN and let the caller log ERR.
-1.5. Doxygen
+[XXX Proposed convention: every message of severity INFO or higher should
+either (A) be intelligible to end-users who don't know the Tor source; or (B)
+somehow inform the end-users that they aren't expected to understand the
+message (perhaps with a string like "internal error"). Option (A) is to be
+preferred to option (B). -NM]
- We use the 'doxygen' utility to generate documentation from our
- source code. Here's how to use it:
+Doxygen
+~~~~~~~~
+
+We use the 'doxygen' utility to generate documentation from our
+source code. Here's how to use it:
1. Begin every file that should be documented with
/**
@@ -214,11 +373,12 @@ valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
6. See the Doxygen manual for more information; this summary just
scratches the surface.
-1.5.1. Doxygen comment conventions
+Doxygen comment conventions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Say what functions do as a series of one or more imperative sentences, as
- though you were telling somebody how to be the function. In other words,
- DO NOT say:
+Say what functions do as a series of one or more imperative sentences, as
+though you were telling somebody how to be the function. In other words, DO
+NOT say:
/** The strtol function parses a number.
*
@@ -230,7 +390,7 @@ valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
*/
long strtol(const char *nptr, char **nptr, int base);
- Instead, please DO say:
+Instead, please DO say:
/** Parse a number in radix <b>base</b> from the string <b>nptr</b>,
* and return the result. Skip all leading whitespace. If
@@ -239,66 +399,10 @@ valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
**/
long strtol(const char *nptr, char **nptr, int base);
- Doxygen comments are the contract in our abstraction-by-contract world: if
- the functions that call your function rely on it doing something, then your
- function should mention that it does that something in the documentation.
- If you rely on a function doing something beyond what is in its
- documentation, then you should watch out, or it might do something else
- later.
-
-2. Code notes
-
-2.1. Dataflows
-
-2.1.1. How Incoming data is handled
-
-There are two paths for data arriving at Tor over the network: regular
-TCP data, and DNS.
-
-2.1.1.1. TCP.
-
-When Tor takes information over the network, it uses the functions
-read_to_buf() and read_to_buf_tls() in buffers.c. These read from a
-socket or an SSL* into a buffer_t, which is an mbuf-style linkedlist
-of memory chunks.
-
-read_to_buf() and read_to_buf_tls() are called only from
-connection_read_to_buf() in connection.c. It takes a connection_t
-pointer, and reads data into it over the network, up to the
-connection's current bandwidth limits. It places that data into the
-"inbuf" field of the connection, and then:
- - Adjusts the connection's want-to-read/want-to-write status as
- appropriate.
- - Increments the read and written counts for the connection as
- appropriate.
- - Adjusts bandwidth buckets as appropriate.
-
-connection_read_to_buf() is called only from connection_handle_read().
-The connection_handle_read() function is called whenever libevent
-decides (based on select, poll, epoll, kqueue, etc) that there is data
-to read from a connection. If any data is read,
-connection_handle_read() calls connection_process_inbuf() to see if
-any of the data can be processed. If the connection was closed,
-connection_handle_read() calls connection_reached_eof().
-
-Connection_process_inbuf() and connection_reached_eof() both dispatch
-based on the connection type to determine what to do with the data
-that's just arrived on the connection's inbuf field. Each type of
-connection has its own version of these functions. For example,
-directory connections process incoming data in
-connection_dir_process_inbuf(), while OR connections process incoming
-data in connection_or_process_inbuf(). These
-connection_*_process_inbuf() functions extract data from the
-connection's inbuf field (a buffer_t), using functions from buffers.c.
-Some of these accessor functions are straightforward data extractors
-(like fetch_from_buf()); others do protocol-specific parsing.
-
-
-2.1.1.2. DNS
-
-Tor launches (and optionally accepts) DNS requests using the code in
-eventdns.c, which is a copy of libevent's evdns.c. (We don't use
-libevent's version because it is not yet in the versions of libevent
-all our users have.) DNS replies are read in nameserver_read();
-DNS queries are read in server_port_read().
+Doxygen comments are the contract in our abstraction-by-contract world: if
+the functions that call your function rely on it doing something, then your
+function should mention that it does that something in the documentation. If
+you rely on a function doing something beyond what is in its documentation,
+then you should watch out, or it might do something else later.
+
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 79123d81d5..693378c486 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,12 +1,83 @@
-EXTRA_DIST = HACKING \
- tor-resolve.1 tor-gencert.1 \
- tor-osx-dmg-creation.txt tor-rpm-creation.txt \
+# We use a two-step process to generate documentation from asciidoc files.
+#
+# First, we use asciidoc/a2x to process the asciidoc files into .1.in and
+# .html.in files (see the asciidoc-helper.sh script). These are the same as
+# the regular .1 and .html files, except that they still have some autoconf
+# variables set in them.
+#
+# Second, we use config.status to turn .1.in files into .1 files and
+# .html.in files into .html files.
+#
+# We do the steps in this order so that we can ship the .*.in files as
+# part of the source distribution, so that people without asciidoc can
+# just use the .1 and .html files.
+
+if USE_ASCIIDOC
+asciidoc_files = tor tor-gencert tor-resolve torify
+html_in = $(asciidoc_files:=.html.in)
+man_in = $(asciidoc_files:=.1.in)
+txt_in = $(asciidoc_files:=.1.txt)
+nodist_man_MANS = $(asciidoc_files:=.1)
+doc_DATA = $(asciidoc_files:=.html)
+else
+asciidoc_files =
+html_in =
+man_in =
+txt_in =
+nodist_man_MANS =
+doc_DATA =
+endif
+
+EXTRA_DIST = HACKING asciidoc-helper.sh \
+ $(html_in) $(man_in) $(txt_in) \
+ tor-rpm-creation.txt \
tor-win32-mingw-creation.txt
-man_MANS = tor.1 tor-resolve.1 tor-gencert.1
+docdir = @docdir@
+
+asciidoc_product = $(nodist_man_MANS) $(doc_DATA)
+
+SUBDIRS = spec
+
+DIST_SUBDIRS = spec
+
+# Generate the html documentation from asciidoc, but don't do
+# machine-specific replacements yet
+$(html_in) :
+ $(top_srcdir)/doc/asciidoc-helper.sh html @ASCIIDOC@ $(top_srcdir)/doc/$@
+
+tor.html.in : tor.1.txt
+torify.html.in : torify.1.txt
+tor-gencert.html.in : tor-gencert.1.txt
+tor-resolve.html.in : tor-resolve.1.txt
+
+# Generate the manpage from asciidoc, but don't do
+# machine-specific replacements yet
+$(man_in) :
+ $(top_srcdir)/doc/asciidoc-helper.sh man @A2X@ $(top_srcdir)/doc/$@
+
+tor.1.in : tor.1.txt
+torify.1.in : torify.1.txt
+tor-gencert.1.in : tor-gencert.1.txt
+tor-resolve.1.in : tor-resolve.1.txt
-SUBDIRS = design-paper spec
+# use ../config.status to swap all machine-specific magic strings
+# in the asciidoc with their replacements.
+$(asciidoc_product) :
+ if test -e $(top_srcdir)/doc/$@.in && ! test -e ./$@.in ; then \
+ cp $(top_srcdir)/doc/$@.in .; \
+ fi
+ ../config.status --file=$@;
-DIST_SUBDIRS = design-paper spec
+tor.1 : tor.1.in
+torify.1 : torify.1.in
+tor-gencert.1 : tor-gencert.1.in
+tor-resolve.1 : tor-resolve.1.in
+tor.html : tor.html.in
+torify.html : torify.html.in
+tor-gencert.html : tor-gencert.html.in
+tor-resolve.html : tor-resolve.html.in
+CLEANFILES = $(asciidoc_product) config.log
+DISTCLEANFILES = $(html_in) $(man_in)
diff --git a/doc/TODO b/doc/TODO
index fd023c8bf5..194d6507bc 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -4,8 +4,8 @@ We've split out our TODO into three files:
TODO.02x is the list of items we're planning to get done in the next
stable release.
-TODO.external is the list of external constraints and deliverables that
-we all need to keep in mind.
+TODO.external lives in svn under /projects/todo/. It's the list of
+external constraints and deliverables that we all need to keep in mind.
TODO.future is the list of other items we plan to get to in later releases.
diff --git a/doc/TODO.021 b/doc/TODO.021
index 881ba5ee4b..37c5b9845b 100644
--- a/doc/TODO.021
+++ b/doc/TODO.021
@@ -1,4 +1,3 @@
-$Id$
Legend:
SPEC!! - Not specified
SPEC - Spec not finalized
diff --git a/doc/TODO.022 b/doc/TODO.022
index 3eeae006cb..d83ed6e671 100644
--- a/doc/TODO.022
+++ b/doc/TODO.022
@@ -8,44 +8,85 @@ NOTE 2: It's easy to list stuff like this with no time estimates and
0.2.2, figure out how long the stuff we want will take, and
triage accordingly, or vice versa.
-- Design
- - Begin design work for UDP transition; identify areas where we need to
- make changes or instrument stuff early.
-
- Performance, mostly protocol-neutral.
- - Work with Libevent 2.0's bufferevent interface
- - Identify any performance stuff we need to push back into
- libevent to make it as fast as we want.
- - Revise how we do bandwidth limiting and round-robining between
+ o Revise how we do bandwidth limiting and round-robining between
circuits on a connection.
- - Revise how we do bandwidth limiting and round-robining between
+ . Revise how we do bandwidth limiting and round-robining between
connections.
- Better flow-control to avoid filling buffers on routers.
- - Split AES across cores if possible.
- - Split SSL across cores (reach; may require Libevent 2.1).
-
- Figure out good ways to instrument Tor internals so we can tell
how well our bandwidth and flow-control stuff is actually working.
+ - What ports eat the bandwidth?
+ - How full do queues get?
+ - How much latency do queues get?
+
+ - Rate limit at clients:
+ - Give clients an upper bound on how much they're willing to use
+ the network if they're not relaying?
+ - ... or group client circuits by IP at the server and rate-limit
+ like that.
+
+ - Use if-modified-since to download consensuses
-- Features
+
+- Other features
- Proposals to implement:
- - 146: reflect long-term stability
+ - 146: reflect long-term stability in consensuses
- 147: Stop using v2 directories to generate v3 votes.
+ - Start pinging as soon as we learn about a relay, not on a
+ 22-minute cycle. Prioritize new and volatile relays for
+ testing.
- Proposals to improve and implement
- 158: microdescriptors
+ o Revise proposal
+ - Implement
- Proposals to improve and implement if not broken
- - IPv6 support. (Parts of 117, but figure out how to handle DNS
+ D IPv6 support. (Parts of 117, but figure out how to handle DNS
requests.)
- 140: Directory diffs
+ - Need a decent simple C diff implementation.
+ - Need a decent simple C ed patch implementation.
- 149: learn info from netinfo cells.
- - 134: handle authority fragmentation (Needs more analysis)
+ o Start discussion
+ - Revise proposal based on discussion.
+ X 134: handle authority fragmentation (Needs more analysis)
+ - 165: Easy migration for voting authority sets
+ - 163: Detect client-status better
+ o Write proposal
+ - Possibly implement, depending on discussion.
+ - 164: Have authorities report relay and voting status better: make it
+ easy to answer, "Why is my server not listed/not Guard/not
+ Running/etc"
+ o Write proposal
+ - Possibly implement, depending on discussion
+ - 162: Have consensuses come in multiple "flavours".
+ o Write proposal
+ - Possibly implement, depending on discussion.
+
+ - Needs a proposal, or at least some design
+ - Weaken the requirements for being a Guard, based on K's
+ measurements.
+K - Finish measurements
+K? - Write proposal
+ - Adaptive timeouts for giving up on circuits and streams.
+M - Revise proposal 151
+ - Downweight guards more sensibly: be more forgiving about using
+ Guard nodes as non-first-hop.
+ - Write proposal.
+ - Lagged weight updates in consensuses: don't just move abruptly.
+M? - Write proposal
+ d Don't kill a circuit on the first failed extend.
+
+- Installers
+ - Switch to MSI on win32
+ - Use Thandy, perhaps?
-- Deprecations
- - Make .exit safe, or make it off-by-default.
+o Deprecations
+ o Make .exit safe, or make it off-by-default.
diff --git a/doc/TODO.external b/doc/TODO.external
index c02d6aca54..2e7e536efc 100644
--- a/doc/TODO.external
+++ b/doc/TODO.external
@@ -1,196 +1,4 @@
-$Id$
-Legend:
-SPEC!! - Not specified
-SPEC - Spec not finalized
-N - nick claims
-R - arma claims
-P - phobos claims
-S - Steven claims
-E - Matt claims
-M - Mike claims
-J - Jeff claims
-I - ioerror claims
-W - weasel claims
-K - Karsten claims
-C - coderman claims
- - Not done
- * Top priority
- . Partially done
- o Done
- d Deferrable
- D Deferred
- X Abandoned
-=======================================================================
-
-External constraints:
-
-For June/July:
-NR - Work more on Paul's NRL research problem.
-
-For March 22:
-I * Email auto-responder
- * teach gettor how to ask for (and attach) split files.
-
-K . Metrics.
- . With Mike's help, use Torflow to start doing monthly rudimentary
- performance evaluations:
- . Circuit throughput and latency
- - Measure via Broadband and dialup
- . Publish a report addressing key long-term metrics questions:
- . What metrics should we present?
- . What data are available for these metrics?
- . What data are missing, and can collect them safely? Can we
- publish them safely?
- . What systems are available to present this data?
-
-E . Vidalia improvements
- o Vidalia displays by-country user summary for bridge operators
-? - write a help page for vidalia, "what is this"
-
-For mid August:
-
-Section 0, items that didn't make it into the original roadmap:
-
-0.1, installers and packaging
-C . i18n for the msi bundle files
-P . more consistent TBB builds
-IC- get a buildbot up again. Have Linux and BSD build machines.
- (Windows would be nice but realistically will come later.)
-E - Get Tor to work properly on the iPhone.
-
-3.1, performance work. [Section numbers in here are from performance.pdf]
- - High-priority items from performance.pdf
-RS - 1.2, new circuit window sizes. make the default package window lower.
-R+ - 2.1, squeeze loud circuits
- - Evaluate the code to see what stats we can keep about circuit use.
- - Write proposals for various meddling. Look at the research papers
- that Juliusz pointed us to. Ask our systems friends. Plan to put
- a lot of the parameters in the consensus, so we can tune it with
- short turnaround times.
-E+ - 2.5, Change Vidalia's default exit policy to not click "other
- protocols". Or choose not to. Think this through first.
-R+ - 2.6, Tell users not to file-share.
- - Put statement on the Tor front page
- - Put statement on the download pages too
- - And the FAQ
- - 3.1.2, Tor weather
-I - Implement time-to-notification (immediate, a day, a week)
-I - Get a relay operator mailing list going, with a plan and supporting
- scripts and so on.
-R - Link to them from the Tor relay page
-R - and the torrc.sample?
-SM - 4.1, balance traffic better
- - Steven and Mike should decide if we should do Steven's plan
- (rejigger the bandwidth numbers at the authorities based on
- Steven's algorithm), or Mike's plan (relay scanning to identify
- the unbalanced relays and fix them on the fly), or both.
- - Figure out how to actually modify bandwidths in the consensus. We
- may need to change the consensus voting algorithm to decide what
- bandwidth to advertise based on something other than median:
- if 7 authorities provide bandwidths, and 2 are doing scanning,
- then the 5 that aren't scanning will outvote any changes. Should
- all 7 scan? Should only some vote? Extra points if it doesn't
- change all the numbers every new consensus, so consensus diffing
- is still practical.
-? - 4.5, Older entry guards are overloaded
- - Pick a conservative timeout like a month, and implement.
-M - 5.2, better timeouts for giving up on circuits/streams
- - clients gather data about circuit timeouts, and then abandon
- circuits that take more than a std dev above that.
-
-4.1, IOCP / libevent / windows / tor
-N - get it working for nick
-N - put out a release so other people can start testing it.
-N - both the libevent buffer abstraction, and the
- tor-uses-libevent-buffer-abstraction. Unless we think that's
- unreachable for this milestone?
-
-4.2.1, risks from becoming a relay
-S - Have a clear plan for how users who become relays will be safe,
- and be confident that we can build this plan.
- - evaluate all the various attacks that are made possible by relaying.
- specifically, see "relaying-traffic attacks" in 6.6.
- - identify and evaluate ways to make them not a big deal
- - setting a low RelayBandwidth
- - Nick Hopper's FC08 paper suggesting that we should do a modified
- round-robin so we leak less about other circuits
- - instructing clients to disable pings in their firewall, etc
- - pick the promising ones, improve them so they're even better, and
- spec them out so we know how to build them and how much effort is
- involved in building them.
-
-4.5, clients download less directory info
-N * deploy proposal 158.
-N - decide whether to do proposal 140. if so, construct an implementation
- plan for how we'll do it. if not, explain why not.
-
-5.1, Normalize TLS fingerprint
-N o write a draft list of possible attacks for this section, with
- estimates about difficulty of attack, difficulty of solution, etc
-N - revisit the list and revise our plans as needed
-NR- put up a blog post about the two contradictory conclusions: we can
- discuss the theory of arms races, and our quandry, without revealing
- any specific vulnerabilities. (or decide not to put up a blog post,
- and explain why not.)
-
-5.5, email autoresponder
-I . maintenance and keeping it running
-
-5.7.2, metrics
-
-XXX.
-
-6.2, Vidalia work
-E - add breakpad support or similar for windows debugging
-E o let vidalia change languages without needing a restart
-E - Implement the status warning event interface started for the
- phase one deliverables.
-E - Work with Steve Tyree on building a Vidalia plugin API to enable
- building Herdict and TBB plugins.
-
-6.3, Node scanning
-M - Steps toward automation
- - Set up email list for results
- - Map failure types to potential BadExit lines
-M - Improve the ability of SoaT to mimic various real web browsers
- - randomizing user agents and locale strings
- - caching, XMLHTTPRequest, form posting, content sniffing
- - Investigate ideas like running Chrome/xulrunner in parallel
-M - Other protocols
- - SSH, IMAPS, POPS, SMTPS
-M - Add ability to geolocalize exit selection based on scanner location
- - Use this to rescan dynamic urls filtered by the URL filter
-
-6.4, Torbutton development
-M - Resolve extension conflicts and other high priority bugs
-M - Fix or hack around ugly firefox bugs, especially Timezone issue.
- Definitely leaning towards "hack around" unless we see some
- level of love from Mozilla.
-M - Vidalia New Nym Integration
- - Implement for Torbutton to pick up on Vidalia's NEWNYM and clear
- cookies based on FoeBud's source
- - Do this in such a way that we could adapt polipo to purge cache
- if we were so inclined
-M - Write up a summary of our options for dealing with the google
- you-must-solve-a-captcha-to-search problem, and pick one as our
- favorite option.
-
-6.6, Evaluate new anonymity attacks
-S - relaying-traffic attacks
- - original murdoch-danezis attack
- - nick hopper's latency measurement attack
- - columbia bandwidth measurement attack
- - christian grothoff's long-circuit attack
-S - client attacks
- - website fingerprinting
-
-7.1, Tor VM Research, analysis, and prototyping
-C . Get a working package out, meaning other people are testing it.
-
-7.2, Tor Browser Bundle
-I - Port to one of OS X or Linux, and start the port to the other.
-I . Make it the recommended Tor download on Windows
-I - Make sure it's easy to un-brand TBB in case Firefox asks us to
-I - Evaluate CCC's Freedom Stick
+[This file moved to svn in /projects/todo/. More people can edit
+it more easily there. -RD]
diff --git a/doc/TODO.future b/doc/TODO.future
index 64169ecfec..85e07aa921 100644
--- a/doc/TODO.future
+++ b/doc/TODO.future
@@ -1,4 +1,3 @@
-$Id$
Legend:
SPEC!! - Not specified
SPEC - Spec not finalized
@@ -23,7 +22,6 @@ K - Karsten claims
=======================================================================
Later, unless people want to implement them now:
- - tor as a socks proxy should accept (and ignore) password auth
- Actually use SSL_shutdown to close our TLS connections.
- Include "v" line in networkstatus getinfo values.
[Nick: bridge authorities output a networkstatus that is missing
@@ -31,10 +29,6 @@ Later, unless people want to implement them now:
bridgedb gives out bridges with certain characteristics. -RD]
[Okay. Is this a separate item, or is it the same issue as the lack of
a "v" line in response to the controller GETINFO command? -NM]
- - Let tor dir mirrors proxy connections to the tor download site, so
- if you know a bridge you can fetch the tor software.
- - when somebody uses the controlport as an http proxy, give them
- a "tor isn't an http proxy" error too like we do for the socks port.
- MAYBE kill stalled circuits rather than stalled connections. This is
possible thanks to cell queues, but we need to consider the anonymity
implications.
@@ -46,8 +40,6 @@ Later, unless people want to implement them now:
online config documentation from a single source.
- It would be potentially helpful to respond to https requests on
the OR port by acting like an HTTPS server.
- - Make the timestamp granularity on logs configurable, with default
- of "1 second". This might make some kinds of after-the-fact attack harder.
- We should get smarter about handling address resolve failures, or
addresses that resolve to local IPs. It would be neat to retry
@@ -273,7 +265,7 @@ Future versions:
the RPM and other startup scripts should too?
- add a "default.action" file to the tor/vidalia bundle so we can
fix the https thing in the default configuration:
- http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#PrivoxyWeirdSSLPort
+ https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#PrivoxyWeirdSSLPort
=======================================================================
diff --git a/doc/asciidoc-helper.sh b/doc/asciidoc-helper.sh
new file mode 100755
index 0000000000..00f8b8d07f
--- /dev/null
+++ b/doc/asciidoc-helper.sh
@@ -0,0 +1,65 @@
+#!/bin/sh
+
+# Copyright (c) The Tor Project, Inc.
+# See LICENSE for licensing information
+# Run this to generate .html.in or .1.in files from asciidoc files.
+# Arguments:
+# html|man asciidocpath outputfile
+
+set -e
+
+if [ $# != 3 ]; then
+ exit 1;
+fi
+
+output=$3
+
+if [ "$1" = "html" ]; then
+ input=${output%%.html.in}.1.txt
+ base=${output%%.html.in}
+ if [ "$2" != none ]; then
+ "$2" -d manpage -o $output $input;
+ else
+ echo "==================================";
+ echo;
+ echo "You need asciidoc installed to be able to build the manpage.";
+ echo "To build without manpages, use the --disable-asciidoc argument";
+ echo "when calling configure.";
+ echo;
+ echo "==================================";
+ exit 1;
+ fi
+elif [ "$1" = "man" ]; then
+ input=${output%%.1.in}.1.txt
+ base=${output%%.1.in}
+
+ if test "$2" = none; then
+ echo "==================================";
+ echo;
+ echo "You need asciidoc installed to be able to build the manpage.";
+ echo "To build without manpages, use the --disable-asciidoc argument";
+ echo "when calling configure.";
+ echo;
+ echo "==================================";
+ exit 1;
+ fi
+ if "$2" -f manpage $input; then
+ mv $base.1 $output;
+ else
+ cat<<EOF
+==================================
+You need a working asciidoc installed to be able to build the manpage.
+
+a2x is installed, but for some reason it isn't working. Sometimes
+This happens because required docbook support files are missing.
+Please install docbook-xsl, docbook-xml, and libxml2-utils (Debian) or
+similar.
+
+Alternatively, to build without manpages, use the --disable-asciidoc
+argument when calling configure.
+==================================
+EOF
+ exit 1;
+ fi
+fi
+
diff --git a/doc/codecon04.mgp b/doc/codecon04.mgp
deleted file mode 100644
index e9815fcb37..0000000000
--- a/doc/codecon04.mgp
+++ /dev/null
@@ -1,357 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%deffont "standard" xfont "comic sans ms-medium-r"
-%%deffont "thick" xfont "arial black-medium-r"
-%%deffont "typewriter" xfont "courier new-bold-r"
-%%deffont "type2writer" xfont "arial narrow-bold-r"
-%%deffont "standard" tfont "standard.ttf", tmfont "kochi-mincho.ttf"
-%%deffont "thick" tfont "thick.ttf", tmfont "goth.ttf"
-%%deffont "typewriter" tfont "typewriter.ttf", tmfont "goth.ttf"
-%deffont "standard" xfont "helvetica-medium-r", tfont "arial.ttf", tmfont "times.ttf"
-%deffont "thick" xfont "helvetica-bold-r", tfont "arialbd.ttf", tmfont "hoso6.ttf"
-%deffont "italic" xfont "helvetica-italic-r", tfont "ariali.ttf", tmfont "hoso6.ttf"
-%deffont "typewriter" xfont "courier-medium-r", tfont "typewriter.ttf", tmfont "hoso6.ttf"
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Default settings per each line numbers.
-%%
-%default 1 leftfill, size 8, fore "black", back "white", font "thick", hgap 1
-%default 2 size 8, vgap 10, prefix " ", ccolor "black"
-%default 3 size 6, bar "gray70", vgap 0
-%default 4 size 6, fore "black", vgap 0, prefix " ", font "standard"
-%%
-%%default 1 area 90 90, leftfill, size 9, fore "yellow", back "blue", font "thick"
-%%default 2 size 9, vgap 10, prefix " "
-%%default 3 size 7, bar "gray70", vgap 10
-%%default 4 size 7, vgap 30, prefix " ", font "standard"
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Default settings that are applied to TAB-indented lines.
-%%
-%tab 1 size 5, vgap 40, prefix " ", icon arc "red" 50
-%tab 2 size 4, vgap 35, prefix " ", icon delta3 "blue" 40
-%tab 3 size 3, vgap 35, prefix " ", icon dia "DarkViolet" 40
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-%nodefault
-%center, size 9, font "thick", back "white", fore "black"
-
-Tor:
-%size 8
-Next-generation Onion Routing
-
-
-%size 7
-Roger Dingledine
-Nick Mathewson
-Paul Syverson
-
-The Free Haven Project
-%font "typewriter", fore "blue"
-http://freehaven.net/
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Low-latency anonymity system
-
-%leftfill
-Deployed: 20 nodes, hundreds (?) of users
-
-Many improvements on earlier design
-
-Free software -- modified BSD license
-
-Design is not covered by earlier onion routing
-patent
-
-Uses SOCKS to interface with client apps
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-We have working code
-
-(14 kloc of C)
-
-and a design document,
-and a byte-level specification,
-and a Debian package (in Unstable)
-
-Works on Linux, BSD, OSX, Cygwin, ...
-User-space, doesn't need kernel mods or root
-
-%size 9
-http://freehaven.net/tor/
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%page
-%%
-%%Talk Overview
-%%
-%%A bit about Onion Routing
-%%
-%%Improvements we've made
-%%
-%%Some related work
-%%
-%%Ask me questions
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Anonymity: Who needs it?
-
-Private citizens
- advocacy, counseling, whistleblowing, reporting, ...
-%size 6
-Higher-level protocols
- voting, e-cash, auctions
-%size 6
-Government applications
- research, law enforcement
-%size 6
-Business applications
-%size 5
-(hide relationships and volumes of communication)
- Who is visiting job sites?
- Which groups are talking to patent lawyers?
- Who are your suppliers and customers?
- Is the CEO talking to a buyout partner?
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Anonymity is a network effect
-
- Systems need traffic (many low-sensitivity users) to attract the high-sensitivity users
- Most users do not value anonymity much
- Weak security (fast system) can mean more users
- which can mean
-%cont, font "italic"
-stronger
-%cont, font "standard"
-anonymity
- High-sensitivity agents have incentive to run nodes
- so they can be certain first node in their path is good
- to attract traffic for their messages
- There can be an optimal level of free-riding
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Onion Routing is...
-
-An overlay network
-
-Users build virtual circuits through the network
-
-One layer of encryption at each hop
-
-Fixed-size cells
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Tor's goals
-
-Conservative design
- minimize new design work needed
-
-%size 6
-Support testing of future research
-
-Design for deployment; deploy for use
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Threat model -- what we aim for
-
-Protect against somebody watching Alice
-
-Protect against curious Bob
-
-Protect against `some' curious nodes in the middle
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Differences / limitations
-
-
-We're TCP-only, not all IP (but we're user-space and very portable)
-
-Not as strong as high-latency systems (Mixmaster, Mixminion)
-
-Not peer-to-peer
-
-No protocol normalization
-
-Not unobservable (no steg, etc)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Perfect forward secrecy
-
-
-Telescoping circuit
-
- negotiates keys at each hop
- no more need for replay detection
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-No mixing, padding, traffic shaping (yet)
-
-
-Please show us they're worth the usability tradeoff
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%page
-%%
-%%Many TCP streams can share one circuit
-%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Many TCP streams share a circuit
-
-Previous designs built a new circuit for each stream
-
- lots of public key ops per request
- plus anonymity dangers from making so many circuits
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Leaky-pipe circuit topology
-
-Alice can direct cells to any node in her circuit
-
- So we can support long-range padding,
- have multiple streams exiting at different places in the circuit
- etc
-
-%size 6
-Unclear whether this is dangerous or useful
-
-More research needed
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Congestion control
-
-
-Simple rate limiting
-
-Plus have to keep internal nodes from overflowing
-
-(Can't use global state or inter-node control)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Directory servers
-
-To solve the `introduction' problem
-
-Approve new servers
-
-Tell clients who's up right now
-
- plus their keys, location, etc
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Variable exit policies
-
-
-Each server allows different outgoing connections
-
-E.g. no servers allow outgoing mail currently
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-End-to-end integrity checking
-
-
-In previous onion routing, an insider could change
-the text being transmitted:
-
-"dir" => "rm *"
-
-Even an external adversary could do this!
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Rendezvous points
-
-allow hidden services
-
-don't need (brittle) reply onions
-
- Access-controlled: Bob can control who he talks to
- Robust: Bob's service is available even when some Tor nodes go down
- Smear-resistant: Evil service can't frame a rendezvous router
- Application-transparent: Don't need to modify Bob's apache
-
-%size 6
-(Not implemented yet)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-How do we compare security?
-
-Assume adversary owns c of n nodes
- can choose which
-%size 6
-What's the chance for a random Alice and Bob that he wins?
-
-Freedom, Tor: (c/n)^2
-Peekabooty, six-four, etc: c/n
-Jap (if no padding): 1 if c>1
-Anonymizer: 1 if c>0
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Future work
-
-Threshold directory agreement
-
-Scalability: Morphmix/p2p extensions?
-Restricted-route (non-clique topology)
-
-Non-TCP transport
-
-Implement rendezvous points
-
-Make it work better
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-We have working code
-
-Plus a design document,
-and a byte-level specification
-and a Debian package (in Unstable)
-
-%size 9
-http://freehaven.net/tor/
-
-%size 6
-Privacy Enhancing Technologies workshop
-
-%size 9
-http://petworkshop.org/
-
diff --git a/doc/design-paper/Makefile.am b/doc/design-paper/Makefile.am
deleted file mode 100644
index fb94706d07..0000000000
--- a/doc/design-paper/Makefile.am
+++ /dev/null
@@ -1,26 +0,0 @@
-
-cell-struct.eps: cell-struct.fig
- fig2dev -L eps $< $@
-interaction.eps: interaction.fig
- fig2dev -L eps $< $@
-cell-struct.pdf: cell-struct.fig
- fig2dev -L pdf $< $@
-interaction.pdf: interaction.fig
- fig2dev -L pdf $< $@
-
-tor-design.ps: cell-struct.eps interaction.eps tor-design.bib tor-design.tex usenix.sty latex8.bst
- latex tor-design.tex
- bibtex tor-design
- latex tor-design.tex
- latex tor-design.tex
- dvips -o $@ tor-design.dvi
-
-tor-design.pdf: cell-struct.pdf interaction.pdf tor-design.bib tor-design.tex usenix.sty latex8.bst
- pdflatex tor-design.tex
- bibtex tor-design
- pdflatex tor-design.tex
- pdflatex tor-design.tex
-
-EXTRA_DIST = cell-struct.fig interaction.fig tor-design.bib usenix.sty latex8.bst tor-design.tex
-
-DISTCLEANFILES = cell-struct.eps interaction.eps cell-struct.pdf interaction.pdf tor-design.aux tor-design.bbl tor-design.blg tor-design.log tor-design.dvi tor-design.ps tor-design.pdf
diff --git a/doc/design-paper/blocking.html b/doc/design-paper/blocking.html
deleted file mode 100644
index 6028f5dc1c..0000000000
--- a/doc/design-paper/blocking.html
+++ /dev/null
@@ -1,2112 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "DTD/xhtml1-transitional.dtd">
-<html>
-<meta name="GENERATOR" content="TtH 3.77">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <style type="text/css"> div.p { margin-top: 7pt;}</style>
- <style type="text/css"><!--
- td div.comp { margin-top: -0.6ex; margin-bottom: -1ex;}
- td div.comb { margin-top: -0.6ex; margin-bottom: -.6ex;}
- td div.hrcomp { line-height: 0.9; margin-top: -0.8ex; margin-bottom: -1ex;}
- td div.norm {line-height:normal;}
- span.roman {font-family: serif; font-style: normal; font-weight: normal;}
- span.overacc2 {position: relative; left: .8em; top: -1.2ex;}
- span.overacc1 {position: relative; left: .6em; top: -1.2ex;} --></style>
-
-
-<title> Design of a blocking-resistant anonymity system\DRAFT</title>
-
-<h1 align="center">Design of a blocking-resistant anonymity system<br />DRAFT </h1>
-
-<div class="p"><!----></div>
-
-<h3 align="center">Roger Dingledine, Nick Mathewson </h3>
-
-
-<div class="p"><!----></div>
-
-<h2> Abstract</h2>
-Internet censorship is on the rise as websites around the world are
-increasingly blocked by government-level firewalls. Although popular
-anonymizing networks like Tor were originally designed to keep attackers from
-tracing people's activities, many people are also using them to evade local
-censorship. But if the censor simply denies access to the Tor network
-itself, blocked users can no longer benefit from the security Tor offers.
-
-<div class="p"><!----></div>
-Here we describe a design that builds upon the current Tor network
-to provide an anonymizing network that resists blocking
-by government-level attackers.
-
-<div class="p"><!----></div>
-
- <h2><a name="tth_sEc1">
-1</a>&nbsp;&nbsp;Introduction and Goals</h2>
-
-<div class="p"><!----></div>
-Anonymizing networks like Tor&nbsp;[<a href="#tor-design" name="CITEtor-design">11</a>] bounce traffic around a
-network of encrypting relays. Unlike encryption, which hides only <i>what</i>
-is said, these networks also aim to hide who is communicating with whom, which
-users are using which websites, and similar relations. These systems have a
-broad range of users, including ordinary citizens who want to avoid being
-profiled for targeted advertisements, corporations who don't want to reveal
-information to their competitors, and law enforcement and government
-intelligence agencies who need to do operations on the Internet without being
-noticed.
-
-<div class="p"><!----></div>
-Historical anonymity research has focused on an
-attacker who monitors the user (call her Alice) and tries to discover her
-activities, yet lets her reach any piece of the network. In more modern
-threat models such as Tor's, the adversary is allowed to perform active
-attacks such as modifying communications to trick Alice
-into revealing her destination, or intercepting some connections
-to run a man-in-the-middle attack. But these systems still assume that
-Alice can eventually reach the anonymizing network.
-
-<div class="p"><!----></div>
-An increasing number of users are using the Tor software
-less for its anonymity properties than for its censorship
-resistance properties &mdash; if they use Tor to access Internet sites like
-Wikipedia
-and Blogspot, they are no longer affected by local censorship
-and firewall rules. In fact, an informal user study
-showed China as the third largest user base
-for Tor clients, with perhaps ten thousand people accessing the Tor
-network from China each day.
-
-<div class="p"><!----></div>
-The current Tor design is easy to block if the attacker controls Alice's
-connection to the Tor network &mdash; by blocking the directory authorities,
-by blocking all the server IP addresses in the directory, or by filtering
-based on the fingerprint of the Tor TLS handshake. Here we describe an
-extended design that builds upon the current Tor network to provide an
-anonymizing
-network that resists censorship as well as anonymity-breaking attacks.
-In section&nbsp;<a href="#sec:adversary">2</a> we discuss our threat model &mdash; that is,
-the assumptions we make about our adversary. Section&nbsp;<a href="#sec:current-tor">3</a>
-describes the components of the current Tor design and how they can be
-leveraged for a new blocking-resistant design. Section&nbsp;<a href="#sec:related">4</a>
-explains the features and drawbacks of the currently deployed solutions.
-In sections&nbsp;<a href="#sec:bridges">5</a> through&nbsp;<a href="#sec:discovery">7</a>, we explore the
-components of our designs in detail. Section&nbsp;<a href="#sec:security">8</a> considers
-security implications and Section&nbsp;<a href="#sec:reachability">9</a> presents other
-issues with maintaining connectivity and sustainability for the design.
-Section&nbsp;<a href="#sec:future">10</a> speculates about future more complex designs,
-and finally Section&nbsp;<a href="#sec:conclusion">11</a> summarizes our next steps and
-recommendations.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc2">
-<a name="sec:adversary">
-2</a>&nbsp;&nbsp;Adversary assumptions</h2>
-</a>
-
-<div class="p"><!----></div>
-To design an effective anti-censorship tool, we need a good model for the
-goals and resources of the censors we are evading. Otherwise, we risk
-spending our effort on keeping the adversaries from doing things they have no
-interest in doing, and thwarting techniques they do not use.
-The history of blocking-resistance designs is littered with conflicting
-assumptions about what adversaries to expect and what problems are
-in the critical path to a solution. Here we describe our best
-understanding of the current situation around the world.
-
-<div class="p"><!----></div>
-In the traditional security style, we aim to defeat a strong
-attacker &mdash; if we can defend against this attacker, we inherit protection
-against weaker attackers as well. After all, we want a general design
-that will work for citizens of China, Thailand, and other censored
-countries; for
-whistleblowers in firewalled corporate networks; and for people in
-unanticipated oppressive situations. In fact, by designing with
-a variety of adversaries in mind, we can take advantage of the fact that
-adversaries will be in different stages of the arms race at each location,
-so a server blocked in one locale can still be useful in others.
-
-<div class="p"><!----></div>
-We assume that the attackers' goals are somewhat complex.
-
-<dl compact="compact">
-
- <dt><b></b></dt>
- <dd><li>The attacker would like to restrict the flow of certain kinds of
- information, particularly when this information is seen as embarrassing to
- those in power (such as information about rights violations or corruption),
- or when it enables or encourages others to oppose them effectively (such as
- information about opposition movements or sites that are used to organize
- protests).</dd>
- <dt><b></b></dt>
- <dd><li>As a second-order effect, censors aim to chill citizens' behavior by
- creating an impression that their online activities are monitored.</dd>
- <dt><b></b></dt>
- <dd><li>In some cases, censors make a token attempt to block a few sites for
- obscenity, blasphemy, and so on, but their efforts here are mainly for
- show. In other cases, they really do try hard to block such content.</dd>
- <dt><b></b></dt>
- <dd><li>Complete blocking (where nobody at all can ever download censored
- content) is not a
- goal. Attackers typically recognize that perfect censorship is not only
- impossible, but unnecessary: if "undesirable" information is known only
- to a small few, further censoring efforts can be focused elsewhere.</dd>
- <dt><b></b></dt>
- <dd><li>Similarly, the censors are not attempting to shut down or block <i>
- every</i> anti-censorship tool &mdash; merely the tools that are popular and
- effective (because these tools impede the censors' information restriction
- goals) and those tools that are highly visible (thus making the censors
- look ineffectual to their citizens and their bosses).</dd>
- <dt><b></b></dt>
- <dd><li>Reprisal against <i>most</i> passive consumers of <i>most</i> kinds of
- blocked information is also not a goal, given the broadness of most
- censorship regimes. This seems borne out by fact.<a href="#tthFtNtAAB" name="tthFrefAAB"><sup>1</sup></a></dd>
- <dt><b></b></dt>
- <dd><li>Producers and distributors of targeted information are in much
- greater danger than consumers; the attacker would like to not only block
- their work, but identify them for reprisal.</dd>
- <dt><b></b></dt>
- <dd><li>The censors (or their governments) would like to have a working, useful
- Internet. There are economic, political, and social factors that prevent
- them from "censoring" the Internet by outlawing it entirely, or by
- blocking access to all but a tiny list of sites.
- Nevertheless, the censors <i>are</i> willing to block innocuous content
- (like the bulk of a newspaper's reporting) in order to censor other content
- distributed through the same channels (like that newspaper's coverage of
- the censored country).
-</dd>
-</dl>
-
-<div class="p"><!----></div>
-We assume there are three main technical network attacks in use by censors
-currently&nbsp;[<a href="#clayton:pet2006" name="CITEclayton:pet2006">7</a>]:
-
-<div class="p"><!----></div>
-
-<dl compact="compact">
-
- <dt><b></b></dt>
- <dd><li>Block a destination or type of traffic by automatically searching for
- certain strings or patterns in TCP packets. Offending packets can be
- dropped, or can trigger a response like closing the
- connection.</dd>
- <dt><b></b></dt>
- <dd><li>Block a destination by listing its IP address at a
- firewall or other routing control point.</dd>
- <dt><b></b></dt>
- <dd><li>Intercept DNS requests and give bogus responses for certain
- destination hostnames.
-</dd>
-</dl>
-
-<div class="p"><!----></div>
-We assume the network firewall has limited CPU and memory per
-connection&nbsp;[<a href="#clayton:pet2006" name="CITEclayton:pet2006">7</a>]. Against an adversary who could carefully
-examine the contents of every packet and correlate the packets in every
-stream on the network, we would need some stronger mechanism such as
-steganography, which introduces its own
-problems&nbsp;[<a href="#active-wardens" name="CITEactive-wardens">15</a>,<a href="#tcpstego" name="CITEtcpstego">26</a>]. But we make a "weak
-steganography" assumption here: to remain unblocked, it is necessary to
-remain unobservable only by computational resources on par with a modern
-router, firewall, proxy, or IDS.
-
-<div class="p"><!----></div>
-We assume that while various different regimes can coordinate and share
-notes, there will be a time lag between one attacker learning how to overcome
-a facet of our design and other attackers picking it up. (The most common
-vector of transmission seems to be commercial providers of censorship tools:
-once a provider adds a feature to meet one country's needs or requests, the
-feature is available to all of the provider's customers.) Conversely, we
-assume that insider attacks become a higher risk only after the early stages
-of network development, once the system has reached a certain level of
-success and visibility.
-
-<div class="p"><!----></div>
-We do not assume that government-level attackers are always uniform
-across the country. For example, users of different ISPs in China
-experience different censorship policies and mechanisms.
-
-<div class="p"><!----></div>
-We assume that the attacker may be able to use political and economic
-resources to secure the cooperation of extraterritorial or multinational
-corporations and entities in investigating information sources.
-For example, the censors can threaten the service providers of
-troublesome blogs with economic reprisals if they do not reveal the
-authors' identities.
-
-<div class="p"><!----></div>
-We assume that our users have control over their hardware and
-software &mdash; they don't have any spyware installed, there are no
-cameras watching their screens, etc. Unfortunately, in many situations
-these threats are real&nbsp;[<a href="#zuckerman-threatmodels" name="CITEzuckerman-threatmodels">28</a>]; yet
-software-based security systems like ours are poorly equipped to handle
-a user who is entirely observed and controlled by the adversary. See
-Section&nbsp;<a href="#subsec:cafes-and-livecds">8.4</a> for more discussion of what little
-we can do about this issue.
-
-<div class="p"><!----></div>
-Similarly, we assume that the user will be able to fetch a genuine
-version of Tor, rather than one supplied by the adversary; see
-Section&nbsp;<a href="#subsec:trust-chain">8.5</a> for discussion on helping the user
-confirm that he has a genuine version and that he can connect to the
-real Tor network.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc3">
-<a name="sec:current-tor">
-3</a>&nbsp;&nbsp;Adapting the current Tor design to anti-censorship</h2>
-</a>
-
-<div class="p"><!----></div>
-Tor is popular and sees a lot of use &mdash; it's the largest anonymity
-network of its kind, and has
-attracted more than 800 volunteer-operated routers from around the
-world. Tor protects each user by routing their traffic through a multiply
-encrypted "circuit" built of a few randomly selected servers, each of which
-can remove only a single layer of encryption. Each server sees only the step
-before it and the step after it in the circuit, and so no single server can
-learn the connection between a user and her chosen communication partners.
-In this section, we examine some of the reasons why Tor has become popular,
-with particular emphasis to how we can take advantage of these properties
-for a blocking-resistance design.
-
-<div class="p"><!----></div>
-Tor aims to provide three security properties:
-
-<dl compact="compact">
-
- <dt><b></b></dt>
- <dd>1. A local network attacker can't learn, or influence, your
-destination.</dd>
- <dt><b></b></dt>
- <dd>2. No single router in the Tor network can link you to your
-destination.</dd>
- <dt><b></b></dt>
- <dd>3. The destination, or somebody watching the destination,
-can't learn your location.
-</dd>
-</dl>
-
-<div class="p"><!----></div>
-For blocking-resistance, we care most clearly about the first
-property. But as the arms race progresses, the second property
-will become important &mdash; for example, to discourage an adversary
-from volunteering a relay in order to learn that Alice is reading
-or posting to certain websites. The third property helps keep users safe from
-collaborating websites: consider websites and other Internet services
-that have been pressured
-recently into revealing the identity of bloggers
-or treating clients differently depending on their network
-location&nbsp;[<a href="#goodell-syverson06" name="CITEgoodell-syverson06">17</a>].
-
-<div class="p"><!----></div>
-The Tor design provides other features as well that are not typically
-present in manual or ad hoc circumvention techniques.
-
-<div class="p"><!----></div>
-First, Tor has a well-analyzed and well-understood way to distribute
-information about servers.
-Tor directory authorities automatically aggregate, test,
-and publish signed summaries of the available Tor routers. Tor clients
-can fetch these summaries to learn which routers are available and
-which routers are suitable for their needs. Directory information is cached
-throughout the Tor network, so once clients have bootstrapped they never
-need to interact with the authorities directly. (To tolerate a minority
-of compromised directory authorities, we use a threshold trust scheme &mdash;
-see Section&nbsp;<a href="#subsec:trust-chain">8.5</a> for details.)
-
-<div class="p"><!----></div>
-Second, the list of directory authorities is not hard-wired.
-Clients use the default authorities if no others are specified,
-but it's easy to start a separate (or even overlapping) Tor network just
-by running a different set of authorities and convincing users to prefer
-a modified client. For example, we could launch a distinct Tor network
-inside China; some users could even use an aggregate network made up of
-both the main network and the China network. (But we should not be too
-quick to create other Tor networks &mdash; part of Tor's anonymity comes from
-users behaving like other users, and there are many unsolved anonymity
-questions if different users know about different pieces of the network.)
-
-<div class="p"><!----></div>
-Third, in addition to automatically learning from the chosen directories
-which Tor routers are available and working, Tor takes care of building
-paths through the network and rebuilding them as needed. So the user
-never has to know how paths are chosen, never has to manually pick
-working proxies, and so on. More generally, at its core the Tor protocol
-is simply a tool that can build paths given a set of routers. Tor is
-quite flexible about how it learns about the routers and how it chooses
-the paths. Harvard's Blossom project&nbsp;[<a href="#blossom-thesis" name="CITEblossom-thesis">16</a>] makes this
-flexibility more concrete: Blossom makes use of Tor not for its security
-properties but for its reachability properties. It runs a separate set
-of directory authorities, its own set of Tor routers (called the Blossom
-network), and uses Tor's flexible path-building to let users view Internet
-resources from any point in the Blossom network.
-
-<div class="p"><!----></div>
-Fourth, Tor separates the role of <em>internal relay</em> from the
-role of <em>exit relay</em>. That is, some volunteers choose just to relay
-traffic between Tor users and Tor routers, and others choose to also allow
-connections to external Internet resources. Because we don't force all
-volunteers to play both roles, we end up with more relays. This increased
-diversity in turn is what gives Tor its security: the more options the
-user has for her first hop, and the more options she has for her last hop,
-the less likely it is that a given attacker will be watching both ends
-of her circuit&nbsp;[<a href="#tor-design" name="CITEtor-design">11</a>]. As a bonus, because our design attracts
-more internal relays that want to help out but don't want to deal with
-being an exit relay, we end up providing more options for the first
-hop &mdash; the one most critical to being able to reach the Tor network.
-
-<div class="p"><!----></div>
-Fifth, Tor is sustainable. Zero-Knowledge Systems offered the commercial
-but now defunct Freedom Network&nbsp;[<a href="#freedom21-security" name="CITEfreedom21-security">2</a>], a design with
-security comparable to Tor's, but its funding model relied on collecting
-money from users to pay relay operators. Modern commercial proxy systems
-similarly
-need to keep collecting money to support their infrastructure. On the
-other hand, Tor has built a self-sustaining community of volunteers who
-donate their time and resources. This community trust is rooted in Tor's
-open design: we tell the world exactly how Tor works, and we provide all
-the source code. Users can decide for themselves, or pay any security
-expert to decide, whether it is safe to use. Further, Tor's modularity
-as described above, along with its open license, mean that its impact
-will continue to grow.
-
-<div class="p"><!----></div>
-Sixth, Tor has an established user base of hundreds of
-thousands of people from around the world. This diversity of
-users contributes to sustainability as above: Tor is used by
-ordinary citizens, activists, corporations, law enforcement, and
-even government and military users,
-and they can
-only achieve their security goals by blending together in the same
-network&nbsp;[<a href="#econymics" name="CITEeconymics">1</a>,<a href="#usability:weis2006" name="CITEusability:weis2006">9</a>]. This user base also provides
-something else: hundreds of thousands of different and often-changing
-addresses that we can leverage for our blocking-resistance design.
-
-<div class="p"><!----></div>
-Finally and perhaps most importantly, Tor provides anonymity and prevents any
-single server from linking users to their communication partners. Despite
-initial appearances, <i>distributed-trust anonymity is critical for
-anti-censorship efforts</i>. If any single server can expose dissident bloggers
-or compile a list of users' behavior, the censors can profitably compromise
-that server's operator, perhaps by applying economic pressure to their
-employers,
-breaking into their computer, pressuring their family (if they have relatives
-in the censored area), or so on. Furthermore, in designs where any relay can
-expose its users, the censors can spread suspicion that they are running some
-of the relays and use this belief to chill use of the network.
-
-<div class="p"><!----></div>
-We discuss and adapt these components further in
-Section&nbsp;<a href="#sec:bridges">5</a>. But first we examine the strengths and
-weaknesses of other blocking-resistance approaches, so we can expand
-our repertoire of building blocks and ideas.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc4">
-<a name="sec:related">
-4</a>&nbsp;&nbsp;Current proxy solutions</h2>
-</a>
-
-<div class="p"><!----></div>
-Relay-based blocking-resistance schemes generally have two main
-components: a relay component and a discovery component. The relay part
-encompasses the process of establishing a connection, sending traffic
-back and forth, and so on &mdash; everything that's done once the user knows
-where she's going to connect. Discovery is the step before that: the
-process of finding one or more usable relays.
-
-<div class="p"><!----></div>
-For example, we can divide the pieces of Tor in the previous section
-into the process of building paths and sending
-traffic over them (relay) and the process of learning from the directory
-servers about what routers are available (discovery). With this distinction
-in mind, we now examine several categories of relay-based schemes.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.1">
-4.1</a>&nbsp;&nbsp;Centrally-controlled shared proxies</h3>
-
-<div class="p"><!----></div>
-Existing commercial anonymity solutions (like Anonymizer.com) are based
-on a set of single-hop proxies. In these systems, each user connects to
-a single proxy, which then relays traffic between the user and her
-destination. These public proxy
-systems are typically characterized by two features: they control and
-operate the proxies centrally, and many different users get assigned
-to each proxy.
-
-<div class="p"><!----></div>
-In terms of the relay component, single proxies provide weak security
-compared to systems that distribute trust over multiple relays, since a
-compromised proxy can trivially observe all of its users' actions, and
-an eavesdropper only needs to watch a single proxy to perform timing
-correlation attacks against all its users' traffic and thus learn where
-everyone is connecting. Worse, all users
-need to trust the proxy company to have good security itself as well as
-to not reveal user activities.
-
-<div class="p"><!----></div>
-On the other hand, single-hop proxies are easier to deploy, and they
-can provide better performance than distributed-trust designs like Tor,
-since traffic only goes through one relay. They're also more convenient
-from the user's perspective &mdash; since users entirely trust the proxy,
-they can just use their web browser directly.
-
-<div class="p"><!----></div>
-Whether public proxy schemes are more or less scalable than Tor is
-still up for debate: commercial anonymity systems can use some of their
-revenue to provision more bandwidth as they grow, whereas volunteer-based
-anonymity systems can attract thousands of fast relays to spread the load.
-
-<div class="p"><!----></div>
-The discovery piece can take several forms. Most commercial anonymous
-proxies have one or a handful of commonly known websites, and their users
-log in to those websites and relay their traffic through them. When
-these websites get blocked (generally soon after the company becomes
-popular), if the company cares about users in the blocked areas, they
-start renting lots of disparate IP addresses and rotating through them
-as they get blocked. They notify their users of new addresses (by email,
-for example). It's an arms race, since attackers can sign up to receive the
-email too, but operators have one nice trick available to them: because they
-have a list of paying subscribers, they can notify certain subscribers
-about updates earlier than others.
-
-<div class="p"><!----></div>
-Access control systems on the proxy let them provide service only to
-users with certain characteristics, such as paying customers or people
-from certain IP address ranges.
-
-<div class="p"><!----></div>
-Discovery in the face of a government-level firewall is a complex and
-unsolved
-topic, and we're stuck in this same arms race ourselves; we explore it
-in more detail in Section&nbsp;<a href="#sec:discovery">7</a>. But first we examine the
-other end of the spectrum &mdash; getting volunteers to run the proxies,
-and telling only a few people about each proxy.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.2">
-4.2</a>&nbsp;&nbsp;Independent personal proxies</h3>
-
-<div class="p"><!----></div>
-Personal proxies such as Circumventor&nbsp;[<a href="#circumventor" name="CITEcircumventor">18</a>] and
-CGIProxy&nbsp;[<a href="#cgiproxy" name="CITEcgiproxy">23</a>] use the same technology as the public ones as
-far as the relay component goes, but they use a different strategy for
-discovery. Rather than managing a few centralized proxies and constantly
-getting new addresses for them as the old addresses are blocked, they
-aim to have a large number of entirely independent proxies, each managing
-its own (much smaller) set of users.
-
-<div class="p"><!----></div>
-As the Circumventor site explains, "You don't
-actually install the Circumventor <em>on</em> the computer that is blocked
-from accessing Web sites. You, or a friend of yours, has to install the
-Circumventor on some <em>other</em> machine which is not censored."
-
-<div class="p"><!----></div>
-This tactic has great advantages in terms of blocking-resistance &mdash; recall
-our assumption in Section&nbsp;<a href="#sec:adversary">2</a> that the attention
-a system attracts from the attacker is proportional to its number of
-users and level of publicity. If each proxy only has a few users, and
-there is no central list of proxies, most of them will never get noticed by
-the censors.
-
-<div class="p"><!----></div>
-On the other hand, there's a huge scalability question that so far has
-prevented these schemes from being widely useful: how does the fellow
-in China find a person in Ohio who will run a Circumventor for him? In
-some cases he may know and trust some people on the outside, but in many
-cases he's just out of luck. Just as hard, how does a new volunteer in
-Ohio find a person in China who needs it?
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-This challenge leads to a hybrid design-centrally &mdash; distributed
-personal proxies &mdash; which we will investigate in more detail in
-Section&nbsp;<a href="#sec:discovery">7</a>.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.3">
-4.3</a>&nbsp;&nbsp;Open proxies</h3>
-
-<div class="p"><!----></div>
-Yet another currently used approach to bypassing firewalls is to locate
-open and misconfigured proxies on the Internet. A quick Google search
-for "open proxy list" yields a wide variety of freely available lists
-of HTTP, HTTPS, and SOCKS proxies. Many small companies have sprung up
-providing more refined lists to paying customers.
-
-<div class="p"><!----></div>
-There are some downsides to using these open proxies though. First,
-the proxies are of widely varying quality in terms of bandwidth and
-stability, and many of them are entirely unreachable. Second, unlike
-networks of volunteers like Tor, the legality of routing traffic through
-these proxies is questionable: it's widely believed that most of them
-don't realize what they're offering, and probably wouldn't allow it if
-they realized. Third, in many cases the connection to the proxy is
-unencrypted, so firewalls that filter based on keywords in IP packets
-will not be hindered. Fourth, in many countries (including China), the
-firewall authorities hunt for open proxies as well, to preemptively
-block them. And last, many users are suspicious that some
-open proxies are a little <em>too</em> convenient: are they run by the
-adversary, in which case they get to monitor all the user's requests
-just as single-hop proxies can?
-
-<div class="p"><!----></div>
-A distributed-trust design like Tor resolves each of these issues for
-the relay component, but a constantly changing set of thousands of open
-relays is clearly a useful idea for a discovery component. For example,
-users might be able to make use of these proxies to bootstrap their
-first introduction into the Tor network.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.4">
-4.4</a>&nbsp;&nbsp;Blocking resistance and JAP</h3>
-
-<div class="p"><!----></div>
-K&#246;psell and Hilling's Blocking Resistance
-design&nbsp;[<a href="#koepsell:wpes2004" name="CITEkoepsell:wpes2004">20</a>] is probably
-the closest related work, and is the starting point for the design in this
-paper. In this design, the JAP anonymity system&nbsp;[<a href="#web-mix" name="CITEweb-mix">3</a>] is used
-as a base instead of Tor. Volunteers operate a large number of access
-points that relay traffic to the core JAP
-network, which in turn anonymizes users' traffic. The software to run these
-relays is, as in our design, included in the JAP client software and enabled
-only when the user decides to enable it. Discovery is handled with a
-CAPTCHA-based mechanism; users prove that they aren't an automated process,
-and are given the address of an access point. (The problem of a determined
-attacker with enough manpower to launch many requests and enumerate all the
-access points is not considered in depth.) There is also some suggestion
-that information about access points could spread through existing social
-networks.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.5">
-4.5</a>&nbsp;&nbsp;Infranet</h3>
-
-<div class="p"><!----></div>
-The Infranet design&nbsp;[<a href="#infranet" name="CITEinfranet">14</a>] uses one-hop relays to deliver web
-content, but disguises its communications as ordinary HTTP traffic. Requests
-are split into multiple requests for URLs on the relay, which then encodes
-its responses in the content it returns. The relay needs to be an actual
-website with plausible content and a number of URLs which the user might want
-to access &mdash; if the Infranet software produced its own cover content, it would
-be far easier for censors to identify. To keep the censors from noticing
-that cover content changes depending on what data is embedded, Infranet needs
-the cover content to have an innocuous reason for changing frequently: the
-paper recommends watermarked images and webcams.
-
-<div class="p"><!----></div>
-The attacker and relay operators in Infranet's threat model are significantly
-different than in ours. Unlike our attacker, Infranet's censor can't be
-bypassed with encrypted traffic (presumably because the censor blocks
-encrypted traffic, or at least considers it suspicious), and has more
-computational resources to devote to each connection than ours (so it can
-notice subtle patterns over time). Unlike our bridge operators, Infranet's
-operators (and users) have more bandwidth to spare; the overhead in typical
-steganography schemes is far higher than Tor's.
-
-<div class="p"><!----></div>
-The Infranet design does not include a discovery element. Discovery,
-however, is a critical point: if whatever mechanism allows users to learn
-about relays also allows the censor to do so, he can trivially discover and
-block their addresses, even if the steganography would prevent mere traffic
-observation from revealing the relays' addresses.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.6">
-4.6</a>&nbsp;&nbsp;RST-evasion and other packet-level tricks</h3>
-
-<div class="p"><!----></div>
-In their analysis of China's firewall's content-based blocking, Clayton,
-Murdoch and Watson discovered that rather than blocking all packets in a TCP
-streams once a forbidden word was noticed, the firewall was simply forging
-RST packets to make the communicating parties believe that the connection was
-closed&nbsp;[<a href="#clayton:pet2006" name="CITEclayton:pet2006">7</a>]. They proposed altering operating systems
-to ignore forged RST packets. This approach might work in some cases, but
-in practice it appears that many firewalls start filtering by IP address
-once a sufficient number of RST packets have been sent.
-
-<div class="p"><!----></div>
-Other packet-level responses to filtering include splitting
-sensitive words across multiple TCP packets, so that the censors'
-firewalls can't notice them without performing expensive stream
-reconstruction&nbsp;[<a href="#ptacek98insertion" name="CITEptacek98insertion">27</a>]. This technique relies on the
-same insight as our weak steganography assumption.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.7">
-4.7</a>&nbsp;&nbsp;Internal caching networks</h3>
-
-<div class="p"><!----></div>
-Freenet&nbsp;[<a href="#freenet-pets00" name="CITEfreenet-pets00">6</a>] is an anonymous peer-to-peer data store.
-Analyzing Freenet's security can be difficult, as its design is in flux as
-new discovery and routing mechanisms are proposed, and no complete
-specification has (to our knowledge) been written. Freenet servers relay
-requests for specific content (indexed by a digest of the content)
-"toward" the server that hosts it, and then cache the content as it
-follows the same path back to
-the requesting user. If Freenet's routing mechanism is successful in
-allowing nodes to learn about each other and route correctly even as some
-node-to-node links are blocked by firewalls, then users inside censored areas
-can ask a local Freenet server for a piece of content, and get an answer
-without having to connect out of the country at all. Of course, operators of
-servers inside the censored area can still be targeted, and the addresses of
-external servers can still be blocked.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.8">
-4.8</a>&nbsp;&nbsp;Skype</h3>
-
-<div class="p"><!----></div>
-The popular Skype voice-over-IP software uses multiple techniques to tolerate
-restrictive networks, some of which allow it to continue operating in the
-presence of censorship. By switching ports and using encryption, Skype
-attempts to resist trivial blocking and content filtering. Even if no
-encryption were used, it would still be expensive to scan all voice
-traffic for sensitive words. Also, most current keyloggers are unable to
-store voice traffic. Nevertheless, Skype can still be blocked, especially at
-its central login server.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.9">
-4.9</a>&nbsp;&nbsp;Tor itself</h3>
-
-<div class="p"><!----></div>
-And last, we include Tor itself in the list of current solutions
-to firewalls. Tens of thousands of people use Tor from countries that
-routinely filter their Internet. Tor's website has been blocked in most
-of them. But why hasn't the Tor network been blocked yet?
-
-<div class="p"><!----></div>
-We have several theories. The first is the most straightforward: tens of
-thousands of people are simply too few to matter. It may help that Tor is
-perceived to be for experts only, and thus not worth attention yet. The
-more subtle variant on this theory is that we've positioned Tor in the
-public eye as a tool for retaining civil liberties in more free countries,
-so perhaps blocking authorities don't view it as a threat. (We revisit
-this idea when we consider whether and how to publicize a Tor variant
-that improves blocking-resistance &mdash; see Section&nbsp;<a href="#subsec:publicity">9.5</a>
-for more discussion.)
-
-<div class="p"><!----></div>
-The broader explanation is that the maintenance of most government-level
-filters is aimed at stopping widespread information flow and appearing to be
-in control, not by the impossible goal of blocking all possible ways to bypass
-censorship. Censors realize that there will always
-be ways for a few people to get around the firewall, and as long as Tor
-has not publically threatened their control, they see no urgent need to
-block it yet.
-
-<div class="p"><!----></div>
-We should recognize that we're <em>already</em> in the arms race. These
-constraints can give us insight into the priorities and capabilities of
-our various attackers.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc5">
-<a name="sec:bridges">
-5</a>&nbsp;&nbsp;The relay component of our blocking-resistant design</h2>
-</a>
-
-<div class="p"><!----></div>
-Section&nbsp;<a href="#sec:current-tor">3</a> describes many reasons why Tor is
-well-suited as a building block in our context, but several changes will
-allow the design to resist blocking better. The most critical changes are
-to get more relay addresses, and to distribute them to users differently.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc5.1">
-5.1</a>&nbsp;&nbsp;Bridge relays</h3>
-
-<div class="p"><!----></div>
-Today, Tor servers operate on less than a thousand distinct IP addresses;
-an adversary
-could enumerate and block them all with little trouble. To provide a
-means of ingress to the network, we need a larger set of entry points, most
-of which an adversary won't be able to enumerate easily. Fortunately, we
-have such a set: the Tor users.
-
-<div class="p"><!----></div>
-Hundreds of thousands of people around the world use Tor. We can leverage
-our already self-selected user base to produce a list of thousands of
-frequently-changing IP addresses. Specifically, we can give them a little
-button in the GUI that says "Tor for Freedom", and users who click
-the button will turn into <em>bridge relays</em> (or just <em>bridges</em>
-for short). They can rate limit relayed connections to 10 KB/s (almost
-nothing for a broadband user in a free country, but plenty for a user
-who otherwise has no access at all), and since they are just relaying
-bytes back and forth between blocked users and the main Tor network, they
-won't need to make any external connections to Internet sites. Because
-of this separation of roles, and because we're making use of software
-that the volunteers have already installed for their own use, we expect
-our scheme to attract and maintain more volunteers than previous schemes.
-
-<div class="p"><!----></div>
-As usual, there are new anonymity and security implications from running a
-bridge relay, particularly from letting people relay traffic through your
-Tor client; but we leave this discussion for Section&nbsp;<a href="#sec:security">8</a>.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc5.2">
-5.2</a>&nbsp;&nbsp;The bridge directory authority</h3>
-
-<div class="p"><!----></div>
-How do the bridge relays advertise their existence to the world? We
-introduce a second new component of the design: a specialized directory
-authority that aggregates and tracks bridges. Bridge relays periodically
-publish server descriptors (summaries of their keys, locations, etc,
-signed by their long-term identity key), just like the relays in the
-"main" Tor network, but in this case they publish them only to the
-bridge directory authorities.
-
-<div class="p"><!----></div>
-The main difference between bridge authorities and the directory
-authorities for the main Tor network is that the main authorities provide
-a list of every known relay, but the bridge authorities only give
-out a server descriptor if you already know its identity key. That is,
-you can keep up-to-date on a bridge's location and other information
-once you know about it, but you can't just grab a list of all the bridges.
-
-<div class="p"><!----></div>
-The identity key, IP address, and directory port for each bridge
-authority ship by default with the Tor software, so the bridge relays
-can be confident they're publishing to the right location, and the
-blocked users can establish an encrypted authenticated channel. See
-Section&nbsp;<a href="#subsec:trust-chain">8.5</a> for more discussion of the public key
-infrastructure and trust chain.
-
-<div class="p"><!----></div>
-Bridges use Tor to publish their descriptors privately and securely,
-so even an attacker monitoring the bridge directory authority's network
-can't make a list of all the addresses contacting the authority.
-Bridges may publish to only a subset of the
-authorities, to limit the potential impact of an authority compromise.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc5.3">
-<a name="subsec:relay-together">
-5.3</a>&nbsp;&nbsp;Putting them together</h3>
-</a>
-
-<div class="p"><!----></div>
-If a blocked user knows the identity keys of a set of bridge relays, and
-he has correct address information for at least one of them, he can use
-that one to make a secure connection to the bridge authority and update
-his knowledge about the other bridge relays. He can also use it to make
-secure connections to the main Tor network and directory servers, so he
-can build circuits and connect to the rest of the Internet. All of these
-updates happen in the background: from the blocked user's perspective,
-he just accesses the Internet via his Tor client like always.
-
-<div class="p"><!----></div>
-So now we've reduced the problem from how to circumvent the firewall
-for all transactions (and how to know that the pages you get have not
-been modified by the local attacker) to how to learn about a working
-bridge relay.
-
-<div class="p"><!----></div>
-There's another catch though. We need to make sure that the network
-traffic we generate by simply connecting to a bridge relay doesn't stand
-out too much.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc6">
-<a name="sec:network-fingerprint">
-<a name="subsec:enclave-dirs">
-6</a>&nbsp;&nbsp;Hiding Tor's network fingerprint</h2>
-</a>
-</a>
-
-<div class="p"><!----></div>
-Currently, Tor uses two protocols for its network communications. The
-main protocol uses TLS for encrypted and authenticated communication
-between Tor instances. The second protocol is standard HTTP, used for
-fetching directory information. All Tor servers listen on their "ORPort"
-for TLS connections, and some of them opt to listen on their "DirPort"
-as well, to serve directory information. Tor servers choose whatever port
-numbers they like; the server descriptor they publish to the directory
-tells users where to connect.
-
-<div class="p"><!----></div>
-One format for communicating address information about a bridge relay is
-its IP address and DirPort. From there, the user can ask the bridge's
-directory cache for an up-to-date copy of its server descriptor, and
-learn its current circuit keys, its ORPort, and so on.
-
-<div class="p"><!----></div>
-However, connecting directly to the directory cache involves a plaintext
-HTTP request. A censor could create a network fingerprint (known as a
-<em>signature</em> in the intrusion detection field) for the request
-and/or its response, thus preventing these connections. To resolve this
-vulnerability, we've modified the Tor protocol so that users can connect
-to the directory cache via the main Tor port &mdash; they establish a TLS
-connection with the bridge as normal, and then send a special "begindir"
-relay command to establish an internal connection to its directory cache.
-
-<div class="p"><!----></div>
-Therefore a better way to summarize a bridge's address is by its IP
-address and ORPort, so all communications between the client and the
-bridge will use ordinary TLS. But there are other details that need
-more investigation.
-
-<div class="p"><!----></div>
-What port should bridges pick for their ORPort? We currently recommend
-that they listen on port 443 (the default HTTPS port) if they want to
-be most useful, because clients behind standard firewalls will have
-the best chance to reach them. Is this the best choice in all cases,
-or should we encourage some fraction of them pick random ports, or other
-ports commonly permitted through firewalls like 53 (DNS) or 110
-(POP)? Or perhaps we should use other ports where TLS traffic is
-expected, like 993 (IMAPS) or 995 (POP3S). We need more research on our
-potential users, and their current and anticipated firewall restrictions.
-
-<div class="p"><!----></div>
-Furthermore, we need to look at the specifics of Tor's TLS handshake.
-Right now Tor uses some predictable strings in its TLS handshakes. For
-example, it sets the X.509 organizationName field to "Tor", and it puts
-the Tor server's nickname in the certificate's commonName field. We
-should tweak the handshake protocol so it doesn't rely on any unusual details
-in the certificate, yet it remains secure; the certificate itself
-should be made to resemble an ordinary HTTPS certificate. We should also try
-to make our advertised cipher-suites closer to what an ordinary web server
-would support.
-
-<div class="p"><!----></div>
-Tor's TLS handshake uses two-certificate chains: one certificate
-contains the self-signed identity key for
-the router, and the second contains a current TLS key, signed by the
-identity key. We use these to authenticate that we're talking to the right
-router, and to limit the impact of TLS-key exposure. Most (though far from
-all) consumer-oriented HTTPS services provide only a single certificate.
-These extra certificates may help identify Tor's TLS handshake; instead,
-bridges should consider using only a single TLS key certificate signed by
-their identity key, and providing the full value of the identity key in an
-early handshake cell. More significantly, Tor currently has all clients
-present certificates, so that clients are harder to distinguish from servers.
-But in a blocking-resistance environment, clients should not present
-certificates at all.
-
-<div class="p"><!----></div>
-Last, what if the adversary starts observing the network traffic even
-more closely? Even if our TLS handshake looks innocent, our traffic timing
-and volume still look different than a user making a secure web connection
-to his bank. The same techniques used in the growing trend to build tools
-to recognize encrypted Bittorrent traffic
-could be used to identify Tor communication and recognize bridge
-relays. Rather than trying to look like encrypted web traffic, we may be
-better off trying to blend with some other encrypted network protocol. The
-first step is to compare typical network behavior for a Tor client to
-typical network behavior for various other protocols. This statistical
-cat-and-mouse game is made more complex by the fact that Tor transports a
-variety of protocols, and we'll want to automatically handle web browsing
-differently from, say, instant messaging.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc6.1">
-<a name="subsec:id-address">
-6.1</a>&nbsp;&nbsp;Identity keys as part of addressing information</h3>
-</a>
-
-<div class="p"><!----></div>
-We have described a way for the blocked user to bootstrap into the
-network once he knows the IP address and ORPort of a bridge. What about
-local spoofing attacks? That is, since we never learned an identity
-key fingerprint for the bridge, a local attacker could intercept our
-connection and pretend to be the bridge we had in mind. It turns out
-that giving false information isn't that bad &mdash; since the Tor client
-ships with trusted keys for the bridge directory authority and the Tor
-network directory authorities, the user can learn whether he's being
-given a real connection to the bridge authorities or not. (After all,
-if the adversary intercepts every connection the user makes and gives
-him a bad connection each time, there's nothing we can do.)
-
-<div class="p"><!----></div>
-What about anonymity-breaking attacks from observing traffic, if the
-blocked user doesn't start out knowing the identity key of his intended
-bridge? The vulnerabilities aren't so bad in this case either &mdash; the
-adversary could do similar attacks just by monitoring the network
-traffic.
-
-<div class="p"><!----></div>
-Once the Tor client has fetched the bridge's server descriptor, it should
-remember the identity key fingerprint for that bridge relay. Thus if
-the bridge relay moves to a new IP address, the client can query the
-bridge directory authority to look up a fresh server descriptor using
-this fingerprint.
-
-<div class="p"><!----></div>
-So we've shown that it's <em>possible</em> to bootstrap into the network
-just by learning the IP address and ORPort of a bridge, but are there
-situations where it's more convenient or more secure to learn the bridge's
-identity fingerprint as well as instead, while bootstrapping? We keep
-that question in mind as we next investigate bootstrapping and discovery.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc7">
-<a name="sec:discovery">
-7</a>&nbsp;&nbsp;Discovering working bridge relays</h2>
-</a>
-
-<div class="p"><!----></div>
-Tor's modular design means that we can develop a better relay component
-independently of developing the discovery component. This modularity's
-great promise is that we can pick any discovery approach we like; but the
-unfortunate fact is that we have no magic bullet for discovery. We're
-in the same arms race as all the other designs we described in
-Section&nbsp;<a href="#sec:related">4</a>.
-
-<div class="p"><!----></div>
-In this section we describe a variety of approaches to adding discovery
-components for our design.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.1">
-<a name="subsec:first-bridge">
-7.1</a>&nbsp;&nbsp;Bootstrapping: finding your first bridge.</h3>
-</a>
-
-<div class="p"><!----></div>
-In Section&nbsp;<a href="#subsec:relay-together">5.3</a>, we showed that a user who knows
-a working bridge address can use it to reach the bridge authority and
-to stay connected to the Tor network. But how do new users reach the
-bridge authority in the first place? After all, the bridge authority
-will be one of the first addresses that a censor blocks.
-
-<div class="p"><!----></div>
-First, we should recognize that most government firewalls are not
-perfect. That is, they may allow connections to Google cache or some
-open proxy servers, or they let file-sharing traffic, Skype, instant
-messaging, or World-of-Warcraft connections through. Different users will
-have different mechanisms for bypassing the firewall initially. Second,
-we should remember that most people don't operate in a vacuum; users will
-hopefully know other people who are in other situations or have other
-resources available. In the rest of this section we develop a toolkit
-of different options and mechanisms, so that we can enable users in a
-diverse set of contexts to bootstrap into the system.
-
-<div class="p"><!----></div>
-(For users who can't use any of these techniques, hopefully they know
-a friend who can &mdash; for example, perhaps the friend already knows some
-bridge relay addresses. If they can't get around it at all, then we
-can't help them &mdash; they should go meet more people or learn more about
-the technology running the firewall in their area.)
-
-<div class="p"><!----></div>
-By deploying all the schemes in the toolkit at once, we let bridges and
-blocked users employ the discovery approach that is most appropriate
-for their situation.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.2">
-7.2</a>&nbsp;&nbsp;Independent bridges, no central discovery</h3>
-
-<div class="p"><!----></div>
-The first design is simply to have no centralized discovery component at
-all. Volunteers run bridges, and we assume they have some blocked users
-in mind and communicate their address information to them out-of-band
-(for example, through Gmail). This design allows for small personal
-bridges that have only one or a handful of users in mind, but it can
-also support an entire community of users. For example, Citizen Lab's
-upcoming Psiphon single-hop proxy tool&nbsp;[<a href="#psiphon" name="CITEpsiphon">13</a>] plans to use this
-<em>social network</em> approach as its discovery component.
-
-<div class="p"><!----></div>
-There are several ways to do bootstrapping in this design. In the simple
-case, the operator of the bridge informs each chosen user about his
-bridge's address information and/or keys. A different approach involves
-blocked users introducing new blocked users to the bridges they know.
-That is, somebody in the blocked area can pass along a bridge's address to
-somebody else they trust. This scheme brings in appealing but complex game
-theoretic properties: the blocked user making the decision has an incentive
-only to delegate to trustworthy people, since an adversary who learns
-the bridge's address and filters it makes it unavailable for both of them.
-Also, delegating known bridges to members of your social network can be
-dangerous: an the adversary who can learn who knows which bridges may
-be able to reconstruct the social network.
-
-<div class="p"><!----></div>
-Note that a central set of bridge directory authorities can still be
-compatible with a decentralized discovery process. That is, how users
-first learn about bridges is entirely up to the bridges, but the process
-of fetching up-to-date descriptors for them can still proceed as described
-in Section&nbsp;<a href="#sec:bridges">5</a>. Of course, creating a central place that
-knows about all the bridges may not be smart, especially if every other
-piece of the system is decentralized. Further, if a user only knows
-about one bridge and he loses track of it, it may be quite a hassle to
-reach the bridge authority. We address these concerns next.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.3">
-7.3</a>&nbsp;&nbsp;Families of bridges, no central discovery</h3>
-
-<div class="p"><!----></div>
-Because the blocked users are running our software too, we have many
-opportunities to improve usability or robustness. Our second design builds
-on the first by encouraging volunteers to run several bridges at once
-(or coordinate with other bridge volunteers), such that some
-of the bridges are likely to be available at any given time.
-
-<div class="p"><!----></div>
-The blocked user's Tor client would periodically fetch an updated set of
-recommended bridges from any of the working bridges. Now the client can
-learn new additions to the bridge pool, and can expire abandoned bridges
-or bridges that the adversary has blocked, without the user ever needing
-to care. To simplify maintenance of the community's bridge pool, each
-community could run its own bridge directory authority &mdash; reachable via
-the available bridges, and also mirrored at each bridge.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.4">
-7.4</a>&nbsp;&nbsp;Public bridges with central discovery</h3>
-
-<div class="p"><!----></div>
-What about people who want to volunteer as bridges but don't know any
-suitable blocked users? What about people who are blocked but don't
-know anybody on the outside? Here we describe how to make use of these
-<em>public bridges</em> in a way that still makes it hard for the attacker
-to learn all of them.
-
-<div class="p"><!----></div>
-The basic idea is to divide public bridges into a set of pools based on
-identity key. Each pool corresponds to a <em>distribution strategy</em>:
-an approach to distributing its bridge addresses to users. Each strategy
-is designed to exercise a different scarce resource or property of
-the user.
-
-<div class="p"><!----></div>
-How do we divide bridges between these strategy pools such that they're
-evenly distributed and the allocation is hard to influence or predict,
-but also in a way that's amenable to creating more strategies later
-on without reshuffling all the pools? We assign a given bridge
-to a strategy pool by hashing the bridge's identity key along with a
-secret that only the bridge authority knows: the first n bits of this
-hash dictate the strategy pool number, where n is a parameter that
-describes how many strategy pools we want at this point. We choose n=3
-to start, so we divide bridges between 8 pools; but as we later invent
-new distribution strategies, we can increment n to split the 8 into
-16. Since a bridge can't predict the next bit in its hash, it can't
-anticipate which identity key will correspond to a certain new pool
-when the pools are split. Further, since the bridge authority doesn't
-provide any feedback to the bridge about which strategy pool it's in,
-an adversary who signs up bridges with the goal of filling a certain
-pool&nbsp;[<a href="#casc-rep" name="CITEcasc-rep">12</a>] will be hindered.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-The first distribution strategy (used for the first pool) publishes bridge
-addresses in a time-release fashion. The bridge authority divides the
-available bridges into partitions, and each partition is deterministically
-available only in certain time windows. That is, over the course of a
-given time slot (say, an hour), each requester is given a random bridge
-from within that partition. When the next time slot arrives, a new set
-of bridges from the pool are available for discovery. Thus some bridge
-address is always available when a new
-user arrives, but to learn about all bridges the attacker needs to fetch
-all new addresses at every new time slot. By varying the length of the
-time slots, we can make it harder for the attacker to guess when to check
-back. We expect these bridges will be the first to be blocked, but they'll
-help the system bootstrap until they <em>do</em> get blocked. Further,
-remember that we're dealing with different blocking regimes around the
-world that will progress at different rates &mdash; so this pool will still
-be useful to some users even as the arms races progress.
-
-<div class="p"><!----></div>
-The second distribution strategy publishes bridge addresses based on the IP
-address of the requesting user. Specifically, the bridge authority will
-divide the available bridges in the pool into a bunch of partitions
-(as in the first distribution scheme), hash the requester's IP address
-with a secret of its own (as in the above allocation scheme for creating
-pools), and give the requester a random bridge from the appropriate
-partition. To raise the bar, we should discard the last octet of the
-IP address before inputting it to the hash function, so an attacker
-who only controls a single "/24" network only counts as one user. A
-large attacker like China will still be able to control many addresses,
-but the hassle of establishing connections from each network (or spoofing
-TCP connections) may still slow them down. Similarly, as a special case,
-we should treat IP addresses that are Tor exit nodes as all being on
-the same network.
-
-<div class="p"><!----></div>
-The third strategy combines the time-based and location-based
-strategies to further constrain and rate-limit the available bridge
-addresses. Specifically, the bridge address provided in a given time
-slot to a given network location is deterministic within the partition,
-rather than chosen randomly each time from the partition. Thus, repeated
-requests during that time slot from a given network are given the same
-bridge address as the first request.
-
-<div class="p"><!----></div>
-The fourth strategy is based on Circumventor's discovery strategy.
-The Circumventor project, realizing that its adoption will remain limited
-if it has no central coordination mechanism, has started a mailing list to
-distribute new proxy addresses every few days. From experimentation it
-seems they have concluded that sending updates every three or four days
-is sufficient to stay ahead of the current attackers.
-
-<div class="p"><!----></div>
-The fifth strategy provides an alternative approach to a mailing list:
-users provide an email address and receive an automated response
-listing an available bridge address. We could limit one response per
-email address. To further rate limit queries, we could require a CAPTCHA
-solution
-in each case too. In fact, we wouldn't need to
-implement the CAPTCHA on our side: if we only deliver bridge addresses
-to Yahoo or GMail addresses, we can leverage the rate-limiting schemes
-that other parties already impose for account creation.
-
-<div class="p"><!----></div>
-The sixth strategy ties in the social network design with public
-bridges and a reputation system. We pick some seeds &mdash; trusted people in
-blocked areas &mdash; and give them each a few dozen bridge addresses and a few
-<em>delegation tokens</em>. We run a website next to the bridge authority,
-where users can log in (they connect via Tor, and they don't need to
-provide actual identities, just persistent pseudonyms). Users can delegate
-trust to other people they know by giving them a token, which can be
-exchanged for a new account on the website. Accounts in "good standing"
-then accrue new bridge addresses and new tokens. As usual, reputation
-schemes bring in a host of new complexities&nbsp;[<a href="#rep-anon" name="CITErep-anon">10</a>]: how do we
-decide that an account is in good standing? We could tie reputation
-to whether the bridges they're told about have been blocked &mdash; see
-Section&nbsp;<a href="#subsec:geoip">7.7</a> below for initial thoughts on how to discover
-whether bridges have been blocked. We could track reputation between
-accounts (if you delegate to somebody who screws up, it impacts you too),
-or we could use blinded delegation tokens&nbsp;[<a href="#chaum-blind" name="CITEchaum-blind">5</a>] to prevent
-the website from mapping the seeds' social network. We put off deeper
-discussion of the social network reputation strategy for future work.
-
-<div class="p"><!----></div>
-Pools seven and eight are held in reserve, in case our currently deployed
-tricks all fail at once and the adversary blocks all those bridges &mdash; so
-we can adapt and move to new approaches quickly, and have some bridges
-immediately available for the new schemes. New strategies might be based
-on some other scarce resource, such as relaying traffic for others or
-other proof of energy spent. (We might also worry about the incentives
-for bridges that sign up and get allocated to the reserve pools: will they
-be unhappy that they're not being used? But this is a transient problem:
-if Tor users are bridges by default, nobody will mind not being used yet.
-See also Section&nbsp;<a href="#subsec:incentives">9.4</a>.)
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.5">
-7.5</a>&nbsp;&nbsp;Public bridges with coordinated discovery</h3>
-
-<div class="p"><!----></div>
-We presented the above discovery strategies in the context of a single
-bridge directory authority, but in practice we will want to distribute the
-operations over several bridge authorities &mdash; a single point of failure
-or attack is a bad move. The first answer is to run several independent
-bridge directory authorities, and bridges gravitate to one based on
-their identity key. The better answer would be some federation of bridge
-authorities that work together to provide redundancy but don't introduce
-new security issues. We could even imagine designs where the bridge
-authorities have encrypted versions of the bridge's server descriptors,
-and the users learn a decryption key that they keep private when they
-first hear about the bridge &mdash; this way the bridge authorities would not
-be able to learn the IP address of the bridges.
-
-<div class="p"><!----></div>
-We leave this design question for future work.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.6">
-7.6</a>&nbsp;&nbsp;Assessing whether bridges are useful</h3>
-
-<div class="p"><!----></div>
-Learning whether a bridge is useful is important in the bridge authority's
-decision to include it in responses to blocked users. For example, if
-we end up with a list of thousands of bridges and only a few dozen of
-them are reachable right now, most blocked users will not end up knowing
-about working bridges.
-
-<div class="p"><!----></div>
-There are three components for assessing how useful a bridge is. First,
-is it reachable from the public Internet? Second, what proportion of
-the time is it available? Third, is it blocked in certain jurisdictions?
-
-<div class="p"><!----></div>
-The first component can be tested just as we test reachability of
-ordinary Tor servers. Specifically, the bridges do a self-test &mdash; connect
-to themselves via the Tor network &mdash; before they are willing to
-publish their descriptor, to make sure they're not obviously broken or
-misconfigured. Once the bridges publish, the bridge authority also tests
-reachability to make sure they're not confused or outright lying.
-
-<div class="p"><!----></div>
-The second component can be measured and tracked by the bridge authority.
-By doing periodic reachability tests, we can get a sense of how often the
-bridge is available. More complex tests will involve bandwidth-intensive
-checks to force the bridge to commit resources in order to be counted as
-available. We need to evaluate how the relationship of uptime percentage
-should weigh into our choice of which bridges to advertise. We leave
-this to future work.
-
-<div class="p"><!----></div>
-The third component is perhaps the trickiest: with many different
-adversaries out there, how do we keep track of which adversaries have
-blocked which bridges, and how do we learn about new blocks as they
-occur? We examine this problem next.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.7">
-<a name="subsec:geoip">
-7.7</a>&nbsp;&nbsp;How do we know if a bridge relay has been blocked?</h3>
-</a>
-
-<div class="p"><!----></div>
-There are two main mechanisms for testing whether bridges are reachable
-from inside each blocked area: active testing via users, and passive
-testing via bridges.
-
-<div class="p"><!----></div>
-In the case of active testing, certain users inside each area
-sign up as testing relays. The bridge authorities can then use a
-Blossom-like&nbsp;[<a href="#blossom-thesis" name="CITEblossom-thesis">16</a>] system to build circuits through them
-to each bridge and see if it can establish the connection. But how do
-we pick the users? If we ask random users to do the testing (or if we
-solicit volunteers from the users), the adversary should sign up so he
-can enumerate the bridges we test. Indeed, even if we hand-select our
-testers, the adversary might still discover their location and monitor
-their network activity to learn bridge addresses.
-
-<div class="p"><!----></div>
-Another answer is not to measure directly, but rather let the bridges
-report whether they're being used.
-Specifically, bridges should install a GeoIP database such as the public
-IP-To-Country list&nbsp;[<a href="#ip-to-country" name="CITEip-to-country">19</a>], and then periodically report to the
-bridge authorities which countries they're seeing use from. This data
-would help us track which countries are making use of the bridge design,
-and can also let us learn about new steps the adversary has taken in
-the arms race. (The compressed GeoIP database is only several hundred
-kilobytes, and we could even automate the update process by serving it
-from the bridge authorities.)
-More analysis of this passive reachability
-testing design is needed to resolve its many edge cases: for example,
-if a bridge stops seeing use from a certain area, does that mean the
-bridge is blocked or does that mean those users are asleep?
-
-<div class="p"><!----></div>
-There are many more problems with the general concept of detecting whether
-bridges are blocked. First, different zones of the Internet are blocked
-in different ways, and the actual firewall jurisdictions do not match
-country borders. Our bridge scheme could help us map out the topology
-of the censored Internet, but this is a huge task. More generally,
-if a bridge relay isn't reachable, is that because of a network block
-somewhere, because of a problem at the bridge relay, or just a temporary
-outage somewhere in between? And last, an attacker could poison our
-bridge database by signing up already-blocked bridges. In this case,
-if we're stingy giving out bridge addresses, users in that country won't
-learn working bridges.
-
-<div class="p"><!----></div>
-All of these issues are made more complex when we try to integrate this
-testing into our social network reputation system above.
-Since in that case we punish or reward users based on whether bridges
-get blocked, the adversary has new attacks to trick or bog down the
-reputation tracking. Indeed, the bridge authority doesn't even know
-what zone the blocked user is in, so do we blame him for any possible
-censored zone, or what?
-
-<div class="p"><!----></div>
-Clearly more analysis is required. The eventual solution will probably
-involve a combination of passive measurement via GeoIP and active
-measurement from trusted testers. More generally, we can use the passive
-feedback mechanism to track usage of the bridge network as a whole &mdash; which
-would let us respond to attacks and adapt the design, and it would also
-let the general public track the progress of the project.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc7.8">
-7.8</a>&nbsp;&nbsp;Advantages of deploying all solutions at once</h3>
-
-<div class="p"><!----></div>
-For once, we're not in the position of the defender: we don't have to
-defend against every possible filtering scheme; we just have to defend
-against at least one. On the flip side, the attacker is forced to guess
-how to allocate his resources to defend against each of these discovery
-strategies. So by deploying all of our strategies at once, we not only
-increase our chances of finding one that the adversary has difficulty
-blocking, but we actually make <em>all</em> of the strategies more robust
-in the face of an adversary with limited resources.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc8">
-<a name="sec:security">
-8</a>&nbsp;&nbsp;Security considerations</h2>
-</a>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc8.1">
-8.1</a>&nbsp;&nbsp;Possession of Tor in oppressed areas</h3>
-
-<div class="p"><!----></div>
-Many people speculate that installing and using a Tor client in areas with
-particularly extreme firewalls is a high risk &mdash; and the risk increases
-as the firewall gets more restrictive. This notion certainly has merit, but
-there's
-a counter pressure as well: as the firewall gets more restrictive, more
-ordinary people behind it end up using Tor for more mainstream activities,
-such as learning
-about Wall Street prices or looking at pictures of women's ankles. So
-as the restrictive firewall pushes up the number of Tor users, the
-"typical" Tor user becomes more mainstream, and therefore mere
-use or possession of the Tor software is not so surprising.
-
-<div class="p"><!----></div>
-It's hard to say which of these pressures will ultimately win out,
-but we should keep both sides of the issue in mind.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc8.2">
-<a name="subsec:upload-padding">
-8.2</a>&nbsp;&nbsp;Observers can tell who is publishing and who is reading</h3>
-</a>
-
-<div class="p"><!----></div>
-Tor encrypts traffic on the local network, and it obscures the eventual
-destination of the communication, but it doesn't do much to obscure the
-traffic volume. In particular, a user publishing a home video will have a
-different network fingerprint than a user reading an online news article.
-Based on our assumption in Section&nbsp;<a href="#sec:adversary">2</a> that users who
-publish material are in more danger, should we work to improve Tor's
-security in this situation?
-
-<div class="p"><!----></div>
-In the general case this is an extremely challenging task:
-effective <em>end-to-end traffic confirmation attacks</em>
-are known where the adversary observes the origin and the
-destination of traffic and confirms that they are part of the
-same communication&nbsp;[<a href="#danezis:pet2004" name="CITEdanezis:pet2004">8</a>,<a href="#e2e-traffic" name="CITEe2e-traffic">24</a>]. Related are
-<em>website fingerprinting attacks</em>, where the adversary downloads
-a few hundred popular websites, makes a set of "fingerprints" for each
-site, and then observes the target Tor client's traffic to look for
-a match&nbsp;[<a href="#pet05-bissias" name="CITEpet05-bissias">4</a>,<a href="#defensive-dropping" name="CITEdefensive-dropping">21</a>]. But can we do better
-against a limited adversary who just does coarse-grained sweeps looking
-for unusually prolific publishers?
-
-<div class="p"><!----></div>
-One answer is for bridge users to automatically send bursts of padding
-traffic periodically. (This traffic can be implemented in terms of
-long-range drop cells, which are already part of the Tor specification.)
-Of course, convincingly simulating an actual human publishing interesting
-content is a difficult arms race, but it may be worthwhile to at least
-start the race. More research remains.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc8.3">
-8.3</a>&nbsp;&nbsp;Anonymity effects from acting as a bridge relay</h3>
-
-<div class="p"><!----></div>
-Against some attacks, relaying traffic for others can improve
-anonymity. The simplest example is an attacker who owns a small number
-of Tor servers. He will see a connection from the bridge, but he won't
-be able to know whether the connection originated there or was relayed
-from somebody else. More generally, the mere uncertainty of whether the
-traffic originated from that user may be helpful.
-
-<div class="p"><!----></div>
-There are some cases where it doesn't seem to help: if an attacker can
-watch all of the bridge's incoming and outgoing traffic, then it's easy
-to learn which connections were relayed and which started there. (In this
-case he still doesn't know the final destinations unless he is watching
-them too, but in this case bridges are no better off than if they were
-an ordinary client.)
-
-<div class="p"><!----></div>
-There are also some potential downsides to running a bridge. First, while
-we try to make it hard to enumerate all bridges, it's still possible to
-learn about some of them, and for some people just the fact that they're
-running one might signal to an attacker that they place a higher value
-on their anonymity. Second, there are some more esoteric attacks on Tor
-relays that are not as well-understood or well-tested &mdash; for example, an
-attacker may be able to "observe" whether the bridge is sending traffic
-even if he can't actually watch its network, by relaying traffic through
-it and noticing changes in traffic timing&nbsp;[<a href="#attack-tor-oak05" name="CITEattack-tor-oak05">25</a>]. On
-the other hand, it may be that limiting the bandwidth the bridge is
-willing to relay will allow this sort of attacker to determine if it's
-being used as a bridge but not easily learn whether it is adding traffic
-of its own.
-
-<div class="p"><!----></div>
-We also need to examine how entry guards fit in. Entry guards
-(a small set of nodes that are always used for the first
-step in a circuit) help protect against certain attacks
-where the attacker runs a few Tor servers and waits for
-the user to choose these servers as the beginning and end of her
-circuit<a href="#tthFtNtAAC" name="tthFrefAAC"><sup>2</sup></a>.
-If the blocked user doesn't use the bridge's entry guards, then the bridge
-doesn't gain as much cover benefit. On the other hand, what design changes
-are needed for the blocked user to use the bridge's entry guards without
-learning what they are (this seems hard), and even if we solve that,
-do they then need to use the guards' guards and so on down the line?
-
-<div class="p"><!----></div>
-It is an open research question whether the benefits of running a bridge
-outweigh the risks. A lot of the decision rests on which attacks the
-users are most worried about. For most users, we don't think running a
-bridge relay will be that damaging, and it could help quite a bit.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc8.4">
-<a name="subsec:cafes-and-livecds">
-8.4</a>&nbsp;&nbsp;Trusting local hardware: Internet cafes and LiveCDs</h3>
-</a>
-
-<div class="p"><!----></div>
-Assuming that users have their own trusted hardware is not
-always reasonable.
-
-<div class="p"><!----></div>
-For Internet cafe Windows computers that let you attach your own USB key,
-a USB-based Tor image would be smart. There's Torpark, and hopefully
-there will be more thoroughly analyzed and trustworthy options down the
-road. Worries remain about hardware or software keyloggers and other
-spyware, as well as physical surveillance.
-
-<div class="p"><!----></div>
-If the system lets you boot from a CD or from a USB key, you can gain
-a bit more security by bringing a privacy LiveCD with you. (This
-approach isn't foolproof either of course, since hardware
-keyloggers and physical surveillance are still a worry).
-
-<div class="p"><!----></div>
-In fact, LiveCDs are also useful if it's your own hardware, since it's
-easier to avoid leaving private data and logs scattered around the
-system.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc8.5">
-<a name="subsec:trust-chain">
-8.5</a>&nbsp;&nbsp;The trust chain</h3>
-</a>
-
-<div class="p"><!----></div>
-Tor's "public key infrastructure" provides a chain of trust to
-let users verify that they're actually talking to the right servers.
-There are four pieces to this trust chain.
-
-<div class="p"><!----></div>
-First, when Tor clients are establishing circuits, at each step
-they demand that the next Tor server in the path prove knowledge of
-its private key&nbsp;[<a href="#tor-design" name="CITEtor-design">11</a>]. This step prevents the first node
-in the path from just spoofing the rest of the path. Second, the
-Tor directory authorities provide a signed list of servers along with
-their public keys &mdash; so unless the adversary can control a threshold
-of directory authorities, he can't trick the Tor client into using other
-Tor servers. Third, the location and keys of the directory authorities,
-in turn, is hard-coded in the Tor source code &mdash; so as long as the user
-got a genuine version of Tor, he can know that he is using the genuine
-Tor network. And last, the source code and other packages are signed
-with the GPG keys of the Tor developers, so users can confirm that they
-did in fact download a genuine version of Tor.
-
-<div class="p"><!----></div>
-In the case of blocked users contacting bridges and bridge directory
-authorities, the same logic applies in parallel: the blocked users fetch
-information from both the bridge authorities and the directory authorities
-for the `main' Tor network, and they combine this information locally.
-
-<div class="p"><!----></div>
-How can a user in an oppressed country know that he has the correct
-key fingerprints for the developers? As with other security systems, it
-ultimately comes down to human interaction. The keys are signed by dozens
-of people around the world, and we have to hope that our users have met
-enough people in the PGP web of trust
-that they can learn
-the correct keys. For users that aren't connected to the global security
-community, though, this question remains a critical weakness.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc9">
-<a name="sec:reachability">
-9</a>&nbsp;&nbsp;Maintaining reachability</h2>
-</a>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc9.1">
-9.1</a>&nbsp;&nbsp;How many bridge relays should you know about?</h3>
-
-<div class="p"><!----></div>
-The strategies described in Section&nbsp;<a href="#sec:discovery">7</a> talked about
-learning one bridge address at a time. But if most bridges are ordinary
-Tor users on cable modem or DSL connection, many of them will disappear
-and/or move periodically. How many bridge relays should a blocked user
-know about so that she is likely to have at least one reachable at any
-given point? This is already a challenging problem if we only consider
-natural churn: the best approach is to see what bridges we attract in
-reality and measure their churn. We may also need to factor in a parameter
-for how quickly bridges get discovered and blocked by the attacker;
-we leave this for future work after we have more deployment experience.
-
-<div class="p"><!----></div>
-A related question is: if the bridge relays change IP addresses
-periodically, how often does the blocked user need to fetch updates in
-order to keep from being cut out of the loop?
-
-<div class="p"><!----></div>
-Once we have more experience and intuition, we should explore technical
-solutions to this problem too. For example, if the discovery strategies
-give out k bridge addresses rather than a single bridge address, perhaps
-we can improve robustness from the user perspective without significantly
-aiding the adversary. Rather than giving out a new random subset of k
-addresses at each point, we could bind them together into <em>bridge
-families</em>, so all users that learn about one member of the bridge family
-are told about the rest as well.
-
-<div class="p"><!----></div>
-This scheme may also help defend against attacks to map the set of
-bridges. That is, if all blocked users learn a random subset of bridges,
-the attacker should learn about a few bridges, monitor the country-level
-firewall for connections to them, then watch those users to see what
-other bridges they use, and repeat. By segmenting the bridge address
-space, we can limit the exposure of other users.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc9.2">
-<a name="subsec:block-cable">
-9.2</a>&nbsp;&nbsp;Cablemodem users don't usually provide important websites</h3>
-</a>
-
-<div class="p"><!----></div>
-Another attacker we might be concerned about is that the attacker could
-just block all DSL and cablemodem network addresses, on the theory that
-they don't run any important services anyway. If most of our bridges
-are on these networks, this attack could really hurt.
-
-<div class="p"><!----></div>
-The first answer is to aim to get volunteers both from traditionally
-"consumer" networks and also from traditionally "producer" networks.
-Since bridges don't need to be Tor exit nodes, as we improve our usability
-it seems quite feasible to get a lot of websites helping out.
-
-<div class="p"><!----></div>
-The second answer (not as practical) would be to encourage more use of
-consumer networks for popular and useful Internet services.
-
-<div class="p"><!----></div>
-A related attack we might worry about is based on large countries putting
-economic pressure on companies that want to expand their business. For
-example, what happens if Verizon wants to sell services in China, and
-China pressures Verizon to discourage its users in the free world from
-running bridges?
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc9.3">
-9.3</a>&nbsp;&nbsp;Scanning resistance: making bridges more subtle</h3>
-
-<div class="p"><!----></div>
-If it's trivial to verify that a given address is operating as a bridge,
-and most bridges run on a predictable port, then it's conceivable our
-attacker could scan the whole Internet looking for bridges. (In fact,
-he can just concentrate on scanning likely networks like cablemodem
-and DSL services &mdash; see Section&nbsp;<a href="#subsec:block-cable">9.2</a>
-above for
-related attacks.) It would be nice to slow down this attack. It would
-be even nicer to make it hard to learn whether we're a bridge without
-first knowing some secret. We call this general property <em>scanning
-resistance</em>, and it goes along with normalizing Tor's TLS handshake and
-network fingerprint.
-
-<div class="p"><!----></div>
-We could provide a password to the blocked user, and she (or her Tor
-client) provides a nonced hash of this password when she connects. We'd
-need to give her an ID key for the bridge too (in addition to the IP
-address and port &mdash; see Section&nbsp;<a href="#subsec:id-address">6.1</a>), and wait to
-present the password until we've finished the TLS handshake, else it
-would look unusual. If Alice can authenticate the bridge before she
-tries to send her password, we can resist an adversary who pretends
-to be the bridge and launches a man-in-the-middle attack to learn the
-password. But even if she can't, we still resist against widespread
-scanning.
-
-<div class="p"><!----></div>
-How should the bridge behave if accessed without the correct
-authorization? Perhaps it should act like an unconfigured HTTPS server
-("welcome to the default Apache page"), or maybe it should mirror
-and act like common websites, or websites randomly chosen from Google.
-
-<div class="p"><!----></div>
-We might assume that the attacker can recognize HTTPS connections that
-use self-signed certificates. (This process would be resource-intensive
-but not out of the realm of possibility.) But even in this case, many
-popular websites around the Internet use self-signed or just plain broken
-SSL certificates.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc9.4">
-<a name="subsec:incentives">
-9.4</a>&nbsp;&nbsp;How to motivate people to run bridge relays</h3>
-</a>
-
-<div class="p"><!----></div>
-One of the traditional ways to get people to run software that benefits
-others is to give them motivation to install it themselves. An often
-suggested approach is to install it as a stunning screensaver so everybody
-will be pleased to run it. We take a similar approach here, by leveraging
-the fact that these users are already interested in protecting their
-own Internet traffic, so they will install and run the software.
-
-<div class="p"><!----></div>
-Eventually, we may be able to make all Tor users become bridges if they
-pass their self-reachability tests &mdash; the software and installers need
-more work on usability first, but we're making progress.
-
-<div class="p"><!----></div>
-In the mean time, we can make a snazzy network graph with
-Vidalia<a href="#tthFtNtAAD" name="tthFrefAAD"><sup>3</sup></a> that
-emphasizes the connections the bridge user is currently relaying.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc9.5">
-<a name="subsec:publicity">
-9.5</a>&nbsp;&nbsp;Publicity attracts attention</h3>
-</a>
-
-<div class="p"><!----></div>
-Many people working on this field want to publicize the existence
-and extent of censorship concurrently with the deployment of their
-circumvention software. The easy reason for this two-pronged push is
-to attract volunteers for running proxies in their systems; but in many
-cases their main goal is not to focus on actually allowing individuals
-to circumvent the firewall, but rather to educate the world about the
-censorship. The media also tries to do its part by broadcasting the
-existence of each new circumvention system.
-
-<div class="p"><!----></div>
-But at the same time, this publicity attracts the attention of the
-censors. We can slow down the arms race by not attracting as much
-attention, and just spreading by word of mouth. If our goal is to
-establish a solid social network of bridges and bridge users before
-the adversary gets involved, does this extra attention work to our
-disadvantage?
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc9.6">
-9.6</a>&nbsp;&nbsp;The Tor website: how to get the software</h3>
-
-<div class="p"><!----></div>
-One of the first censoring attacks against a system like ours is to
-block the website and make the software itself hard to find. Our system
-should work well once the user is running an authentic
-copy of Tor and has found a working bridge, but to get to that point
-we rely on their individual skills and ingenuity.
-
-<div class="p"><!----></div>
-Right now, most countries that block access to Tor block only the main
-website and leave mirrors and the network itself untouched.
-Falling back on word-of-mouth is always a good last resort, but we should
-also take steps to make sure it's relatively easy for users to get a copy,
-such as publicizing the mirrors more and making copies available through
-other media. We might also mirror the latest version of the software on
-each bridge, so users who hear about an honest bridge can get a good
-copy.
-See Section&nbsp;<a href="#subsec:first-bridge">7.1</a> for more discussion.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc10">
-<a name="sec:future">
-10</a>&nbsp;&nbsp;Future designs</h2>
-</a>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc10.1">
-10.1</a>&nbsp;&nbsp;Bridges inside the blocked network too</h3>
-
-<div class="p"><!----></div>
-Assuming actually crossing the firewall is the risky part of the
-operation, can we have some bridge relays inside the blocked area too,
-and more established users can use them as relays so they don't need to
-communicate over the firewall directly at all? A simple example here is
-to make new blocked users into internal bridges also &mdash; so they sign up
-on the bridge authority as part of doing their query, and we give out
-their addresses
-rather than (or along with) the external bridge addresses. This design
-is a lot trickier because it brings in the complexity of whether the
-internal bridges will remain available, can maintain reachability with
-the outside world, etc.
-
-<div class="p"><!----></div>
-More complex future designs involve operating a separate Tor network
-inside the blocked area, and using <em>hidden service bridges</em> &mdash; bridges
-that can be accessed by users of the internal Tor network but whose
-addresses are not published or findable, even by these users &mdash; to get
-from inside the firewall to the rest of the Internet. But this design
-requires directory authorities to run inside the blocked area too,
-and they would be a fine target to take down the network.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc11">
-<a name="sec:conclusion">
-11</a>&nbsp;&nbsp;Next Steps</h2>
-</a>
-
-<div class="p"><!----></div>
-Technical solutions won't solve the whole censorship problem. After all,
-the firewalls in places like China are <em>socially</em> very
-successful, even if technologies and tricks exist to get around them.
-However, having a strong technical solution is still necessary as one
-important piece of the puzzle.
-
-<div class="p"><!----></div>
-In this paper, we have shown that Tor provides a great set of building
-blocks to start from. The next steps are to deploy prototype bridges and
-bridge authorities, implement some of the proposed discovery strategies,
-and then observe the system in operation and get more intuition about
-the actual requirements and adversaries we're up against.
-
-<div class="p"><!----></div>
-
-<h2>References</h2>
-
-<dl compact="compact">
- <dt><a href="#CITEeconymics" name="econymics">[1]</a></dt><dd>
-Alessandro Acquisti, Roger Dingledine, and Paul Syverson.
- On the economics of anonymity.
- In Rebecca&nbsp;N. Wright, editor, <em>Financial Cryptography</em>.
- Springer-Verlag, LNCS 2742, 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEfreedom21-security" name="freedom21-security">[2]</a></dt><dd>
-Adam Back, Ian Goldberg, and Adam Shostack.
- Freedom systems 2.1 security issues and analysis.
- White paper, Zero Knowledge Systems, Inc., May 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEweb-mix" name="web-mix">[3]</a></dt><dd>
-Oliver Berthold, Hannes Federrath, and Stefan K&#246;psell.
- Web MIXes: A system for anonymous and unobservable Internet
- access.
- In H.&nbsp;Federrath, editor, <em>Designing Privacy Enhancing
- Technologies: Workshop on Design Issue in Anonymity and Unobservability</em>.
- Springer-Verlag, LNCS 2009, 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEpet05-bissias" name="pet05-bissias">[4]</a></dt><dd>
-George&nbsp;Dean Bissias, Marc Liberatore, and Brian&nbsp;Neil Levine.
- Privacy vulnerabilities in encrypted http streams.
- In <em>Proceedings of Privacy Enhancing Technologies workshop (PET
- 2005)</em>, May 2005.
-
- <a href="http://prisms.cs.umass.edu/brian/pubs/bissias.liberatore.pet.2005.pdf"><tt>http://prisms.cs.umass.edu/brian/pubs/bissias.liberatore.pet.2005.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEchaum-blind" name="chaum-blind">[5]</a></dt><dd>
-David Chaum.
- Blind signatures for untraceable payments.
- In D.&nbsp;Chaum, R.L. Rivest, and A.T. Sherman, editors, <em>Advances in
- Cryptology: Proceedings of Crypto 82</em>, pages 199-203. Plenum Press, 1983.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEfreenet-pets00" name="freenet-pets00">[6]</a></dt><dd>
-Ian Clarke, Oskar Sandberg, Brandon Wiley, and Theodore&nbsp;W. Hong.
- Freenet: A distributed anonymous information storage and retrieval
- system.
- In H.&nbsp;Federrath, editor, <em>Designing Privacy Enhancing
- Technologies: Workshop on Design Issue in Anonymity and Unobservability</em>,
- pages 46-66. Springer-Verlag, LNCS 2009, July 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEclayton:pet2006" name="clayton:pet2006">[7]</a></dt><dd>
-Richard Clayton, Steven&nbsp;J. Murdoch, and Robert N.&nbsp;M. Watson.
- Ignoring the great firewall of china.
- In <em>Proceedings of the Sixth Workshop on Privacy Enhancing
- Technologies (PET 2006)</em>, Cambridge, UK, June 2006. Springer.
- <a href="http://www.cl.cam.ac.uk/~rnc1/ignoring.pdf"><tt>http://www.cl.cam.ac.uk/~rnc1/ignoring.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEdanezis:pet2004" name="danezis:pet2004">[8]</a></dt><dd>
-George Danezis.
- The traffic analysis of continuous-time mixes.
- In David Martin and Andrei Serjantov, editors, <em>Privacy Enhancing
- Technologies (PET 2004)</em>, LNCS, May 2004.
- <a href="http://www.cl.cam.ac.uk/users/gd216/cmm2.pdf"><tt>http://www.cl.cam.ac.uk/users/gd216/cmm2.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEusability:weis2006" name="usability:weis2006">[9]</a></dt><dd>
-Roger Dingledine and Nick Mathewson.
- Anonymity loves company: Usability and the network effect.
- In <em>Proceedings of the Fifth Workshop on the Economics of
- Information Security (WEIS 2006)</em>, Cambridge, UK, June 2006.
- <a href="http://freehaven.net/doc/wupss04/usability.pdf"><tt>http://freehaven.net/doc/wupss04/usability.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITErep-anon" name="rep-anon">[10]</a></dt><dd>
-Roger Dingledine, Nick Mathewson, and Paul Syverson.
- Reputation in P2P Anonymity Systems.
- In <em>Proceedings of Workshop on Economics of Peer-to-Peer
- Systems</em>, June 2003.
- <a href="http://freehaven.net/doc/econp2p03/econp2p03.pdf"><tt>http://freehaven.net/doc/econp2p03/econp2p03.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEtor-design" name="tor-design">[11]</a></dt><dd>
-Roger Dingledine, Nick Mathewson, and Paul Syverson.
- Tor: The second-generation onion router.
- In <em>Proceedings of the 13th USENIX Security Symposium</em>, August
- 2004.
- <a href="http://tor.eff.org/tor-design.pdf"><tt>http://tor.eff.org/tor-design.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEcasc-rep" name="casc-rep">[12]</a></dt><dd>
-Roger Dingledine and Paul Syverson.
- Reliable MIX Cascade Networks through Reputation.
- In Matt Blaze, editor, <em>Financial Cryptography</em>. Springer-Verlag,
- LNCS 2357, 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEpsiphon" name="psiphon">[13]</a></dt><dd>
-Ronald&nbsp;Deibert et&nbsp;al.
- Psiphon.
- <a href="http://psiphon.civisec.org/"><tt>http://psiphon.civisec.org/</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEinfranet" name="infranet">[14]</a></dt><dd>
-Nick Feamster, Magdalena Balazinska, Greg Harfst, Hari Balakrishnan, and David
- Karger.
- Infranet: Circumventing web censorship and surveillance.
- In <em>Proceedings of the 11th USENIX Security Symposium</em>, August
- 2002.
- <a href="http://nms.lcs.mit.edu/~feamster/papers/usenixsec2002.pdf"><tt>http://nms.lcs.mit.edu/~feamster/papers/usenixsec2002.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEactive-wardens" name="active-wardens">[15]</a></dt><dd>
-Gina Fisk, Mike Fisk, Christos Papadopoulos, and Joshua Neil.
- Eliminating steganography in internet traffic with active wardens.
- In Fabien Petitcolas, editor, <em>Information Hiding Workshop (IH
- 2002)</em>. Springer-Verlag, LNCS 2578, October 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEblossom-thesis" name="blossom-thesis">[16]</a></dt><dd>
-Geoffrey Goodell.
- <em>Perspective Access Networks</em>.
- PhD thesis, Harvard University, July 2006.
- <a href="http://afs.eecs.harvard.edu/~goodell/thesis.pdf"><tt>http://afs.eecs.harvard.edu/~goodell/thesis.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEgoodell-syverson06" name="goodell-syverson06">[17]</a></dt><dd>
-Geoffrey Goodell and Paul Syverson.
- The right place at the right time: The use of network location in
- authentication and abuse prevention, 2006.
- Submitted.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEcircumventor" name="circumventor">[18]</a></dt><dd>
-Bennett Haselton.
- How to install the Circumventor program.
-
- <a href="http://www.peacefire.org/circumventor/simple-circumventor-instructions.html"><tt>http://www.peacefire.org/circumventor/simple-circumventor-instructions.html</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEip-to-country" name="ip-to-country">[19]</a></dt><dd>
-Ip-to-country database.
- <a href="http://ip-to-country.webhosting.info/"><tt>http://ip-to-country.webhosting.info/</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEkoepsell:wpes2004" name="koepsell:wpes2004">[20]</a></dt><dd>
-Stefan K&#246;psell and Ulf Hilling.
- How to achieve blocking resistance for existing systems enabling
- anonymous web surfing.
- In <em>Proceedings of the Workshop on Privacy in the Electronic
- Society (WPES 2004)</em>, Washington, DC, USA, October 2004.
- <a href="http://freehaven.net/anonbib/papers/p103-koepsell.pdf"><tt>http://freehaven.net/anonbib/papers/p103-koepsell.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEdefensive-dropping" name="defensive-dropping">[21]</a></dt><dd>
-Brian&nbsp;N. Levine, Michael&nbsp;K. Reiter, Chenxi Wang, and Matthew Wright.
- Timing analysis in low-latency mix-based systems.
- In Ari Juels, editor, <em>Financial Cryptography</em>. Springer-Verlag,
- LNCS (forthcoming), 2004.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEmackinnon-personal" name="mackinnon-personal">[22]</a></dt><dd>
-Rebecca MacKinnon.
- Private communication, 2006.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEcgiproxy" name="cgiproxy">[23]</a></dt><dd>
-James Marshall.
- CGIProxy: HTTP/FTP Proxy in a CGI Script.
- <a href="http://www.jmarshall.com/tools/cgiproxy/"><tt>http://www.jmarshall.com/tools/cgiproxy/</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEe2e-traffic" name="e2e-traffic">[24]</a></dt><dd>
-Nick Mathewson and Roger Dingledine.
- Practical traffic analysis: Extending and resisting statistical
- disclosure.
- In David Martin and Andrei Serjantov, editors, <em>Privacy Enhancing
- Technologies (PET 2004)</em>, LNCS, May 2004.
- <a href="http://freehaven.net/doc/e2e-traffic/e2e-traffic.pdf"><tt>http://freehaven.net/doc/e2e-traffic/e2e-traffic.pdf</tt></a>.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEattack-tor-oak05" name="attack-tor-oak05">[25]</a></dt><dd>
-Steven&nbsp;J. Murdoch and George Danezis.
- Low-cost traffic analysis of tor.
- In <em>IEEE Symposium on Security and Privacy</em>. IEEE CS, May 2005.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEtcpstego" name="tcpstego">[26]</a></dt><dd>
-Steven&nbsp;J. Murdoch and Stephen Lewis.
- Embedding covert channels into TCP/IP.
- In Mauro Barni, Jordi Herrera-Joancomart&#237;, Stefan Katzenbeisser,
- and Fernando P&#233;rez-Gonz&#225;lez, editors, <em>Information Hiding: 7th
- International Workshop</em>, volume 3727 of <em>LNCS</em>, pages 247-261,
- Barcelona, Catalonia (Spain), June 2005. Springer-Verlag.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEptacek98insertion" name="ptacek98insertion">[27]</a></dt><dd>
-Thomas&nbsp;H. Ptacek and Timothy&nbsp;N. Newsham.
- Insertion, evasion, and denial of service: Eluding network intrusion
- detection.
- Technical report, Secure Networks, Inc., Suite 330, 1201 5th Street
- S.W, Calgary, Alberta, Canada, T2R-0Y6, 1998.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEzuckerman-threatmodels" name="zuckerman-threatmodels">[28]</a></dt><dd>
-Ethan Zuckerman.
- We've got to adjust some of our threat models.
- <a href="http://www.ethanzuckerman.com/blog/?p=1019"><tt>http://www.ethanzuckerman.com/blog/?p=1019</tt></a>.</dd>
-</dl>
-
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-<hr /><h3>Footnotes:</h3>
-
-<div class="p"><!----></div>
-<a name="tthFtNtAAB"></a><a href="#tthFrefAAB"><sup>1</sup></a>So far in places
- like China, the authorities mainly go after people who publish materials
- and coordinate organized movements&nbsp;[<a href="#mackinnon-personal" name="CITEmackinnon-personal">22</a>].
- If they find that a
- user happens to be reading a site that should be blocked, the typical
- response is simply to block the site. Of course, even with an encrypted
- connection, the adversary may be able to distinguish readers from
- publishers by observing whether Alice is mostly downloading bytes or mostly
- uploading them &mdash; we discuss this issue more in
- Section&nbsp;<a href="#subsec:upload-padding">8.2</a>.
-<div class="p"><!----></div>
-<a name="tthFtNtAAC"></a><a href="#tthFrefAAC"><sup>2</sup></a><a href="http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ\#EntryGuards"><tt>http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#EntryGuards</tt></a>
-<div class="p"><!----></div>
-<a name="tthFtNtAAD"></a><a href="#tthFrefAAD"><sup>3</sup></a><a href="http://vidalia-project.net/"><tt>http://vidalia-project.net/</tt></a>
-<br /><br /><hr /><small>File translated from
-T<sub><font size="-1">E</font></sub>X
-by <a href="http://hutchinson.belmont.ma.us/tth/">
-T<sub><font size="-1">T</font></sub>H</a>,
-version 3.77.<br />On 11 May 2007, 21:49.</small>
-</html>
-
diff --git a/doc/design-paper/blocking.pdf b/doc/design-paper/blocking.pdf
deleted file mode 100644
index 1ee0eb0bbd..0000000000
--- a/doc/design-paper/blocking.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/blocking.tex b/doc/design-paper/blocking.tex
deleted file mode 100644
index 3b7d05ca57..0000000000
--- a/doc/design-paper/blocking.tex
+++ /dev/null
@@ -1,1894 +0,0 @@
-%\documentclass{llncs}
-\documentclass{usenixsubmit}
-%\documentclass[twocolumn]{article}
-%usepackage{usenix}
-
-\usepackage{url}
-\usepackage{amsmath}
-\usepackage{epsfig}
-
-\setlength{\textwidth}{6.0in}
-\setlength{\textheight}{8.5in}
-\setlength{\topmargin}{.5cm}
-\setlength{\oddsidemargin}{1cm}
-\setlength{\evensidemargin}{1cm}
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-
-\newcommand{\workingnote}[1]{} % The version that hides the note.
-%\newcommand{\workingnote}[1]{(**#1)} % makes the note visible.
-
-\date{}
-\title{Design of a blocking-resistant anonymity system\\DRAFT}
-
-%\author{Roger Dingledine\inst{1} \and Nick Mathewson\inst{1}}
-\author{Roger Dingledine \\ The Tor Project \\ arma@torproject.org \and
-Nick Mathewson \\ The Tor Project \\ nickm@torproject.org}
-
-\begin{document}
-\maketitle
-\pagestyle{plain}
-
-\begin{abstract}
-
-Internet censorship is on the rise as websites around the world are
-increasingly blocked by government-level firewalls. Although popular
-anonymizing networks like Tor were originally designed to keep attackers from
-tracing people's activities, many people are also using them to evade local
-censorship. But if the censor simply denies access to the Tor network
-itself, blocked users can no longer benefit from the security Tor offers.
-
-Here we describe a design that builds upon the current Tor network
-to provide an anonymizing network that resists blocking
-by government-level attackers. We have implemented and deployed this
-design, and talk briefly about early use.
-
-\end{abstract}
-
-\section{Introduction}
-
-Anonymizing networks like Tor~\cite{tor-design} bounce traffic around a
-network of encrypting relays. Unlike encryption, which hides only {\it what}
-is said, these networks also aim to hide who is communicating with whom, which
-users are using which websites, and so on. These systems have a
-broad range of users, including ordinary citizens who want to avoid being
-profiled for targeted advertisements, corporations who don't want to reveal
-information to their competitors, and law enforcement and government
-intelligence agencies who need to do operations on the Internet without being
-noticed.
-
-Historical anonymity research has focused on an
-attacker who monitors the user (call her Alice) and tries to discover her
-activities, yet lets her reach any piece of the network. In more modern
-threat models such as Tor's, the adversary is allowed to perform active
-attacks such as modifying communications to trick Alice
-into revealing her destination, or intercepting some connections
-to run a man-in-the-middle attack. But these systems still assume that
-Alice can eventually reach the anonymizing network.
-
-An increasing number of users are using the Tor software
-less for its anonymity properties than for its censorship
-resistance properties---if they use Tor to access Internet sites like
-Wikipedia
-and Blogspot, they are no longer affected by local censorship
-and firewall rules. In fact, an informal user study
-%(described in Appendix~\ref{app:geoip})
-showed that a few hundred thousand users people access the Tor network
-each day, with about 20\% of them coming from China~\cite{something}.
-
-The current Tor design is easy to block if the attacker controls Alice's
-connection to the Tor network---by blocking the directory authorities,
-by blocking all the relay IP addresses in the directory, or by filtering
-based on the network fingerprint of the Tor TLS handshake. Here we
-describe an
-extended design that builds upon the current Tor network to provide an
-anonymizing
-network that resists censorship as well as anonymity-breaking attacks.
-In section~\ref{sec:adversary} we discuss our threat model---that is,
-the assumptions we make about our adversary. Section~\ref{sec:current-tor}
-describes the components of the current Tor design and how they can be
-leveraged for a new blocking-resistant design. Section~\ref{sec:related}
-explains the features and drawbacks of the currently deployed solutions.
-In sections~\ref{sec:bridges} through~\ref{sec:discovery}, we explore the
-components of our designs in detail. Section~\ref{sec:security} considers
-security implications and Section~\ref{sec:reachability} presents other
-issues with maintaining connectivity and sustainability for the design.
-%Section~\ref{sec:future} speculates about future more complex designs,
-Finally section~\ref{sec:conclusion} summarizes our next steps and
-recommendations.
-
-% The other motivation is for places where we're concerned they will
-% try to enumerate a list of Tor users. So even if they're not blocking
-% the Tor network, it may be smart to not be visible as connecting to it.
-
-%And adding more different classes of users and goals to the Tor network
-%improves the anonymity for all Tor users~\cite{econymics,usability:weis2006}.
-
-% Adding use classes for countering blocking as well as anonymity has
-% benefits too. Should add something about how providing undetected
-% access to Tor would facilitate people talking to, e.g., govt. authorities
-% about threats to public safety etc. in an environment where Tor use
-% is not otherwise widespread and would make one stand out.
-
-\section{Adversary assumptions}
-\label{sec:adversary}
-
-To design an effective anti-censorship tool, we need a good model for the
-goals and resources of the censors we are evading. Otherwise, we risk
-spending our effort on keeping the adversaries from doing things they have no
-interest in doing, and thwarting techniques they do not use.
-The history of blocking-resistance designs is littered with conflicting
-assumptions about what adversaries to expect and what problems are
-in the critical path to a solution. Here we describe our best
-understanding of the current situation around the world.
-
-In the traditional security style, we aim to defeat a strong
-attacker---if we can defend against this attacker, we inherit protection
-against weaker attackers as well. After all, we want a general design
-that will work for citizens of China, Thailand, and other censored
-countries; for
-whistleblowers in firewalled corporate networks; and for people in
-unanticipated oppressive situations. In fact, by designing with
-a variety of adversaries in mind, we can take advantage of the fact that
-adversaries will be in different stages of the arms race at each location,
-so an address blocked in one locale can still be useful in others.
-We focus on an attacker with somewhat complex goals:
-
-\begin{tightlist}
-\item The attacker would like to restrict the flow of certain kinds of
- information, particularly when this information is seen as embarrassing to
- those in power (such as information about rights violations or corruption),
- or when it enables or encourages others to oppose them effectively (such as
- information about opposition movements or sites that are used to organize
- protests).
-\item As a second-order effect, censors aim to chill citizens' behavior by
- creating an impression that their online activities are monitored.
-\item In some cases, censors make a token attempt to block a few sites for
- obscenity, blasphemy, and so on, but their efforts here are mainly for
- show. In other cases, they really do try hard to block such content.
-\item Complete blocking (where nobody at all can ever download censored
- content) is not a
- goal. Attackers typically recognize that perfect censorship is not only
- impossible, it is unnecessary: if ``undesirable'' information is known only
- to a small few, further censoring efforts can be focused elsewhere.
-\item Similarly, the censors do not attempt to shut down or block {\it
- every} anti-censorship tool---merely the tools that are popular and
- effective (because these tools impede the censors' information restriction
- goals) and those tools that are highly visible (thus making the censors
- look ineffectual to their citizens and their bosses).
-\item Reprisal against {\it most} passive consumers of {\it most} kinds of
- blocked information is also not a goal, given the broadness of most
- censorship regimes. This seems borne out by fact.\footnote{So far in places
- like China, the authorities mainly go after people who publish materials
- and coordinate organized movements~\cite{mackinnon-personal}.
- If they find that a
- user happens to be reading a site that should be blocked, the typical
- response is simply to block the site. Of course, even with an encrypted
- connection, the adversary may be able to distinguish readers from
- publishers by observing whether Alice is mostly downloading bytes or mostly
- uploading them---we discuss this issue more in
- Section~\ref{subsec:upload-padding}.}
-\item Producers and distributors of targeted information are in much
- greater danger than consumers; the attacker would like to not only block
- their work, but identify them for reprisal.
-\item The censors (or their governments) would like to have a working, useful
- Internet. There are economic, political, and social factors that prevent
- them from ``censoring'' the Internet by outlawing it entirely, or by
- blocking access to all but a tiny list of sites.
- Nevertheless, the censors {\it are} willing to block innocuous content
- (like the bulk of a newspaper's reporting) in order to censor other content
- distributed through the same channels (like that newspaper's coverage of
- the censored country).
-\end{tightlist}
-
-We assume there are three main technical network attacks in use by censors
-currently~\cite{clayton:pet2006}:
-
-\begin{tightlist}
-\item Block a destination or type of traffic by automatically searching for
- certain strings or patterns in TCP packets. Offending packets can be
- dropped, or can trigger a response like closing the
- connection.
-\item Block certain IP addresses or destination ports at a
- firewall or other routing control point.
-\item Intercept DNS requests and give bogus responses for certain
- destination hostnames.
-\end{tightlist}
-
-We assume the network firewall has limited CPU and memory per
-connection~\cite{clayton:pet2006}. Against an adversary who could carefully
-examine the contents of every packet and correlate the packets in every
-stream on the network, we would need some stronger mechanism such as
-steganography, which introduces its own
-problems~\cite{active-wardens,tcpstego}. But we make a ``weak
-steganography'' assumption here: to remain unblocked, it is necessary to
-remain unobservable only by computational resources on par with a modern
-router, firewall, proxy, or IDS.
-
-We assume that while various different regimes can coordinate and share
-notes, there will be a time lag between one attacker learning how to overcome
-a facet of our design and other attackers picking it up. (The most common
-vector of transmission seems to be commercial providers of censorship tools:
-once a provider adds a feature to meet one country's needs or requests, the
-feature is available to all of the provider's customers.) Conversely, we
-assume that insider attacks become a higher risk only after the early stages
-of network development, once the system has reached a certain level of
-success and visibility.
-
-We do not assume that government-level attackers are always uniform
-across the country. For example, users of different ISPs in China
-experience different censorship policies and mechanisms~\cite{china-ccs07}.
-%there is no single centralized place in China
-%that coordinates its specific censorship decisions and steps.
-
-We assume that the attacker may be able to use political and economic
-resources to secure the cooperation of extraterritorial or multinational
-corporations and entities in investigating information sources.
-For example, the censors can threaten the service providers of
-troublesome blogs with economic reprisals if they do not reveal the
-authors' identities.
-
-We assume that our users have control over their hardware and
-software---they don't have any spyware installed, there are no
-cameras watching their screens, etc. Unfortunately, in many situations
-these threats are real~\cite{zuckerman-threatmodels}; yet
-software-based security systems like ours are poorly equipped to handle
-a user who is entirely observed and controlled by the adversary. See
-Section~\ref{subsec:cafes-and-livecds} for more discussion of what little
-we can do about this issue.
-
-Similarly, we assume that the user will be able to fetch a genuine
-version of Tor, rather than one supplied by the adversary; see
-Section~\ref{subsec:trust-chain} for discussion on helping the user
-confirm that he has a genuine version and that he can connect to the
-real Tor network.
-
-\section{Adapting the current Tor design to anti-censorship}
-\label{sec:current-tor}
-
-Tor is popular and sees a lot of use---it's the largest anonymity
-network of its kind, and has
-attracted more than 1500 volunteer-operated routers from around the
-world. Tor protects each user by routing their traffic through a multiply
-encrypted ``circuit'' built of a few randomly selected relay, each of which
-can remove only a single layer of encryption. Each relay sees only the step
-before it and the step after it in the circuit, and so no single relay can
-learn the connection between a user and her chosen communication partners.
-In this section, we examine some of the reasons why Tor has become popular,
-with particular emphasis to how we can take advantage of these properties
-for a blocking-resistance design.
-
-Tor aims to provide three security properties:
-\begin{tightlist}
-\item 1. A local network attacker can't learn, or influence, your
-destination.
-\item 2. No single router in the Tor network can link you to your
-destination.
-\item 3. The destination, or somebody watching the destination,
-can't learn your location.
-\end{tightlist}
-
-For blocking-resistance, we care most clearly about the first
-property. But as the arms race progresses, the second property
-will become important---for example, to discourage an adversary
-from volunteering a relay in order to learn that Alice is reading
-or posting to certain websites. The third property helps keep users safe from
-collaborating websites: consider websites and other Internet services
-that have been pressured
-recently into revealing the identity of bloggers
-%~\cite{arrested-bloggers}
-or treating clients differently depending on their network
-location~\cite{netauth}.
-%~\cite{google-geolocation}.
-
-The Tor design provides other features as well that are not typically
-present in manual or ad hoc circumvention techniques.
-
-First, Tor has a well-analyzed and well-understood way to distribute
-information about relay.
-Tor directory authorities automatically aggregate, test,
-and publish signed summaries of the available Tor routers. Tor clients
-can fetch these summaries to learn which routers are available and
-which routers are suitable for their needs. Directory information is cached
-throughout the Tor network, so once clients have bootstrapped they never
-need to interact with the authorities directly. (To tolerate a minority
-of compromised directory authorities, we use a threshold trust scheme---
-see Section~\ref{subsec:trust-chain} for details.)
-
-Second, the list of directory authorities is not hard-wired.
-Clients use the default authorities if no others are specified,
-but it's easy to start a separate (or even overlapping) Tor network just
-by running a different set of authorities and convincing users to prefer
-a modified client. For example, we could launch a distinct Tor network
-inside China; some users could even use an aggregate network made up of
-both the main network and the China network. (But we should not be too
-quick to create other Tor networks---part of Tor's anonymity comes from
-users behaving like other users, and there are many unsolved anonymity
-questions if different users know about different pieces of the network.)
-
-Third, in addition to automatically learning from the chosen directories
-which Tor routers are available and working, Tor takes care of building
-paths through the network and rebuilding them as needed. So the user
-never has to know how paths are chosen, never has to manually pick
-working proxies, and so on. More generally, at its core the Tor protocol
-is simply a tool that can build paths given a set of routers. Tor is
-quite flexible about how it learns about the routers and how it chooses
-the paths. Harvard's Blossom project~\cite{blossom-thesis} makes this
-flexibility more concrete: Blossom makes use of Tor not for its security
-properties but for its reachability properties. It runs a separate set
-of directory authorities, its own set of Tor routers (called the Blossom
-network), and uses Tor's flexible path-building to let users view Internet
-resources from any point in the Blossom network.
-
-Fourth, Tor separates the role of \emph{internal relay} from the
-role of \emph{exit relay}. That is, some volunteers choose just to relay
-traffic between Tor users and Tor routers, and others choose to also allow
-connections to external Internet resources. Because we don't force all
-volunteers to play both roles, we end up with more relays. This increased
-diversity in turn is what gives Tor its security: the more options the
-user has for her first hop, and the more options she has for her last hop,
-the less likely it is that a given attacker will be watching both ends
-of her circuit~\cite{tor-design}. As a bonus, because our design attracts
-more internal relays that want to help out but don't want to deal with
-being an exit relay, we end up providing more options for the first
-hop---the one most critical to being able to reach the Tor network.
-
-Fifth, Tor is sustainable. Zero-Knowledge Systems offered the commercial
-but now defunct Freedom Network~\cite{freedom21-security}, a design with
-security comparable to Tor's, but its funding model relied on collecting
-money from users to pay relay operators. Modern commercial proxy systems
-similarly
-need to keep collecting money to support their infrastructure. On the
-other hand, Tor has built a self-sustaining community of volunteers who
-donate their time and resources. This community trust is rooted in Tor's
-open design: we tell the world exactly how Tor works, and we provide all
-the source code. Users can decide for themselves, or pay any security
-expert to decide, whether it is safe to use. Further, Tor's modularity
-as described above, along with its open license, mean that its impact
-will continue to grow.
-
-Sixth, Tor has an established user base of hundreds of
-thousands of people from around the world. This diversity of
-users contributes to sustainability as above: Tor is used by
-ordinary citizens, activists, corporations, law enforcement, and
-even government and military users,
-%\footnote{\url{https://www.torproject.org/overview}}
-and they can
-only achieve their security goals by blending together in the same
-network~\cite{econymics,usability:weis2006}. This user base also provides
-something else: hundreds of thousands of different and often-changing
-addresses that we can leverage for our blocking-resistance design.
-
-Finally and perhaps most importantly, Tor provides anonymity and prevents any
-single relay from linking users to their communication partners. Despite
-initial appearances, {\it distributed-trust anonymity is critical for
-anti-censorship efforts}. If any single relay can expose dissident bloggers
-or compile a list of users' behavior, the censors can profitably compromise
-that relay's operator, perhaps by applying economic pressure to their
-employers,
-breaking into their computer, pressuring their family (if they have relatives
-in the censored area), or so on. Furthermore, in designs where any relay can
-expose its users, the censors can spread suspicion that they are running some
-of the relays and use this belief to chill use of the network.
-
-We discuss and adapt these components further in
-Section~\ref{sec:bridges}. But first we examine the strengths and
-weaknesses of other blocking-resistance approaches, so we can expand
-our repertoire of building blocks and ideas.
-
-\section{Current proxy solutions}
-\label{sec:related}
-
-Relay-based blocking-resistance schemes generally have two main
-components: a relay component and a discovery component. The relay part
-encompasses the process of establishing a connection, sending traffic
-back and forth, and so on---everything that's done once the user knows
-where she's going to connect. Discovery is the step before that: the
-process of finding one or more usable relays.
-
-For example, we can divide the pieces of Tor in the previous section
-into the process of building paths and sending
-traffic over them (relay) and the process of learning from the directory
-authorities about what routers are available (discovery). With this
-distinction
-in mind, we now examine several categories of relay-based schemes.
-
-\subsection{Centrally-controlled shared proxies}
-
-Existing commercial anonymity solutions (like Anonymizer.com) are based
-on a set of single-hop proxies. In these systems, each user connects to
-a single proxy, which then relays traffic between the user and her
-destination. These public proxy
-systems are typically characterized by two features: they control and
-operate the proxies centrally, and many different users get assigned
-to each proxy.
-
-In terms of the relay component, single proxies provide weak security
-compared to systems that distribute trust over multiple relays, since a
-compromised proxy can trivially observe all of its users' actions, and
-an eavesdropper only needs to watch a single proxy to perform timing
-correlation attacks against all its users' traffic and thus learn where
-everyone is connecting. Worse, all users
-need to trust the proxy company to have good security itself as well as
-to not reveal user activities.
-
-On the other hand, single-hop proxies are easier to deploy, and they
-can provide better performance than distributed-trust designs like Tor,
-since traffic only goes through one relay. They're also more convenient
-from the user's perspective---since users entirely trust the proxy,
-they can just use their web browser directly.
-
-Whether public proxy schemes are more or less scalable than Tor is
-still up for debate: commercial anonymity systems can use some of their
-revenue to provision more bandwidth as they grow, whereas volunteer-based
-anonymity systems can attract thousands of fast relays to spread the load.
-
-The discovery piece can take several forms. Most commercial anonymous
-proxies have one or a handful of commonly known websites, and their users
-log in to those websites and relay their traffic through them. When
-these websites get blocked (generally soon after the company becomes
-popular), if the company cares about users in the blocked areas, they
-start renting lots of disparate IP addresses and rotating through them
-as they get blocked. They notify their users of new addresses (by email,
-for example). It's an arms race, since attackers can sign up to receive the
-email too, but operators have one nice trick available to them: because they
-have a list of paying subscribers, they can notify certain subscribers
-about updates earlier than others.
-
-Access control systems on the proxy let them provide service only to
-users with certain characteristics, such as paying customers or people
-from certain IP address ranges.
-
-Discovery in the face of a government-level firewall is a complex and
-unsolved
-topic, and we're stuck in this same arms race ourselves; we explore it
-in more detail in Section~\ref{sec:discovery}. But first we examine the
-other end of the spectrum---getting volunteers to run the proxies,
-and telling only a few people about each proxy.
-
-\subsection{Independent personal proxies}
-
-Personal proxies such as Circumventor~\cite{circumventor} and
-CGIProxy~\cite{cgiproxy} use the same technology as the public ones as
-far as the relay component goes, but they use a different strategy for
-discovery. Rather than managing a few centralized proxies and constantly
-getting new addresses for them as the old addresses are blocked, they
-aim to have a large number of entirely independent proxies, each managing
-its own (much smaller) set of users.
-
-As the Circumventor site explains, ``You don't
-actually install the Circumventor \emph{on} the computer that is blocked
-from accessing Web sites. You, or a friend of yours, has to install the
-Circumventor on some \emph{other} machine which is not censored.''
-
-This tactic has great advantages in terms of blocking-resistance---recall
-our assumption in Section~\ref{sec:adversary} that the attention
-a system attracts from the attacker is proportional to its number of
-users and level of publicity. If each proxy only has a few users, and
-there is no central list of proxies, most of them will never get noticed by
-the censors.
-
-On the other hand, there's a huge scalability question that so far has
-prevented these schemes from being widely useful: how does the fellow
-in China find a person in Ohio who will run a Circumventor for him? In
-some cases he may know and trust some people on the outside, but in many
-cases he's just out of luck. Just as hard, how does a new volunteer in
-Ohio find a person in China who needs it?
-
-% another key feature of a proxy run by your uncle is that you
-% self-censor, so you're unlikely to bring abuse complaints onto
-% your uncle. self-censoring clearly has a downside too, though.
-
-This challenge leads to a hybrid design---centrally-distributed
-personal proxies---which we will investigate in more detail in
-Section~\ref{sec:discovery}.
-
-\subsection{Open proxies}
-
-Yet another currently used approach to bypassing firewalls is to locate
-open and misconfigured proxies on the Internet. A quick Google search
-for ``open proxy list'' yields a wide variety of freely available lists
-of HTTP, HTTPS, and SOCKS proxies. Many small companies have sprung up
-providing more refined lists to paying customers.
-
-There are some downsides to using these open proxies though. First,
-the proxies are of widely varying quality in terms of bandwidth and
-stability, and many of them are entirely unreachable. Second, unlike
-networks of volunteers like Tor, the legality of routing traffic through
-these proxies is questionable: it's widely believed that most of them
-don't realize what they're offering, and probably wouldn't allow it if
-they realized. Third, in many cases the connection to the proxy is
-unencrypted, so firewalls that filter based on keywords in IP packets
-will not be hindered. Fourth, in many countries (including China), the
-firewall authorities hunt for open proxies as well, to preemptively
-block them. And last, many users are suspicious that some
-open proxies are a little \emph{too} convenient: are they run by the
-adversary, in which case they get to monitor all the user's requests
-just as single-hop proxies can?
-
-A distributed-trust design like Tor resolves each of these issues for
-the relay component, but a constantly changing set of thousands of open
-relays is clearly a useful idea for a discovery component. For example,
-users might be able to make use of these proxies to bootstrap their
-first introduction into the Tor network.
-
-\subsection{Blocking resistance and JAP}
-
-K\"{o}psell and Hilling's Blocking Resistance
-design~\cite{koepsell:wpes2004} is probably
-the closest related work, and is the starting point for the design in this
-paper. In this design, the JAP anonymity system~\cite{web-mix} is used
-as a base instead of Tor. Volunteers operate a large number of access
-points that relay traffic to the core JAP
-network, which in turn anonymizes users' traffic. The software to run these
-relays is, as in our design, included in the JAP client software and enabled
-only when the user decides to enable it. Discovery is handled with a
-CAPTCHA-based mechanism; users prove that they aren't an automated process,
-and are given the address of an access point. (The problem of a determined
-attacker with enough manpower to launch many requests and enumerate all the
-access points is not considered in depth.) There is also some suggestion
-that information about access points could spread through existing social
-networks.
-
-\subsection{Infranet}
-
-The Infranet design~\cite{infranet} uses one-hop relays to deliver web
-content, but disguises its communications as ordinary HTTP traffic. Requests
-are split into multiple requests for URLs on the relay, which then encodes
-its responses in the content it returns. The relay needs to be an actual
-website with plausible content and a number of URLs which the user might want
-to access---if the Infranet software produced its own cover content, it would
-be far easier for censors to identify. To keep the censors from noticing
-that cover content changes depending on what data is embedded, Infranet needs
-the cover content to have an innocuous reason for changing frequently: the
-paper recommends watermarked images and webcams.
-
-The attacker and relay operators in Infranet's threat model are significantly
-different than in ours. Unlike our attacker, Infranet's censor can't be
-bypassed with encrypted traffic (presumably because the censor blocks
-encrypted traffic, or at least considers it suspicious), and has more
-computational resources to devote to each connection than ours (so it can
-notice subtle patterns over time). Unlike our bridge operators, Infranet's
-operators (and users) have more bandwidth to spare; the overhead in typical
-steganography schemes is far higher than Tor's.
-
-The Infranet design does not include a discovery element. Discovery,
-however, is a critical point: if whatever mechanism allows users to learn
-about relays also allows the censor to do so, he can trivially discover and
-block their addresses, even if the steganography would prevent mere traffic
-observation from revealing the relays' addresses.
-
-\subsection{RST-evasion and other packet-level tricks}
-
-In their analysis of China's firewall's content-based blocking, Clayton,
-Murdoch and Watson discovered that rather than blocking all packets in a TCP
-streams once a forbidden word was noticed, the firewall was simply forging
-RST packets to make the communicating parties believe that the connection was
-closed~\cite{clayton:pet2006}. They proposed altering operating systems
-to ignore forged RST packets. This approach might work in some cases, but
-in practice it appears that many firewalls start filtering by IP address
-once a sufficient number of RST packets have been sent.
-
-Other packet-level responses to filtering include splitting
-sensitive words across multiple TCP packets, so that the censors'
-firewalls can't notice them without performing expensive stream
-reconstruction~\cite{ptacek98insertion}. This technique relies on the
-same insight as our weak steganography assumption.
-
-%\subsection{Internal caching networks}
-
-%Freenet~\cite{freenet-pets00} is an anonymous peer-to-peer data store.
-%Analyzing Freenet's security can be difficult, as its design is in flux as
-%new discovery and routing mechanisms are proposed, and no complete
-%specification has (to our knowledge) been written. Freenet servers relay
-%requests for specific content (indexed by a digest of the content)
-%``toward'' the server that hosts it, and then cache the content as it
-%follows the same path back to
-%the requesting user. If Freenet's routing mechanism is successful in
-%allowing nodes to learn about each other and route correctly even as some
-%node-to-node links are blocked by firewalls, then users inside censored areas
-%can ask a local Freenet server for a piece of content, and get an answer
-%without having to connect out of the country at all. Of course, operators of
-%servers inside the censored area can still be targeted, and the addresses of
-%external servers can still be blocked.
-
-%\subsection{Skype}
-
-%The popular Skype voice-over-IP software uses multiple techniques to tolerate
-%restrictive networks, some of which allow it to continue operating in the
-%presence of censorship. By switching ports and using encryption, Skype
-%attempts to resist trivial blocking and content filtering. Even if no
-%encryption were used, it would still be expensive to scan all voice
-%traffic for sensitive words. Also, most current keyloggers are unable to
-%store voice traffic. Nevertheless, Skype can still be blocked, especially at
-%its central login server.
-
-%*sjmurdoch* "we consider the login server to be the only central component in
-%the Skype p2p network."
-%*sjmurdoch* http://www1.cs.columbia.edu/~salman/publications/skype1_4.pdf
-%-> *sjmurdoch* ok. what is the login server's role?
-%-> *sjmurdoch* and do you need to reach it directly to use skype?
-%*sjmurdoch* It checks the username and password
-%*sjmurdoch* It is necessary in the current implementation, but I don't know if
-%it is a fundemental limitation of the architecture
-
-\subsection{Tor itself}
-
-And last, we include Tor itself in the list of current solutions
-to firewalls. Tens of thousands of people use Tor from countries that
-routinely filter their Internet. Tor's website has been blocked in most
-of them. But why hasn't the Tor network been blocked yet?
-
-We have several theories. The first is the most straightforward: tens of
-thousands of people are simply too few to matter. It may help that Tor is
-perceived to be for experts only, and thus not worth attention yet. The
-more subtle variant on this theory is that we've positioned Tor in the
-public eye as a tool for retaining civil liberties in more free countries,
-so perhaps blocking authorities don't view it as a threat. (We revisit
-this idea when we consider whether and how to publicize a Tor variant
-that improves blocking-resistance---see Section~\ref{subsec:publicity}
-for more discussion.)
-
-The broader explanation is that the maintenance of most government-level
-filters is aimed at stopping widespread information flow and appearing to be
-in control, not by the impossible goal of blocking all possible ways to bypass
-censorship. Censors realize that there will always
-be ways for a few people to get around the firewall, and as long as Tor
-has not publically threatened their control, they see no urgent need to
-block it yet.
-
-We should recognize that we're \emph{already} in the arms race. These
-constraints can give us insight into the priorities and capabilities of
-our various attackers.
-
-\section{The relay component of our blocking-resistant design}
-\label{sec:bridges}
-
-Section~\ref{sec:current-tor} describes many reasons why Tor is
-well-suited as a building block in our context, but several changes will
-allow the design to resist blocking better. The most critical changes are
-to get more relay addresses, and to distribute them to users differently.
-
-%We need to address three problems:
-%- adapting the relay component of Tor so it resists blocking better.
-%- Discovery.
-%- Tor's network fingerprint.
-
-%Here we describe the new pieces we need to add to the current Tor design.
-
-\subsection{Bridge relays}
-
-Today, Tor relays operate on a few thousand distinct IP addresses;
-an adversary
-could enumerate and block them all with little trouble. To provide a
-means of ingress to the network, we need a larger set of entry points, most
-of which an adversary won't be able to enumerate easily. Fortunately, we
-have such a set: the Tor users.
-
-Hundreds of thousands of people around the world use Tor. We can leverage
-our already self-selected user base to produce a list of thousands of
-frequently-changing IP addresses. Specifically, we can give them a little
-button in the GUI that says ``Tor for Freedom'', and users who click
-the button will turn into \emph{bridge relays} (or just \emph{bridges}
-for short). They can rate limit relayed connections to 10 KB/s (almost
-nothing for a broadband user in a free country, but plenty for a user
-who otherwise has no access at all), and since they are just relaying
-bytes back and forth between blocked users and the main Tor network, they
-won't need to make any external connections to Internet sites. Because
-of this separation of roles, and because we're making use of software
-that the volunteers have already installed for their own use, we expect
-our scheme to attract and maintain more volunteers than previous schemes.
-
-As usual, there are new anonymity and security implications from running a
-bridge relay, particularly from letting people relay traffic through your
-Tor client; but we leave this discussion for Section~\ref{sec:security}.
-
-%...need to outline instructions for a Tor config that will publish
-%to an alternate directory authority, and for controller commands
-%that will do this cleanly.
-
-\subsection{The bridge directory authority}
-
-How do the bridge relays advertise their existence to the world? We
-introduce a second new component of the design: a specialized directory
-authority that aggregates and tracks bridges. Bridge relays periodically
-publish relay descriptors (summaries of their keys, locations, etc,
-signed by their long-term identity key), just like the relays in the
-``main'' Tor network, but in this case they publish them only to the
-bridge directory authorities.
-
-The main difference between bridge authorities and the directory
-authorities for the main Tor network is that the main authorities provide
-a list of every known relay, but the bridge authorities only give
-out a relay descriptor if you already know its identity key. That is,
-you can keep up-to-date on a bridge's location and other information
-once you know about it, but you can't just grab a list of all the bridges.
-
-The identity key, IP address, and directory port for each bridge
-authority ship by default with the Tor software, so the bridge relays
-can be confident they're publishing to the right location, and the
-blocked users can establish an encrypted authenticated channel. See
-Section~\ref{subsec:trust-chain} for more discussion of the public key
-infrastructure and trust chain.
-
-Bridges use Tor to publish their descriptors privately and securely,
-so even an attacker monitoring the bridge directory authority's network
-can't make a list of all the addresses contacting the authority.
-Bridges may publish to only a subset of the
-authorities, to limit the potential impact of an authority compromise.
-
-
-%\subsection{A simple matter of engineering}
-%
-%Although we've described bridges and bridge authorities in simple terms
-%above, some design modifications and features are needed in the Tor
-%codebase to add them. We describe the four main changes here.
-%
-%Firstly, we need to get smarter about rate limiting:
-%Bandwidth classes
-%
-%Secondly, while users can in fact configure which directory authorities
-%they use, we need to add a new type of directory authority and teach
-%bridges to fetch directory information from the main authorities while
-%publishing relay descriptors to the bridge authorities. We're most of
-%the way there, since we can already specify attributes for directory
-%authorities:
-%add a separate flag named ``blocking''.
-%
-%Thirdly, need to build paths using bridges as the first
-%hop. One more hole in the non-clique assumption.
-%
-%Lastly, since bridge authorities don't answer full network statuses,
-%we need to add a new way for users to learn the current status for a
-%single relay or a small set of relays---to answer such questions as
-%``is it running?'' or ``is it behaving correctly?'' We describe in
-%Section~\ref{subsec:enclave-dirs} a way for the bridge authority to
-%publish this information without resorting to signing each answer
-%individually.
-
-\subsection{Putting them together}
-\label{subsec:relay-together}
-
-If a blocked user knows the identity keys of a set of bridge relays, and
-he has correct address information for at least one of them, he can use
-that one to make a secure connection to the bridge authority and update
-his knowledge about the other bridge relays. He can also use it to make
-secure connections to the main Tor network and directory authorities, so he
-can build circuits and connect to the rest of the Internet. All of these
-updates happen in the background: from the blocked user's perspective,
-he just accesses the Internet via his Tor client like always.
-
-So now we've reduced the problem from how to circumvent the firewall
-for all transactions (and how to know that the pages you get have not
-been modified by the local attacker) to how to learn about a working
-bridge relay.
-
-There's another catch though. We need to make sure that the network
-traffic we generate by simply connecting to a bridge relay doesn't stand
-out too much.
-
-%The following section describes ways to bootstrap knowledge of your first
-%bridge relay, and ways to maintain connectivity once you know a few
-%bridge relays.
-
-% (See Section~\ref{subsec:first-bridge} for a discussion
-%of exactly what information is sufficient to characterize a bridge relay.)
-
-
-
-\section{Hiding Tor's network fingerprint}
-\label{sec:network-fingerprint}
-\label{subsec:enclave-dirs}
-
-Currently, Tor uses two protocols for its network communications. The
-main protocol uses TLS for encrypted and authenticated communication
-between Tor instances. The second protocol is standard HTTP, used for
-fetching directory information. All Tor relays listen on their ``ORPort''
-for TLS connections, and some of them opt to listen on their ``DirPort''
-as well, to serve directory information. Tor relays choose whatever port
-numbers they like; the relay descriptor they publish to the directory
-tells users where to connect.
-
-One format for communicating address information about a bridge relay is
-its IP address and DirPort. From there, the user can ask the bridge's
-directory cache for an up-to-date copy of its relay descriptor, and
-learn its current circuit keys, its ORPort, and so on.
-
-However, connecting directly to the directory cache involves a plaintext
-HTTP request. A censor could create a network fingerprint (known as a
-\emph{signature} in the intrusion detection field) for the request
-and/or its response, thus preventing these connections. To resolve this
-vulnerability, we've modified the Tor protocol so that users can connect
-to the directory cache via the main Tor port---they establish a TLS
-connection with the bridge as normal, and then send a special ``begindir''
-relay command to establish an internal connection to its directory cache.
-
-Therefore a better way to summarize a bridge's address is by its IP
-address and ORPort, so all communications between the client and the
-bridge will use ordinary TLS. But there are other details that need
-more investigation.
-
-What port should bridges pick for their ORPort? We currently recommend
-that they listen on port 443 (the default HTTPS port) if they want to
-be most useful, because clients behind standard firewalls will have
-the best chance to reach them. Is this the best choice in all cases,
-or should we encourage some fraction of them pick random ports, or other
-ports commonly permitted through firewalls like 53 (DNS) or 110
-(POP)? Or perhaps we should use other ports where TLS traffic is
-expected, like 993 (IMAPS) or 995 (POP3S). We need more research on our
-potential users, and their current and anticipated firewall restrictions.
-
-Furthermore, we need to look at the specifics of Tor's TLS handshake.
-Right now Tor uses some predictable strings in its TLS handshakes. For
-example, it sets the X.509 organizationName field to ``Tor'', and it puts
-the Tor relay's nickname in the certificate's commonName field. We
-should tweak the handshake protocol so it doesn't rely on any unusual details
-in the certificate, yet it remains secure; the certificate itself
-should be made to resemble an ordinary HTTPS certificate. We should also try
-to make our advertised cipher-suites closer to what an ordinary web server
-would support.
-
-Tor's TLS handshake uses two-certificate chains: one certificate
-contains the self-signed identity key for
-the router, and the second contains a current TLS key, signed by the
-identity key. We use these to authenticate that we're talking to the right
-router, and to limit the impact of TLS-key exposure. Most (though far from
-all) consumer-oriented HTTPS services provide only a single certificate.
-These extra certificates may help identify Tor's TLS handshake; instead,
-bridges should consider using only a single TLS key certificate signed by
-their identity key, and providing the full value of the identity key in an
-early handshake cell. More significantly, Tor currently has all clients
-present certificates, so that clients are harder to distinguish from relays.
-But in a blocking-resistance environment, clients should not present
-certificates at all.
-
-Last, what if the adversary starts observing the network traffic even
-more closely? Even if our TLS handshake looks innocent, our traffic timing
-and volume still look different than a user making a secure web connection
-to his bank. The same techniques used in the growing trend to build tools
-to recognize encrypted Bittorrent traffic
-%~\cite{bt-traffic-shaping}
-could be used to identify Tor communication and recognize bridge
-relays. Rather than trying to look like encrypted web traffic, we may be
-better off trying to blend with some other encrypted network protocol. The
-first step is to compare typical network behavior for a Tor client to
-typical network behavior for various other protocols. This statistical
-cat-and-mouse game is made more complex by the fact that Tor transports a
-variety of protocols, and we'll want to automatically handle web browsing
-differently from, say, instant messaging.
-
-% Tor cells are 512 bytes each. So TLS records will be roughly
-% multiples of this size? How bad is this? -RD
-% Look at ``Inferring the Source of Encrypted HTTP Connections''
-% by Marc Liberatore and Brian Neil Levine (CCS 2006)
-% They substantially flesh out the numbers for the web fingerprinting
-% attack. -PS
-% Yes, but I meant detecting the fingerprint of Tor traffic itself, not
-% learning what websites we're going to. I wouldn't be surprised to
-% learn that these are related problems, but it's not obvious to me. -RD
-
-\subsection{Identity keys as part of addressing information}
-\label{subsec:id-address}
-
-We have described a way for the blocked user to bootstrap into the
-network once he knows the IP address and ORPort of a bridge. What about
-local spoofing attacks? That is, since we never learned an identity
-key fingerprint for the bridge, a local attacker could intercept our
-connection and pretend to be the bridge we had in mind. It turns out
-that giving false information isn't that bad---since the Tor client
-ships with trusted keys for the bridge directory authority and the Tor
-network directory authorities, the user can learn whether he's being
-given a real connection to the bridge authorities or not. (After all,
-if the adversary intercepts every connection the user makes and gives
-him a bad connection each time, there's nothing we can do.)
-
-What about anonymity-breaking attacks from observing traffic, if the
-blocked user doesn't start out knowing the identity key of his intended
-bridge? The vulnerabilities aren't so bad in this case either---the
-adversary could do similar attacks just by monitoring the network
-traffic.
-% cue paper by steven and george
-
-Once the Tor client has fetched the bridge's relay descriptor, it should
-remember the identity key fingerprint for that bridge relay. Thus if
-the bridge relay moves to a new IP address, the client can query the
-bridge directory authority to look up a fresh relay descriptor using
-this fingerprint.
-
-So we've shown that it's \emph{possible} to bootstrap into the network
-just by learning the IP address and ORPort of a bridge, but are there
-situations where it's more convenient or more secure to learn the bridge's
-identity fingerprint as well as instead, while bootstrapping? We keep
-that question in mind as we next investigate bootstrapping and discovery.
-
-\section{Discovering working bridge relays}
-\label{sec:discovery}
-
-Tor's modular design means that we can develop a better relay component
-independently of developing the discovery component. This modularity's
-great promise is that we can pick any discovery approach we like; but the
-unfortunate fact is that we have no magic bullet for discovery. We're
-in the same arms race as all the other designs we described in
-Section~\ref{sec:related}.
-
-In this section we describe a variety of approaches to adding discovery
-components for our design.
-
-\subsection{Bootstrapping: finding your first bridge.}
-\label{subsec:first-bridge}
-
-In Section~\ref{subsec:relay-together}, we showed that a user who knows
-a working bridge address can use it to reach the bridge authority and
-to stay connected to the Tor network. But how do new users reach the
-bridge authority in the first place? After all, the bridge authority
-will be one of the first addresses that a censor blocks.
-
-First, we should recognize that most government firewalls are not
-perfect. That is, they may allow connections to Google cache or some
-open proxy servers, or they let file-sharing traffic, Skype, instant
-messaging, or World-of-Warcraft connections through. Different users will
-have different mechanisms for bypassing the firewall initially. Second,
-we should remember that most people don't operate in a vacuum; users will
-hopefully know other people who are in other situations or have other
-resources available. In the rest of this section we develop a toolkit
-of different options and mechanisms, so that we can enable users in a
-diverse set of contexts to bootstrap into the system.
-
-(For users who can't use any of these techniques, hopefully they know
-a friend who can---for example, perhaps the friend already knows some
-bridge relay addresses. If they can't get around it at all, then we
-can't help them---they should go meet more people or learn more about
-the technology running the firewall in their area.)
-
-By deploying all the schemes in the toolkit at once, we let bridges and
-blocked users employ the discovery approach that is most appropriate
-for their situation.
-
-\subsection{Independent bridges, no central discovery}
-
-The first design is simply to have no centralized discovery component at
-all. Volunteers run bridges, and we assume they have some blocked users
-in mind and communicate their address information to them out-of-band
-(for example, through Gmail). This design allows for small personal
-bridges that have only one or a handful of users in mind, but it can
-also support an entire community of users. For example, Citizen Lab's
-upcoming Psiphon single-hop proxy tool~\cite{psiphon} plans to use this
-\emph{social network} approach as its discovery component.
-
-There are several ways to do bootstrapping in this design. In the simple
-case, the operator of the bridge informs each chosen user about his
-bridge's address information and/or keys. A different approach involves
-blocked users introducing new blocked users to the bridges they know.
-That is, somebody in the blocked area can pass along a bridge's address to
-somebody else they trust. This scheme brings in appealing but complex game
-theoretic properties: the blocked user making the decision has an incentive
-only to delegate to trustworthy people, since an adversary who learns
-the bridge's address and filters it makes it unavailable for both of them.
-Also, delegating known bridges to members of your social network can be
-dangerous: an the adversary who can learn who knows which bridges may
-be able to reconstruct the social network.
-
-Note that a central set of bridge directory authorities can still be
-compatible with a decentralized discovery process. That is, how users
-first learn about bridges is entirely up to the bridges, but the process
-of fetching up-to-date descriptors for them can still proceed as described
-in Section~\ref{sec:bridges}. Of course, creating a central place that
-knows about all the bridges may not be smart, especially if every other
-piece of the system is decentralized. Further, if a user only knows
-about one bridge and he loses track of it, it may be quite a hassle to
-reach the bridge authority. We address these concerns next.
-
-\subsection{Families of bridges, no central discovery}
-
-Because the blocked users are running our software too, we have many
-opportunities to improve usability or robustness. Our second design builds
-on the first by encouraging volunteers to run several bridges at once
-(or coordinate with other bridge volunteers), such that some
-of the bridges are likely to be available at any given time.
-
-The blocked user's Tor client would periodically fetch an updated set of
-recommended bridges from any of the working bridges. Now the client can
-learn new additions to the bridge pool, and can expire abandoned bridges
-or bridges that the adversary has blocked, without the user ever needing
-to care. To simplify maintenance of the community's bridge pool, each
-community could run its own bridge directory authority---reachable via
-the available bridges, and also mirrored at each bridge.
-
-\subsection{Public bridges with central discovery}
-
-What about people who want to volunteer as bridges but don't know any
-suitable blocked users? What about people who are blocked but don't
-know anybody on the outside? Here we describe how to make use of these
-\emph{public bridges} in a way that still makes it hard for the attacker
-to learn all of them.
-
-The basic idea is to divide public bridges into a set of pools based on
-identity key. Each pool corresponds to a \emph{distribution strategy}:
-an approach to distributing its bridge addresses to users. Each strategy
-is designed to exercise a different scarce resource or property of
-the user.
-
-How do we divide bridges between these strategy pools such that they're
-evenly distributed and the allocation is hard to influence or predict,
-but also in a way that's amenable to creating more strategies later
-on without reshuffling all the pools? We assign a given bridge
-to a strategy pool by hashing the bridge's identity key along with a
-secret that only the bridge authority knows: the first $n$ bits of this
-hash dictate the strategy pool number, where $n$ is a parameter that
-describes how many strategy pools we want at this point. We choose $n=3$
-to start, so we divide bridges between 8 pools; but as we later invent
-new distribution strategies, we can increment $n$ to split the 8 into
-16. Since a bridge can't predict the next bit in its hash, it can't
-anticipate which identity key will correspond to a certain new pool
-when the pools are split. Further, since the bridge authority doesn't
-provide any feedback to the bridge about which strategy pool it's in,
-an adversary who signs up bridges with the goal of filling a certain
-pool~\cite{casc-rep} will be hindered.
-
-% This algorithm is not ideal. When we split pools, each existing
-% pool is cut in half, where half the bridges remain with the
-% old distribution policy, and half will be under what the new one
-% is. So the new distribution policy inherits a bunch of blocked
-% bridges if the old policy was too loose, or a bunch of unblocked
-% bridges if its policy was still secure. -RD
-%
-% I think it should be more chordlike.
-% Bridges are allocated to wherever on the ring which is divided
-% into arcs (buckets).
-% If a bucket gets too full, you can just split it.
-% More on this below. -PFS
-
-The first distribution strategy (used for the first pool) publishes bridge
-addresses in a time-release fashion. The bridge authority divides the
-available bridges into partitions, and each partition is deterministically
-available only in certain time windows. That is, over the course of a
-given time slot (say, an hour), each requester is given a random bridge
-from within that partition. When the next time slot arrives, a new set
-of bridges from the pool are available for discovery. Thus some bridge
-address is always available when a new
-user arrives, but to learn about all bridges the attacker needs to fetch
-all new addresses at every new time slot. By varying the length of the
-time slots, we can make it harder for the attacker to guess when to check
-back. We expect these bridges will be the first to be blocked, but they'll
-help the system bootstrap until they \emph{do} get blocked. Further,
-remember that we're dealing with different blocking regimes around the
-world that will progress at different rates---so this pool will still
-be useful to some users even as the arms races progress.
-
-The second distribution strategy publishes bridge addresses based on the IP
-address of the requesting user. Specifically, the bridge authority will
-divide the available bridges in the pool into a bunch of partitions
-(as in the first distribution scheme), hash the requester's IP address
-with a secret of its own (as in the above allocation scheme for creating
-pools), and give the requester a random bridge from the appropriate
-partition. To raise the bar, we should discard the last octet of the
-IP address before inputting it to the hash function, so an attacker
-who only controls a single ``/24'' network only counts as one user. A
-large attacker like China will still be able to control many addresses,
-but the hassle of establishing connections from each network (or spoofing
-TCP connections) may still slow them down. Similarly, as a special case,
-we should treat IP addresses that are Tor exit nodes as all being on
-the same network.
-
-The third strategy combines the time-based and location-based
-strategies to further constrain and rate-limit the available bridge
-addresses. Specifically, the bridge address provided in a given time
-slot to a given network location is deterministic within the partition,
-rather than chosen randomly each time from the partition. Thus, repeated
-requests during that time slot from a given network are given the same
-bridge address as the first request.
-
-The fourth strategy is based on Circumventor's discovery strategy.
-The Circumventor project, realizing that its adoption will remain limited
-if it has no central coordination mechanism, has started a mailing list to
-distribute new proxy addresses every few days. From experimentation it
-seems they have concluded that sending updates every three or four days
-is sufficient to stay ahead of the current attackers.
-
-The fifth strategy provides an alternative approach to a mailing list:
-users provide an email address and receive an automated response
-listing an available bridge address. We could limit one response per
-email address. To further rate limit queries, we could require a CAPTCHA
-solution
-%~\cite{captcha}
-in each case too. In fact, we wouldn't need to
-implement the CAPTCHA on our side: if we only deliver bridge addresses
-to Yahoo or GMail addresses, we can leverage the rate-limiting schemes
-that other parties already impose for account creation.
-
-The sixth strategy ties in the social network design with public
-bridges and a reputation system. We pick some seeds---trusted people in
-blocked areas---and give them each a few dozen bridge addresses and a few
-\emph{delegation tokens}. We run a website next to the bridge authority,
-where users can log in (they connect via Tor, and they don't need to
-provide actual identities, just persistent pseudonyms). Users can delegate
-trust to other people they know by giving them a token, which can be
-exchanged for a new account on the website. Accounts in ``good standing''
-then accrue new bridge addresses and new tokens. As usual, reputation
-schemes bring in a host of new complexities~\cite{rep-anon}: how do we
-decide that an account is in good standing? We could tie reputation
-to whether the bridges they're told about have been blocked---see
-Section~\ref{subsec:geoip} below for initial thoughts on how to discover
-whether bridges have been blocked. We could track reputation between
-accounts (if you delegate to somebody who screws up, it impacts you too),
-or we could use blinded delegation tokens~\cite{chaum-blind} to prevent
-the website from mapping the seeds' social network. We put off deeper
-discussion of the social network reputation strategy for future work.
-
-Pools seven and eight are held in reserve, in case our currently deployed
-tricks all fail at once and the adversary blocks all those bridges---so
-we can adapt and move to new approaches quickly, and have some bridges
-immediately available for the new schemes. New strategies might be based
-on some other scarce resource, such as relaying traffic for others or
-other proof of energy spent. (We might also worry about the incentives
-for bridges that sign up and get allocated to the reserve pools: will they
-be unhappy that they're not being used? But this is a transient problem:
-if Tor users are bridges by default, nobody will mind not being used yet.
-See also Section~\ref{subsec:incentives}.)
-
-%Is it useful to load balance which bridges are handed out? The above
-%pool concept makes some bridges wildly popular and others less so.
-%But I guess that's the point.
-
-\subsection{Public bridges with coordinated discovery}
-
-We presented the above discovery strategies in the context of a single
-bridge directory authority, but in practice we will want to distribute the
-operations over several bridge authorities---a single point of failure
-or attack is a bad move. The first answer is to run several independent
-bridge directory authorities, and bridges gravitate to one based on
-their identity key. The better answer would be some federation of bridge
-authorities that work together to provide redundancy but don't introduce
-new security issues. We could even imagine designs where the bridge
-authorities have encrypted versions of the bridge's relay descriptors,
-and the users learn a decryption key that they keep private when they
-first hear about the bridge---this way the bridge authorities would not
-be able to learn the IP address of the bridges.
-
-We leave this design question for future work.
-
-\subsection{Assessing whether bridges are useful}
-
-Learning whether a bridge is useful is important in the bridge authority's
-decision to include it in responses to blocked users. For example, if
-we end up with a list of thousands of bridges and only a few dozen of
-them are reachable right now, most blocked users will not end up knowing
-about working bridges.
-
-There are three components for assessing how useful a bridge is. First,
-is it reachable from the public Internet? Second, what proportion of
-the time is it available? Third, is it blocked in certain jurisdictions?
-
-The first component can be tested just as we test reachability of
-ordinary Tor relays. Specifically, the bridges do a self-test---connect
-to themselves via the Tor network---before they are willing to
-publish their descriptor, to make sure they're not obviously broken or
-misconfigured. Once the bridges publish, the bridge authority also tests
-reachability to make sure they're not confused or outright lying.
-
-The second component can be measured and tracked by the bridge authority.
-By doing periodic reachability tests, we can get a sense of how often the
-bridge is available. More complex tests will involve bandwidth-intensive
-checks to force the bridge to commit resources in order to be counted as
-available. We need to evaluate how the relationship of uptime percentage
-should weigh into our choice of which bridges to advertise. We leave
-this to future work.
-
-The third component is perhaps the trickiest: with many different
-adversaries out there, how do we keep track of which adversaries have
-blocked which bridges, and how do we learn about new blocks as they
-occur? We examine this problem next.
-
-\subsection{How do we know if a bridge relay has been blocked?}
-\label{subsec:geoip}
-
-There are two main mechanisms for testing whether bridges are reachable
-from inside each blocked area: active testing via users, and passive
-testing via bridges.
-
-In the case of active testing, certain users inside each area
-sign up as testing relays. The bridge authorities can then use a
-Blossom-like~\cite{blossom-thesis} system to build circuits through them
-to each bridge and see if it can establish the connection. But how do
-we pick the users? If we ask random users to do the testing (or if we
-solicit volunteers from the users), the adversary should sign up so he
-can enumerate the bridges we test. Indeed, even if we hand-select our
-testers, the adversary might still discover their location and monitor
-their network activity to learn bridge addresses.
-
-Another answer is not to measure directly, but rather let the bridges
-report whether they're being used.
-%If they periodically report to their
-%bridge directory authority how much use they're seeing, perhaps the
-%authority can make smart decisions from there.
-Specifically, bridges should install a GeoIP database such as the public
-IP-To-Country list~\cite{ip-to-country}, and then periodically report to the
-bridge authorities which countries they're seeing use from. This data
-would help us track which countries are making use of the bridge design,
-and can also let us learn about new steps the adversary has taken in
-the arms race. (The compressed GeoIP database is only several hundred
-kilobytes, and we could even automate the update process by serving it
-from the bridge authorities.)
-More analysis of this passive reachability
-testing design is needed to resolve its many edge cases: for example,
-if a bridge stops seeing use from a certain area, does that mean the
-bridge is blocked or does that mean those users are asleep?
-
-There are many more problems with the general concept of detecting whether
-bridges are blocked. First, different zones of the Internet are blocked
-in different ways, and the actual firewall jurisdictions do not match
-country borders. Our bridge scheme could help us map out the topology
-of the censored Internet, but this is a huge task. More generally,
-if a bridge relay isn't reachable, is that because of a network block
-somewhere, because of a problem at the bridge relay, or just a temporary
-outage somewhere in between? And last, an attacker could poison our
-bridge database by signing up already-blocked bridges. In this case,
-if we're stingy giving out bridge addresses, users in that country won't
-learn working bridges.
-
-All of these issues are made more complex when we try to integrate this
-testing into our social network reputation system above.
-Since in that case we punish or reward users based on whether bridges
-get blocked, the adversary has new attacks to trick or bog down the
-reputation tracking. Indeed, the bridge authority doesn't even know
-what zone the blocked user is in, so do we blame him for any possible
-censored zone, or what?
-
-Clearly more analysis is required. The eventual solution will probably
-involve a combination of passive measurement via GeoIP and active
-measurement from trusted testers. More generally, we can use the passive
-feedback mechanism to track usage of the bridge network as a whole---which
-would let us respond to attacks and adapt the design, and it would also
-let the general public track the progress of the project.
-
-%Worry: the adversary could choose not to block bridges but just record
-%connections to them. So be it, I guess.
-
-\subsection{Advantages of deploying all solutions at once}
-
-For once, we're not in the position of the defender: we don't have to
-defend against every possible filtering scheme; we just have to defend
-against at least one. On the flip side, the attacker is forced to guess
-how to allocate his resources to defend against each of these discovery
-strategies. So by deploying all of our strategies at once, we not only
-increase our chances of finding one that the adversary has difficulty
-blocking, but we actually make \emph{all} of the strategies more robust
-in the face of an adversary with limited resources.
-
-%\subsection{Remaining unsorted notes}
-
-%In the first subsection we describe how to find a first bridge.
-
-%Going to be an arms race. Need a bag of tricks. Hard to say
-%which ones will work. Don't spend them all at once.
-
-%Some techniques are sufficient to get us an IP address and a port,
-%and others can get us IP:port:key. Lay out some plausible options
-%for how users can bootstrap into learning their first bridge.
-
-%\section{The account / reputation system}
-%\section{Social networks with directory-side support}
-%\label{sec:accounts}
-
-%One answer is to measure based on whether the bridge addresses
-%we give it end up blocked. But how do we decide if they get blocked?
-
-%Perhaps each bridge should be known by a single bridge directory
-%authority. This makes it easier to trace which users have learned about
-%it, so easier to blame or reward. It also makes things more brittle,
-%since loss of that authority means its bridges aren't advertised until
-%they switch, and means its bridge users are sad too.
-%(Need a slick hash algorithm that will map our identity key to a
-%bridge authority, in a way that's sticky even when we add bridge
-%directory authorities, but isn't sticky when our authority goes
-%away. Does this exist?)
-% [[Ian says: What about just using something like hash table chaining?
-% This should work, so long as the client knows which authorities currently
-% exist.]]
-
-%\subsection{Discovery based on social networks}
-
-%A token that can be exchanged at the bridge authority (assuming you
-%can reach it) for a new bridge address.
-
-%The account server runs as a Tor controller for the bridge authority.
-
-%Users can establish reputations, perhaps based on social network
-%connectivity, perhaps based on not getting their bridge relays blocked,
-
-%Probably the most critical lesson learned in past work on reputation
-%systems in privacy-oriented environments~\cite{rep-anon} is the need for
-%verifiable transactions. That is, the entity computing and advertising
-%reputations for participants needs to actually learn in a convincing
-%way that a given transaction was successful or unsuccessful.
-
-%(Lesson from designing reputation systems~\cite{rep-anon}: easy to
-%reward good behavior, hard to punish bad behavior.
-
-\section{Security considerations}
-\label{sec:security}
-
-\subsection{Possession of Tor in oppressed areas}
-
-Many people speculate that installing and using a Tor client in areas with
-particularly extreme firewalls is a high risk---and the risk increases
-as the firewall gets more restrictive. This notion certainly has merit, but
-there's
-a counter pressure as well: as the firewall gets more restrictive, more
-ordinary people behind it end up using Tor for more mainstream activities,
-such as learning
-about Wall Street prices or looking at pictures of women's ankles. So
-as the restrictive firewall pushes up the number of Tor users, the
-``typical'' Tor user becomes more mainstream, and therefore mere
-use or possession of the Tor software is not so surprising.
-
-It's hard to say which of these pressures will ultimately win out,
-but we should keep both sides of the issue in mind.
-
-%Nick, want to rewrite/elaborate on this section?
-
-%Ian suggests:
-% Possession of Tor: this is totally of-the-cuff, and there are lots of
-% security issues to think about, but what about an ActiveX version of
-% Tor? The magic you learn (as opposed to a bridge address) is a plain
-% old HTTPS server, which feeds you an ActiveX applet pre-configured with
-% some bridge address (possibly on the same machine). For bonus points,
-% somehow arrange that (a) the applet is signed in some way the user can
-% reliably check, but (b) don't end up with anything like an incriminating
-% long-term cert stored on the user's computer. This may be marginally
-% useful in some Internet-cafe situations as well, though (a) is even
-% harder to get right there.
-
-
-\subsection{Observers can tell who is publishing and who is reading}
-\label{subsec:upload-padding}
-
-Tor encrypts traffic on the local network, and it obscures the eventual
-destination of the communication, but it doesn't do much to obscure the
-traffic volume. In particular, a user publishing a home video will have a
-different network fingerprint than a user reading an online news article.
-Based on our assumption in Section~\ref{sec:adversary} that users who
-publish material are in more danger, should we work to improve Tor's
-security in this situation?
-
-In the general case this is an extremely challenging task:
-effective \emph{end-to-end traffic confirmation attacks}
-are known where the adversary observes the origin and the
-destination of traffic and confirms that they are part of the
-same communication~\cite{danezis:pet2004,e2e-traffic}. Related are
-\emph{website fingerprinting attacks}, where the adversary downloads
-a few hundred popular websites, makes a set of "fingerprints" for each
-site, and then observes the target Tor client's traffic to look for
-a match~\cite{pet05-bissias,defensive-dropping}. But can we do better
-against a limited adversary who just does coarse-grained sweeps looking
-for unusually prolific publishers?
-
-One answer is for bridge users to automatically send bursts of padding
-traffic periodically. (This traffic can be implemented in terms of
-long-range drop cells, which are already part of the Tor specification.)
-Of course, convincingly simulating an actual human publishing interesting
-content is a difficult arms race, but it may be worthwhile to at least
-start the race. More research remains.
-
-\subsection{Anonymity effects from acting as a bridge relay}
-
-Against some attacks, relaying traffic for others can improve
-anonymity. The simplest example is an attacker who owns a small number
-of Tor relays. He will see a connection from the bridge, but he won't
-be able to know whether the connection originated there or was relayed
-from somebody else. More generally, the mere uncertainty of whether the
-traffic originated from that user may be helpful.
-
-There are some cases where it doesn't seem to help: if an attacker can
-watch all of the bridge's incoming and outgoing traffic, then it's easy
-to learn which connections were relayed and which started there. (In this
-case he still doesn't know the final destinations unless he is watching
-them too, but in this case bridges are no better off than if they were
-an ordinary client.)
-
-There are also some potential downsides to running a bridge. First, while
-we try to make it hard to enumerate all bridges, it's still possible to
-learn about some of them, and for some people just the fact that they're
-running one might signal to an attacker that they place a higher value
-on their anonymity. Second, there are some more esoteric attacks on Tor
-relays that are not as well-understood or well-tested---for example, an
-attacker may be able to ``observe'' whether the bridge is sending traffic
-even if he can't actually watch its network, by relaying traffic through
-it and noticing changes in traffic timing~\cite{attack-tor-oak05}. On
-the other hand, it may be that limiting the bandwidth the bridge is
-willing to relay will allow this sort of attacker to determine if it's
-being used as a bridge but not easily learn whether it is adding traffic
-of its own.
-
-We also need to examine how entry guards fit in. Entry guards
-(a small set of nodes that are always used for the first
-step in a circuit) help protect against certain attacks
-where the attacker runs a few Tor relays and waits for
-the user to choose these relays as the beginning and end of her
-circuit\footnote{\url{http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#EntryGuards}}.
-If the blocked user doesn't use the bridge's entry guards, then the bridge
-doesn't gain as much cover benefit. On the other hand, what design changes
-are needed for the blocked user to use the bridge's entry guards without
-learning what they are (this seems hard), and even if we solve that,
-do they then need to use the guards' guards and so on down the line?
-
-It is an open research question whether the benefits of running a bridge
-outweigh the risks. A lot of the decision rests on which attacks the
-users are most worried about. For most users, we don't think running a
-bridge relay will be that damaging, and it could help quite a bit.
-
-\subsection{Trusting local hardware: Internet cafes and LiveCDs}
-\label{subsec:cafes-and-livecds}
-
-Assuming that users have their own trusted hardware is not
-always reasonable.
-
-For Internet cafe Windows computers that let you attach your own USB key,
-a USB-based Tor image would be smart. There's Torpark, and hopefully
-there will be more thoroughly analyzed and trustworthy options down the
-road. Worries remain about hardware or software keyloggers and other
-spyware, as well as physical surveillance.
-
-If the system lets you boot from a CD or from a USB key, you can gain
-a bit more security by bringing a privacy LiveCD with you. (This
-approach isn't foolproof either of course, since hardware
-keyloggers and physical surveillance are still a worry).
-
-In fact, LiveCDs are also useful if it's your own hardware, since it's
-easier to avoid leaving private data and logs scattered around the
-system.
-
-%\subsection{Forward compatibility and retiring bridge authorities}
-%
-%Eventually we'll want to change the identity key and/or location
-%of a bridge authority. How do we do this mostly cleanly?
-
-\subsection{The trust chain}
-\label{subsec:trust-chain}
-
-Tor's ``public key infrastructure'' provides a chain of trust to
-let users verify that they're actually talking to the right relays.
-There are four pieces to this trust chain.
-
-First, when Tor clients are establishing circuits, at each step
-they demand that the next Tor relay in the path prove knowledge of
-its private key~\cite{tor-design}. This step prevents the first node
-in the path from just spoofing the rest of the path. Second, the
-Tor directory authorities provide a signed list of relays along with
-their public keys---so unless the adversary can control a threshold
-of directory authorities, he can't trick the Tor client into using other
-Tor relays. Third, the location and keys of the directory authorities,
-in turn, is hard-coded in the Tor source code---so as long as the user
-got a genuine version of Tor, he can know that he is using the genuine
-Tor network. And last, the source code and other packages are signed
-with the GPG keys of the Tor developers, so users can confirm that they
-did in fact download a genuine version of Tor.
-
-In the case of blocked users contacting bridges and bridge directory
-authorities, the same logic applies in parallel: the blocked users fetch
-information from both the bridge authorities and the directory authorities
-for the `main' Tor network, and they combine this information locally.
-
-How can a user in an oppressed country know that he has the correct
-key fingerprints for the developers? As with other security systems, it
-ultimately comes down to human interaction. The keys are signed by dozens
-of people around the world, and we have to hope that our users have met
-enough people in the PGP web of trust
-%~\cite{pgp-wot}
-that they can learn
-the correct keys. For users that aren't connected to the global security
-community, though, this question remains a critical weakness.
-
-%\subsection{Security through obscurity: publishing our design}
-
-%Many other schemes like dynaweb use the typical arms race strategy of
-%not publishing their plans. Our goal here is to produce a design---a
-%framework---that can be public and still secure. Where's the tradeoff?
-
-%\section{Performance improvements}
-%\label{sec:performance}
-%
-%\subsection{Fetch relay descriptors just-in-time}
-%
-%I guess we should encourage most places to do this, so blocked
-%users don't stand out.
-%
-%
-%network-status and directory optimizations. caching better. partitioning
-%issues?
-
-\section{Maintaining reachability}
-\label{sec:reachability}
-
-\subsection{How many bridge relays should you know about?}
-
-The strategies described in Section~\ref{sec:discovery} talked about
-learning one bridge address at a time. But if most bridges are ordinary
-Tor users on cable modem or DSL connection, many of them will disappear
-and/or move periodically. How many bridge relays should a blocked user
-know about so that she is likely to have at least one reachable at any
-given point? This is already a challenging problem if we only consider
-natural churn: the best approach is to see what bridges we attract in
-reality and measure their churn. We may also need to factor in a parameter
-for how quickly bridges get discovered and blocked by the attacker;
-we leave this for future work after we have more deployment experience.
-
-A related question is: if the bridge relays change IP addresses
-periodically, how often does the blocked user need to fetch updates in
-order to keep from being cut out of the loop?
-
-Once we have more experience and intuition, we should explore technical
-solutions to this problem too. For example, if the discovery strategies
-give out $k$ bridge addresses rather than a single bridge address, perhaps
-we can improve robustness from the user perspective without significantly
-aiding the adversary. Rather than giving out a new random subset of $k$
-addresses at each point, we could bind them together into \emph{bridge
-families}, so all users that learn about one member of the bridge family
-are told about the rest as well.
-
-This scheme may also help defend against attacks to map the set of
-bridges. That is, if all blocked users learn a random subset of bridges,
-the attacker should learn about a few bridges, monitor the country-level
-firewall for connections to them, then watch those users to see what
-other bridges they use, and repeat. By segmenting the bridge address
-space, we can limit the exposure of other users.
-
-\subsection{Cablemodem users don't usually provide important websites}
-\label{subsec:block-cable}
-
-Another attacker we might be concerned about is that the attacker could
-just block all DSL and cablemodem network addresses, on the theory that
-they don't run any important services anyway. If most of our bridges
-are on these networks, this attack could really hurt.
-
-The first answer is to aim to get volunteers both from traditionally
-``consumer'' networks and also from traditionally ``producer'' networks.
-Since bridges don't need to be Tor exit nodes, as we improve our usability
-it seems quite feasible to get a lot of websites helping out.
-
-The second answer (not as practical) would be to encourage more use of
-consumer networks for popular and useful Internet services.
-%(But P2P exists;
-%minor websites exist; gaming exists; IM exists; ...)
-
-A related attack we might worry about is based on large countries putting
-economic pressure on companies that want to expand their business. For
-example, what happens if Verizon wants to sell services in China, and
-China pressures Verizon to discourage its users in the free world from
-running bridges?
-
-\subsection{Scanning resistance: making bridges more subtle}
-
-If it's trivial to verify that a given address is operating as a bridge,
-and most bridges run on a predictable port, then it's conceivable our
-attacker could scan the whole Internet looking for bridges. (In fact,
-he can just concentrate on scanning likely networks like cablemodem
-and DSL services---see Section~\ref{subsec:block-cable} above for
-related attacks.) It would be nice to slow down this attack. It would
-be even nicer to make it hard to learn whether we're a bridge without
-first knowing some secret. We call this general property \emph{scanning
-resistance}, and it goes along with normalizing Tor's TLS handshake and
-network fingerprint.
-
-We could provide a password to the blocked user, and she (or her Tor
-client) provides a nonced hash of this password when she connects. We'd
-need to give her an ID key for the bridge too (in addition to the IP
-address and port---see Section~\ref{subsec:id-address}), and wait to
-present the password until we've finished the TLS handshake, else it
-would look unusual. If Alice can authenticate the bridge before she
-tries to send her password, we can resist an adversary who pretends
-to be the bridge and launches a man-in-the-middle attack to learn the
-password. But even if she can't, we still resist against widespread
-scanning.
-
-How should the bridge behave if accessed without the correct
-authorization? Perhaps it should act like an unconfigured HTTPS server
-(``welcome to the default Apache page''), or maybe it should mirror
-and act like common websites, or websites randomly chosen from Google.
-
-We might assume that the attacker can recognize HTTPS connections that
-use self-signed certificates. (This process would be resource-intensive
-but not out of the realm of possibility.) But even in this case, many
-popular websites around the Internet use self-signed or just plain broken
-SSL certificates.
-
-%to unknown servers. It can then attempt to connect to them and block
-%connections to servers that seem suspicious. It may be that password
-%protected web sites will not be suspicious in general, in which case
-%that may be the easiest way to give controlled access to the bridge.
-%If such sites that have no other overt features are automatically
-%blocked when detected, then we may need to be more subtle.
-%Possibilities include serving an innocuous web page if a TLS encrypted
-%request is received without the authorization needed to access the Tor
-%network and only responding to a requested access to the Tor network
-%of proper authentication is given. If an unauthenticated request to
-%access the Tor network is sent, the bridge should respond as if
-%it has received a message it does not understand (as would be the
-%case were it not a bridge).
-
-% Ian suggests a ``socialist millionaires'' protocol here, for something.
-
-% Did we once mention knocking here? it's a good idea, but we should clarify
-% what we mean. Ian also notes that knocking itself is very fingerprintable,
-% and we should beware.
-
-\subsection{How to motivate people to run bridge relays}
-\label{subsec:incentives}
-
-One of the traditional ways to get people to run software that benefits
-others is to give them motivation to install it themselves. An often
-suggested approach is to install it as a stunning screensaver so everybody
-will be pleased to run it. We take a similar approach here, by leveraging
-the fact that these users are already interested in protecting their
-own Internet traffic, so they will install and run the software.
-
-Eventually, we may be able to make all Tor users become bridges if they
-pass their self-reachability tests---the software and installers need
-more work on usability first, but we're making progress.
-
-In the mean time, we can make a snazzy network graph with
-Vidalia\footnote{\url{http://vidalia-project.net/}} that
-emphasizes the connections the bridge user is currently relaying.
-%(Minor
-%anonymity implications, but hey.) (In many cases there won't be much
-%activity, so this may backfire. Or it may be better suited to full-fledged
-%Tor relay.)
-
-% Also consider everybody-a-relay. Many of the scalability questions
-% are easier when you're talking about making everybody a bridge.
-
-%\subsection{What if the clients can't install software?}
-
-%[this section should probably move to the related work section,
-%or just disappear entirely.]
-
-%Bridge users without Tor software
-
-%Bridge relays could always open their socks proxy. This is bad though,
-%first
-%because bridges learn the bridge users' destinations, and second because
-%we've learned that open socks proxies tend to attract abusive users who
-%have no idea they're using Tor.
-
-%Bridges could require passwords in the socks handshake (not supported
-%by most software including Firefox). Or they could run web proxies
-%that require authentication and then pass the requests into Tor. This
-%approach is probably a good way to help bootstrap the Psiphon network,
-%if one of its barriers to deployment is a lack of volunteers willing
-%to exit directly to websites. But it clearly drops some of the nice
-%anonymity and security features Tor provides.
-
-%A hybrid approach where the user gets his anonymity from Tor but his
-%software-less use from a web proxy running on a trusted machine on the
-%free side.
-
-\subsection{Publicity attracts attention}
-\label{subsec:publicity}
-
-Many people working on this field want to publicize the existence
-and extent of censorship concurrently with the deployment of their
-circumvention software. The easy reason for this two-pronged push is
-to attract volunteers for running proxies in their systems; but in many
-cases their main goal is not to focus on getting more users signed up,
-but rather to educate the rest of the world about the
-censorship. The media also tries to do its part by broadcasting the
-existence of each new circumvention system.
-
-But at the same time, this publicity attracts the attention of the
-censors. We can slow down the arms race by not attracting as much
-attention, and just spreading by word of mouth. If our goal is to
-establish a solid social network of bridges and bridge users before
-the adversary gets involved, does this extra attention work to our
-disadvantage?
-
-\subsection{The Tor website: how to get the software}
-
-One of the first censoring attacks against a system like ours is to
-block the website and make the software itself hard to find. Our system
-should work well once the user is running an authentic
-copy of Tor and has found a working bridge, but to get to that point
-we rely on their individual skills and ingenuity.
-
-Right now, most countries that block access to Tor block only the main
-website and leave mirrors and the network itself untouched.
-Falling back on word-of-mouth is always a good last resort, but we should
-also take steps to make sure it's relatively easy for users to get a copy,
-such as publicizing the mirrors more and making copies available through
-other media. We might also mirror the latest version of the software on
-each bridge, so users who hear about an honest bridge can get a good
-copy.
-See Section~\ref{subsec:first-bridge} for more discussion.
-
-% Ian suggests that we have every tor relay distribute a signed copy of the
-% software.
-
-\section{Next Steps}
-\label{sec:conclusion}
-
-Technical solutions won't solve the whole censorship problem. After all,
-the firewalls in places like China are \emph{socially} very
-successful, even if technologies and tricks exist to get around them.
-However, having a strong technical solution is still necessary as one
-important piece of the puzzle.
-
-In this paper, we have shown that Tor provides a great set of building
-blocks to start from. The next steps are to deploy prototype bridges and
-bridge authorities, implement some of the proposed discovery strategies,
-and then observe the system in operation and get more intuition about
-the actual requirements and adversaries we're up against.
-
-\bibliographystyle{plain} \bibliography{tor-design}
-
-%\appendix
-
-%\section{Counting Tor users by country}
-%\label{app:geoip}
-
-\end{document}
-
-
-
-\section{Future designs}
-\label{sec:future}
-
-\subsection{Bridges inside the blocked network too}
-
-Assuming actually crossing the firewall is the risky part of the
-operation, can we have some bridge relays inside the blocked area too,
-and more established users can use them as relays so they don't need to
-communicate over the firewall directly at all? A simple example here is
-to make new blocked users into internal bridges also---so they sign up
-on the bridge authority as part of doing their query, and we give out
-their addresses
-rather than (or along with) the external bridge addresses. This design
-is a lot trickier because it brings in the complexity of whether the
-internal bridges will remain available, can maintain reachability with
-the outside world, etc.
-
-More complex future designs involve operating a separate Tor network
-inside the blocked area, and using \emph{hidden service bridges}---bridges
-that can be accessed by users of the internal Tor network but whose
-addresses are not published or findable, even by these users---to get
-from inside the firewall to the rest of the Internet. But this design
-requires directory authorities to run inside the blocked area too,
-and they would be a fine target to take down the network.
-
-% Hidden services as bridge directory authorities.
-
-
-------------------------------------------
-
-ship geoip db to bridges. they look up users who tls to them in the db,
-and upload a signed list of countries and number-of-users each day. the
-bridge authority aggregates them and publishes stats.
-
-bridge relays have buddies
-they ask a user to test the reachability of their buddy.
-leaks O(1) bridges, but not O(n).
-
-we should not be blockable by ordinary cisco censorship features.
-that is, if they want to block our new design, they will need to
-add a feature to block exactly this.
-strategically speaking, this may come in handy.
-
-Bridges come in clumps of 4 or 8 or whatever. If you know one bridge
-in a clump, the authority will tell you the rest. Now bridges can
-ask users to test reachability of their buddies.
-
-Giving out clumps helps with dynamic IP addresses too. Whether it
-should be 4 or 8 depends on our churn.
-
-the account server. let's call it a database, it doesn't have to
-be a thing that human interacts with.
-
-so how do we reward people for being good?
-
-\subsubsection{Public Bridges with Coordinated Discovery}
-
-****Pretty much this whole subsubsection will probably need to be
-deferred until ``later'' and moved to after end document, but I'm leaving
-it here for now in case useful.******
-
-Rather than be entirely centralized, we can have a coordinated
-collection of bridge authorities, analogous to how Tor network
-directory authorities now work.
-
-Key components
-``Authorities'' will distribute caches of what they know to overlapping
-collections of nodes so that no one node is owned by one authority.
-Also so that it is impossible to DoS info maintained by one authority
-simply by making requests to it.
-
-Where a bridge gets assigned is not predictable by the bridge?
-
-If authorities don't know the IP addresses of the bridges they
-are responsible for, they can't abuse that info (or be attacked for
-having it). But, they also can't, e.g., control being sent massive
-lists of nodes that were never good. This raises another question.
-We generally decry use of IP address for location, etc. but we
-need to do that to limit the introduction of functional but useless
-IP addresses because, e.g., they are in China and the adversary
-owns massive chunks of the IP space there.
-
-We don't want an arbitrary someone to be able to contact the
-authorities and say an IP address is bad because it would be easy
-for an adversary to take down all the suspicious bridges
-even if they provide good cover websites, etc. Only the bridge
-itself and/or the directory authority can declare a bridge blocked
-from somewhere.
-
-
-9. Bridge directories must not simply be a handful of nodes that
-provide the list of bridges. They must flood or otherwise distribute
-information out to other Tor nodes as mirrors. That way it becomes
-difficult for censors to flood the bridge directory authorities with
-requests, effectively denying access for others. But, there's lots of
-churn and a much larger size than Tor directories. We are forced to
-handle the directory scaling problem here much sooner than for the
-network in general. Authorities can pass their bridge directories
-(and policy info) to some moderate number of unidentified Tor nodes.
-Anyone contacting one of those nodes can get bridge info. the nodes
-must remain somewhat synched to prevent the adversary from abusing,
-e.g., a timed release policy or the distribution to those nodes must
-be resilient even if they are not coordinating.
-
-I think some kind of DHT like scheme would work here. A Tor node is
-assigned a chunk of the directory. Lookups in the directory should be
-via hashes of keys (fingerprints) and that should determine the Tor
-nodes responsible. Ordinary directories can publish lists of Tor nodes
-responsible for fingerprint ranges. Clients looking to update info on
-some bridge will make a Tor connection to one of the nodes responsible
-for that address. Instead of shutting down a circuit after getting
-info on one address, extend it to another that is responsible for that
-address (the node from which you are extending knows you are doing so
-anyway). Keep going. This way you can amortize the Tor connection.
-
-10. We need some way to give new identity keys out to those who need
-them without letting those get immediately blocked by authorities. One
-way is to give a fingerprint that gets you more fingerprints, as
-already described. These are meted out/updated periodically but allow
-us to keep track of which sources are compromised: if a distribution
-fingerprint repeatedly leads to quickly blocked bridges, it should be
-suspect, dropped, etc. Since we're using hashes, there shouldn't be a
-correlation with bridge directory mirrors, bridges, portions of the
-network observed, etc. It should just be that the authorities know
-about that key that leads to new addresses.
-
-This last point is very much like the issues in the valet nodes paper,
-which is essentially about blocking resistance wrt exiting the Tor network,
-while this paper is concerned with blocking the entering to the Tor network.
-In fact the tickets used to connect to the IPo (Introduction Point),
-could serve as an example, except that instead of authorizing
-a connection to the Hidden Service, it's authorizing the downloading
-of more fingerprints.
-
-Also, the fingerprints can follow the hash(q + '1' + cookie) scheme of
-that paper (where q = hash(PK + salt) gave the q.onion address). This
-allows us to control and track which fingerprint was causing problems.
-
-Note that, unlike many settings, the reputation problem should not be
-hard here. If a bridge says it is blocked, then it might as well be.
-If an adversary can say that the bridge is blocked wrt
-$\mathit{censor}_i$, then it might as well be, since
-$\mathit{censor}_i$ can presumably then block that bridge if it so
-chooses.
-
-11. How much damage can the adversary do by running nodes in the Tor
-network and watching for bridge nodes connecting to it? (This is
-analogous to an Introduction Point watching for Valet Nodes connecting
-to it.) What percentage of the network do you need to own to do how
-much damage. Here the entry-guard design comes in helpfully. So we
-need to have bridges use entry-guards, but (cf. 3 above) not use
-bridges as entry-guards. Here's a serious tradeoff (again akin to the
-ratio of valets to IPos) the more bridges/client the worse the
-anonymity of that client. The fewer bridges/client the worse the
-blocking resistance of that client.
-
-
-
diff --git a/doc/design-paper/cell-struct.eps b/doc/design-paper/cell-struct.eps
deleted file mode 100644
index eb9fcb8643..0000000000
--- a/doc/design-paper/cell-struct.eps
+++ /dev/null
@@ -1,189 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: cell-struct.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 4
-%%CreationDate: Mon May 17 00:04:58 2004
-%%For: root@localhost.localdomain (root)
-%%BoundingBox: 0 0 254 73
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 73 moveto 0 0 lineto 254 0 lineto 254 73 lineto closepath clip newpath
--35.3 77.2 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-%
-% here starts figure with depth 50
-% Polyline
-7.500 slw
-n 1200 975 m
- 1200 1275 l gs col0 s gr
-% Polyline
-n 1725 975 m
- 1725 1275 l gs col0 s gr
-% Polyline
-n 600 975 m 4800 975 l 4800 1275 l 600 1275 l
- cp gs col0 s gr
-% Polyline
-n 1200 300 m
- 1200 600 l gs col0 s gr
-% Polyline
-n 1725 300 m
- 1725 600 l gs col0 s gr
-% Polyline
-n 600 300 m 4800 300 l 4800 600 l 600 600 l
- cp gs col0 s gr
-% Polyline
-n 2550 975 m
- 2550 1275 l gs col0 s gr
-% Polyline
-n 3150 975 m
- 3150 1275 l gs col0 s gr
-% Polyline
-n 3450 975 m
- 3450 1275 l gs col0 s gr
-% Polyline
-n 3900 975 m
- 3900 1275 l gs col0 s gr
-/Times-Roman ff 180.00 scf sf
-675 1200 m
-gs 1 -1 sc (CircID) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-900 900 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-1275 1200 m
-gs 1 -1 sc (Relay) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-1800 1200 m
-gs 1 -1 sc (StreamID) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-2625 1200 m
-gs 1 -1 sc (Digest) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-3150 1200 m
-gs 1 -1 sc (Len) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-4200 1200 m
-gs 1 -1 sc (DATA) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-675 525 m
-gs 1 -1 sc (CircID) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-1275 525 m
-gs 1 -1 sc (CMD) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-900 225 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-1425 225 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-3225 525 m
-gs 1 -1 sc (DATA) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-3225 900 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-3450 1200 m
-gs 1 -1 sc (CMD) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-3600 900 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-3300 225 m
-gs 1 -1 sc (509 bytes) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-1425 900 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-2100 900 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-2850 900 m
-gs 1 -1 sc (6) col0 sh gr
-/Times-Roman ff 180.00 scf sf
-4350 900 m
-gs 1 -1 sc (498) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
diff --git a/doc/design-paper/cell-struct.fig b/doc/design-paper/cell-struct.fig
deleted file mode 100644
index 3490673ca6..0000000000
--- a/doc/design-paper/cell-struct.fig
+++ /dev/null
@@ -1,49 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter
-100.00
-Single
--2
-1200 2
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1200 975 1200 1275
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1725 975 1725 1275
-2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
- 600 975 4800 975 4800 1275 600 1275 600 975
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1200 300 1200 600
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1725 300 1725 600
-2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
- 600 300 4800 300 4800 600 600 600 600 300
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 2550 975 2550 1275
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 3150 975 3150 1275
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 3450 975 3450 1275
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 3900 975 3900 1275
-4 0 0 50 -1 0 12 0.0000 4 135 510 675 1200 CircID\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 900 900 2\001
-4 0 0 50 -1 0 12 0.0000 4 180 435 1275 1200 Relay\001
-4 0 0 50 -1 0 12 0.0000 4 135 735 1800 1200 StreamID\001
-4 0 0 50 -1 0 12 0.0000 4 180 510 2625 1200 Digest\001
-4 0 0 50 -1 0 12 0.0000 4 135 285 3150 1200 Len\001
-4 0 0 50 -1 0 12 0.0000 4 135 510 4200 1200 DATA\001
-4 0 0 50 -1 0 12 0.0000 4 135 510 675 525 CircID\001
-4 0 0 50 -1 0 12 0.0000 4 135 420 1275 525 CMD\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 900 225 2\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 1425 225 1\001
-4 0 0 50 -1 0 12 0.0000 4 135 510 3225 525 DATA\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 3225 900 2\001
-4 0 0 50 -1 0 12 0.0000 4 135 420 3450 1200 CMD\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 3600 900 1\001
-4 0 0 50 -1 0 12 0.0000 4 180 735 3300 225 509 bytes\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 1425 900 1\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 2100 900 2\001
-4 0 0 50 -1 0 12 0.0000 4 135 90 2850 900 6\001
-4 0 0 50 -1 0 12 0.0000 4 135 270 4350 900 498\001
diff --git a/doc/design-paper/cell-struct.pdf b/doc/design-paper/cell-struct.pdf
deleted file mode 100644
index 8ca52deeb9..0000000000
--- a/doc/design-paper/cell-struct.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/cell-struct.png b/doc/design-paper/cell-struct.png
deleted file mode 100644
index 799bcc8c18..0000000000
--- a/doc/design-paper/cell-struct.png
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/challenges.pdf b/doc/design-paper/challenges.pdf
deleted file mode 100644
index d0a3e0923b..0000000000
--- a/doc/design-paper/challenges.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/challenges.tex b/doc/design-paper/challenges.tex
deleted file mode 100644
index 6949693bf0..0000000000
--- a/doc/design-paper/challenges.tex
+++ /dev/null
@@ -1,1505 +0,0 @@
-\documentclass{llncs}
-
-\usepackage{url}
-\usepackage{amsmath}
-\usepackage{epsfig}
-
-\setlength{\textwidth}{5.9in}
-\setlength{\textheight}{8.4in}
-\setlength{\topmargin}{.5cm}
-\setlength{\oddsidemargin}{1cm}
-\setlength{\evensidemargin}{1cm}
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-
-\begin{document}
-
-\title{Challenges in deploying low-latency anonymity (DRAFT)}
-
-\author{Roger Dingledine\inst{1} \and
-Nick Mathewson\inst{1} \and
-Paul Syverson\inst{2}}
-\institute{The Free Haven Project \email{<\{arma,nickm\}@freehaven.net>} \and
-Naval Research Laboratory \email{<syverson@itd.nrl.navy.mil>}}
-
-\maketitle
-\pagestyle{plain}
-
-\begin{abstract}
- There are many unexpected or unexpectedly difficult obstacles to
- deploying anonymous communications. Drawing on our experiences deploying
- Tor (the second-generation onion routing network), we describe social
- challenges and technical issues that must be faced
- in building, deploying, and sustaining a scalable, distributed, low-latency
- anonymity network.
-\end{abstract}
-
-\section{Introduction}
-% Your network is not practical unless it is sustainable and distributed.
-Anonymous communication is full of surprises. This paper discusses some
-unexpected challenges arising from our experiences deploying Tor, a
-low-latency general-purpose anonymous communication system. We will discuss
-some of the difficulties we have experienced and how we have met them (or how
-we plan to meet them, if we know). We also discuss some less
-troublesome open problems that we must nevertheless eventually address.
-%We will describe both those future challenges that we intend to explore and
-%those that we have decided not to explore and why.
-
-Tor is an overlay network for anonymizing TCP streams over the
-Internet~\cite{tor-design}. It addresses limitations in earlier Onion
-Routing designs~\cite{or-ih96,or-jsac98,or-discex00,or-pet00} by adding
-perfect forward secrecy, congestion control, directory servers, data
-integrity, configurable exit policies, and location-hidden services using
-rendezvous points. Tor works on the real-world Internet, requires no special
-privileges or kernel modifications, requires little synchronization or
-coordination between nodes, and provides a reasonable trade-off between
-anonymity, usability, and efficiency.
-
-We deployed the public Tor network in October 2003; since then it has
-grown to over a hundred volunteer-operated nodes
-and as much as 80 megabits of
-average traffic per second. Tor's research strategy has focused on deploying
-a network to as many users as possible; thus, we have resisted designs that
-would compromise deployability by imposing high resource demands on node
-operators, and designs that would compromise usability by imposing
-unacceptable restrictions on which applications we support. Although this
-strategy has
-drawbacks (including a weakened threat model, as discussed below), it has
-made it possible for Tor to serve many thousands of users and attract
-funding from diverse sources whose goals range from security on a
-national scale down to individual liberties.
-
-In~\cite{tor-design} we gave an overall view of Tor's
-design and goals. Here we describe some policy, social, and technical
-issues that we face as we continue deployment.
-Rather than providing complete solutions to every problem, we
-instead lay out the challenges and constraints that we have observed while
-deploying Tor. In doing so, we aim to provide a research agenda
-of general interest to projects attempting to build
-and deploy practical, usable anonymity networks in the wild.
-
-%While the Tor design paper~\cite{tor-design} gives an overall view its
-%design and goals,
-%this paper describes the policy and technical issues that Tor faces as
-%we continue deployment. Rather than trying to provide complete solutions
-%to every problem here, we lay out the assumptions and constraints
-%that we have observed through deploying Tor in the wild. In doing so, we
-%aim to create a research agenda for others to
-%help in addressing these issues.
-% Section~\ref{sec:what-is-tor} gives an
-%overview of the Tor
-%design and ours goals. Sections~\ref{sec:crossroads-policy}
-%and~\ref{sec:crossroads-design} go on to describe the practical challenges,
-%both policy and technical respectively,
-%that stand in the way of moving
-%from a practical useful network to a practical useful anonymous network.
-
-%\section{What Is Tor}
-\section{Background}
-Here we give a basic overview of the Tor design and its properties, and
-compare Tor to other low-latency anonymity designs.
-
-\subsection{Tor, threat models, and distributed trust}
-\label{sec:what-is-tor}
-
-%Here we give a basic overview of the Tor design and its properties. For
-%details on the design, assumptions, and security arguments, we refer
-%the reader to the Tor design paper~\cite{tor-design}.
-
-Tor provides \emph{forward privacy}, so that users can connect to
-Internet sites without revealing their logical or physical locations
-to those sites or to observers. It also provides \emph{location-hidden
-services}, so that servers can support authorized users without
-giving an effective vector for physical or online attackers.
-Tor provides these protections even when a portion of its
-infrastructure is compromised.
-
-To connect to a remote server via Tor, the client software learns a signed
-list of Tor nodes from one of several central \emph{directory servers}, and
-incrementally creates a private pathway or \emph{circuit} of encrypted
-connections through authenticated Tor nodes on the network, negotiating a
-separate set of encryption keys for each hop along the circuit. The circuit
-is extended one node at a time, and each node along the way knows only the
-immediately previous and following nodes in the circuit, so no individual Tor
-node knows the complete path that each fixed-sized data packet (or
-\emph{cell}) will take.
-%Because each node sees no more than one hop in the
-%circuit,
-Thus, neither an eavesdropper nor a compromised node can
-see both the connection's source and destination. Later requests use a new
-circuit, to complicate long-term linkability between different actions by
-a single user.
-
-Tor also helps servers hide their locations while
-providing services such as web publishing or instant
-messaging. Using ``rendezvous points'', other Tor users can
-connect to these authenticated hidden services, neither one learning the
-other's network identity.
-
-Tor attempts to anonymize the transport layer, not the application layer.
-This approach is useful for applications such as SSH
-where authenticated communication is desired. However, when anonymity from
-those with whom we communicate is desired,
-application protocols that include personally identifying information need
-additional application-level scrubbing proxies, such as
-Privoxy~\cite{privoxy} for HTTP\@. Furthermore, Tor does not relay arbitrary
-IP packets; it only anonymizes TCP streams and DNS requests
-%, and only supports
-%connections via SOCKS
-(but see Section~\ref{subsec:tcp-vs-ip}).
-
-Most node operators do not want to allow arbitrary TCP traffic. % to leave
-%their server.
-To address this, Tor provides \emph{exit policies} so
-each exit node can block the IP addresses and ports it is unwilling to allow.
-Tor nodes advertise their exit policies to the directory servers, so that
-clients can tell which nodes will support their connections.
-
-As of January 2005, the Tor network has grown to around a hundred nodes
-on four continents, with a total capacity exceeding 1Gbit/s. Appendix A
-shows a graph of the number of working nodes over time, as well as a
-graph of the number of bytes being handled by the network over time.
-The network is now sufficiently diverse for further development
-and testing; but of course we always encourage new nodes
-to join.
-
-Tor research and development has been funded by ONR and DARPA
-for use in securing government
-communications, and by the Electronic Frontier Foundation for use
-in maintaining civil liberties for ordinary citizens online. The Tor
-protocol is one of the leading choices
-for the anonymizing layer in the European Union's PRIME directive to
-help maintain privacy in Europe.
-The AN.ON project in Germany
-has integrated an independent implementation of the Tor protocol into
-their popular Java Anon Proxy anonymizing client.
-% This wide variety of
-%interests helps maintain both the stability and the security of the
-%network.
-
-\medskip
-\noindent
-{\bf Threat models and design philosophy.}
-The ideal Tor network would be practical, useful and anonymous. When
-trade-offs arise between these properties, Tor's research strategy has been
-to remain useful enough to attract many users,
-and practical enough to support them. Only subject to these
-constraints do we try to maximize
-anonymity.\footnote{This is not the only possible
-direction in anonymity research: designs exist that provide more anonymity
-than Tor at the expense of significantly increased resource requirements, or
-decreased flexibility in application support (typically because of increased
-latency). Such research does not typically abandon aspirations toward
-deployability or utility, but instead tries to maximize deployability and
-utility subject to a certain degree of structural anonymity (structural because
-usability and practicality affect usage which affects the actual anonymity
-provided by the network \cite{econymics,back01}).}
-%{We believe that these
-%approaches can be promising and useful, but that by focusing on deploying a
-%usable system in the wild, Tor helps us experiment with the actual parameters
-%of what makes a system ``practical'' for volunteer operators and ``useful''
-%for home users, and helps illuminate undernoticed issues which any deployed
-%volunteer anonymity network will need to address.}
-Because of our strategy, Tor has a weaker threat model than many designs in
-the literature. In particular, because we
-support interactive communications without impractically expensive padding,
-we fall prey to a variety
-of intra-network~\cite{back01,attack-tor-oak05,flow-correlation04} and
-end-to-end~\cite{danezis:pet2004,SS03} anonymity-breaking attacks.
-
-Tor does not attempt to defend against a global observer. In general, an
-attacker who can measure both ends of a connection through the Tor network
-% I say 'measure' rather than 'observe', to encompass murdoch-danezis
-% style attacks. -RD
-can correlate the timing and volume of data on that connection as it enters
-and leaves the network, and so link communication partners.
-Known solutions to this attack would seem to require introducing a
-prohibitive degree of traffic padding between the user and the network, or
-introducing an unacceptable degree of latency (but see Section
-\ref{subsec:mid-latency}). Also, it is not clear that these methods would
-work at all against a minimally active adversary who could introduce timing
-patterns or additional traffic. Thus, Tor only attempts to defend against
-external observers who cannot observe both sides of a user's connections.
-
-
-Against internal attackers who sign up Tor nodes, the situation is more
-complicated. In the simplest case, if an adversary has compromised $c$ of
-$n$ nodes on the Tor network, then the adversary will be able to compromise
-a random circuit with probability $\frac{c^2}{n^2}$ (since the circuit
-initiator chooses hops randomly). But there are
-complicating factors:
-(1)~If the user continues to build random circuits over time, an adversary
- is pretty certain to see a statistical sample of the user's traffic, and
- thereby can build an increasingly accurate profile of her behavior. (See
- Section~\ref{subsec:helper-nodes} for possible solutions.)
-(2)~An adversary who controls a popular service outside the Tor network
- can be certain to observe all connections to that service; he
- can therefore trace connections to that service with probability
- $\frac{c}{n}$.
-(3)~Users do not in fact choose nodes with uniform probability; they
- favor nodes with high bandwidth or uptime, and exit nodes that
- permit connections to their favorite services.
-(See Section~\ref{subsec:routing-zones} for discussion of larger
-adversaries and our dispersal goals.)
-
-% I'm trying to make this paragraph work without reference to the
-% analysis/confirmation distinction, which we haven't actually introduced
-% yet, and which we realize isn't very stable anyway. Also, I don't want to
-% deprecate these attacks if we can't demonstrate that they don't work, since
-% in case they *do* turn out to work well against Tor, we'll look pretty
-% foolish. -NM
-More powerful attacks may exist. In \cite{hintz-pet02} it was
-shown that an attacker who can catalog data volumes of popular
-responder destinations (say, websites with consistent data volumes) may not
-need to
-observe both ends of a stream to learn source-destination links for those
-responders.
-Similarly, latencies of going through various routes can be
-cataloged~\cite{back01} to connect endpoints.
-% Also, \cite{kesdogan:pet2002} takes the
-% attack another level further, to narrow down where you could be
-% based on an intersection attack on subpages in a website. -RD
-It has not yet been shown whether these attacks will succeed or fail
-in the presence of the variability and volume quantization introduced by the
-Tor network, but it seems likely that these factors will at best delay
-rather than halt the attacks in the cases where they succeed.
-Along similar lines, the same paper suggests a ``clogging
-attack'' in which the throughput on a circuit is observed to slow
-down when an adversary clogs the right nodes with his own traffic.
-To determine the nodes in a circuit this attack requires the ability
-to continuously monitor the traffic exiting the network on a circuit
-that is up long enough to probe all network nodes in binary fashion.
-% Though somewhat related, clogging and interference are really different
-% attacks with different assumptions about adversary distribution and
-% capabilities as well as different techniques. -pfs
-Murdoch and Danezis~\cite{attack-tor-oak05} show a practical
-interference attack against portions of
-the fifty node Tor network as deployed in mid 2004.
-An outside attacker can actively trace a circuit through the Tor network
-by observing changes in the latency of his
-own traffic sent through various Tor nodes. This can be done
-simultaneously at multiple nodes; however, like clogging,
-this attack only reveals
-the Tor nodes in the circuit, not initiator and responder addresses,
-so it is still necessary to discover the endpoints to complete an
-effective attack. Increasing the size and diversity of the Tor network may
-help counter these attacks.
-
-%discuss $\frac{c^2}{n^2}$, except how in practice the chance of owning
-%the last hop is not $c/n$ since that doesn't take the destination (website)
-%into account. so in cases where the adversary does not also control the
-%final destination we're in good shape, but if he *does* then we'd be better
-%off with a system that lets each hop choose a path.
-%
-%Isn't it more accurate to say ``If the adversary _always_ controls the final
-% dest, we would be just as well off with such as system.'' ? If not, why
-% not? -nm
-% Sure. In fact, better off, since they seem to scale more easily. -rd
-
-%Murdoch and Danezis describe an attack
-%\cite{attack-tor-oak05} that lets an attacker determine the nodes used
-%in a circuit; yet s/he cannot identify the initiator or responder,
-%e.g., client or web server, through this attack. So the endpoints
-%remain secure, which is the goal. It is conceivable that an
-%adversary could attack or set up observation of all connections
-%to an arbitrary Tor node in only a few minutes. If such an adversary
-%were to exist, s/he could use this probing to remotely identify a node
-%for further attack. Of more likely immediate practical concern
-%an adversary with active access to the responder traffic
-%wants to keep a circuit alive long enough to attack an identified
-%node. Thus it is important to prevent the responding end of the circuit
-%from keeping it open indefinitely.
-%Also, someone could identify nodes in this way and if in their
-%jurisdiction, immediately get a subpoena (if they even need one)
-%telling the node operator(s) that she must retain all the active
-%circuit data she now has.
-%Further, the enclave model, which had previously looked to be the most
-%generally secure, seems particularly threatened by this attack, since
-%it identifies endpoints when they're also nodes in the Tor network:
-%see Section~\ref{subsec:helper-nodes} for discussion of some ways to
-%address this issue.
-
-\medskip
-\noindent
-{\bf Distributed trust.}
-In practice Tor's threat model is based on
-dispersal and diversity.
-Our defense lies in having a diverse enough set of nodes
-to prevent most real-world
-adversaries from being in the right places to attack users,
-by distributing each transaction
-over several nodes in the network. This ``distributed trust'' approach
-means the Tor network can be safely operated and used by a wide variety
-of mutually distrustful users, providing sustainability and security.
-%than some previous attempts at anonymizing networks.
-
-No organization can achieve this security on its own. If a single
-corporation or government agency were to build a private network to
-protect its operations, any connections entering or leaving that network
-would be obviously linkable to the controlling organization. The members
-and operations of that agency would be easier, not harder, to distinguish.
-
-Instead, to protect our networks from traffic analysis, we must
-collaboratively blend the traffic from many organizations and private
-citizens, so that an eavesdropper can't tell which users are which,
-and who is looking for what information. %By bringing more users onto
-%the network, all users become more secure~\cite{econymics}.
-%[XXX I feel uncomfortable saying this last sentence now. -RD]
-%[So, I took it out. I think we can do without it. -PFS]
-The Tor network has a broad range of users, including ordinary citizens
-concerned about their privacy, corporations
-who don't want to reveal information to their competitors, and law
-enforcement and government intelligence agencies who need
-to do operations on the Internet without being noticed.
-Naturally, organizations will not want to depend on others for their
-security. If most participating providers are reliable, Tor tolerates
-some hostile infiltration of the network. For maximum protection,
-the Tor design includes an enclave approach that lets data be encrypted
-(and authenticated) end-to-end, so high-sensitivity users can be sure it
-hasn't been read or modified. This even works for Internet services that
-don't have built-in encryption and authentication, such as unencrypted
-HTTP or chat, and it requires no modification of those services.
-
-\subsection{Related work}
-Tor differs from other deployed systems for traffic analysis resistance
-in its security and flexibility. Mix networks such as
-Mixmaster~\cite{mixmaster-spec} or its successor Mixminion~\cite{minion-design}
-gain the highest degrees of anonymity at the expense of introducing highly
-variable delays, making them unsuitable for applications such as web
-browsing. Commercial single-hop
-proxies~\cite{anonymizer} can provide good performance, but
-a single compromise can expose all users' traffic, and a single-point
-eavesdropper can perform traffic analysis on the entire network.
-%Also, their proprietary implementations place any infrastructure that
-%depends on these single-hop solutions at the mercy of their providers'
-%financial health as well as network security.
-The Java
-Anon Proxy~\cite{web-mix} provides similar functionality to Tor but
-handles only web browsing rather than all TCP\@.
-%Some peer-to-peer file-sharing overlay networks such as
-%Freenet~\cite{freenet} and Mute~\cite{mute}
-The Freedom
-network from Zero-Knowledge Systems~\cite{freedom21-security}
-was even more flexible than Tor in
-transporting arbitrary IP packets, and also supported
-pseudonymity in addition to anonymity; but it had
-a different approach to sustainability (collecting money from users
-and paying ISPs to run Tor nodes), and was eventually shut down due to financial
-load. Finally, %potentially more scalable
-% [I had added 'potentially' because the scalability of these designs
-% is not established, and I am uncomfortable making the
-% bolder unmodified assertion. Roger took 'potentially' out.
-% Here's an attempt at more neutral wording -pfs]
-peer-to-peer designs that are intended to be more scalable,
-for example Tarzan~\cite{tarzan:ccs02} and
-MorphMix~\cite{morphmix:fc04}, have been proposed in the literature but
-have not been fielded. These systems differ somewhat
-in threat model and presumably practical resistance to threats.
-Note that MorphMix differs from Tor only in
-node discovery and circuit setup; so Tor's architecture is flexible
-enough to contain a MorphMix experiment.
-We direct the interested reader
-to~\cite{tor-design} for a more in-depth review of related work.
-
-%XXXX six-four. crowds. i2p.
-
-%XXXX
-%have a serious discussion of morphmix's assumptions, since they would
-%seem to be the direct competition. in fact tor is a flexible architecture
-%that would encompass morphmix, and they're nearly identical except for
-%path selection and node discovery. and the trust system morphmix has
-%seems overkill (and/or insecure) based on the threat model we've picked.
-% this para should probably move to the scalability / directory system. -RD
-% Nope. Cut for space, except for small comment added above -PFS
-
-\section{Social challenges}
-
-Many of the issues the Tor project needs to address extend beyond
-system design and technology development. In particular, the
-Tor project's \emph{image} with respect to its users and the rest of
-the Internet impacts the security it can provide.
-With this image issue in mind, this section discusses the Tor user base and
-Tor's interaction with other services on the Internet.
-
-\subsection{Communicating security}
-
-Usability for anonymity systems
-contributes to their security, because usability
-affects the possible anonymity set~\cite{econymics,back01}.
-Conversely, an unusable system attracts few users and thus can't provide
-much anonymity.
-
-This phenomenon has a second-order effect: knowing this, users should
-choose which anonymity system to use based in part on how usable
-and secure
-\emph{others} will find it, in order to get the protection of a larger
-anonymity set. Thus we might supplement the adage ``usability is a security
-parameter''~\cite{back01} with a new one: ``perceived usability is a
-security parameter.'' From here we can better understand the effects
-of publicity on security: the more convincing your
-advertising, the more likely people will believe you have users, and thus
-the more users you will attract. Perversely, over-hyped systems (if they
-are not too broken) may be a better choice than modestly promoted ones,
-if the hype attracts more users~\cite{usability-network-effect}.
-
-So it follows that we should come up with ways to accurately communicate
-the available security levels to the user, so she can make informed
-decisions. JAP aims to do this by including a
-comforting `anonymity meter' dial in the software's graphical interface,
-giving the user an impression of the level of protection for her current
-traffic.
-
-However, there's a catch. For users to share the same anonymity set,
-they need to act like each other. An attacker who can distinguish
-a given user's traffic from the rest of the traffic will not be
-distracted by anonymity set size. For high-latency systems like
-Mixminion, where the threat model is based on mixing messages with each
-other, there's an arms race between end-to-end statistical attacks and
-counter-strategies~\cite{statistical-disclosure,minion-design,e2e-traffic,trickle02}.
-But for low-latency systems like Tor, end-to-end \emph{traffic
-correlation} attacks~\cite{danezis:pet2004,defensive-dropping,SS03}
-allow an attacker who can observe both ends of a communication
-to correlate packet timing and volume, quickly linking
-the initiator to her destination.
-
-Like Tor, the current JAP implementation does not pad connections
-apart from using small fixed-size cells for transport. In fact,
-JAP's cascade-based network topology may be more vulnerable to these
-attacks, because its network has fewer edges. JAP was born out of
-the ISDN mix design~\cite{isdn-mixes}, where padding made sense because
-every user had a fixed bandwidth allocation and altering the timing
-pattern of packets could be immediately detected. But in its current context
-as an Internet web anonymizer, adding sufficient padding to JAP
-would probably be prohibitively expensive and ineffective against a
-minimally active attacker.\footnote{Even if JAP could
-fund higher-capacity nodes indefinitely, our experience
-suggests that many users would not accept the increased per-user
-bandwidth requirements, leading to an overall much smaller user base. But
-see Section~\ref{subsec:mid-latency}.} Therefore, since under this threat
-model the number of concurrent users does not seem to have much impact
-on the anonymity provided, we suggest that JAP's anonymity meter is not
-accurately communicating security levels to its users.
-
-On the other hand, while the number of active concurrent users may not
-matter as much as we'd like, it still helps to have some other users
-on the network. We investigate this issue next.
-
-\subsection{Reputability and perceived social value}
-Another factor impacting the network's security is its reputability:
-the perception of its social value based on its current user base. If Alice is
-the only user who has ever downloaded the software, it might be socially
-accepted, but she's not getting much anonymity. Add a thousand
-activists, and she's anonymous, but everyone thinks she's an activist too.
-Add a thousand
-diverse citizens (cancer survivors, privacy enthusiasts, and so on)
-and now she's harder to profile.
-
-Furthermore, the network's reputability affects its operator base: more people
-are willing to run a service if they believe it will be used by human rights
-workers than if they believe it will be used exclusively for disreputable
-ends. This effect becomes stronger if node operators themselves think they
-will be associated with their users' disreputable ends.
-
-So the more cancer survivors on Tor, the better for the human rights
-activists. The more malicious hackers, the worse for the normal users. Thus,
-reputability is an anonymity issue for two reasons. First, it impacts
-the sustainability of the network: a network that's always about to be
-shut down has difficulty attracting and keeping adequate nodes.
-Second, a disreputable network is more vulnerable to legal and
-political attacks, since it will attract fewer supporters.
-
-While people therefore have an incentive for the network to be used for
-``more reputable'' activities than their own, there are still trade-offs
-involved when it comes to anonymity. To follow the above example, a
-network used entirely by cancer survivors might welcome file sharers
-onto the network, though of course they'd prefer a wider
-variety of users.
-
-Reputability becomes even more tricky in the case of privacy networks,
-since the good uses of the network (such as publishing by journalists in
-dangerous countries) are typically kept private, whereas network abuses
-or other problems tend to be more widely publicized.
-
-The impact of public perception on security is especially important
-during the bootstrapping phase of the network, where the first few
-widely publicized uses of the network can dictate the types of users it
-attracts next.
-As an example, some U.S.~Department of Energy
-penetration testing engineers are tasked with compromising DoE computers
-from the outside. They only have a limited number of ISPs from which to
-launch their attacks, and they found that the defenders were recognizing
-attacks because they came from the same IP space. These engineers wanted
-to use Tor to hide their tracks. First, from a technical standpoint,
-Tor does not support the variety of IP packets one would like to use in
-such attacks (see Section~\ref{subsec:tcp-vs-ip}). But aside from this,
-we also decided that it would probably be poor precedent to encourage
-such use---even legal use that improves national security---and managed
-to dissuade them.
-
-%% "outside of academia, jap has just lost, permanently". (That is,
-%% even though the crime detection issues are resolved and are unlikely
-%% to go down the same way again, public perception has not been kind.)
-
-\subsection{Sustainability and incentives}
-One of the unsolved problems in low-latency anonymity designs is
-how to keep the nodes running. ZKS's Freedom network
-depended on paying third parties to run its servers; the JAP project's
-bandwidth depends on grants to pay for its bandwidth and
-administrative expenses. In Tor, bandwidth and administrative costs are
-distributed across the volunteers who run Tor nodes, so we at least have
-reason to think that the Tor network could survive without continued research
-funding.\footnote{It also helps that Tor is implemented with free and open
- source software that can be maintained by anybody with the ability and
- inclination.} But why are these volunteers running nodes, and what can we
-do to encourage more volunteers to do so?
-
-We have not formally surveyed Tor node operators to learn why they are
-running nodes, but
-from the information they have provided, it seems that many of them run Tor
-nodes for reasons of personal interest in privacy issues. It is possible
-that others are running Tor nodes to protect their own
-anonymity, but of course they are
-hardly likely to tell us specifics if they are.
-%Significantly, Tor's threat model changes the anonymity incentives for running
-%a node. In a high-latency mix network, users can receive additional
-%anonymity by running their own node, since doing so obscures when they are
-%injecting messages into the network. But, anybody observing all I/O to a Tor
-%node can tell when the node is generating traffic that corresponds to
-%none of its incoming traffic.
-%
-%I didn't buy the above for reason's subtle enough that I just cut it -PFS
-Tor exit node operators do attain a degree of
-``deniability'' for traffic that originates at that exit node. For
- example, it is likely in practice that HTTP requests from a Tor node's IP
- will be assumed to be from the Tor network.
- More significantly, people and organizations who use Tor for
- anonymity depend on the
- continued existence of the Tor network to do so; running a node helps to
- keep the network operational.
-%\item Local Tor entry and exit nodes allow users on a network to run in an
-% `enclave' configuration. [XXXX need to resolve this. They would do this
-% for E2E encryption + auth?]
-
-
-%We must try to make the costs of running a Tor node easily minimized.
-Since Tor is run by volunteers, the most crucial software usability issue is
-usability by operators: when an operator leaves, the network becomes less
-usable by everybody. To keep operators pleased, we must try to keep Tor's
-resource and administrative demands as low as possible.
-
-Because of ISP billing structures, many Tor operators have underused capacity
-that they are willing to donate to the network, at no additional monetary
-cost to them. Features to limit bandwidth have been essential to adoption.
-Also useful has been a ``hibernation'' feature that allows a Tor node that
-wants to provide high bandwidth, but no more than a certain amount in a
-giving billing cycle, to become dormant once its bandwidth is exhausted, and
-to reawaken at a random offset into the next billing cycle. This feature has
-interesting policy implications, however; see
-the next section below.
-Exit policies help to limit administrative costs by limiting the frequency of
-abuse complaints (see Section~\ref{subsec:tor-and-blacklists}). We discuss
-technical incentive mechanisms in Section~\ref{subsec:incentives-by-design}.
-
-%[XXXX say more. Why else would you run a node? What else can we do/do we
-% already do to make running a node more attractive?]
-%[We can enforce incentives; see Section 6.1. We can rate-limit clients.
-% We can put "top bandwidth nodes lists" up a la seti@home.]
-
-\subsection{Bandwidth and file-sharing}
-\label{subsec:bandwidth-and-file-sharing}
-%One potentially problematical area with deploying Tor has been our response
-%to file-sharing applications.
-Once users have configured their applications to work with Tor, the largest
-remaining usability issue is performance. Users begin to suffer
-when websites ``feel slow.''
-Clients currently try to build their connections through nodes that they
-guess will have enough bandwidth. But even if capacity is allocated
-optimally, it seems unlikely that the current network architecture will have
-enough capacity to provide every user with as much bandwidth as she would
-receive if she weren't using Tor, unless far more nodes join the network.
-
-%Limited capacity does not destroy the network, however. Instead, usage tends
-%towards an equilibrium: when performance suffers, users who value performance
-%over anonymity tend to leave the system, thus freeing capacity until the
-%remaining users on the network are exactly those willing to use that capacity
-%there is.
-
-Much of Tor's recent bandwidth difficulties have come from file-sharing
-applications. These applications provide two challenges to
-any anonymizing network: their intensive bandwidth requirement, and the
-degree to which they are associated (correctly or not) with copyright
-infringement.
-
-High-bandwidth protocols can make the network unresponsive,
-but tend to be somewhat self-correcting as lack of bandwidth drives away
-users who need it. Issues of copyright violation,
-however, are more interesting. Typical exit node operators want to help
-people achieve private and anonymous speech, not to help people (say) host
-Vin Diesel movies for download; and typical ISPs would rather not
-deal with customers who draw menacing letters
-from the MPAA\@. While it is quite likely that the operators are doing nothing
-illegal, many ISPs have policies of dropping users who get repeated legal
-threats regardless of the merits of those threats, and many operators would
-prefer to avoid receiving even meritless legal threats.
-So when letters arrive, operators are likely to face
-pressure to block file-sharing applications entirely, in order to avoid the
-hassle.
-
-But blocking file-sharing is not easy: popular
-protocols have evolved to run on non-standard ports to
-get around other port-based bans. Thus, exit node operators who want to
-block file-sharing would have to find some way to integrate Tor with a
-protocol-aware exit filter. This could be a technically expensive
-undertaking, and one with poor prospects: it is unlikely that Tor exit nodes
-would succeed where so many institutional firewalls have failed. Another
-possibility for sensitive operators is to run a restrictive node that
-only permits exit connections to a restricted range of ports that are
-not frequently associated with file sharing. There are increasingly few such
-ports.
-
-Other possible approaches might include rate-limiting connections, especially
-long-lived connections or connections to file-sharing ports, so that
-high-bandwidth connections do not flood the network. We might also want to
-give priority to cells on low-bandwidth connections to keep them interactive,
-but this could have negative anonymity implications.
-
-For the moment, it seems that Tor's bandwidth issues have rendered it
-unattractive for bulk file-sharing traffic; this may continue to be so in the
-future. Nevertheless, Tor will likely remain attractive for limited use in
-file-sharing protocols that have separate control and data channels.
-
-%[We should say more -- but what? That we'll see a similar
-% equilibriating effect as with bandwidth, where sensitive ops switch to
-% middleman, and we become less useful for file-sharing, so the file-sharing
-% people back off, so we get more ops since there's less file-sharing, so the
-% file-sharers come back, etc.]
-
-%XXXX
-%in practice, plausible deniability is hypothetical and doesn't seem very
-%convincing. if ISPs find the activity antisocial, they don't care *why*
-%your computer is doing that behavior.
-
-\subsection{Tor and blacklists}
-\label{subsec:tor-and-blacklists}
-
-It was long expected that, alongside legitimate users, Tor would also
-attract troublemakers who exploit Tor to abuse services on the
-Internet with vandalism, rude mail, and so on.
-Our initial answer to this situation was to use ``exit policies''
-to allow individual Tor nodes to block access to specific IP/port ranges.
-This approach aims to make operators more willing to run Tor by allowing
-them to prevent their nodes from being used for abusing particular
-services. For example, all Tor nodes currently block SMTP (port 25),
-to avoid being used for spam.
-
-Exit policies are useful, but they are insufficient: if not all nodes
-block a given service, that service may try to block Tor instead.
-While being blockable is important to being good netizens, we would like
-to encourage services to allow anonymous access. Services should not
-need to decide between blocking legitimate anonymous use and allowing
-unlimited abuse.
-
-This is potentially a bigger problem than it may appear.
-On the one hand, services should be allowed to refuse connections from
-sources of possible abuse.
-But when a Tor node administrator decides whether he prefers to be able
-to post to Wikipedia from his IP address, or to allow people to read
-Wikipedia anonymously through his Tor node, he is making the decision
-for others as well. (For a while, Wikipedia
-blocked all posting from all Tor nodes based on IP addresses.) If
-the Tor node shares an address with a campus or corporate NAT,
-then the decision can prevent the entire population from posting.
-This is a loss for both Tor
-and Wikipedia: we don't want to compete for (or divvy up) the
-NAT-protected entities of the world.
-
-Worse, many IP blacklists are coarse-grained: they ignore Tor's exit
-policies, partly because it's easier to implement and partly
-so they can punish
-all Tor nodes. One IP blacklist even bans
-every class C network that contains a Tor node, and recommends banning SMTP
-from these networks even though Tor does not allow SMTP at all. This
-strategic decision aims to discourage the
-operation of anything resembling an open proxy by encouraging its neighbors
-to shut it down to get unblocked themselves. This pressure even
-affects Tor nodes running in middleman mode (disallowing all exits) when
-those nodes are blacklisted too.
-
-Problems of abuse occur mainly with services such as IRC networks and
-Wikipedia, which rely on IP blocking to ban abusive users. While at first
-blush this practice might seem to depend on the anachronistic assumption that
-each IP is an identifier for a single user, it is actually more reasonable in
-practice: it assumes that non-proxy IPs are a costly resource, and that an
-abuser can not change IPs at will. By blocking IPs which are used by Tor
-nodes, open proxies, and service abusers, these systems hope to make
-ongoing abuse difficult. Although the system is imperfect, it works
-tolerably well for them in practice.
-
-Of course, we would prefer that legitimate anonymous users be able to
-access abuse-prone services. One conceivable approach would require
-would-be IRC users, for instance, to register accounts if they want to
-access the IRC network from Tor. In practice this would not
-significantly impede abuse if creating new accounts were easily automatable;
-this is why services use IP blocking. To deter abuse, pseudonymous
-identities need to require a significant switching cost in resources or human
-time. Some popular webmail applications
-impose cost with Reverse Turing Tests, but this step may not deter all
-abusers. Freedom used blind signatures to limit
-the number of pseudonyms for each paying account, but Tor has neither the
-ability nor the desire to collect payment.
-
-We stress that as far as we can tell, most Tor uses are not
-abusive. Most services have not complained, and others are actively
-working to find ways besides banning to cope with the abuse. For example,
-the Freenode IRC network had a problem with a coordinated group of
-abusers joining channels and subtly taking over the conversation; but
-when they labelled all users coming from Tor IPs as ``anonymous users,''
-removing the ability of the abusers to blend in, the abuse stopped.
-
-%The use of squishy IP-based ``authentication'' and ``authorization''
-%has not broken down even to the level that SSNs used for these
-%purposes have in commercial and public record contexts. Externalities
-%and misplaced incentives cause a continued focus on fighting identity
-%theft by protecting SSNs rather than developing better authentication
-%and incentive schemes \cite{price-privacy}. Similarly we can expect a
-%continued use of identification by IP number as long as there is no
-%workable alternative.
-
-%[XXX Mention correct DNS-RBL implementation. -NM]
-
-\section{Design choices}
-
-In addition to social issues, Tor also faces some design trade-offs that must
-be investigated as the network develops.
-
-\subsection{Transporting the stream vs transporting the packets}
-\label{subsec:stream-vs-packet}
-\label{subsec:tcp-vs-ip}
-
-Tor transports streams; it does not tunnel packets.
-It has often been suggested that like the old Freedom
-network~\cite{freedom21-security}, Tor should
-``obviously'' anonymize IP traffic
-at the IP layer. Before this could be done, many issues need to be resolved:
-
-\begin{enumerate}
-\setlength{\itemsep}{0mm}
-\setlength{\parsep}{0mm}
-\item \emph{IP packets reveal OS characteristics.} We would still need to do
-IP-level packet normalization, to stop things like TCP fingerprinting
-attacks. %There likely exist libraries that can help with this.
-This is unlikely to be a trivial task, given the diversity and complexity of
-TCP stacks.
-\item \emph{Application-level streams still need scrubbing.} We still need
-Tor to be easy to integrate with user-level application-specific proxies
-such as Privoxy. So it's not just a matter of capturing packets and
-anonymizing them at the IP layer.
-\item \emph{Certain protocols will still leak information.} For example, we
-must rewrite DNS requests so they are delivered to an unlinkable DNS server
-rather than the DNS server at a user's ISP; thus, we must understand the
-protocols we are transporting.
-\item \emph{The crypto is unspecified.} First we need a block-level encryption
-approach that can provide security despite
-packet loss and out-of-order delivery. Freedom allegedly had one, but it was
-never publicly specified.
-Also, TLS over UDP is not yet implemented or
-specified, though some early work has begun~\cite{dtls}.
-\item \emph{We'll still need to tune network parameters.} Since the above
-encryption system will likely need sequence numbers (and maybe more) to do
-replay detection, handle duplicate frames, and so on, we will be reimplementing
-a subset of TCP anyway---a notoriously tricky path.
-\item \emph{Exit policies for arbitrary IP packets mean building a secure
-IDS\@.} Our node operators tell us that exit policies are one of
-the main reasons they're willing to run Tor.
-Adding an Intrusion Detection System to handle exit policies would
-increase the security complexity of Tor, and would likely not work anyway,
-as evidenced by the entire field of IDS and counter-IDS papers. Many
-potential abuse issues are resolved by the fact that Tor only transports
-valid TCP streams (as opposed to arbitrary IP including malformed packets
-and IP floods), so exit policies become even \emph{more} important as
-we become able to transport IP packets. We also need to compactly
-describe exit policies so clients can predict
-which nodes will allow which packets to exit.
-\item \emph{The Tor-internal name spaces would need to be redesigned.} We
-support hidden service {\tt{.onion}} addresses (and other special addresses,
-like {\tt{.exit}} which lets the user request a particular exit node),
-by intercepting the addresses when they are passed to the Tor client.
-Doing so at the IP level would require a more complex interface between
-Tor and the local DNS resolver.
-\end{enumerate}
-
-This list is discouragingly long, but being able to transport more
-protocols obviously has some advantages. It would be good to learn which
-items are actual roadblocks and which are easier to resolve than we think.
-
-To be fair, Tor's stream-based approach has run into
-stumbling blocks as well. While Tor supports the SOCKS protocol,
-which provides a standardized interface for generic TCP proxies, many
-applications do not support SOCKS\@. For them we already need to
-replace the networking system calls with SOCKS-aware
-versions, or run a SOCKS tunnel locally, neither of which is
-easy for the average user. %---even with good instructions.
-Even when applications can use SOCKS, they often make DNS requests
-themselves before handing an IP address to Tor, which advertises
-where the user is about to connect.
-We are still working on more usable solutions.
-
-%So to actually provide good anonymity, we need to make sure that
-%users have a practical way to use Tor anonymously. Possibilities include
-%writing wrappers for applications to anonymize them automatically; improving
-%the applications' support for SOCKS; writing libraries to help application
-%writers use Tor properly; and implementing a local DNS proxy to reroute DNS
-%requests to Tor so that applications can simply point their DNS resolvers at
-%localhost and continue to use SOCKS for data only.
-
-\subsection{Mid-latency}
-\label{subsec:mid-latency}
-
-Some users need to resist traffic correlation attacks. Higher-latency
-mix-networks introduce variability into message
-arrival times: as timing variance increases, timing correlation attacks
-require increasingly more data~\cite{e2e-traffic}. Can we improve Tor's
-resistance without losing too much usability?
-
-We need to learn whether we can trade a small increase in latency
-for a large anonymity increase, or if we'd end up trading a lot of
-latency for only a minimal security gain. A trade-off might be worthwhile
-even if we
-could only protect certain use cases, such as infrequent short-duration
-transactions. % To answer this question
-We might adapt the techniques of~\cite{e2e-traffic} to a lower-latency mix
-network, where the messages are batches of cells in temporally clustered
-connections. These large fixed-size batches can also help resist volume
-signature attacks~\cite{hintz-pet02}. We could also experiment with traffic
-shaping to get a good balance of throughput and security.
-%Other padding regimens might supplement the
-%mid-latency option; however, we should continue the caution with which
-%we have always approached padding lest the overhead cost us too much
-%performance or too many volunteers.
-
-We must keep usability in mind too. How much can latency increase
-before we drive users away? We've already been forced to increase
-latency slightly, as our growing network incorporates more DSL and
-cable-modem nodes and more nodes in distant continents. Perhaps we can
-harness this increased latency to improve anonymity rather than just
-reduce usability. Further, if we let clients label certain circuits as
-mid-latency as they are constructed, we could handle both types of traffic
-on the same network, giving users a choice between speed and security---and
-giving researchers a chance to experiment with parameters to improve the
-quality of those choices.
-
-\subsection{Enclaves and helper nodes}
-\label{subsec:helper-nodes}
-
-It has long been thought that users can improve their anonymity by
-running their own node~\cite{tor-design,or-ih96,or-pet00}, and using
-it in an \emph{enclave} configuration, where all their circuits begin
-at the node under their control. Running Tor clients or servers at
-the enclave perimeter is useful when policy or other requirements
-prevent individual machines within the enclave from running Tor
-clients~\cite{or-jsac98,or-discex00}.
-
-Of course, Tor's default path length of
-three is insufficient for these enclaves, since the entry and/or exit
-% [edit war: without the ``and/'' the natural reading here
-% is aut rather than vel. And the use of the plural verb does not work -pfs]
-themselves are sensitive. Tor thus increments path length by one
-for each sensitive endpoint in the circuit.
-Enclaves also help to protect against end-to-end attacks, since it's
-possible that traffic coming from the node has simply been relayed from
-elsewhere. However, if the node has recognizable behavior patterns,
-an attacker who runs nodes in the network can triangulate over time to
-gain confidence that it is in fact originating the traffic. Wright et
-al.~\cite{wright03} introduce the notion of a \emph{helper node}---a
-single fixed entry node for each user---to combat this \emph{predecessor
-attack}.
-
-However, the attack in~\cite{attack-tor-oak05} shows that simply adding
-to the path length, or using a helper node, may not protect an enclave
-node. A hostile web server can send constant interference traffic to
-all nodes in the network, and learn which nodes are involved in the
-circuit (though at least in the current attack, he can't learn their
-order). Using randomized path lengths may help some, since the attacker
-will never be certain he has identified all nodes in the path unless
-he probes the entire network, but as
-long as the network remains small this attack will still be feasible.
-
-Helper nodes also aim to help Tor clients, because choosing entry and exit
-points
-randomly and changing them frequently allows an attacker who controls
-even a few nodes to eventually link some of their destinations. The goal
-is to take the risk once and for all about choosing a bad entry node,
-rather than taking a new risk for each new circuit. (Choosing fixed
-exit nodes is less useful, since even an honest exit node still doesn't
-protect against a hostile website.) But obstacles remain before
-we can implement helper nodes.
-For one, the literature does not describe how to choose helpers from a list
-of nodes that changes over time. If Alice is forced to choose a new entry
-helper every $d$ days and $c$ of the $n$ nodes are bad, she can expect
-to choose a compromised node around
-every $dc/n$ days. Statistically over time this approach only helps
-if she is better at choosing honest helper nodes than at choosing
-honest nodes. Worse, an attacker with the ability to DoS nodes could
-force users to switch helper nodes more frequently, or remove
-other candidate helpers.
-
-%Do general DoS attacks have anonymity implications? See e.g. Adam
-%Back's IH paper, but I think there's more to be pointed out here. -RD
-% Not sure what you want to say here. -NM
-
-%Game theory for helper nodes: if Alice offers a hidden service on a
-%server (enclave model), and nobody ever uses helper nodes, then against
-%George+Steven's attack she's totally nailed. If only Alice uses a helper
-%node, then she's still identified as the source of the data. If everybody
-%uses a helper node (including Alice), then the attack identifies the
-%helper node and also Alice, and knows which one is which. If everybody
-%uses a helper node (but not Alice), then the attacker figures the real
-%source was a client that is using Alice as a helper node. [How's my
-%logic here?] -RD
-%
-% Not sure about the logic. For the attack to work with helper nodes, the
-%attacker needs to guess that Alice is running the hidden service, right?
-%Otherwise, how can he know to measure her traffic specifically? -NM
-%
-% In the Murdoch-Danezis attack, the adversary measures all servers. -RD
-
-%point to routing-zones section re: helper nodes to defend against
-%big stuff.
-
-\subsection{Location-hidden services}
-\label{subsec:hidden-services}
-
-% This section is first up against the wall when the revolution comes.
-
-Tor's \emph{rendezvous points}
-let users provide TCP services to other Tor users without revealing
-the service's location. Since this feature is relatively recent, we describe
-here
-a couple of our early observations from its deployment.
-
-First, our implementation of hidden services seems less hidden than we'd
-like, since they build a different rendezvous circuit for each user,
-and an external adversary can induce them to
-produce traffic. This insecurity means that they may not be suitable as
-a building block for Free Haven~\cite{freehaven-berk} or other anonymous
-publishing systems that aim to provide long-term security, though helper
-nodes, as discussed above, would seem to help.
-
-\emph{Hot-swap} hidden services, where more than one location can
-provide the service and loss of any one location does not imply a
-change in service, would help foil intersection and observation attacks
-where an adversary monitors availability of a hidden service and also
-monitors whether certain users or servers are online. The design
-challenges in providing such services without otherwise compromising
-the hidden service's anonymity remain an open problem;
-however, see~\cite{move-ndss05}.
-
-In practice, hidden services are used for more than just providing private
-access to a web server or IRC server. People are using hidden services
-as a poor man's VPN and firewall-buster. Many people want to be able
-to connect to the computers in their private network via secure shell,
-and rather than playing with dyndns and trying to pierce holes in their
-firewall, they run a hidden service on the inside and then rendezvous
-with that hidden service externally.
-
-News sites like Bloggers Without Borders (www.b19s.org) are advertising
-a hidden-service address on their front page. Doing this can provide
-increased robustness if they use the dual-IP approach we describe
-in~\cite{tor-design},
-but in practice they do it to increase visibility
-of the Tor project and their support for privacy, and to offer
-a way for their users, using unmodified software, to get end-to-end
-encryption and authentication to their website.
-
-\subsection{Location diversity and ISP-class adversaries}
-\label{subsec:routing-zones}
-
-Anonymity networks have long relied on diversity of node location for
-protection against attacks---typically an adversary who can observe a
-larger fraction of the network can launch a more effective attack. One
-way to achieve dispersal involves growing the network so a given adversary
-sees less. Alternately, we can arrange the topology so traffic can enter
-or exit at many places (for example, by using a free-route network
-like Tor rather than a cascade network like JAP). Lastly, we can use
-distributed trust to spread each transaction over multiple jurisdictions.
-But how do we decide whether two nodes are in related locations?
-
-Feamster and Dingledine defined a \emph{location diversity} metric
-in~\cite{feamster:wpes2004}, and began investigating a variant of location
-diversity based on the fact that the Internet is divided into thousands of
-independently operated networks called {\em autonomous systems} (ASes).
-The key insight from their paper is that while we typically think of a
-connection as going directly from the Tor client to the first Tor node,
-actually it traverses many different ASes on each hop. An adversary at
-any of these ASes can monitor or influence traffic. Specifically, given
-plausible initiators and recipients, and given random path selection,
-some ASes in the simulation were able to observe 10\% to 30\% of the
-transactions (that is, learn both the origin and the destination) on
-the deployed Tor network (33 nodes as of June 2004).
-
-The paper concludes that for best protection against the AS-level
-adversary, nodes should be in ASes that have the most links to other ASes:
-Tier-1 ISPs such as AT\&T and Abovenet. Further, a given transaction
-is safest when it starts or ends in a Tier-1 ISP\@. Therefore, assuming
-initiator and responder are both in the U.S., it actually \emph{hurts}
-our location diversity to use far-flung nodes in
-continents like Asia or South America.
-% it's not just entering or exiting from them. using them as the middle
-% hop reduces your effective path length, which you presumably don't
-% want because you chose that path length for a reason.
-%
-% Not sure I buy that argument. Two end nodes in the right ASs to
-% discourage linking are still not known to each other. If some
-% adversary in a single AS can bridge the middle node, it shouldn't
-% therefore be able to identify initiator or responder; although it could
-% contribute to further attacks given more assumptions.
-% Nonetheless, no change to the actual text for now.
-
-Many open questions remain. First, it will be an immense engineering
-challenge to get an entire BGP routing table to each Tor client, or to
-summarize it sufficiently. Without a local copy, clients won't be
-able to safely predict what ASes will be traversed on the various paths
-through the Tor network to the final destination. Tarzan~\cite{tarzan:ccs02}
-and MorphMix~\cite{morphmix:fc04} suggest that we compare IP prefixes to
-determine location diversity; but the above paper showed that in practice
-many of the Mixmaster nodes that share a single AS have entirely different
-IP prefixes. When the network has scaled to thousands of nodes, does IP
-prefix comparison become a more useful approximation? % Alternatively, can
-%relevant parts of the routing tables be summarized centrally and delivered to
-%clients in a less verbose format?
-%% i already said "or to summarize is sufficiently" above. is that not
-%% enough? -RD
-%
-Second, we can take advantage of caching certain content at the
-exit nodes, to limit the number of requests that need to leave the
-network at all. What about taking advantage of caches like Akamai or
-Google~\cite{shsm03}? (Note that they're also well-positioned as global
-adversaries.)
-%
-Third, if we follow the recommendations in~\cite{feamster:wpes2004}
- and tailor path selection
-to avoid choosing endpoints in similar locations, how much are we hurting
-anonymity against larger real-world adversaries who can take advantage
-of knowing our algorithm?
-%
-Fourth, can we use this knowledge to figure out which gaps in our network
-most affect our robustness to this class of attack, and go recruit
-new nodes with those ASes in mind?
-
-%Tor's security relies in large part on the dispersal properties of its
-%network. We need to be more aware of the anonymity properties of various
-%approaches so we can make better design decisions in the future.
-
-\subsection{The Anti-censorship problem}
-\label{subsec:china}
-
-Citizens in a variety of countries, such as most recently China and
-Iran, are blocked from accessing various sites outside
-their country. These users try to find any tools available to allow
-them to get around these firewalls. Some anonymity networks, such as
-Six-Four~\cite{six-four}, are designed specifically with this goal in
-mind; others like the Anonymizer~\cite{anonymizer} are paid by sponsors
-such as Voice of America to encourage Internet
-freedom. Even though Tor wasn't
-designed with ubiquitous access to the network in mind, thousands of
-users across the world are now using it for exactly this purpose.
-% Academic and NGO organizations, peacefire, \cite{berkman}, etc
-
-Anti-censorship networks hoping to bridge country-level blocks face
-a variety of challenges. One of these is that they need to find enough
-exit nodes---servers on the `free' side that are willing to relay
-traffic from users to their final destinations. Anonymizing
-networks like Tor are well-suited to this task since we have
-already gathered a set of exit nodes that are willing to tolerate some
-political heat.
-
-The other main challenge is to distribute a list of reachable relays
-to the users inside the country, and give them software to use those relays,
-without letting the censors also enumerate this list and block each
-relay. Anonymizer solves this by buying lots of seemingly-unrelated IP
-addresses (or having them donated), abandoning old addresses as they are
-`used up,' and telling a few users about the new ones. Distributed
-anonymizing networks again have an advantage here, in that we already
-have tens of thousands of separate IP addresses whose users might
-volunteer to provide this service since they've already installed and use
-the software for their own privacy~\cite{koepsell:wpes2004}. Because
-the Tor protocol separates routing from network discovery \cite{tor-design},
-volunteers could configure their Tor clients
-to generate node descriptors and send them to a special directory
-server that gives them out to dissidents who need to get around blocks.
-
-Of course, this still doesn't prevent the adversary
-from enumerating and preemptively blocking the volunteer relays.
-Perhaps a tiered-trust system could be built where a few individuals are
-given relays' locations. They could then recommend other individuals
-by telling them
-those addresses, thus providing a built-in incentive to avoid letting the
-adversary intercept them. Max-flow trust algorithms~\cite{advogato}
-might help to bound the number of IP addresses leaked to the adversary. Groups
-like the W3C are looking into using Tor as a component in an overall system to
-help address censorship; we wish them success.
-
-%\cite{infranet}
-
-\section{Scaling}
-\label{sec:scaling}
-
-Tor is running today with hundreds of nodes and tens of thousands of
-users, but it will certainly not scale to millions.
-Scaling Tor involves four main challenges. First, to get a
-large set of nodes, we must address incentives for
-users to carry traffic for others. Next is safe node discovery, both
-while bootstrapping (Tor clients must robustly find an initial
-node list) and later (Tor clients must learn about a fair sample
-of honest nodes and not let the adversary control circuits).
-We must also detect and handle node speed and reliability as the network
-becomes increasingly heterogeneous: since the speed and reliability
-of a circuit is limited by its worst link, we must learn to track and
-predict performance. Finally, we must stop assuming that all points on
-the network can connect to all other points.
-
-\subsection{Incentives by Design}
-\label{subsec:incentives-by-design}
-
-There are three behaviors we need to encourage for each Tor node: relaying
-traffic; providing good throughput and reliability while doing it;
-and allowing traffic to exit the network from that node.
-
-We encourage these behaviors through \emph{indirect} incentives: that
-is, by designing the system and educating users in such a way that users
-with certain goals will choose to relay traffic. One
-main incentive for running a Tor node is social: volunteers
-altruistically donate their bandwidth and time. We encourage this with
-public rankings of the throughput and reliability of nodes, much like
-seti@home. We further explain to users that they can get
-deniability for any traffic emerging from the same address as a Tor
-exit node, and they can use their own Tor node
-as an entry or exit point with confidence that it's not run by an adversary.
-Further, users may run a node simply because they need such a network
-to be persistently available and usable, and the value of supporting this
-exceeds any countervening costs.
-Finally, we can encourage operators by improving the usability and feature
-set of the software:
-rate limiting support and easy packaging decrease the hassle of
-maintaining a node, and our configurable exit policies allow each
-operator to advertise a policy describing the hosts and ports to which
-he feels comfortable connecting.
-
-To date these incentives appear to have been adequate. As the system scales
-or as new issues emerge, however, we may also need to provide
- \emph{direct} incentives:
-providing payment or other resources in return for high-quality service.
-Paying actual money is problematic: decentralized e-cash systems are
-not yet practical, and a centralized collection system not only reduces
-robustness, but also has failed in the past (the history of commercial
-anonymizing networks is littered with failed attempts). A more promising
-option is to use a tit-for-tat incentive scheme, where nodes provide better
-service to nodes that have provided good service for them.
-
-Unfortunately, such an approach introduces new anonymity problems.
-There are many surprising ways for nodes to game the incentive and
-reputation system to undermine anonymity---such systems are typically
-designed to encourage fairness in storage or bandwidth usage, not
-fairness of provided anonymity. An adversary can attract more traffic
-by performing well or can target individual users by selectively
-performing, to undermine their anonymity. Typically a user who
-chooses evenly from all nodes is most resistant to an adversary
-targeting him, but that approach hampers the efficient use
-of heterogeneous nodes.
-
-%When a node (call him Steve) performs well for Alice, does Steve gain
-%reputation with the entire system, or just with Alice? If the entire
-%system, how does Alice tell everybody about her experience in a way that
-%prevents her from lying about it yet still protects her identity? If
-%Steve's behavior only affects Alice's behavior, does this allow Steve to
-%selectively perform only for Alice, and then break her anonymity later
-%when somebody (presumably Alice) routes through his node?
-
-A possible solution is a simplified approach to the tit-for-tat
-incentive scheme based on two rules: (1) each node should measure the
-service it receives from adjacent nodes, and provide service relative
-to the received service, but (2) when a node is making decisions that
-affect its own security (such as building a circuit for its own
-application connections), it should choose evenly from a sufficiently
-large set of nodes that meet some minimum service
-threshold~\cite{casc-rep}. This approach allows us to discourage
-bad service
-without opening Alice up as much to attacks. All of this requires
-further study.
-
-\subsection{Trust and discovery}
-\label{subsec:trust-and-discovery}
-
-The published Tor design is deliberately simplistic in how
-new nodes are authorized and how clients are informed about Tor
-nodes and their status.
-All nodes periodically upload a signed description
-of their locations, keys, and capabilities to each of several well-known {\it
- directory servers}. These directory servers construct a signed summary
-of all known Tor nodes (a ``directory''), and a signed statement of which
-nodes they
-believe to be operational then (a ``network status''). Clients
-periodically download a directory to learn the latest nodes and
-keys, and more frequently download a network status to learn which nodes are
-likely to be running. Tor nodes also operate as directory caches, to
-lighten the bandwidth on the directory servers.
-
-To prevent Sybil attacks (wherein an adversary signs up many
-purportedly independent nodes to increase her network view),
-this design
-requires the directory server operators to manually
-approve new nodes. Unapproved nodes are included in the directory,
-but clients
-do not use them at the start or end of their circuits. In practice,
-directory administrators perform little actual verification, and tend to
-approve any Tor node whose operator can compose a coherent email.
-This procedure
-may prevent trivial automated Sybil attacks, but will do little
-against a clever and determined attacker.
-
-There are a number of flaws in this system that need to be addressed as we
-move forward. First,
-each directory server represents an independent point of failure: any
-compromised directory server could start recommending only compromised
-nodes.
-Second, as more nodes join the network, %the more unreasonable it
-%becomes to expect clients to know about them all.
-directories
-become infeasibly large, and downloading the list of nodes becomes
-burdensome.
-Third, the validation scheme may do as much harm as it does good. It
-does not prevent clever attackers from mounting Sybil attacks,
-and it may deter node operators from joining the network---if
-they expect the validation process to be difficult, or they do not share
-any languages in common with the directory server operators.
-
-We could try to move the system in several directions, depending on our
-choice of threat model and requirements. If we did not need to increase
-network capacity to support more users, we could simply
- adopt even stricter validation requirements, and reduce the number of
-nodes in the network to a trusted minimum.
-But, we can only do that if we can simultaneously make node capacity
-scale much more than we anticipate to be feasible soon, and if we can find
-entities willing to run such nodes, an equally daunting prospect.
-
-In order to address the first two issues, it seems wise to move to a system
-including a number of semi-trusted directory servers, no one of which can
-compromise a user on its own. Ultimately, of course, we cannot escape the
-problem of a first introducer: since most users will run Tor in whatever
-configuration the software ships with, the Tor distribution itself will
-remain a single point of failure so long as it includes the seed
-keys for directory servers, a list of directory servers, or any other means
-to learn which nodes are on the network. But omitting this information
-from the Tor distribution would only delegate the trust problem to each
-individual user. %, most of whom are presumably less informed about how to make
-%trust decisions than the Tor developers.
-A well publicized, widely available, authoritatively and independently
-endorsed and signed list of initial directory servers and their keys
-is a possible solution. But, setting that up properly is itself a large
-bootstrapping task.
-
-%Network discovery, sybil, node admission, scaling. It seems that the code
-%will ship with something and that's our trust root. We could try to get
-%people to build a web of trust, but no. Where we go from here depends
-%on what threats we have in mind. Really decentralized if your threat is
-%RIAA; less so if threat is to application data or individuals or...
-
-\subsection{Measuring performance and capacity}
-\label{subsec:performance}
-
-One of the paradoxes with engineering an anonymity network is that we'd like
-to learn as much as we can about how traffic flows so we can improve the
-network, but we want to prevent others from learning how traffic flows in
-order to trace users' connections through the network. Furthermore, many
-mechanisms that help Tor run efficiently
-require measurements about the network.
-
-Currently, nodes try to deduce their own available bandwidth (based on how
-much traffic they have been able to transfer recently) and include this
-information in the descriptors they upload to the directory. Clients
-choose servers weighted by their bandwidth, neglecting really slow
-servers and capping the influence of really fast ones.
-%
-This is, of course, eminently cheatable. A malicious node can get a
-disproportionate amount of traffic simply by claiming to have more bandwidth
-than it does. But better mechanisms have their problems. If bandwidth data
-is to be measured rather than self-reported, it is usually possible for
-nodes to selectively provide better service for the measuring party, or
-sabotage the measured value of other nodes. Complex solutions for
-mix networks have been proposed, but do not address the issues
-completely~\cite{mix-acc,casc-rep}.
-
-Even with no cheating, network measurement is complex. It is common
-for views of a node's latency and/or bandwidth to vary wildly between
-observers. Further, it is unclear whether total bandwidth is really
-the right measure; perhaps clients should instead be considering nodes
-based on unused bandwidth or observed throughput.
-%How to measure performance without letting people selectively deny service
-%by distinguishing pings. Heck, just how to measure performance at all. In
-%practice people have funny firewalls that don't match up to their exit
-%policies and Tor doesn't deal.
-%
-%Network investigation: Is all this bandwidth publishing thing a good idea?
-%How can we collect stats better? Note weasel's smokeping, at
-%http://seppia.noreply.org/cgi-bin/smokeping.cgi?target=Tor
-%which probably gives george and steven enough info to break tor?
-%
-And even if we can collect and use this network information effectively,
-we must ensure
-that it is not more useful to attackers than to us. While it
-seems plausible that bandwidth data alone is not enough to reveal
-sender-recipient connections under most circumstances, it could certainly
-reveal the path taken by large traffic flows under low-usage circumstances.
-
-\subsection{Non-clique topologies}
-
-Tor's comparatively weak threat model may allow easier scaling than
-other
-designs. High-latency mix networks need to avoid partitioning attacks, where
-network splits let an attacker distinguish users in different partitions.
-Since Tor assumes the adversary cannot cheaply observe nodes at will,
-a network split may not decrease protection much.
-Thus, one option when the scale of a Tor network
-exceeds some size is simply to split it. Nodes could be allocated into
-partitions while hampering collaborating hostile nodes from taking over
-a single partition~\cite{casc-rep}.
-Clients could switch between
-networks, even on a per-circuit basis.
-%Future analysis may uncover
-%other dangers beyond those affecting mix-nets.
-
-More conservatively, we can try to scale a single Tor network. Likely
-problems with adding more servers to a single Tor network include an
-explosion in the number of sockets needed on each server as more servers
-join, and increased coordination overhead to keep each users' view of
-the network consistent. As we grow, we will also have more instances of
-servers that can't reach each other simply due to Internet topology or
-routing problems.
-
-%include restricting the number of sockets and the amount of bandwidth
-%used by each node. The number of sockets is determined by the network's
-%connectivity and the number of users, while bandwidth capacity is determined
-%by the total bandwidth of nodes on the network. The simplest solution to
-%bandwidth capacity is to add more nodes, since adding a Tor node of any
-%feasible bandwidth will increase the traffic capacity of the network. So as
-%a first step to scaling, we should focus on making the network tolerate more
-%nodes, by reducing the interconnectivity of the nodes; later we can reduce
-%overhead associated with directories, discovery, and so on.
-
-We can address these points by reducing the network's connectivity.
-Danezis~\cite{danezis:pet2003} considers
-the anonymity implications of restricting routes on mix networks and
-recommends an approach based on expander graphs (where any subgraph is likely
-to have many neighbors). It is not immediately clear that this approach will
-extend to Tor, which has a weaker threat model but higher performance
-requirements: instead of analyzing the
-probability of an attacker's viewing whole paths, we will need to examine the
-attacker's likelihood of compromising the endpoints.
-%
-Tor may not need an expander graph per se: it
-may be enough to have a single central subnet that is highly connected, like
-an Internet backbone. % As an
-%example, assume fifty nodes of relatively high traffic capacity. This
-%\emph{center} forms a clique. Assume each center node can
-%handle 200 connections to other nodes (including the other ones in the
-%center). Assume every noncenter node connects to three nodes in the
-%center and anyone out of the center that they want to. Then the
-%network easily scales to c. 2500 nodes with commensurate increase in
-%bandwidth.
-There are many open questions: how to distribute connectivity information
-(presumably nodes will learn about the central nodes
-when they download Tor), whether central nodes
-will need to function as a `backbone', and so on. As above,
-this could reduce the amount of anonymity available from a mix-net,
-but for a low-latency network where anonymity derives largely from
-the edges, it may be feasible.
-
-%In a sense, Tor already has a non-clique topology.
-%Individuals can set up and run Tor nodes without informing the
-%directory servers. This allows groups to run a
-%local Tor network of private nodes that connects to the public Tor
-%network. This network is hidden behind the Tor network, and its
-%only visible connection to Tor is at those points where it connects.
-%As far as the public network, or anyone observing it, is concerned,
-%they are running clients.
-
-\section{The Future}
-\label{sec:conclusion}
-
-Tor is the largest and most diverse low-latency anonymity network
-available, but we are still in the beginning stages of deployment. Several
-major questions remain.
-
-First, will our volunteer-based approach to sustainability work in the
-long term? As we add more features and destabilize the network, the
-developers spend a lot of time keeping the server operators happy. Even
-though Tor is free software, the network would likely stagnate and die at
-this stage if the developers stopped actively working on it. We may get
-an unexpected boon from the fact that we're a general-purpose overlay
-network: as Tor grows more popular, other groups who need an overlay
-network on the Internet are starting to adapt Tor to their needs.
-%
-Second, Tor is only one of many components that preserve privacy online.
-For applications where it is desirable to
-keep identifying information out of application traffic, someone must build
-more and better protocol-aware proxies that are usable by ordinary people.
-%
-Third, we need to gain a reputation for social good, and learn how to
-coexist with the variety of Internet services and their established
-authentication mechanisms. We can't just keep escalating the blacklist
-standoff forever.
-%
-Fourth, the current Tor
-architecture does not scale even to handle current user demand. We must
-find designs and incentives to let some clients relay traffic too, without
-sacrificing too much anonymity.
-
-These are difficult and open questions. Yet choosing not to solve them
-means leaving most users to a less secure network or no anonymizing
-network at all.
-
-\bibliographystyle{plain} \bibliography{tor-design}
-
-\clearpage
-\appendix
-
-\begin{figure}[t]
-%\unitlength=1in
-\centering
-%\begin{picture}(6.0,2.0)
-%\put(3,1){\makebox(0,0)[c]{\epsfig{figure=graphnodes,width=6in}}}
-%\end{picture}
-\mbox{\epsfig{figure=graphnodes,width=5in}}
-\caption{Number of Tor nodes over time, through January 2005. Lowest
-line is number of exit
-nodes that allow connections to port 80. Middle line is total number of
-verified (registered) Tor nodes. The line above that represents nodes
-that are running but not yet registered.}
-\label{fig:graphnodes}
-\end{figure}
-
-\begin{figure}[t]
-\centering
-\mbox{\epsfig{figure=graphtraffic,width=5in}}
-\caption{The sum of traffic reported by each node over time, through
-January 2005. The bottom
-pair show average throughput, and the top pair represent the largest 15
-minute burst in each 4 hour period.}
-\label{fig:graphtraffic}
-\end{figure}
-
-\end{document}
-
-%Making use of nodes with little bandwidth, or high latency/packet loss.
-
-%Running Tor nodes behind NATs, behind great-firewalls-of-China, etc.
-%Restricted routes. How to propagate to everybody the topology? BGP
-%style doesn't work because we don't want just *one* path. Point to
-%Geoff's stuff.
-
diff --git a/doc/design-paper/challenges2.tex b/doc/design-paper/challenges2.tex
deleted file mode 100644
index a39b66cf7d..0000000000
--- a/doc/design-paper/challenges2.tex
+++ /dev/null
@@ -1,1612 +0,0 @@
-\documentclass{llncs}
-
-\usepackage{url}
-\usepackage{amsmath}
-\usepackage{epsfig}
-
-\setlength{\textwidth}{5.9in}
-\setlength{\textheight}{8.4in}
-\setlength{\topmargin}{.5cm}
-\setlength{\oddsidemargin}{1cm}
-\setlength{\evensidemargin}{1cm}
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-
-
-\newcommand{\workingnote}[1]{} % The version that hides the note.
-%\newcommand{\workingnote}[1]{(**#1)} % The version that makes the note visible.
-
-
-\begin{document}
-
-\title{Design challenges and social factors in deploying low-latency anonymity}
-
-\author{Roger Dingledine\inst{1} \and
-Nick Mathewson\inst{1} \and
-Paul Syverson\inst{2}}
-\institute{The Free Haven Project \email{<\{arma,nickm\}@freehaven.net>} \and
-Naval Research Laboratory \email{<syverson@itd.nrl.navy.mil>}}
-
-\maketitle
-\pagestyle{plain}
-
-\begin{abstract}
- There are many unexpected or unexpectedly difficult obstacles to
- deploying anonymous communications. We describe the design
- philosophy of Tor (the third-generation onion routing network), and,
- drawing on our experiences deploying Tor, we describe social
- challenges and related technical issues that must be faced in
- building, deploying, and sustaining a scalable, distributed,
- low-latency anonymity network.
-\end{abstract}
-
-\section{Introduction}
-% Your network is not practical unless it is sustainable and distributed.
-Anonymous communication is full of surprises. This article describes
-Tor, a low-latency general-purpose anonymous communication system, and
-discusses some unexpected challenges arising from our experiences
-deploying Tor. We will discuss
-some of the difficulties we have experienced and how we have met them (or how
-we plan to meet them, if we know).
-% We also discuss some less
-% troublesome open problems that we must nevertheless eventually address.
-%We will describe both those future challenges that we intend to explore and
-%those that we have decided not to explore and why.
-
-Tor is an overlay network for anonymizing TCP streams over the
-Internet~\cite{tor-design}. It addresses limitations in earlier Onion
-Routing designs~\cite{or-ih96,or-jsac98,or-discex00,or-pet00} by adding
-perfect forward secrecy, congestion control, directory servers, data
-integrity,
-%configurable exit policies, Huh? That was part of the gen. 1 design -PFS
-and a revised design for location-hidden services using
-rendezvous points. Tor works on the real-world Internet, requires no special
-privileges or kernel modifications, requires little synchronization or
-coordination between nodes, and provides a reasonable trade-off between
-anonymity, usability, and efficiency.
-
-We deployed the public Tor network in October 2003; since then it has
-grown to over nine hundred volunteer-operated nodes worldwide
-and over 100 megabytes average traffic per second from hundreds of
-thousands of concurrent users.
-Tor's research strategy has focused on deploying
-a network to as many users as possible; thus, we have resisted designs that
-would compromise deployability by imposing high resource demands on node
-operators, and designs that would compromise usability by imposing
-unacceptable restrictions on which applications we support. Although this
-strategy has drawbacks (including a weakened threat model, as
-discussed below), it has made it possible for Tor to serve many
-hundreds of thousands of users and attract funding from diverse
-sources whose goals range from security on a national scale down to
-individual liberties.
-
-In~\cite{tor-design} we gave an overall view of Tor's design and
-goals. Here we review that design at a higher level and describe
-some policy and social issues that we face as
-we continue deployment. Though we will discuss technical responses to
-these, we do not in this article discuss purely technical challenges
-facing Tor (e.g., transport protocol, resource scaling issues, moving
-to non-clique topologies, performance, etc.), nor do we even cover
-all of the social issues: we simply touch on some of the most salient of these.
-Also, rather than providing complete solutions to every problem, we
-instead lay out the challenges and constraints that we have observed while
-deploying Tor. In doing so, we aim to provide a research agenda
-of general interest to projects attempting to build
-and deploy practical, usable anonymity networks in the wild.
-
-%While the Tor design paper~\cite{tor-design} gives an overall view its
-%design and goals,
-%this paper describes the policy and technical issues that Tor faces as
-%we continue deployment. Rather than trying to provide complete solutions
-%to every problem here, we lay out the assumptions and constraints
-%that we have observed through deploying Tor in the wild. In doing so, we
-%aim to create a research agenda for others to
-%help in addressing these issues.
-% Section~\ref{sec:what-is-tor} gives an
-%overview of the Tor
-%design and ours goals. Sections~\ref{sec:crossroads-policy}
-%and~\ref{sec:crossroads-design} go on to describe the practical challenges,
-%both policy and technical respectively,
-%that stand in the way of moving
-%from a practical useful network to a practical useful anonymous network.
-
-%\section{What Is Tor}
-\section{Background}
-Here we give a basic overview of the Tor design and its properties, and
-compare Tor to other low-latency anonymity designs.
-
-\subsection{Tor, threat models, and distributed trust}
-\label{sec:what-is-tor}
-
-%Here we give a basic overview of the Tor design and its properties. For
-%details on the design, assumptions, and security arguments, we refer
-%the reader to the Tor design paper~\cite{tor-design}.
-
-Tor provides \emph{forward privacy}, so that users can connect to
-Internet sites without revealing their logical or physical locations
-to those sites or to observers. It also provides \emph{location-hidden
-services}, so that servers can support authorized users without
-giving an effective vector for physical or online attackers.
-Tor provides these protections even when a portion of its
-infrastructure is compromised.
-
-To connect to a remote server via Tor, the client software learns a signed
-list of Tor nodes from one of several central \emph{directory servers}, and
-incrementally creates a private pathway or \emph{circuit} of encrypted
-connections through authenticated Tor nodes on the network, negotiating a
-separate set of encryption keys for each hop along the circuit. The circuit
-is extended one node at a time, and each node along the way knows only the
-immediately previous and following nodes in the circuit, so no individual Tor
-node knows the complete path that each fixed-sized data packet (or
-\emph{cell}) will take.
-%Because each node sees no more than one hop in the
-%circuit,
-Thus, neither an eavesdropper nor a compromised node can
-see both the connection's source and destination. Later requests use a new
-circuit, to complicate long-term linkability between different actions by
-a single user.
-
-%Tor also helps servers hide their locations while
-%providing services such as web publishing or instant
-%messaging. Using ``rendezvous points'', other Tor users can
-%connect to these authenticated hidden services, neither one learning the
-%other's network identity.
-
-Tor attempts to anonymize the transport layer, not the application layer.
-This approach is useful for applications such as SSH
-where authenticated communication is desired. However, when anonymity from
-those with whom we communicate is desired,
-application protocols that include personally identifying information need
-additional application-level scrubbing proxies, such as
-Privoxy~\cite{privoxy} for HTTP\@. Furthermore, Tor does not relay arbitrary
-IP packets; it only anonymizes TCP streams and DNS requests.
-%, and only supports
-%connections via SOCKS
-%(but see Section~\ref{subsec:tcp-vs-ip}).
-
-%Most node operators do not want to allow arbitrary TCP traffic. % to leave
-%their server.
-%To address this, Tor provides \emph{exit policies} so
-%each exit node can block the IP addresses and ports it is unwilling to allow.
-%Tor nodes advertise their exit policies to the directory servers, so that
-%client can tell which nodes will support their connections.
-%
-%***Covered in 3.4*** Matt Edman via -PFS
-%
-%As of this writing, the Tor network has grown to around nine hundred nodes
-%on four continents, with a total average load exceeding 100 MB/s and
-%a total capacity exceeding %1Gbit/s.
-%\\***What's the current capacity? -PFS***\\
-%
-%***Covered in intro*** Matt Edman via -PFS
-%
-%Appendix A
-%shows a graph of the number of working nodes over time, as well as a
-%graph of the number of bytes being handled by the network over time.
-%The network is now sufficiently diverse for further development
-%and testing; but of course we always encourage new nodes
-%to join.
-
-Building from earlier versions of onion routing developed at NRL,
-Tor was researched and developed by NRL and FreeHaven under
-funding by ONR and DARPA for use in securing government
-communications. Continuing development and deployment has also been
-funded by the Omidyar Network, the Electronic Frontier Foundation for use
-in maintaining civil liberties for ordinary citizens online, and the
-International Broadcasting Bureau and Reporters without Borders to combat
-blocking and censorship on the Internet. As we will see below,
-this wide variety of interests helps maintain both the stability and
-the security of the network.
-
-% The Tor
-%protocol was chosen
-%for the anonymizing layer in the European Union's PRIME directive to
-%help maintain privacy in Europe.
-%The AN.ON project in Germany
-%has integrated an independent implementation of the Tor protocol into
-%their popular Java Anon Proxy anonymizing client.
-
-\medskip
-\noindent
-{\bf Threat models and design philosophy.}
-The ideal Tor network would be practical, useful and anonymous. When
-trade-offs arise between these properties, Tor's research strategy has been
-to remain useful enough to attract many users,
-and practical enough to support them. Only subject to these
-constraints do we try to maximize
-anonymity.\footnote{This is not the only possible
-direction in anonymity research: designs exist that provide more anonymity
-than Tor at the expense of significantly increased resource requirements, or
-decreased flexibility in application support (typically because of increased
-latency). Such research does not typically abandon aspirations toward
-deployability or utility, but instead tries to maximize deployability and
-utility subject to a certain degree of structural anonymity (structural because
-usability and practicality affect usage which affects the actual anonymity
-provided by the network \cite{econymics,back01}).}
-%{We believe that these
-%approaches can be promising and useful, but that by focusing on deploying a
-%usable system in the wild, Tor helps us experiment with the actual parameters
-%of what makes a system ``practical'' for volunteer operators and ``useful''
-%for home users, and helps illuminate undernoticed issues which any deployed
-%volunteer anonymity network will need to address.}
-Because of our strategy, Tor has a weaker threat model than many designs in
-the literature. In particular, because we
-support interactive communications without impractically expensive padding,
-we fall prey to a variety
-of intra-network~\cite{back01,attack-tor-oak05,flow-correlation04,hs-attack}
-and
-end-to-end~\cite{danezis:pet2004,SS03} anonymity-breaking attacks.
-
-Tor does not attempt to defend against a global observer. In general, an
-attacker who can measure both ends of a connection through the Tor network
-% I say 'measure' rather than 'observe', to encompass murdoch-danezis
-% style attacks. -RD
-can correlate the timing and volume of data on that connection as it enters
-and leaves the network, and so link communication partners.
-Known solutions to this attack would seem to require introducing a
-prohibitive degree of traffic padding between the user and the network, or
-introducing an unacceptable degree of latency.
-Also, it is not clear that these methods would
-work at all against a minimally active adversary who could introduce timing
-patterns or additional traffic. Thus, Tor only attempts to defend against
-external observers who cannot observe both sides of a user's connections.
-
-Against internal attackers who sign up Tor nodes, the situation is more
-complicated. In the simplest case, if an adversary has compromised $c$ of
-$n$ nodes on the Tor network, then the adversary will be able to compromise
-a random circuit with probability $\frac{c^2}{n^2}$~\cite{or-pet00}
-(since the circuit
-initiator chooses hops randomly). But there are
-complicating factors:
-(1)~If the user continues to build random circuits over time, an adversary
- is pretty certain to see a statistical sample of the user's traffic, and
- thereby can build an increasingly accurate profile of her behavior.
-(2)~An adversary who controls a popular service outside the Tor network
- can be certain to observe all connections to that service; he
- can therefore trace connections to that service with probability
- $\frac{c}{n}$.
-(3)~Users do not in fact choose nodes with uniform probability; they
- favor nodes with high bandwidth or uptime, and exit nodes that
- permit connections to their favorite services.
-We demonstrated the severity of these problems in experiments on the
-live Tor network in 2006~\cite{hsattack} and introduced \emph{entry
- guards} as a means to curtail them. By choosing entry guards from
-a small persistent subset, it becomes difficult for an adversary to
-increase the number of circuits observed entering the network from any
-given client simply by causing
-numerous connections or by watching compromised nodes over time.% (See
-%also Section~\ref{subsec:routing-zones} for discussion of larger
-%adversaries and our dispersal goals.)
-
-
-% I'm trying to make this paragraph work without reference to the
-% analysis/confirmation distinction, which we haven't actually introduced
-% yet, and which we realize isn't very stable anyway. Also, I don't want to
-% deprecate these attacks if we can't demonstrate that they don't work, since
-% in case they *do* turn out to work well against Tor, we'll look pretty
-% foolish. -NM
-%
-% Matt suggests maybe cutting the following paragraph -PFS
-%
-More powerful attacks may exist. In \cite{hintz-pet02} it was
-shown that an attacker who can catalog data volumes of popular
-responder destinations (say, websites with consistent data volumes) may not
-need to
-observe both ends of a stream to learn source-destination links for those
-responders. Entry guards should complicate such attacks as well.
-Similarly, latencies of going through various routes can be
-cataloged~\cite{back01} to connect endpoints.
-% Also, \cite{kesdogan:pet2002} takes the
-% attack another level further, to narrow down where you could be
-% based on an intersection attack on subpages in a website. -RD
-It has not yet been shown whether these attacks will succeed or fail
-in the presence of the variability and volume quantization introduced by the
-Tor network, but it seems likely that these factors will at best delay
-the time and data needed for success
-rather than prevent the attacks completely.
-
-\workingnote{
-Along similar lines, the same paper suggests a ``clogging
-attack'' in which the throughput on a circuit is observed to slow
-down when an adversary clogs the right nodes with his own traffic.
-To determine the nodes in a circuit this attack requires the ability
-to continuously monitor the traffic exiting the network on a circuit
-that is up long enough to probe all network nodes in binary fashion.
-% Though somewhat related, clogging and interference are really different
-% attacks with different assumptions about adversary distribution and
-% capabilities as well as different techniques. -pfs
-Murdoch and Danezis~\cite{attack-tor-oak05} show a practical
-interference attack against portions of
-the fifty node Tor network as deployed in mid 2004.
-An outside attacker can actively trace a circuit through the Tor network
-by observing changes in the latency of his
-own traffic sent through various Tor nodes. This can be done
-simultaneously at multiple nodes; however, like clogging,
-this attack only reveals
-the Tor nodes in the circuit, not initiator and responder addresses,
-so it is still necessary to discover the endpoints to complete an
-effective attack. The the size and diversity of the Tor network have
-increased many fold since then, and it is unknown if the attacks
-can scale to the current Tor network.
-}
-
-
-%discuss $\frac{c^2}{n^2}$, except how in practice the chance of owning
-%the last hop is not $c/n$ since that doesn't take the destination (website)
-%into account. so in cases where the adversary does not also control the
-%final destination we're in good shape, but if he *does* then we'd be better
-%off with a system that lets each hop choose a path.
-%
-%Isn't it more accurate to say ``If the adversary _always_ controls the final
-% dest, we would be just as well off with such as system.'' ? If not, why
-% not? -nm
-% Sure. In fact, better off, since they seem to scale more easily. -rd
-
-%Murdoch and Danezis describe an attack
-%\cite{attack-tor-oak05} that lets an attacker determine the nodes used
-%in a circuit; yet s/he cannot identify the initiator or responder,
-%e.g., client or web server, through this attack. So the endpoints
-%remain secure, which is the goal. It is conceivable that an
-%adversary could attack or set up observation of all connections
-%to an arbitrary Tor node in only a few minutes. If such an adversary
-%were to exist, s/he could use this probing to remotely identify a node
-%for further attack. Of more likely immediate practical concern
-%an adversary with active access to the responder traffic
-%wants to keep a circuit alive long enough to attack an identified
-%node. Thus it is important to prevent the responding end of the circuit
-%from keeping it open indefinitely.
-%Also, someone could identify nodes in this way and if in their
-%jurisdiction, immediately get a subpoena (if they even need one)
-%telling the node operator(s) that she must retain all the active
-%circuit data she now has.
-%Further, the enclave model, which had previously looked to be the most
-%generally secure, seems particularly threatened by this attack, since
-%it identifies endpoints when they're also nodes in the Tor network:
-%see Section~\ref{subsec:helper-nodes} for discussion of some ways to
-%address this issue.
-
-\medskip
-\noindent
-{\bf Distributed trust.}
-In practice Tor's threat model is based on
-dispersal and diversity.
-Our defense lies in having a diverse enough set of nodes
-to prevent most real-world
-adversaries from being in the right places to attack users,
-by distributing each transaction
-over several nodes in the network. This ``distributed trust'' approach
-means the Tor network can be safely operated and used by a wide variety
-of mutually distrustful users, providing sustainability and security.
-%than some previous attempts at anonymizing networks.
-
-%No organization can achieve this security on its own. If a single
-%corporation or government agency were to build a private network to
-%protect its operations, any connections entering or leaving that network
-%would be obviously linkable to the controlling organization. The members
-%and operations of that agency would be easier, not harder, to distinguish.
-
-To protect our networks from traffic analysis, we must
-collaboratively blend the traffic from many organizations and private
-citizens, so that an eavesdropper can't tell which users are which,
-and who is looking for what information. %By bringing more users onto
-%the network, all users become more secure~\cite{econymics}.
-%[XXX I feel uncomfortable saying this last sentence now. -RD]
-%[So, I took it out. I think we can do without it. -PFS]
-The Tor network has a broad range of users, including ordinary citizens
-concerned about their privacy, corporations
-who don't want to reveal information to their competitors, and law
-enforcement and government intelligence agencies who need
-to do operations on the Internet without being noticed.
-Naturally, organizations will not want to depend on others for their
-security. If most participating providers are reliable, Tor tolerates
-some hostile infiltration of the network. For maximum protection,
-the Tor design includes an enclave approach that lets data be encrypted
-(and authenticated) end-to-end, so high-sensitivity users can be sure it
-hasn't been read or modified. This even works for Internet services that
-don't have built-in encryption and authentication, such as unencrypted
-HTTP or chat, and it requires no modification of those services.
-
-%\subsection{Related work}
-Tor differs from other deployed systems for traffic analysis resistance
-in its security and flexibility. Mix networks such as
-Mixmaster~\cite{mixmaster-spec} or its successor Mixminion~\cite{minion-design}
-gain the highest degrees of anonymity at the expense of introducing highly
-variable delays, making them unsuitable for applications such as web
-browsing. Commercial single-hop
-proxies~\cite{anonymizer} can provide good performance, but
-a single compromise can expose all users' traffic, and a single-point
-eavesdropper can perform traffic analysis on the entire network.
-%Also, their proprietary implementations place any infrastructure that
-%depends on these single-hop solutions at the mercy of their providers'
-%financial health as well as network security.
-The Java
-Anon Proxy (JAP)~\cite{web-mix} provides similar functionality to Tor but
-handles only web browsing rather than all TCP\@. Because all traffic
-passes through fixed ``cascades'' for which the endpoints are predictable,
-an adversary can know where to watch for traffic analysis from particular
-clients or to particular web servers. The design calls for padding to
-complicate this, although it does not appear to be implemented.
-%Some peer-to-peer file-sharing overlay networks such as
-%Freenet~\cite{freenet} and Mute~\cite{mute}
-The Freedom
-network from Zero-Knowledge Systems~\cite{freedom21-security}
-was even more flexible than Tor in
-transporting arbitrary IP packets, and also supported
-pseudonymity in addition to anonymity; but it had
-a different approach to sustainability (collecting money from users
-and paying ISPs to run Tor nodes), and was eventually shut down due to financial
-load. Finally, %potentially more scalable
-% [I had added 'potentially' because the scalability of these designs
-% is not established, and I am uncomfortable making the
-% bolder unmodified assertion. Roger took 'potentially' out.
-% Here's an attempt at more neutral wording -pfs]
-peer-to-peer designs that are intended to be more scalable,
-for example Tarzan~\cite{tarzan:ccs02} and
-MorphMix~\cite{morphmix:fc04}, have been proposed in the literature but
-have not been fielded. These systems differ somewhat
-in threat model and presumably practical resistance to threats.
-%
-% Matt suggests cutting some or all of the rest of this paragraph. -PFS
-%
-Note that MorphMix differs from Tor only in
-node discovery and circuit setup; so Tor's architecture is flexible
-enough to contain a MorphMix experiment. Recently,
-Tor has adopted from MorphMix the approach of making it harder to
-own both ends of a circuit by requiring that nodes be chosen from
-different /16 subnets. This requires
-an adversary to own nodes in multiple address ranges to even have the
-possibility of observing both ends of a circuit. We direct the
-interested reader to~\cite{tor-design} for a more in-depth review of
-related work.
-
-%XXXX six-four. crowds. i2p.
-
-%XXXX
-%have a serious discussion of morphmix's assumptions, since they would
-%seem to be the direct competition. in fact tor is a flexible architecture
-%that would encompass morphmix, and they're nearly identical except for
-%path selection and node discovery. and the trust system morphmix has
-%seems overkill (and/or insecure) based on the threat model we've picked.
-% this para should probably move to the scalability / directory system. -RD
-% Nope. Cut for space, except for small comment added above -PFS
-
-\section{Social challenges}
-
-Many of the issues the Tor project needs to address extend beyond
-system design and technology development. In particular, the
-Tor project's \emph{image} with respect to its users and the rest of
-the Internet impacts the security it can provide.
-With this image issue in mind, this section discusses the Tor user base and
-Tor's interaction with other services on the Internet.
-
-\subsection{Communicating security}
-
-Usability for anonymity systems
-contributes to their security, because usability
-affects the possible anonymity set~\cite{econymics,back01}.
-Conversely, an unusable system attracts few users and thus can't provide
-much anonymity.
-
-This phenomenon has a second-order effect: knowing this, users should
-choose which anonymity system to use based in part on how usable
-and secure
-\emph{others} will find it, in order to get the protection of a larger
-anonymity set. Thus we might supplement the adage ``usability is a security
-parameter''~\cite{back01} with a new one: ``perceived usability is a
-security parameter.''~\cite{usability-network-effect}.
-% From here we can better understand the effects
-%of publicity on security: the more convincing your
-%advertising, the more likely people will believe you have users, and thus
-%the more users you will attract. Perversely, over-hyped systems (if they
-%are not too broken) may be a better choice than modestly promoted ones,
-%if the hype attracts more users~\cite{usability-network-effect}.
-
-%So it follows that we should come up with ways to accurately communicate
-%the available security levels to the user, so she can make informed
-%decisions.
-%JAP aims to do this by including a
-%comforting `anonymity meter' dial in the software's graphical interface,
-%giving the user an impression of the level of protection for her current
-%traffic.
-
-However, there's a catch. For users to share the same anonymity set,
-they need to act like each other. An attacker who can distinguish
-a given user's traffic from the rest of the traffic will not be
-distracted by anonymity set size. For high-latency systems like
-Mixminion, where the threat model is based on mixing messages with each
-other, there's an arms race between end-to-end statistical attacks and
-counter-strategies~\cite{statistical-disclosure,minion-design,e2e-traffic,trickle02}.
-But for low-latency systems like Tor, end-to-end \emph{traffic
-correlation} attacks~\cite{danezis:pet2004,defensive-dropping,SS03,hs-attack}
-allow an attacker who can observe both ends of a communication
-to correlate packet timing and volume, quickly linking
-the initiator to her destination.
-
-\workingnote{
-Like Tor, the current JAP implementation does not pad connections
-apart from using small fixed-size cells for transport. In fact,
-JAP's cascade-based network topology may be more vulnerable to these
-attacks, because its network has fewer edges. JAP was born out of
-the ISDN mix design~\cite{isdn-mixes}, where padding made sense because
-every user had a fixed bandwidth allocation and altering the timing
-pattern of packets could be immediately detected. But in its current context
-as an Internet web anonymizer, adding sufficient padding to JAP
-would probably be prohibitively expensive and ineffective against a
-minimally active attacker.\footnote{Even if JAP could
-fund higher-capacity nodes indefinitely, our experience
-suggests that many users would not accept the increased per-user
-bandwidth requirements, leading to an overall much smaller user base.}
-Therefore, since under this threat
-model the number of concurrent users does not seem to have much impact
-on the anonymity provided, we suggest that JAP's anonymity meter is not
-accurately communicating security levels to its users.
-
-On the other hand, while the number of active concurrent users may not
-matter as much as we'd like, it still helps to have some other users
-on the network, in particular different types of users.
-We investigate this issue next.
-}
-\subsection{Reputability and perceived social value}
-Another factor impacting the network's security is its reputability:
-the perception of its social value based on its current user base. If Alice is
-the only user who has ever downloaded the software, it might be socially
-accepted, but she's not getting much anonymity. Add a thousand
-activists, and she's anonymous, but everyone thinks she's an activist too.
-Add a thousand
-diverse citizens (cancer survivors, privacy enthusiasts, and so on)
-and now she's harder to profile.
-
-Furthermore, the network's reputability affects its operator base: more people
-are willing to run a service if they believe it will be used by human rights
-workers than if they believe it will be used exclusively for disreputable
-ends. This effect becomes stronger if node operators themselves think they
-will be associated with their users' disreputable ends.
-
-So the more cancer survivors on Tor, the better for the human rights
-activists. The more malicious hackers, the worse for the normal users. Thus,
-reputability is an anonymity issue for two reasons. First, it impacts
-the sustainability of the network: a network that's always about to be
-shut down has difficulty attracting and keeping adequate nodes.
-Second, a disreputable network is more vulnerable to legal and
-political attacks, since it will attract fewer supporters.
-
-\workingnote{
-While people therefore have an incentive for the network to be used for
-``more reputable'' activities than their own, there are still trade-offs
-involved when it comes to anonymity. To follow the above example, a
-network used entirely by cancer survivors might welcome file sharers
-onto the network, though of course they'd prefer a wider
-variety of users.
-}
-Reputability becomes even more tricky in the case of privacy networks,
-since the good uses of the network (such as publishing by journalists in
-dangerous countries) are typically kept private, whereas network abuses
-or other problems tend to be more widely publicized.
-
-\workingnote{
-The impact of public perception on security is especially important
-during the bootstrapping phase of the network, where the first few
-widely publicized uses of the network can dictate the types of users it
-attracts next.
-As an example, some U.S.~Department of Energy
-penetration testing engineers are tasked with compromising DoE computers
-from the outside. They only have a limited number of ISPs from which to
-launch their attacks, and they found that the defenders were recognizing
-attacks because they came from the same IP space. These engineers wanted
-to use Tor to hide their tracks. First, from a technical standpoint,
-Tor does not support the variety of IP packets one would like to use in
-such attacks.% (see Section~\ref{subsec:tcp-vs-ip}).
-But aside from this, we also decided that it would probably be poor
-precedent to encourage such use---even legal use that improves
-national security---and managed to dissuade them.
-}
-%% "outside of academia, jap has just lost, permanently". (That is,
-%% even though the crime detection issues are resolved and are unlikely
-%% to go down the same way again, public perception has not been kind.)
-
-\subsection{Sustainability and incentives}
-One of the unsolved problems in low-latency anonymity designs is
-how to keep the nodes running. ZKS's Freedom network
-depended on paying third parties to run its servers; the JAP project's
-bandwidth depends on grants to pay for its bandwidth and
-administrative expenses. In Tor, bandwidth and administrative costs are
-distributed across the volunteers who run Tor nodes, so we at least have
-reason to think that the Tor network could survive without continued research
-funding.\footnote{It also helps that Tor is implemented with free and open
- source software that can be maintained by anybody with the ability and
- inclination.} But why are these volunteers running nodes, and what can we
-do to encourage more volunteers to do so?
-
-We have not formally surveyed Tor node operators to learn why they are
-running nodes, but
-from the information they have provided, it seems that many of them run Tor
-nodes for reasons of personal interest in privacy issues. It is possible
-that others are running Tor nodes to protect their own
-anonymity, but of course they are
-hardly likely to tell us specifics if they are.
-%Significantly, Tor's threat model changes the anonymity incentives for running
-%a node. In a high-latency mix network, users can receive additional
-%anonymity by running their own node, since doing so obscures when they are
-%injecting messages into the network. But, anybody observing all I/O to a Tor
-%node can tell when the node is generating traffic that corresponds to
-%none of its incoming traffic.
-%
-%I didn't buy the above for reason's subtle enough that I just cut it -PFS
-Tor exit node operators do attain a degree of
-``deniability'' for traffic that originates at that exit node. For
- example, it is likely in practice that HTTP requests from a Tor node's IP
- will be assumed to be from the Tor network.
- More significantly, people and organizations who use Tor for
- anonymity depend on the
- continued existence of the Tor network to do so; running a node helps to
- keep the network operational.
-%\item Local Tor entry and exit nodes allow users on a network to run in an
-% `enclave' configuration. [XXXX need to resolve this. They would do this
-% for E2E encryption + auth?]
-
-
-%We must try to make the costs of running a Tor node easily minimized.
-Since Tor is run by volunteers, the most crucial software usability issue is
-usability by operators: when an operator leaves, the network becomes less
-usable by everybody. To keep operators pleased, we must try to keep Tor's
-resource and administrative demands as low as possible.
-
-Because of ISP billing structures, many Tor operators have underused capacity
-that they are willing to donate to the network, at no additional monetary
-cost to them. Features to limit bandwidth have been essential to adoption.
-Also useful has been a ``hibernation'' feature that allows a Tor node that
-wants to provide high bandwidth, but no more than a certain amount in a
-given billing cycle, to become dormant once its bandwidth is exhausted, and
-to reawaken at a random offset into the next billing cycle.
-Exit policies help to limit administrative costs by limiting the frequency of
-abuse complaints (see Section~\ref{subsec:tor-and-blacklists}).
-% We discuss
-%technical incentive mechanisms in Section~\ref{subsec:incentives-by-design}.
-
-%[XXXX say more. Why else would you run a node? What else can we do/do we
-% already do to make running a node more attractive?]
-%[We can enforce incentives; see Section 6.1. We can rate-limit clients.
-% We can put "top bandwidth nodes lists" up a la seti@home.]
-
-\workingnote{
-\subsection{Bandwidth and file-sharing}
-\label{subsec:bandwidth-and-file-sharing}
-%One potentially problematical area with deploying Tor has been our response
-%to file-sharing applications.
-Once users have configured their applications to work with Tor, the largest
-remaining usability issue is performance. Users begin to suffer
-when websites ``feel slow.''
-Clients currently try to build their connections through nodes that they
-guess will have enough bandwidth. But even if capacity is allocated
-optimally, it seems unlikely that the current network architecture will have
-enough capacity to provide every user with as much bandwidth as she would
-receive if she weren't using Tor, unless far more nodes join the network.
-
-%Limited capacity does not destroy the network, however. Instead, usage tends
-%towards an equilibrium: when performance suffers, users who value performance
-%over anonymity tend to leave the system, thus freeing capacity until the
-%remaining users on the network are exactly those willing to use that capacity
-%there is.
-
-Much of Tor's recent bandwidth difficulties have come from file-sharing
-applications. These applications provide two challenges to
-any anonymizing network: their intensive bandwidth requirement, and the
-degree to which they are associated (correctly or not) with copyright
-infringement.
-
-High-bandwidth protocols can make the network unresponsive,
-but tend to be somewhat self-correcting as lack of bandwidth drives away
-users who need it. Issues of copyright violation,
-however, are more interesting. Typical exit node operators want to help
-people achieve private and anonymous speech, not to help people (say) host
-Vin Diesel movies for download; and typical ISPs would rather not
-deal with customers who draw menacing letters
-from the MPAA\@. While it is quite likely that the operators are doing nothing
-illegal, many ISPs have policies of dropping users who get repeated legal
-threats regardless of the merits of those threats, and many operators would
-prefer to avoid receiving even meritless legal threats.
-So when letters arrive, operators are likely to face
-pressure to block file-sharing applications entirely, in order to avoid the
-hassle.
-
-But blocking file-sharing is not easy: popular
-protocols have evolved to run on non-standard ports to
-get around other port-based bans. Thus, exit node operators who want to
-block file-sharing would have to find some way to integrate Tor with a
-protocol-aware exit filter. This could be a technically expensive
-undertaking, and one with poor prospects: it is unlikely that Tor exit nodes
-would succeed where so many institutional firewalls have failed. Another
-possibility for sensitive operators is to run a restrictive node that
-only permits exit connections to a restricted range of ports that are
-not frequently associated with file sharing. There are increasingly few such
-ports.
-
-Other possible approaches might include rate-limiting connections, especially
-long-lived connections or connections to file-sharing ports, so that
-high-bandwidth connections do not flood the network. We might also want to
-give priority to cells on low-bandwidth connections to keep them interactive,
-but this could have negative anonymity implications.
-
-For the moment, it seems that Tor's bandwidth issues have rendered it
-unattractive for bulk file-sharing traffic; this may continue to be so in the
-future. Nevertheless, Tor will likely remain attractive for limited use in
-file-sharing protocols that have separate control and data channels.
-
-%[We should say more -- but what? That we'll see a similar
-% equilibriating effect as with bandwidth, where sensitive ops switch to
-% middleman, and we become less useful for file-sharing, so the file-sharing
-% people back off, so we get more ops since there's less file-sharing, so the
-% file-sharers come back, etc.]
-
-%XXXX
-%in practice, plausible deniability is hypothetical and doesn't seem very
-%convincing. if ISPs find the activity antisocial, they don't care *why*
-%your computer is doing that behavior.
-}
-
-\subsection{Tor and blacklists}
-\label{subsec:tor-and-blacklists}
-
-It was long expected that, alongside legitimate users, Tor would also
-attract troublemakers who exploit Tor to abuse services on the
-Internet with vandalism, rude mail, and so on.
-Our initial answer to this situation was to use ``exit policies''
-to allow individual Tor nodes to block access to specific IP/port ranges.
-This approach aims to make operators more willing to run Tor by allowing
-them to prevent their nodes from being used for abusing particular
-services. For example, by default Tor nodes block SMTP (port 25),
-to avoid the issue of spam.
-\workingnote{
-Note that for spammers, Tor would be
-a step back, a much less effective means of distributing spam than
-those currently available. This is thus primarily an unmistakable
-answer to those confused about Internet communication who might raise
-spam as an issue.
-}
-
-Exit policies are useful, but they are insufficient: if not all nodes
-block a given service, that service may try to block Tor instead.
-While being blockable is important to being good netizens, we would like
-to encourage services to allow anonymous access. Services should not
-need to decide between blocking legitimate anonymous use and allowing
-unlimited abuse. For the time being, blocking by IP address is
-an expedient strategy, even if it undermines Internet stability and
-functionality in the long run~\cite{netauth}
-
-This is potentially a bigger problem than it may appear.
-On the one hand, services should be allowed to refuse connections from
-sources of possible abuse.
-But when a Tor node administrator decides whether he prefers to be able
-to post to Wikipedia from his IP address, or to allow people to read
-Wikipedia anonymously through his Tor node, he is making the decision
-for others as well. (For a while, Wikipedia
-blocked all posting from all Tor nodes based on IP addresses.) If
-the Tor node shares an address with a campus or corporate NAT,
-then the decision can prevent the entire population from posting.
-Similarly, whether intended or not, such blocking supports
-repression of free speech. In many locations where Internet access
-of various kinds is censored or even punished by imprisonment,
-Tor is a path both to the outside world and to others inside.
-Blocking posts from Tor makes the job of censoring authorities easier.
-This is a loss for both Tor
-and Wikipedia: we don't want to compete for (or divvy up) the
-NAT-protected entities of the world.
-This is also unfortunate because there are relatively simple technical
-solutions.
-Various schemes for escrowing anonymous posts until they are reviewed
-by editors would both prevent abuse and remove incentives for attempts
-to abuse. Further, pseudonymous reputation tracking of posters through Tor
-would allow those who establish adequate reputation to post without
-escrow.
-\workingnote{
-Software to support pseudonymous access via Tor designed precisely
-to interact with Wikipedia's access mechanism has even been developed
-and proposed to Wikimedia by Jason Holt~\cite{nym}, but has not been taken up.
-
-
-Perhaps worse, many IP blacklists are coarse-grained: they ignore Tor's exit
-policies, partly because it's easier to implement and partly
-so they can punish
-all Tor nodes. One IP blacklist even bans
-every class C network that contains a Tor node, and recommends banning SMTP
-from these networks even though Tor does not allow SMTP at all. This
-strategic decision aims to discourage the
-operation of anything resembling an open proxy by encouraging its neighbors
-to shut it down to get unblocked themselves. This pressure even
-affects Tor nodes running in middleman mode (disallowing all exits) when
-those nodes are blacklisted too.
-% Perception of Tor as an abuse vector
-%is also partly driven by multiple base-rate fallacies~\cite{axelsson00}.
-}
-
-Problems of abuse occur mainly with services such as IRC networks and
-Wikipedia, which rely on IP blocking to ban abusive users. While at first
-blush this practice might seem to depend on the anachronistic assumption that
-each IP is an identifier for a single user, it is actually more reasonable in
-practice: it assumes that non-proxy IPs are a costly resource, and that an
-abuser can not change IPs at will. By blocking IPs which are used by Tor
-nodes, open proxies, and service abusers, these systems hope to make
-ongoing abuse difficult. Although the system is imperfect, it works
-tolerably well for them in practice.
-
-Of course, we would prefer that legitimate anonymous users be able to
-access abuse-prone services.
-\workingnote{
- One conceivable approach would require
-would-be IRC users, for instance, to register accounts if they want to
-access the IRC network from Tor. In practice this would not
-significantly impede abuse if creating new accounts were easily automatable;
-this is why services use IP blocking. To deter abuse, pseudonymous
-identities need to require a significant switching cost in resources or human
-time. Some popular webmail applications
-impose cost with Reverse Turing Tests, but this step may not deter all
-abusers. Freedom used blind signatures to limit
-the number of pseudonyms for each paying account, but Tor has neither the
-ability nor the desire to collect payment.
-}
-We stress that as far as we can tell, most Tor uses are not
-abusive. Most services have not complained, and others are actively
-working to find ways besides banning to cope with the abuse. For example,
-the Freenode IRC network had a problem with a coordinated group of
-abusers joining channels and subtly taking over the conversation; but
-when they labelled all users coming from Tor IPs as ``anonymous users,''
-removing the ability of the abusers to blend in, the abuse stopped.
-This is an illustration of how simple technical mechanisms can remove
-the ability to abuse anonymously without undermining the ability
-to communicate anonymously and can thus remove the incentive to attempt
-abusing in this way.
-
-%The use of squishy IP-based ``authentication'' and ``authorization''
-%has not broken down even to the level that SSNs used for these
-%purposes have in commercial and public record contexts. Externalities
-%and misplaced incentives cause a continued focus on fighting identity
-%theft by protecting SSNs rather than developing better authentication
-%and incentive schemes \cite{price-privacy}. Similarly we can expect a
-%continued use of identification by IP number as long as there is no
-%workable alternative.
-
-%[XXX Mention correct DNS-RBL implementation. -NM]
-
-\workingnote{
-\section{Design choices}
-
-In addition to social issues, Tor also faces some design trade-offs that must
-be investigated as the network develops.
-
-\subsection{Transporting the stream vs transporting the packets}
-\label{subsec:stream-vs-packet}
-\label{subsec:tcp-vs-ip}
-
-Tor transports streams; it does not tunnel packets.
-It has often been suggested that like the old Freedom
-network~\cite{freedom21-security}, Tor should
-``obviously'' anonymize IP traffic
-at the IP layer. Before this could be done, many issues need to be resolved:
-
-\begin{enumerate}
-\setlength{\itemsep}{0mm}
-\setlength{\parsep}{0mm}
-\item \emph{IP packets reveal OS characteristics.} We would still need to do
-IP-level packet normalization, to stop things like TCP fingerprinting
-attacks. %There likely exist libraries that can help with this.
-This is unlikely to be a trivial task, given the diversity and complexity of
-TCP stacks.
-\item \emph{Application-level streams still need scrubbing.} We still need
-Tor to be easy to integrate with user-level application-specific proxies
-such as Privoxy. So it's not just a matter of capturing packets and
-anonymizing them at the IP layer.
-\item \emph{Certain protocols will still leak information.} For example, we
-must rewrite DNS requests so they are delivered to an unlinkable DNS server
-rather than the DNS server at a user's ISP; thus, we must understand the
-protocols we are transporting.
-\item \emph{The crypto is unspecified.} First we need a block-level encryption
-approach that can provide security despite
-packet loss and out-of-order delivery. Freedom allegedly had one, but it was
-never publicly specified.
-Also, TLS over UDP is not yet implemented or
-specified, though some early work has begun~\cite{dtls}.
-\item \emph{We'll still need to tune network parameters.} Since the above
-encryption system will likely need sequence numbers (and maybe more) to do
-replay detection, handle duplicate frames, and so on, we will be reimplementing
-a subset of TCP anyway---a notoriously tricky path.
-\item \emph{Exit policies for arbitrary IP packets mean building a secure
-IDS\@.} Our node operators tell us that exit policies are one of
-the main reasons they're willing to run Tor.
-Adding an Intrusion Detection System to handle exit policies would
-increase the security complexity of Tor, and would likely not work anyway,
-as evidenced by the entire field of IDS and counter-IDS papers. Many
-potential abuse issues are resolved by the fact that Tor only transports
-valid TCP streams (as opposed to arbitrary IP including malformed packets
-and IP floods), so exit policies become even \emph{more} important as
-we become able to transport IP packets. We also need to compactly
-describe exit policies so clients can predict
-which nodes will allow which packets to exit.
-\item \emph{The Tor-internal name spaces would need to be redesigned.} We
-support hidden service {\tt{.onion}} addresses (and other special addresses,
-like {\tt{.exit}} which lets the user request a particular exit node),
-by intercepting the addresses when they are passed to the Tor client.
-Doing so at the IP level would require a more complex interface between
-Tor and the local DNS resolver.
-\end{enumerate}
-
-This list is discouragingly long, but being able to transport more
-protocols obviously has some advantages. It would be good to learn which
-items are actual roadblocks and which are easier to resolve than we think.
-
-To be fair, Tor's stream-based approach has run into
-stumbling blocks as well. While Tor supports the SOCKS protocol,
-which provides a standardized interface for generic TCP proxies, many
-applications do not support SOCKS\@. For them we already need to
-replace the networking system calls with SOCKS-aware
-versions, or run a SOCKS tunnel locally, neither of which is
-easy for the average user. %---even with good instructions.
-Even when applications can use SOCKS, they often make DNS requests
-themselves before handing an IP address to Tor, which advertises
-where the user is about to connect.
-We are still working on more usable solutions.
-
-%So to actually provide good anonymity, we need to make sure that
-%users have a practical way to use Tor anonymously. Possibilities include
-%writing wrappers for applications to anonymize them automatically; improving
-%the applications' support for SOCKS; writing libraries to help application
-%writers use Tor properly; and implementing a local DNS proxy to reroute DNS
-%requests to Tor so that applications can simply point their DNS resolvers at
-%localhost and continue to use SOCKS for data only.
-
-\subsection{Mid-latency}
-\label{subsec:mid-latency}
-
-Some users need to resist traffic correlation attacks. Higher-latency
-mix-networks introduce variability into message
-arrival times: as timing variance increases, timing correlation attacks
-require increasingly more data~\cite{e2e-traffic}. Can we improve Tor's
-resistance without losing too much usability?
-
-We need to learn whether we can trade a small increase in latency
-for a large anonymity increase, or if we'd end up trading a lot of
-latency for only a minimal security gain. A trade-off might be worthwhile
-even if we
-could only protect certain use cases, such as infrequent short-duration
-transactions. % To answer this question
-We might adapt the techniques of~\cite{e2e-traffic} to a lower-latency mix
-network, where the messages are batches of cells in temporally clustered
-connections. These large fixed-size batches can also help resist volume
-signature attacks~\cite{hintz-pet02}. We could also experiment with traffic
-shaping to get a good balance of throughput and security.
-%Other padding regimens might supplement the
-%mid-latency option; however, we should continue the caution with which
-%we have always approached padding lest the overhead cost us too much
-%performance or too many volunteers.
-
-We must keep usability in mind too. How much can latency increase
-before we drive users away? We've already been forced to increase
-latency slightly, as our growing network incorporates more DSL and
-cable-modem nodes and more nodes in distant continents. Perhaps we can
-harness this increased latency to improve anonymity rather than just
-reduce usability. Further, if we let clients label certain circuits as
-mid-latency as they are constructed, we could handle both types of traffic
-on the same network, giving users a choice between speed and security---and
-giving researchers a chance to experiment with parameters to improve the
-quality of those choices.
-
-\subsection{Enclaves and helper nodes}
-\label{subsec:helper-nodes}
-
-It has long been thought that users can improve their anonymity by
-running their own node~\cite{tor-design,or-ih96,or-pet00}, and using
-it in an \emph{enclave} configuration, where all their circuits begin
-at the node under their control. Running Tor clients or servers at
-the enclave perimeter is useful when policy or other requirements
-prevent individual machines within the enclave from running Tor
-clients~\cite{or-jsac98,or-discex00}.
-
-Of course, Tor's default path length of
-three is insufficient for these enclaves, since the entry and/or exit
-% [edit war: without the ``and/'' the natural reading here
-% is aut rather than vel. And the use of the plural verb does not work -pfs]
-themselves are sensitive. Tor thus increments path length by one
-for each sensitive endpoint in the circuit.
-Enclaves also help to protect against end-to-end attacks, since it's
-possible that traffic coming from the node has simply been relayed from
-elsewhere. However, if the node has recognizable behavior patterns,
-an attacker who runs nodes in the network can triangulate over time to
-gain confidence that it is in fact originating the traffic. Wright et
-al.~\cite{wright03} introduce the notion of a \emph{helper node}---a
-single fixed entry node for each user---to combat this \emph{predecessor
-attack}.
-
-However, the attack in~\cite{attack-tor-oak05} shows that simply adding
-to the path length, or using a helper node, may not protect an enclave
-node. A hostile web server can send constant interference traffic to
-all nodes in the network, and learn which nodes are involved in the
-circuit (though at least in the current attack, he can't learn their
-order). Using randomized path lengths may help some, since the attacker
-will never be certain he has identified all nodes in the path unless
-he probes the entire network, but as
-long as the network remains small this attack will still be feasible.
-
-Helper nodes also aim to help Tor clients, because choosing entry and exit
-points
-randomly and changing them frequently allows an attacker who controls
-even a few nodes to eventually link some of their destinations. The goal
-is to take the risk once and for all about choosing a bad entry node,
-rather than taking a new risk for each new circuit. (Choosing fixed
-exit nodes is less useful, since even an honest exit node still doesn't
-protect against a hostile website.) But obstacles remain before
-we can implement helper nodes.
-For one, the literature does not describe how to choose helpers from a list
-of nodes that changes over time. If Alice is forced to choose a new entry
-helper every $d$ days and $c$ of the $n$ nodes are bad, she can expect
-to choose a compromised node around
-every $dc/n$ days. Statistically over time this approach only helps
-if she is better at choosing honest helper nodes than at choosing
-honest nodes. Worse, an attacker with the ability to DoS nodes could
-force users to switch helper nodes more frequently, or remove
-other candidate helpers.
-
-%Do general DoS attacks have anonymity implications? See e.g. Adam
-%Back's IH paper, but I think there's more to be pointed out here. -RD
-% Not sure what you want to say here. -NM
-
-%Game theory for helper nodes: if Alice offers a hidden service on a
-%server (enclave model), and nobody ever uses helper nodes, then against
-%George+Steven's attack she's totally nailed. If only Alice uses a helper
-%node, then she's still identified as the source of the data. If everybody
-%uses a helper node (including Alice), then the attack identifies the
-%helper node and also Alice, and knows which one is which. If everybody
-%uses a helper node (but not Alice), then the attacker figures the real
-%source was a client that is using Alice as a helper node. [How's my
-%logic here?] -RD
-%
-% Not sure about the logic. For the attack to work with helper nodes, the
-%attacker needs to guess that Alice is running the hidden service, right?
-%Otherwise, how can he know to measure her traffic specifically? -NM
-%
-% In the Murdoch-Danezis attack, the adversary measures all servers. -RD
-
-%point to routing-zones section re: helper nodes to defend against
-%big stuff.
-
-\subsection{Location-hidden services}
-\label{subsec:hidden-services}
-
-% This section is first up against the wall when the revolution comes.
-
-Tor's \emph{rendezvous points}
-let users provide TCP services to other Tor users without revealing
-the service's location. Since this feature is relatively recent, we describe
-here
-a couple of our early observations from its deployment.
-
-First, our implementation of hidden services seems less hidden than we'd
-like, since they build a different rendezvous circuit for each user,
-and an external adversary can induce them to
-produce traffic. This insecurity means that they may not be suitable as
-a building block for Free Haven~\cite{freehaven-berk} or other anonymous
-publishing systems that aim to provide long-term security, though helper
-nodes, as discussed above, would seem to help.
-
-\emph{Hot-swap} hidden services, where more than one location can
-provide the service and loss of any one location does not imply a
-change in service, would help foil intersection and observation attacks
-where an adversary monitors availability of a hidden service and also
-monitors whether certain users or servers are online. The design
-challenges in providing such services without otherwise compromising
-the hidden service's anonymity remain an open problem;
-however, see~\cite{move-ndss05}.
-
-In practice, hidden services are used for more than just providing private
-access to a web server or IRC server. People are using hidden services
-as a poor man's VPN and firewall-buster. Many people want to be able
-to connect to the computers in their private network via secure shell,
-and rather than playing with dyndns and trying to pierce holes in their
-firewall, they run a hidden service on the inside and then rendezvous
-with that hidden service externally.
-
-News sites like Bloggers Without Borders (www.b19s.org) are advertising
-a hidden-service address on their front page. Doing this can provide
-increased robustness if they use the dual-IP approach we describe
-in~\cite{tor-design},
-but in practice they do it to increase visibility
-of the Tor project and their support for privacy, and to offer
-a way for their users, using unmodified software, to get end-to-end
-encryption and authentication to their website.
-
-\subsection{Location diversity and ISP-class adversaries}
-\label{subsec:routing-zones}
-
-Anonymity networks have long relied on diversity of node location for
-protection against attacks---typically an adversary who can observe a
-larger fraction of the network can launch a more effective attack. One
-way to achieve dispersal involves growing the network so a given adversary
-sees less. Alternately, we can arrange the topology so traffic can enter
-or exit at many places (for example, by using a free-route network
-like Tor rather than a cascade network like JAP). Lastly, we can use
-distributed trust to spread each transaction over multiple jurisdictions.
-But how do we decide whether two nodes are in related locations?
-
-Feamster and Dingledine defined a \emph{location diversity} metric
-in~\cite{feamster:wpes2004}, and began investigating a variant of location
-diversity based on the fact that the Internet is divided into thousands of
-independently operated networks called {\em autonomous systems} (ASes).
-The key insight from their paper is that while we typically think of a
-connection as going directly from the Tor client to the first Tor node,
-actually it traverses many different ASes on each hop. An adversary at
-any of these ASes can monitor or influence traffic. Specifically, given
-plausible initiators and recipients, and given random path selection,
-some ASes in the simulation were able to observe 10\% to 30\% of the
-transactions (that is, learn both the origin and the destination) on
-the deployed Tor network (33 nodes as of June 2004).
-
-The paper concludes that for best protection against the AS-level
-adversary, nodes should be in ASes that have the most links to other ASes:
-Tier-1 ISPs such as AT\&T and Abovenet. Further, a given transaction
-is safest when it starts or ends in a Tier-1 ISP\@. Therefore, assuming
-initiator and responder are both in the U.S., it actually \emph{hurts}
-our location diversity to use far-flung nodes in
-continents like Asia or South America.
-% it's not just entering or exiting from them. using them as the middle
-% hop reduces your effective path length, which you presumably don't
-% want because you chose that path length for a reason.
-%
-% Not sure I buy that argument. Two end nodes in the right ASs to
-% discourage linking are still not known to each other. If some
-% adversary in a single AS can bridge the middle node, it shouldn't
-% therefore be able to identify initiator or responder; although it could
-% contribute to further attacks given more assumptions.
-% Nonetheless, no change to the actual text for now.
-
-Many open questions remain. First, it will be an immense engineering
-challenge to get an entire BGP routing table to each Tor client, or to
-summarize it sufficiently. Without a local copy, clients won't be
-able to safely predict what ASes will be traversed on the various paths
-through the Tor network to the final destination. Tarzan~\cite{tarzan:ccs02}
-and MorphMix~\cite{morphmix:fc04} suggest that we compare IP prefixes to
-determine location diversity; but the above paper showed that in practice
-many of the Mixmaster nodes that share a single AS have entirely different
-IP prefixes. When the network has scaled to thousands of nodes, does IP
-prefix comparison become a more useful approximation? % Alternatively, can
-%relevant parts of the routing tables be summarized centrally and delivered to
-%clients in a less verbose format?
-%% i already said "or to summarize is sufficiently" above. is that not
-%% enough? -RD
-%
-Second, we can take advantage of caching certain content at the
-exit nodes, to limit the number of requests that need to leave the
-network at all. What about taking advantage of caches like Akamai or
-Google~\cite{shsm03}? (Note that they're also well-positioned as global
-adversaries.)
-%
-Third, if we follow the recommendations in~\cite{feamster:wpes2004}
- and tailor path selection
-to avoid choosing endpoints in similar locations, how much are we hurting
-anonymity against larger real-world adversaries who can take advantage
-of knowing our algorithm?
-%
-Fourth, can we use this knowledge to figure out which gaps in our network
-most affect our robustness to this class of attack, and go recruit
-new nodes with those ASes in mind?
-
-%Tor's security relies in large part on the dispersal properties of its
-%network. We need to be more aware of the anonymity properties of various
-%approaches so we can make better design decisions in the future.
-
-\subsection{The Anti-censorship problem}
-\label{subsec:china}
-
-Citizens in a variety of countries, such as most recently China and
-Iran, are blocked from accessing various sites outside
-their country. These users try to find any tools available to allow
-them to get-around these firewalls. Some anonymity networks, such as
-Six-Four~\cite{six-four}, are designed specifically with this goal in
-mind; others like the Anonymizer~\cite{anonymizer} are paid by sponsors
-such as Voice of America to encourage Internet
-freedom. Even though Tor wasn't
-designed with ubiquitous access to the network in mind, thousands of
-users across the world are now using it for exactly this purpose.
-% Academic and NGO organizations, peacefire, \cite{berkman}, etc
-
-Anti-censorship networks hoping to bridge country-level blocks face
-a variety of challenges. One of these is that they need to find enough
-exit nodes---servers on the `free' side that are willing to relay
-traffic from users to their final destinations. Anonymizing
-networks like Tor are well-suited to this task since we have
-already gathered a set of exit nodes that are willing to tolerate some
-political heat.
-
-The other main challenge is to distribute a list of reachable relays
-to the users inside the country, and give them software to use those relays,
-without letting the censors also enumerate this list and block each
-relay. Anonymizer solves this by buying lots of seemingly-unrelated IP
-addresses (or having them donated), abandoning old addresses as they are
-`used up,' and telling a few users about the new ones. Distributed
-anonymizing networks again have an advantage here, in that we already
-have tens of thousands of separate IP addresses whose users might
-volunteer to provide this service since they've already installed and use
-the software for their own privacy~\cite{koepsell:wpes2004}. Because
-the Tor protocol separates routing from network discovery \cite{tor-design},
-volunteers could configure their Tor clients
-to generate node descriptors and send them to a special directory
-server that gives them out to dissidents who need to get around blocks.
-
-Of course, this still doesn't prevent the adversary
-from enumerating and preemptively blocking the volunteer relays.
-Perhaps a tiered-trust system could be built where a few individuals are
-given relays' locations. They could then recommend other individuals
-by telling them
-those addresses, thus providing a built-in incentive to avoid letting the
-adversary intercept them. Max-flow trust algorithms~\cite{advogato}
-might help to bound the number of IP addresses leaked to the adversary. Groups
-like the W3C are looking into using Tor as a component in an overall system to
-help address censorship; we wish them success.
-
-%\cite{infranet}
-
-
-\section{Scaling}
-\label{sec:scaling}
-
-Tor is running today with hundreds of nodes and hundreds of thousands of
-users, but it will certainly not scale to millions.
-Scaling Tor involves four main challenges. First, to get a
-large set of nodes, we must address incentives for
-users to carry traffic for others. Next is safe node discovery, both
-while bootstrapping (Tor clients must robustly find an initial
-node list) and later (Tor clients must learn about a fair sample
-of honest nodes and not let the adversary control circuits).
-We must also detect and handle node speed and reliability as the network
-becomes increasingly heterogeneous: since the speed and reliability
-of a circuit is limited by its worst link, we must learn to track and
-predict performance. Finally, we must stop assuming that all points on
-the network can connect to all other points.
-
-\subsection{Incentives by Design}
-\label{subsec:incentives-by-design}
-
-There are three behaviors we need to encourage for each Tor node: relaying
-traffic; providing good throughput and reliability while doing it;
-and allowing traffic to exit the network from that node.
-
-We encourage these behaviors through \emph{indirect} incentives: that
-is, by designing the system and educating users in such a way that users
-with certain goals will choose to relay traffic. One
-main incentive for running a Tor node is social: volunteers
-altruistically donate their bandwidth and time. We encourage this with
-public rankings of the throughput and reliability of nodes, much like
-seti@home. We further explain to users that they can get
-deniability for any traffic emerging from the same address as a Tor
-exit node, and they can use their own Tor node
-as an entry or exit point with confidence that it's not run by an adversary.
-Further, users may run a node simply because they need such a network
-to be persistently available and usable, and the value of supporting this
-exceeds any countervening costs.
-Finally, we can encourage operators by improving the usability and feature
-set of the software:
-rate limiting support and easy packaging decrease the hassle of
-maintaining a node, and our configurable exit policies allow each
-operator to advertise a policy describing the hosts and ports to which
-he feels comfortable connecting.
-
-To date these incentives appear to have been adequate. As the system scales
-or as new issues emerge, however, we may also need to provide
- \emph{direct} incentives:
-providing payment or other resources in return for high-quality service.
-Paying actual money is problematic: decentralized e-cash systems are
-not yet practical, and a centralized collection system not only reduces
-robustness, but also has failed in the past (the history of commercial
-anonymizing networks is littered with failed attempts). A more promising
-option is to use a tit-for-tat incentive scheme, where nodes provide better
-service to nodes that have provided good service for them.
-
-Unfortunately, such an approach introduces new anonymity problems.
-There are many surprising ways for nodes to game the incentive and
-reputation system to undermine anonymity---such systems are typically
-designed to encourage fairness in storage or bandwidth usage, not
-fairness of provided anonymity. An adversary can attract more traffic
-by performing well or can target individual users by selectively
-performing, to undermine their anonymity. Typically a user who
-chooses evenly from all nodes is most resistant to an adversary
-targeting him, but that approach hampers the efficient use
-of heterogeneous nodes.
-
-%When a node (call him Steve) performs well for Alice, does Steve gain
-%reputation with the entire system, or just with Alice? If the entire
-%system, how does Alice tell everybody about her experience in a way that
-%prevents her from lying about it yet still protects her identity? If
-%Steve's behavior only affects Alice's behavior, does this allow Steve to
-%selectively perform only for Alice, and then break her anonymity later
-%when somebody (presumably Alice) routes through his node?
-
-A possible solution is a simplified approach to the tit-for-tat
-incentive scheme based on two rules: (1) each node should measure the
-service it receives from adjacent nodes, and provide service relative
-to the received service, but (2) when a node is making decisions that
-affect its own security (such as building a circuit for its own
-application connections), it should choose evenly from a sufficiently
-large set of nodes that meet some minimum service
-threshold~\cite{casc-rep}. This approach allows us to discourage
-bad service
-without opening Alice up as much to attacks. All of this requires
-further study.
-
-
-\subsection{Trust and discovery}
-\label{subsec:trust-and-discovery}
-
-The published Tor design is deliberately simplistic in how
-new nodes are authorized and how clients are informed about Tor
-nodes and their status.
-All nodes periodically upload a signed description
-of their locations, keys, and capabilities to each of several well-known {\it
- directory servers}. These directory servers construct a signed summary
-of all known Tor nodes (a ``directory''), and a signed statement of which
-nodes they
-believe to be operational then (a ``network status''). Clients
-periodically download a directory to learn the latest nodes and
-keys, and more frequently download a network status to learn which nodes are
-likely to be running. Tor nodes also operate as directory caches, to
-lighten the bandwidth on the directory servers.
-
-To prevent Sybil attacks (wherein an adversary signs up many
-purportedly independent nodes to increase her network view),
-this design
-requires the directory server operators to manually
-approve new nodes. Unapproved nodes are included in the directory,
-but clients
-do not use them at the start or end of their circuits. In practice,
-directory administrators perform little actual verification, and tend to
-approve any Tor node whose operator can compose a coherent email.
-This procedure
-may prevent trivial automated Sybil attacks, but will do little
-against a clever and determined attacker.
-
-There are a number of flaws in this system that need to be addressed as we
-move forward. First,
-each directory server represents an independent point of failure: any
-compromised directory server could start recommending only compromised
-nodes.
-Second, as more nodes join the network, %the more unreasonable it
-%becomes to expect clients to know about them all.
-directories
-become infeasibly large, and downloading the list of nodes becomes
-burdensome.
-Third, the validation scheme may do as much harm as it does good. It
-does not prevent clever attackers from mounting Sybil attacks,
-and it may deter node operators from joining the network---if
-they expect the validation process to be difficult, or they do not share
-any languages in common with the directory server operators.
-
-We could try to move the system in several directions, depending on our
-choice of threat model and requirements. If we did not need to increase
-network capacity to support more users, we could simply
- adopt even stricter validation requirements, and reduce the number of
-nodes in the network to a trusted minimum.
-But, we can only do that if can simultaneously make node capacity
-scale much more than we anticipate to be feasible soon, and if we can find
-entities willing to run such nodes, an equally daunting prospect.
-
-In order to address the first two issues, it seems wise to move to a system
-including a number of semi-trusted directory servers, no one of which can
-compromise a user on its own. Ultimately, of course, we cannot escape the
-problem of a first introducer: since most users will run Tor in whatever
-configuration the software ships with, the Tor distribution itself will
-remain a single point of failure so long as it includes the seed
-keys for directory servers, a list of directory servers, or any other means
-to learn which nodes are on the network. But omitting this information
-from the Tor distribution would only delegate the trust problem to each
-individual user. %, most of whom are presumably less informed about how to make
-%trust decisions than the Tor developers.
-A well publicized, widely available, authoritatively and independently
-endorsed and signed list of initial directory servers and their keys
-is a possible solution. But, setting that up properly is itself a large
-bootstrapping task.
-
-%Network discovery, sybil, node admission, scaling. It seems that the code
-%will ship with something and that's our trust root. We could try to get
-%people to build a web of trust, but no. Where we go from here depends
-%on what threats we have in mind. Really decentralized if your threat is
-%RIAA; less so if threat is to application data or individuals or...
-
-
-\subsection{Measuring performance and capacity}
-\label{subsec:performance}
-
-One of the paradoxes with engineering an anonymity network is that we'd like
-to learn as much as we can about how traffic flows so we can improve the
-network, but we want to prevent others from learning how traffic flows in
-order to trace users' connections through the network. Furthermore, many
-mechanisms that help Tor run efficiently
-require measurements about the network.
-
-Currently, nodes try to deduce their own available bandwidth (based on how
-much traffic they have been able to transfer recently) and include this
-information in the descriptors they upload to the directory. Clients
-choose servers weighted by their bandwidth, neglecting really slow
-servers and capping the influence of really fast ones.
-%
-This is, of course, eminently cheatable. A malicious node can get a
-disproportionate amount of traffic simply by claiming to have more bandwidth
-than it does. But better mechanisms have their problems. If bandwidth data
-is to be measured rather than self-reported, it is usually possible for
-nodes to selectively provide better service for the measuring party, or
-sabotage the measured value of other nodes. Complex solutions for
-mix networks have been proposed, but do not address the issues
-completely~\cite{mix-acc,casc-rep}.
-
-Even with no cheating, network measurement is complex. It is common
-for views of a node's latency and/or bandwidth to vary wildly between
-observers. Further, it is unclear whether total bandwidth is really
-the right measure; perhaps clients should instead be considering nodes
-based on unused bandwidth or observed throughput.
-%How to measure performance without letting people selectively deny service
-%by distinguishing pings. Heck, just how to measure performance at all. In
-%practice people have funny firewalls that don't match up to their exit
-%policies and Tor doesn't deal.
-%
-%Network investigation: Is all this bandwidth publishing thing a good idea?
-%How can we collect stats better? Note weasel's smokeping, at
-%http://seppia.noreply.org/cgi-bin/smokeping.cgi?target=Tor
-%which probably gives george and steven enough info to break tor?
-%
-And even if we can collect and use this network information effectively,
-we must ensure
-that it is not more useful to attackers than to us. While it
-seems plausible that bandwidth data alone is not enough to reveal
-sender-recipient connections under most circumstances, it could certainly
-reveal the path taken by large traffic flows under low-usage circumstances.
-
-\subsection{Non-clique topologies}
-
-Tor's comparatively weak threat model may allow easier scaling than
-other
-designs. High-latency mix networks need to avoid partitioning attacks, where
-network splits let an attacker distinguish users in different partitions.
-Since Tor assumes the adversary cannot cheaply observe nodes at will,
-a network split may not decrease protection much.
-Thus, one option when the scale of a Tor network
-exceeds some size is simply to split it. Nodes could be allocated into
-partitions while hampering collaborating hostile nodes from taking over
-a single partition~\cite{casc-rep}.
-Clients could switch between
-networks, even on a per-circuit basis.
-%Future analysis may uncover
-%other dangers beyond those affecting mix-nets.
-
-More conservatively, we can try to scale a single Tor network. Likely
-problems with adding more servers to a single Tor network include an
-explosion in the number of sockets needed on each server as more servers
-join, and increased coordination overhead to keep each users' view of
-the network consistent. As we grow, we will also have more instances of
-servers that can't reach each other simply due to Internet topology or
-routing problems.
-
-%include restricting the number of sockets and the amount of bandwidth
-%used by each node. The number of sockets is determined by the network's
-%connectivity and the number of users, while bandwidth capacity is determined
-%by the total bandwidth of nodes on the network. The simplest solution to
-%bandwidth capacity is to add more nodes, since adding a Tor node of any
-%feasible bandwidth will increase the traffic capacity of the network. So as
-%a first step to scaling, we should focus on making the network tolerate more
-%nodes, by reducing the interconnectivity of the nodes; later we can reduce
-%overhead associated with directories, discovery, and so on.
-
-We can address these points by reducing the network's connectivity.
-Danezis~\cite{danezis:pet2003} considers
-the anonymity implications of restricting routes on mix networks and
-recommends an approach based on expander graphs (where any subgraph is likely
-to have many neighbors). It is not immediately clear that this approach will
-extend to Tor, which has a weaker threat model but higher performance
-requirements: instead of analyzing the
-probability of an attacker's viewing whole paths, we will need to examine the
-attacker's likelihood of compromising the endpoints.
-%
-Tor may not need an expander graph per se: it
-may be enough to have a single central subnet that is highly connected, like
-an Internet backbone. % As an
-%example, assume fifty nodes of relatively high traffic capacity. This
-%\emph{center} forms a clique. Assume each center node can
-%handle 200 connections to other nodes (including the other ones in the
-%center). Assume every noncenter node connects to three nodes in the
-%center and anyone out of the center that they want to. Then the
-%network easily scales to c. 2500 nodes with commensurate increase in
-%bandwidth.
-There are many open questions: how to distribute connectivity information
-(presumably nodes will learn about the central nodes
-when they download Tor), whether central nodes
-will need to function as a `backbone', and so on. As above,
-this could reduce the amount of anonymity available from a mix-net,
-but for a low-latency network where anonymity derives largely from
-the edges, it may be feasible.
-
-%In a sense, Tor already has a non-clique topology.
-%Individuals can set up and run Tor nodes without informing the
-%directory servers. This allows groups to run a
-%local Tor network of private nodes that connects to the public Tor
-%network. This network is hidden behind the Tor network, and its
-%only visible connection to Tor is at those points where it connects.
-%As far as the public network, or anyone observing it, is concerned,
-%they are running clients.
-}
-
-\section{The Future}
-\label{sec:conclusion}
-
-Tor is the largest and most diverse low-latency anonymity network
-available, but we are still in the beginning stages of deployment. Several
-major questions remain.
-
-First, will our volunteer-based approach to sustainability work in the
-long term? As we add more features and destabilize the network, the
-developers spend a lot of time keeping the server operators happy. Even
-though Tor is free software, the network would likely stagnate and die at
-this stage if the developers stopped actively working on it. We may get
-an unexpected boon from the fact that we're a general-purpose overlay
-network: as Tor grows more popular, other groups who need an overlay
-network on the Internet are starting to adapt Tor to their needs.
-%
-Second, Tor is only one of many components that preserve privacy online.
-For applications where it is desirable to
-keep identifying information out of application traffic, someone must build
-more and better protocol-aware proxies that are usable by ordinary people.
-%
-Third, we need to gain a reputation for social good, and learn how to
-coexist with the variety of Internet services and their established
-authentication mechanisms. We can't just keep escalating the blacklist
-standoff forever.
-%
-Fourth, the current Tor
-architecture does not scale even to handle current user demand. We must
-find designs and incentives to let some clients relay traffic too, without
-sacrificing too much anonymity.
-
-These are difficult and open questions. Yet choosing not to solve them
-means leaving most users to a less secure network or no anonymizing
-network at all.
-
-\bibliographystyle{plain} \bibliography{tor-design}
-
-\end{document}
-
-\clearpage
-\appendix
-
-\begin{figure}[t]
-%\unitlength=1in
-\centering
-%\begin{picture}(6.0,2.0)
-%\put(3,1){\makebox(0,0)[c]{\epsfig{figure=graphnodes,width=6in}}}
-%\end{picture}
-\mbox{\epsfig{figure=graphnodes,width=5in}}
-\caption{Number of Tor nodes over time, through January 2005. Lowest
-line is number of exit
-nodes that allow connections to port 80. Middle line is total number of
-verified (registered) Tor nodes. The line above that represents nodes
-that are running but not yet registered.}
-\label{fig:graphnodes}
-\end{figure}
-
-\begin{figure}[t]
-\centering
-\mbox{\epsfig{figure=graphtraffic,width=5in}}
-\caption{The sum of traffic reported by each node over time, through
-January 2005. The bottom
-pair show average throughput, and the top pair represent the largest 15
-minute burst in each 4 hour period.}
-\label{fig:graphtraffic}
-\end{figure}
-
-
-
-%Making use of nodes with little bandwidth, or high latency/packet loss.
-
-%Running Tor nodes behind NATs, behind great-firewalls-of-China, etc.
-%Restricted routes. How to propagate to everybody the topology? BGP
-%style doesn't work because we don't want just *one* path. Point to
-%Geoff's stuff.
-
diff --git a/doc/design-paper/graphnodes.eps b/doc/design-paper/graphnodes.eps
deleted file mode 100644
index c1ccf44ffd..0000000000
--- a/doc/design-paper/graphnodes.eps
+++ /dev/null
@@ -1,168 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: 0 0 594 282
-%
-% created by bmeps 1.1.0 (SCCS=1.73)
-%
-/pstr
- 1782 string
-def
-/inputf
- currentfile
- /ASCII85Decode filter
- /FlateDecode filter
- /RunLengthDecode filter
-def
-gsave
-0 282 translate
-594 282 scale
-594 282 8 [594 0 0 -282 0 0]
-{ inputf pstr readstring pop }
-false
-3
-colorimage
-GhVOjDi>]<FajlqSJie3"Aig\TXkI[MM+kbD;&*L=t/GMV-hs)5>n9_WC$R38uPNS
-:\/!h(->g0&o'd+8jO"#,u#\]-qJ1e";8Kq`509MM1b+?CGo=.n_,W;mpme-e![aj
-B("Hbs6'BNh5d)*o60!7giMmDpRL,(pWU;Y7i/+RPG?h0oNsh*1qc+:\e*?imYf?h
-re5U2P]Er&[l@U7MGMBC<a&dq32GfDGWpC0c6`qhbLO?+4%u@8Z/Vdnq"treSqVDa
-\U#EJUY%e5Ph#d,:B[]`lVll3`Q9BVa#HgAoB(Bt*4*aZo7("N(W4Q'r4i65/`js/
-061>D:!%,B]fqbFk0:H<3\DZWUJuk]n`SCZd8H)<CDVC+qoL]1fjpXph0Q![-O?Oq
-n2%`,NU$PO:5qJ*XDRK*P<t":(jqY4cZFDZM5+?Fc#ZM$-E"'\bBrOCFfhh@jSBjM
-f:%bZ^h\g@?;f;.19A;qa6-IE5bGYGqlO2:J$;Gj6N""i>pE_P!2XOs^VlZn5=9gq
-SE9TkJS0@]8s0%XFBHtSSdhZ7mZ"DR\ETm=>(Yd+lps3F+2>#X8RI>kQHh'^kE]G/
-a-5/<G.p/S\TAfTXlOXK5G)$?o9\G+,^,uSYE+&$4BjjYqN7SgY7t'?'`N!Q^[T)g
-/]C$ZS1Y)G<UX2C0U&MVY3<'G=.rD^)@r<3<ggnVGFjRkYJXjJq:Y)V,*4CW$M@nY
-NL*V(Qd.j5TJKEVZ`/?XB$ZD&"QGh-OD_k&OP;`"JT]DO9<1iMLL>?j@AaZ!H*6[I
-W$g(]g^4*1cPI-WK.qdDQoH*_jR`3(kp3I@FTFUH.,QhO4Pd\`)8Xm2MW:P73+qe\
-l(RWFgm5I>8e&2oY10M02D"Bgl>$6gA8)eEL"!-DKD@0"<oXfT1(9!LgNJujgbDB8
-lc6]'n#IO/CtkdTgkJ%iQsJ=e777##4S;<q4[KHA&kX:>#m>K/.3VuT5IN3;!3&q6
-9.PR*SN*mGlIajjqQ8^eneFI#aI<?j/=R07$/0'ElO9To55d+AlhXG%89U!ZlcAtO
-S^+cHqB;RVg</;?YrJof2t`YLp8K6JL$7'B=mp27ff([#\Wm,[0\m!:a1-7_X">h)
-%BW3%i[Ym_R]4`UTdSXfJ3)6W4TfuNFO]o*I_.]iijHIdht#$U)$0f3eA.uk[0r'b
-<A"ZaLu8ql1t,nPYn04AUs2kUP*SgT5[l%shgKb2=^:R=o.U-77ntMWVsgE(;dCQ4
-'qE2$X</F>#Aj=';Rad""$Q7lM$q$i%F(T&OXpc=%`R%j9CL[no72iYSO_=(6@q]E
-J.C(`=q/trfLN`&@=,6Ocg0I1TGQL%CC&iZ8+6Rqj*#<^Q;eI=.Y2TO+Q_EAcn?Wa
-D`X6FY=JerlZAa_r)+9m)OZ)5&nU[lbp5nB+FEJ'*7hr1Vt+RqGW-&sK7DXdY\rA.
-'@"E3Fso6;ktS/,81ZP$Ch'):.7*M!9j[YpCV#.'e9%,qS"bg%l<IZ1%_jaOckeR2
-F!CA@j9?J!%DX7aLW-KB&G]IqK+S7pmr+T0\AHnIN=TM_haXFkc8VpA*cjH6oRT1R
-W1!q;(eP6bqGjNuGV]RF$erJQ2pbF?Q(;q*7rI^=CRR[[m@s#RH)V]9i8ALDoJrab
-U(6UuF1M;D7$&]1@qm4$=.4CHWM4($&XXX%_1PuaeN.338X0\">3;Y@#Fe)[1)cT^
-`W@OtV$9,#QRWFc7:7PH<%8!uAtNHE*VKHXBJ>-B?pFj<+>3,,V&^Q/bcCQL_^]X4
-bg"PN1V4F<Qeta">h%#hd1CBhK/Y<d"f0UX.ttb9Ot@,t\E<1SL3^WGX4.65Z+/%6
->Rs%7SBu)&b[oN_ERW$FaNtClNe,n\X+=I)**h430XhM!i&c6kAcE#+[h7e2>D>?0
-:uV.oZ`qRK\fpLsKWeTG4SfYLl+;^NC8O9Z^=5h>Q1P[)*+(FKTT)tKb&s^-s7``i
-c%(Q68^3oO+_G6h/*VT(D&iLWh^,rI5G]u>F2HJY`_6:tF?Yp-q"-$shiEhNke'kW
-?15Lfc3(-;jGpX*W7<ihq>/'WjnVs:NM6oShm"ppNbghEDn2Oh6Mt+Xq&1!Np>/HE
-a(AjV,f?ssgoh)WR@=u%!BsirW&BkYpp=-Q'udI76+k%AbLNn65G6ZLjjlWDnjA@R
-#D_*9#PS'?X9(kKN)=MlV$]sthLR%c=V_H=H'1s\:"BorK7OP%g>'r;Zp?h\ecr6+
-KI(MQe&(6N]\Y(0cBC/q-G&`k-V#S!@2;3cFXT-:klfY]6;&!-[]gF(4Z-WZ0bt"M
->!pLt&ksVXea3>AW*0WX`WL?;DD5D9=<+rK)=5e#C8&qCf8Xbrk(;fL>lFk.*84PT
-Pc?uRaumCeIj/2&fEH,Z^'mU".9EH[X_,,FaK$GM(mQMO'"lZF`OflCE5K;^M+3pJ
-TMKOa+ST^jX;!s>c``QXaL\O'kFdTYfS=n-]:T+-4bN[0RgNB$\GoD"P^$WT*;%h]
-a&ih_/Z/le''^/Krf>WE+ZMnnm"(k)7DVB.8L-uOfPEb)f,Rc0>KligeqWmJ'[Rq+
-#8kT>ZqA\8e5`d]+n6/\QP#Q!R:ZOcnV:ddH4A8R6Q4fN*Ms-2i%+Jj3sTq#crqmi
-RD(mbp`cS0J^/m8H=+2Ola/7],0-c)E)XnZd3sd91#00]bu09lpk6t2r^[HGTL0:G
-Ta=p`4_c^is3:9]ac?s6k<9-:dM302pL3'#"'TMb%LhL)-gGp`?V:/T\9RK$P4qW=
-T.M2s_>mEl=M[TMaJm0<n?jX%m>(N1Unl\'lA!?J7@\#]Bsg?7;&b;cYhlT<:QtJc
-Q:>a-,<\\*?hq%f[7(2\>1bW9>B2e!1g!_G[u,K;F75r4,c?gtaL7\L2Q`t>/!/`\
-qp4jE9$Slnh=1\33IF]rI<YAjMm=tm@pt$d:7^j-[=>(Mmmj30032FeK0R#7IuHDT
-W31!/?O_U>:WUXK[S+\Y%5qe)%-%NQ?ubB`Kb'42F_(B]Tp5DfXO\iNLXRe/EP#1r
-QOiu)T=%iK+H'dl*,]1-E!S)tFOQac@e^.YWJZsh_qWS<'VC-!DbG<^G/.33fu/lJ
-5i\eM/]De)!Dpg@6#Dn%Hk1=WYJh[6T(:kXhY)9pf=[-)0!AWII(:PD)j9]sp=(DQ
-GrF=X6aHC`2`?l)g@5e^"8t"=j>YVrfm[5H>Ab5iY?*qqmaXG)='VfSUX`)B\(;!9
-$)?lDAdn(AYuN5EdV\LW7G3oXM-P1c9g&;7qmh&i>Hh/Z>Li(%[8clI0dEpQ;3IQY
-GPk*_Md2IK"&Fa;iMd]haBnt*]aqRbS,#8s^$AA(=DD#f$JBQ5?KPuGYmCij_Z&[o
-$ebL%T/>93"`*K<;+%dJ_'hu[=/nc.UIohOEsXt_*8>_Fi./Vf#i1QmIFLnd5qiq[
-#YHVTJkBBa`Jn]"^PfU4`b*[dq_c&U<F83o;V#-WN+b-][EaehDA2@(I=1(2.IpX>
-`+S0GR2Ye1=mWTAc>DC"Pg+[8;33K<F%rV.,"YLA]L8hOEp^!&5&4?n602DW:45oP
-Vr!!Y.HK[cRW%A58]dU5<ff_epn_$fs3kZuBf0C=Y0o58Mt@P5D*qjU,dP=Y1$<kL
-*<_T!"J9Z(.ZE2mG!dsI'u\Q4.'2j2"o'i(4@T^CWeVDte#=0jAfS!5B+hH_cl?.L
-A3Eb:]@Xr.n$$>lZfH[9,Ui7=q@)WJMhZ2AAsVoS9eUsl+2B.Fc_&>ZT"`4+dH*X"
-!\gu-rk(WQ59f,^Cpb,M\rh,Q1GtdaY_)0']Ig<a`P<bY0r'VDs"]aR,lMjK`VV54
-g&,=.G^^M`k_`WdmtZ;$dM?jB5)N1l]=35oe^.V8RKAZ.NeTC"BS`s-=AWk3@h('O
-?>ei"NO@L^nSW54&'ND\_h&dP2YMDpa/nuQfHR[h`n4K1-%AeG`&:&*S"`IB[V:U8
-@Hcf(IoHWI5]8SaK0I`)'oI[hoZ^%,cmC!NZeJ)jHNfo^)uJ"#TrAM#fn?V2T?&52
-[!#:WS6f%44N+.-r38gZ)s!LPcqCQBZ8%(,9q.I\9N*)281j0&.(2a7gKqF@n101$
-O>Ud.5U6;eNnP-U)P[VCQ/Y+d7^/d2'N"Lr%)ut]e"akJ6[jKb+cOo_M+edEp%mDo
->EGpE4&?$'L*qBjc8L3u1UKGe2l>=Z]%nrY[GXRp;'.FTTD2`-N;YZYonrD_c[i1>
-R6YfR#T>DODc/Argc&WeSF-c)g.W'^b&kEg)`;iOgX+Gr9fq(Y]RktkJTiLeo!2tN
-hgI<GS;la?+Lre.1U55lTnXSU=N!X;]9^2/I(R$_Qj,20=VG0PRJL[^4u-8k^l$Pr
-%F]g+mr&u:?"DdX*@3[rrQN?X7AjR8c2A+L"j+S;?n((;=OVf&3!ZCEYsm'Y`jI!`
-@#q`:&/_^#Q+X2[kuHh]FCKpESJdp#=IORAG],fVCnKM6_;@]=g9ui'J<@:BCHEXM
-`/n]fUZoikC`^!$#919lc\87e$pNH*+&6S6(\'2\AS5mJ7p+itN0Pm@i$3#>M7gN'
-,Z4#UAEMInh;cT00<+g8aH>j6CRc\1E[M=OhBq$nl-hAZL9GrTfZrfCf3t-$Z'^b!
-N$u.t(5$J5aBX-j"i:Mr^7/ASRst,m_L%?1G$,mukB#e8G(3?ZL5VbG*ZVl9Msb4]
-`SnPXjHnliZ)0=TDX&IX$[Y5QnEY*hQ<F?T>bg<>RY&WC!!m#F0tc!(aa<mph?!A#
-n)aH*"4t]P"Z<)mh=&b=c^Q"a'u#`jeX#)-MGj1q>!,_?d%?1(N3NZe,OHo%oFfB\
-MMWYuQ\A8'mQGUCS"f2S[J7kI9$Ul7AYItiZVHaf[7-$rU-t:o^t+jfIf63"cJC7b
-4LnS56phbs;DYb1gAu)ZN#f^=6./Ht8pT)]Y;PXLE%bW?6q!_DmS&hE#d/%P;J2J+
-s3d]t>_,i*35GqB"!JjZO^Dg7JjsWga>A]&k0.PXjk$BXo,TuFbt^?>*[pGJg*08$
-ppf_6a1/h4>2F[>I'jDE_1N$?i_!Bk4lOHnAe:fV/U3Aa%6/gXaKqTQ'oHen\:0W@
-_i^n<PuWqFHL+[<Mo])Tjo02af5M/P^M`db9>/*V:]WlQ#pr$Par%"/!@R^[8&N`+
-o"t,GKG3H.\)gDTnG"GacVY06Ll7jC1o,4aS>O#PgFsNsO#^.0P[Sg:RV(skjjL\O
-V?rj!3rlYR,GW'%Md->._2@hE3mH)r^:1OlT-d&bBnh:X*lS<=S=,5dN2c(T[/D;q
-#tE-\b_r_O>=>::F<n?'-/)3%2n"Xr^Hqot4ANiFK?,%4*+VT&6Qor7,>h/KE)jX!
-!'>&Z<SAS.pg*jiiWK1'eq6tLZ5qZC,m1EKYDYL9'1DIe[WFFhUJ<9N:G]O=QZ]lH
-m,5E)Eku<Q&B?q$I9hU/W4>^mqp!-+;o/R"Ocb3#1\'3EDQq#,Lsqb),T?rT.^-+n
-NEGl(!ZUUGA^<fiKZKc`r(JqhB`l;eO*=#WPk98ZT;VV<2*%.<64adS0+r0.m&)W@
-=:uJjC',j;Ark;:]XZYB('G3U+A09iWg=X8",l50ijF]^om94g9%b0aEu+B%<F+&u
-'QN:<-8(Xi6]o[d9T`-URcD6s\"8C&S'[RB`Tja^`g%PHPq6)`(JP;K;NehVBFJ^M
-+JPjLpn5cQ]BYq4luTcg*KSV66$p=!g%!;YGnIld(:c.9=s&lb]2_=j`:)2bM'DQ9
-I,^\+,(j0@%Q#A>f7<%E!B4eL6f2XA!?r2+;8Og-/Gd5t:<eMT)E$VU!JLuVm*%">
-9nJbA_l4TaKA[>BJODXt#\R;_B-!qZGA4$DXn\hQ9%tt7F[q&OIAJ*/+F$PTpN8ge
-ehJr_Ns'=n#UcQJ9@`_K-[eP7K+p$R>$"uCqm>[Gb0'.ASQ%l]`R+?#1J^q^_]ki7
-H"W/LDqImO9'=au>Jmc8'hAe!(u\dnD?&*^Xc>V/8g9CqGE(/&V]j/J4)^u2)L(n=
-B^DY[Qq2OlNbUbKSZU3NBi@Oe,n'r=pY?8Dmoc0sNf4T_jp12igW[OU%=MJ:P0ESq
--.H6KOW+Dk%,grA#GnG%3osd^\*&H^Ir;DuqZ4)4!_/'M5gPfhEtJnE7[B3pUlCVL
-kTPk2UX_VY3G"@LN(TPh_&IrfdQS*-bOEMY)1=P+](St7[s^P]cZE@9BiKIA8B[,0
-8HX:iE#U,*4@4M$G;*fI?sY7qrAKG<LdXYbk;HjlJe&$F_h+<!';$0.d.h7imUM"I
-'K!S8IMn/]?IIns\1biuVrjE/P9'(P=^A#J@Zig0Le(=(2!j]0aPP34K<4I8QEf)o
-RhW'<[D+\Q5r<ih-YU@6)44qViie5RGL;*?M_$o%;C5SCJ,3<I\OOVIi68m_(HI.`
-[LCs53'gRfr6P;)g2l>omojQi]:2EI:ZoAl]A'gk_YnHFVt-9DOM/9n*XcPP9<*UZ
-Q;_=ZjmSEg[RVggGBB3+A@35u7gE8tWjGJ?3,'WG&ro.eb*R:F5\MDe@+i$3,fh!i
-:"6?O7_.]FCY'p4!8><</oJVZQ*]El>?2V2RJf!n5HRusha^CDCAVU^6h0"rEYT0X
-&VQ<94-0Bps,QQC@C7t;5BC#@?ekB%8s:c"&&uilDNk%>%2OJ2-_L]h*[9Ul"0<5n
-pa?P@^62jXoboK0K9G>&KbkW4P^^Hkh?rl29aBVm*_"5"U8cd=0QPrQeq;%m?c6NR
-&0po_:>/n[Q=#/S&iZ(?bP1aKqn-n-%5DNRGkRf>JKSa(*'_e*MBAR.,NGBmL=p6P
-l/1=&GASg*(+(g)R*)I\nuUq317rQp6CEF>M]*t-kQ9#OHEO5N:YC\TNXiV:RZSPJ
-@BB^<$&u<6E7>?\b]:X+]Cd.3Y'oWh-.e:4mLE97+9PV6o4o8hfuO[0=I)H*dt5aQ
-*iV%!8K0]J1g+TZ+f"(hS%^e@7BLdCm(KWso*U#6q+f8uDb'I+25,,mpIZ6\8r^/Q
-]/+E+q'&['C?#bm!(P!:7V*D8$XbfA;(ON;%mYEo[9;Wm4X%8NTWr&./*!%^P\bYT
-5m&)E*VUK%2osk3p.:$NduA%2It0[INLn8GeBeR<-p9jl&i=IPTQAhBPi8*_Fb3L9
-2sA1l,@_;MV1H%O#Ea^8J9M4++kI5,.ln+bR)1Eo\G#'8ok.Q)+c#R&R>,a[:?iYh
-;e+9$#0dJOWTYUj-kK/F42b!3mfEKE:K*Qh[-%h#7sm84)TWKElE-C]F"WFPNCOD:
-\R8R&qZ)V"&N%L%DO01ZOLBgGl/Q0+]#[/j+5Pd@.3=>4!$[sOh@TS=8_iX:]g;A(
-0(/Vq+Z?9KrObJ1mZR\^d(M8FM^(1!ERiDG#)Xrs9Rhi$NLM%"F8P=ZBr/I]5L*T$
-grD+i+.3U@+I@2n96l3(_<';d;h2-V`],*8^jY-ikAi4iN/%f_:T'O0I(W5=qV/?&
-2`%"KJB.a8:W(DW!@%CIOoKZ^<M#@c1H:Rgifd>'cukK(%fue=g^!6LpG1LlkQrFD
-29:2U(0<J@hSmSHL<E!CV`EeMqqrhoDLe>[I_(-'1RlXj[iKRQGcW&KZBN/[9h4?I
-_sTm<VF[G(8=9n`YRc(RaiJt+.fdtFaEBH,=lHJ\Y`rqAJ>uY6JCT1Y0.:$:!B<JN
-"h>lB!#n7VOjP5oG_.#TJG.3-J$uuFWB$73DN3%QifIP?H<\9oJ^G5h<@0js.KfEr
-qq]<k>t-TAn'R&3Z"Psrjs98P.s`R')SjoZ!G:C$=S^B[*A5DVa1ZX_,L\fB;-@_i
-H8)\YbUcn5ZgUTX#8M[*!8:.j5X9nt^jY.Tfl$?3A-7q<K%HU6f.<c'\;d]F;d;)g
-4uQVl0Q:V/AUA!q>&qYlZ;#%c:F;R%^c*<Qlat7K81SX$\.:"BLf`+\QU*mi!G)M#
-*DlI48(ka^frd*$V^%Vd2b`HTp0f':cEac._="QSO4%Vsfhokd!Hn_#*FO'sDXWr8
-QfIgf6@^k2+1MitD$RoEn;:73f`>XhPT<SD5hQ0R"RZBdJbsu'"3M*%4.tqjZ3/8C
-#A#:Q<V^0G)B/#kj(u"6N-?u4_0?4F*K7K-`qu2O0k)#hn>?U,Se[mJ@)dg:%q[qk
-nR0AWJ\fh1C1,.bTdB_V@E"Gi'?B@u\q3n'b9g:^mN]NKTfq%1f0gsD(YI&e.5eAk
-bZ1_YpSR[qEda(`JVl<6HVNSH*)q8XY)fltV[^,W<#9<*$U52(DIF"G"q0tmEG<f:
-ig8Wo,^,uSYE*V+h2RErqV@>.l/]U\'8NSL0sn!B,Om8;2>(>[mI.dOpT91Y+'8?+
-X6rniI!ZNu9oAmFMu@D`s'*b@5E4\pa`fXG6CsJY[&9ImXYfd;>b*<-Mp4%aL#:J>
-2/+3Pn8+>hV%0mNr1jKjBli*7eJ[iu\>#d.:Q1eJ(KRI!WtP2t6cF$I5-MWj#kD2'
-n9G:;L6fB+>a&-poO`6CIEGWJFO-)TEOnFbL\O9ha-*Y0]7$[!+=_o#n<?Aae%o</
-aKluW.8F#/)-%(ONL`)+YS?m:ARn/[M)fB:(TT>DH%"]"B;Cg4#W'h/U4r@L,%<S8
-C"5aXfjq=C"M#H_NtXil+K]/VT",-q9!NE&Yk%uUlH<s+Y)/i&<SA/.B..1"7oH@o
-\[,9*)#dn"E<J:'[pSbk+HD&eUsgG&iW&#ALChSHF`#(IcUiP/^YkF-k8Ns(LmZ,`
-8`"-`I^+2EpoDJ>M#WN^1!aHehs%nZ`2aOo*cQK0*o"G*_s=VM]?#EK8M/fboBE'[
-D8XD3:Yn[1$"7&LYckl4<pJW-ij0-&Bt;YM.M8:]hF8`M<S2e#h/-Pu^0,h)W6X"S
-U\n?T1@m29h8cO."3\Mhj:Lu")ABJErjhfO#D.d;+RhWj&n#16bJ_'Rr.3s#@&8Fs
-9</"JV#1oe<s+$fFJe4<;G"828ZO[R9W]KE#WS!W\gD-_R1o^YiNYP42Oqe;q6&m6
-s42i,P@8th5r:O:4PDh"0qeND5+WB!=PDu&=]0Kr1fa*-enX3iF1^52_;>knBlLX]
-BLYm2@F(WF!\al%Rs4(m6,N3LP/lTl/J5a?Gd2W>%PMD$3$o1eOVFHAW'86@Lq/ae
-PoG]<!?0ND3p&uD,_aDaI4)seP\M_3-6QSfXhedD_F\16HC/)@KkRTj!)>$O["7%9
-D6B5)D40SQUj"t>'sP,GBNHcO_@C;#b4Y/s#/"Q=JK#Z6aoL"/UN22;/ICc%Ue"uB
-]?c8;r^8O2Gn1@s^['02cR?WTXYaq/ld"*4j3n6hI:ur.qDG(lF-1K[aj&iIf8Zb6
-Or[i<?g[<aqu7aROUer
-~>
-grestore
-currentdict /inputf undef
-currentdict /pstr undef
diff --git a/doc/design-paper/graphnodes.pdf b/doc/design-paper/graphnodes.pdf
deleted file mode 100644
index 68e98dc8dc..0000000000
--- a/doc/design-paper/graphnodes.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/graphtraffic.eps b/doc/design-paper/graphtraffic.eps
deleted file mode 100644
index a84383cf2a..0000000000
--- a/doc/design-paper/graphtraffic.eps
+++ /dev/null
@@ -1,143 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: 0 0 594 282
-%
-% created by bmeps 1.1.0 (SCCS=1.73)
-%
-/pstr
- 1782 string
-def
-/inputf
- currentfile
- /ASCII85Decode filter
- /FlateDecode filter
- /RunLengthDecode filter
-def
-gsave
-0 282 translate
-594 282 scale
-594 282 8 [594 0 0 -282 0 0]
-{ inputf pstr readstring pop }
-false
-3
-colorimage
-GhVOJCMt3EF[JG%)$pqO7S(n%G(K^F;`(G8(XOELP.48L(.b+8Ob*4)ImDCW62R>Y
-5HGO<Fr1H]>/u'-DC`Yb)[DB4)jR6jITs'/g5KaoH;L?XMWU?Y2nS3s=$,-(cJ7Tn
-YBfKkRG!i0]/-cTO*_rBhK-t*kM//,dl$1+3UP^>^A=DLhS%e1RVVcTmH/coI^_2p
--/A)fY!:s%S!R6CL[OJmLso/T9kVT@SOM-<O.4GdDT?Ibc$/qg%i@"6-bO49Co>.P
-"#a4/jnkLEcag/sj%jS#:OH52=nG\2FV0B#(d/l[r=F$/4Qhlj2FFL=Hhc&;&J`$g
-e/#mQQ%%cA4[bE&c?USiST&@qHQeW6Q<1<?3l70B^)I">&A7>i*.RhB&kZqmpiuqT
-;(;:1\^[8F`<fe<)dDm.L73akH"7:CV3Kg[r._&+4FZ(9HW8l3<+74k&%JL^0ok15
-[,a]$bn\sQcP$*%^M7Lam>q*%ek]FmNu1&pA5S"U,JuZG85EA52-4j+Fa)>Q]WpUj
--c\0AUZjm(rgK(!Q'CJUfn"L/+)^cpr0ER@>F\KtL:]+M%t+>D*CI0*(eUl!(XEHC
-$I9(6CE)"1Ous8io0`ntb7#Cg$&"&X9J(K:5Un!<:QB?a8(2a0*")gtAsRsn%p7_Y
-jHp%:/!9qS_<='I%A-l7LCc&1FrQqV[ZM!=1G^WceO%6YV*a`XLa9B7m^LNMqdY3'
-Q4<UR>^+0us6$rO^61F>EZnab:b1so.b)bf>Uo!B#Y'gi7FN_'.$fHM3n_"O`l(oW
-(Ph(J+H_ZdYbETV;*h>J]RD]U)MoC-)+9`C6jcNt=$"H,Yfb*#M/"S=ag+N;<)?)&
-/9*T#H2)>tq!dT0(po?TZI>;oH"-D60R!510A=+28p4MPmT29j@+ZGDPQChf'`4_7
-=89;sc_'deo<oChZ)I/0[+cegDPUat-1,bme6"/p$>N#m[0q+I,atN[9.Q94$\_&3
-g,5;nh9*RoFNa_4=gkG/akK[bc9hf.L^N%j_+MVk($!c^@@GEhD5&>b2'm@d[B;nR
-%]d"=L=Bg0GjGk))]]eG0VW]DA4A/7>a9V=6G]9H!<d(q')["DlRGP3ED_BA->`q6
-1*$1JTu:\fnZ8ssn>ri7:2H]'6LgW:%,TmWcA.k.S@0X)P)*g&E>k`Lc'B-oD;ASY
-\eH:KVUM`<Q;^gr))B8ii/#ab0\*N+iNOB"GcJ0%LpC%*TY,;f<5MddGepP%O+%Y9
-AjN/MkB<YK*'Ljm]G`d5$q;`&[Nf;5#^_2U>Y=D7fEPr[<7W\W<onQqh6!I-?lObi
-Y]k,^2CKMYm4=J!Z'tQIOdNT8UZjP"TO4$g7Ba!ZqVP7IOU>hlk=@qY%Z_W$65f7>
->bumq/d5R@&L^V)(kp'eRQC%t"`ZMg$nP/:[me8R6oURfnU^pdf*J<%JP-E.(n'\G
-&T6V'%gFZ8,#.H4JlulYG"<7("BC^WH]j3$J(>cAdkn-JkXrB*N2'8P&Tc6U9!),j
-.lrFf.T_4J\7QJEm0ZgoF>BOm/j;ipaTXksiF>E+>bPYX[9Q-!s"\QRfG?fmX?D@O
-$U*EpT?\k`J#-&`7pJ2>9]dJEI8:*F+]#k+^("B5?%lIB$$MG(=I<++YF&4(1YTjR
-IY1'5c,%T(]:3sl,,Ptq-Q2],6>cB_d(G(@ppOkK!Lb?Sl_&malpO"Ur>r<LlqCbE
-Y,t<i=&:D.LPi]7!L('\JhlJF!'p(4GJoN0ZY$U.`C,KS33a#@!XF%gT=1&SqgY>0
-`I@cjN53uiGuEuEIF?[28aa$G3<"j_WhreS'6pH%:mVSSN\6D?VPEA<enH"s"<et.
-`O(hZVPZVYBNJ-pZJ-9o7o/`rh%])C0XqtXX%5H>AL*-kX<o3N4+`p@,+l!eEWrkF
-dj!:`Wf\]:KA+jCf;[[ZMV+_lQ\d!7$'ulaoWfTm`d1=%P-_3`Zsi,>"p9EB_gWuC
-"9mEX22$/=k[#nS+-W!M_FduS+a6&ciEji'TPX%VI>F0$3:N%,KSVuOL,^1T8WeiS
-Eq.?kX!_aE]YOp$pN7\l/!Op+0=+>"F7uQ"5_hT+WO.%D-h.d#R>AM:XF%Bf+hN8g
-H^:'D-Ai+9b@(JuGR:>-,Xtj=FK;"KKsS-21jJhh#:2]rHL\m\3Na&hE`G+o<UNk@
-D8k%@&DMUa#>ga1QmU]E/%/S(_Yq;!=4%>MIF;'6-+R]2iFo(s8#V<^h/g[75cqOP
-_-WdW[-#A\QLk&eQ)G&,lO6Y2];anIYbMt#i&a"U@OHYclJ\>1$@(,1/;ip=,lhea
-rY<T\=,YQ\>X]#uraYLc@4LLXW)YUtb`6@l$"'pt9q'U_%<jH;_^l::>_(n6^=\mO
-^aMLr5t>ff79.tWd"ot@R>OP`OC97]Xk"G7em4.\YfVn#Xb%?gW4$HQei'Z!8b#mT
-'->:W8(Bp&^nJNnX1E\Aeq!ae=_6G3RoB/=]&=>Z>_qW2`=O"X2m_f`!XhS'"ThQ:
-mGNVkdDWb)#&q]OjM6@dpS*NB%*5:(#+0eS3O2upb1PR*B$)/X:j\1rc)*T/*#Sl>
-PAg#j*b7l<m#u1WB@/Xg9uY2jN]ll(=M=?!01\0Ij$>Ei3?;TnTNlJ9aEF)DF!ggJ
-R:F&'IIpSi1K(6Tg9,i[Vf:jOE?go3\ngpJ*lo9WnR!ZA/e]m4Gki4(N?hB/Ms?Le
-l)kEO,RsL@$&'9S,d]?(A+>W]nA1;K&im@`E+JF1\AmWZUgTKnmU-=]`%68V`W`[V
-i`7;mVI^:ke=D\U-nR5jn:'T+\?LoHne/(&j4d;fWH<R*#;[&DPH3E;XZr"A]q[PC
-/C(>[pZanm"(s1<R8r=Qfoj3?<k@&*8O,tL4WiGj0=8Ag*1Q&X?E1uh8=EK?,;ka3
-_]6kg#.GodeMLWji]/jmpm$CIX='YmVIsi*A8f\%]/5n^mMs#mqV$J38&FZ=i6P:N
-XXpuaTerLh^cVfMJp\mZ>_T?dkDF+rB$U\=OE%To=WP.=b1sKmKW,D$SjIXsJ*mUQ
-B`R:NmJrLqfPt;-+b;+`p).=o!nVR.,Mc72>s(A+4"e$kna]1,+tp#ugD$MOcEQij
-R!mceFd;q6Rf^_ZR^D$aqQ@+,Y:sPe\5Y'4FM5Yn@&i4]eQ,hLl(9Y@iQ&l+NE9rL
-Z+eUh9s^1alX^fNbd_soRSMH:9;\G"CbSNHIu%c"A4;3L\%*Pfka]S9ZIo^nY`_,f
-qp++X>?X3#`N1$aVUgZek:EO'Rc^e.8he$G4@a"QO_0ZW7.-\#DP\CY2?4[u_F4"I
-KIIloF1bT8I)1C?a]:pP6peqn!V6r-Xt;Vf3^\o\$/#DtFEaK*MIWZhNP!;]g3;0c
-cR`Y.-*G,YVPEW9^S+.+\DaVe6N$psR,S98OWCQtGH[M>&J`sHA?`Iog[gLb!qG_-
-MfFZIVn"coLZU(T9(SuRhAL%O&CIa8dDfWaIpm?H'LSS,`cnkk4oo5Y31l\a%O2Y9
-3%J+2XFY7oiC^hCPR6o?r&?H(Mih*<C1$@`I4C5%.SBR!Zj3!APAS03QH:fMq[`;H
-![kG;.JZa#Ic:4?Hg0k1!VE(7Sk`J&pa0:Tie4i(F-D;_J^:o#o%Th&\%n8?P9mq/
-:&'2.9<T]j5l0JWG*Sl).PJe:iq]j`(Ai*6)g!Oo%EOOLc$Z2Pb2#Bh>-J=e.PLcN
-([EM%1X`_!GF:CRc.Rl7Xr$'DVhsFQ]>5n)Rs>@..p-XfB;J"36e^UmJ9AEN)>[+f
-1pR'Y)$a9O_%o$69ANMFJL(]4Tr7#"^:D6X;dH"IP&YCj$g_MEM+fgQC`5JVlE%3u
-SIj:Ui@Z>BZYsX5iWXUhf*jiRif9(#l6D6NW4g@^7nNr(p&:?@a+G%5q'<6GYdF19
-:Lom#ZBENTHrO_+-.T9jdA5_E(fbuGn+LDEO!$<uS]L*\Bt0'8/(?B'![QPs8R%oG
-C\3d%`b%=-GW`Hs)*u`^L4chPL=m?pU[X9qLoIOr_Kkkq=2f$AJND]4a&=['\/<k2
-e(dS4&iK0F]rQghWrfk^Qi#7d`5A4=cSl*nA*]r(rdBm#9;r8m<ng.M3_a=3]%'!N
-VWGd%Ol!?/rauRiMUOUp;I3TV<1YM,SBTUbrV#s`L0rhlG3L&+H:!d_XTdP2Y2&10
-QSkJ%dYU@V-`frU-b3=.ER\X-$?'_gs'>H;>A%gB`EUC56"r)IO&;3,Oc>22+HgbD
->/%M_hi*AbnX_Qc!4DrBZ27ZkV?U:09J.TEgnuL$+a8e`NmdEB.RT\8NRd%_At,pq
-^H#Bi!kSp)?W(*&a&H_@\+)kIAHOm%EOuiWQI9.)pQe_30/en\?FIt-3BMrEMmi97
-7XXnOd(T&A^pg5&*3M)(pWN!@)Xl;K(U[%r^1/9pf+j%g\,.np")7LRE?T[3(:(Jj
-G-LGeaqVeoW(VI%.M^;G(P6*f*?BT`Y8;M</Y8e3mU2<R>r#o<@$*5:c2:Qj1VP@L
-RK;"n;!ubUIGH=[$\>Db[0@H0lUK!Ur9L0s*#E>-l86`K?^KZodfuor^4E[D/G=&o
-$0Wg`4<O_O7?-Z.CK"B_T*)IpY?1.QC)`!llng@<M0CHM7n6&C6f&^8nhL_I$UX'D
-Le+,d3'-r<D@e/SWSr8kqa9(R11CdUUUmbWH:97+f*"cnE8[l,Ii\k($i"O*X]pCE
-s(5]"P#H=+,tJu?>U-sno8knk:U#AW7i$c3bJMh^8"d_Q_3Ni.')k9[::#iF9%?kI
-C%UTM]49^WmlkccB4VHs'RAf&'B;DE#_[ceHF^[umAE8<5Rrg2*emIfXp<<4/_dZN
-qq8FcG"A2;k5tB[ieJ02Cl<5&&o4KL\lgW[V)fARTVBsErZDT@BbcsrmeG@03'Bhd
-_h%fir'JA>E.YYdBeB$d4SBD[90p`);^QV"%-Hu2Im;D;YQGqEX0n>/UQpuBZNOod
-81QBU(W;HYE8cmaXJb:LG/'r1CoX5UpW)W:IdB22\!J"@pig/8F=h`E&.eqr.kf?J
-`h`CSMWb(kabRo>58.d/e'W'@dQqoQ`Cq3;p-Ljp0*pmY:QCJD1]3`:5F>/\jI&gp
->bCD7Nqb"cpS1<WSaUrK88E$pqV>"d$Q^\c$utg#f7XXQ=4\#Kb>WH>Qia>mShr-B
-C-b3AoaQnN<_l;0'7M;:$RG#O+/tcRUZW2p^AsS``%irLO<I+Bq;.jt9m''60J)'P
-=7+HtocBFK`>I,UMf?0VAs@4"B2VZg#e(6A4m,'*cNPU+;j;gPhl24@(@q4N*,W>9
-iDO"j;PNZ8o!W"9.SEQ>RAp:iJeN/5mL5LPV(;sn[cB!).AoT*,IbhGGMboXX(d-Q
-E\J_MK=a0P5?F-to@[5l>pq(PZPs=fY`l$oQNRo`1l]OeK3_OV^P.OFX"C(WF:T*C
-b^5X'R?4kn"q?oq&KcqRmpR@?oQOPBp8oj!o!u4uXQ0o4+M/f?M0AC#`k0c'5'ptk
-qBCHb,[:hE2"#aCL%Q43U55so`)f0q'iu^clK0sGqd"4u=J6m%6-S[og4T;aQ#3Mf
-Bg([7(%`"^2lraoO4T;+H@^sD\pimLfhN-#\'><mYO,^>p_P'8FOBjfUidOC8rsuK
-hBbt<mAYZa5776%8GNG>7SKc:<h;PC(nOt;gmgH[309@U3%cO!q^;i9q:(5;jQG[)
-WbemcS"dr`89+;#)ThXeD6(h-Z$kd[ED=mi51c\;<fAgMR(Ao"PKeu&+\``%Ia,lO
-+-\)bW/[*5ba<A2hYY@(iH>g9L7om2s+r&^b'+=uQYLf"7gJ]@(\RaMdcVC:_J^n>
-P,DFkJr2fUV$KZ,$)!imU(ZmHYD\rF5Up,lEcYRS00f9!9D_AADDCO^$BP\n.a9D/
-'/=8^%ms_kQi1]kg<=Vmq5Vd+Uus5s:k`"^I7`V<S>><!)KiLI,jIERs$ME+$opeg
-d$FdH+J2=Z@(2t@a$ITnCrYJ`/;aba9U=lM.<@n9d@Db25X$t^UE,6))-MAP@VOg2
-[7t*Dkt;,o:2hFbn%Os*7iu;@s7nb^2WCOM-,[Tfb*!C_(B!tgdh%8G\$`:9IARMs
-U,!K54=u%r>%=i5!s;J?"5PWnj)-o=UH#>Hs!7A<HT^Tt?VI@#b4$cY')fD:rX4!5
-b@YaG`ZJeDIN>F&*+`-_[!QAjl%\u)U^O2OaD?N(Aa#\18DhP%D=#[7(549JWT$EQ
-_Y:*V`DS>JR7*Z<3tdr2]]-n[T<8l3V9l7?UguVM(]87eA'/CZl8m6#8L!-f9cc@O
-AA_jAMUtpuFjXJl7!JD0;4aoKVY'i!j$jn4k=@7Ub4V=UR%D$J*.T<3>XBXM<,(cT
-IN#V27&Pq/6,Tm3$Z635V92_PC\;gTr`Z",dd<Z<Y=BLK\LFTUTf(d)7's$*L=)Pc
-GrJBF.uj9Jj75a#k`GGKP#UaH3@8LgrQ]r]?Pgk%C@ZX&8Ut.m9&KmDSgi:aS13^!
-H8o'%\G]CT9f\t+Bs"mo&=k;Bi<$SnW->>Wb;%^HAUjNN<?ro4TIE$u;`Eh?4u;jl
-0K)_l/YP7/&?U8#s7XH!_=P-DUKJlq;@@V=)q<YE?/u$*c]dB.da<0.*oDrY2`:Z7
-,8sn"ro4B(%m'\Eh)u"u,GogdUX\qHRpGJ<gtkHroAMmo9).]Z3SOl7Dh\'Go`$DQ
-s"2iF,.`28#*ajLq$p&%A^<eE/VVq9/)tLG3_=FS(KLtt)e(ZL?qXk!l\.<Dm(TOa
-%/u%NLp._;_.e9A3^rN&OE0bS04`,b78MbDY'D1]G7_t@b\;#l#BAu83l=U97#Q6s
-^m=N1;!pkDRN<]l3n!%E$A#D_Hqc'=L=5Tj%8cb.9#HM<iu>%m@j7g^!9Sh_OH;p9
-,$LfBr"bj^kc)Y@1-F&q;A5]]U71s#W+%O`*pP#`DL;M[".mNRbD>?gn5.s!18i5m
-Sci[q3j0]ZhG2f[7E4,]49dL-TM>o9\jked-_i$VP5k02]>-G\J)PIY3^WBu6AM'X
-s.`*Q!&`q;DRenNLH_gAk,=k[icc;s6r>3gf\Hq68Gkbei>4TADbcJKeTLKV<Heml
-[7QCFaRNp(Ld)E3H[F',BSN?H;SlH$<M,N1F$9R>b$\SKJFf=a@%A&3oeW8g$6/'L
-jAj`mid;ea-F@GF>=7F_hjG.L187EmeAG>_0IifNMHC>fcc;+jK:CCRO3(X!,SQM$
-S!hdF/7`cDOh'unOb/XJ>8f75ag:KICueG\TgNA5-IAeq<-%NX,,W;+/.6i6o2*OL
-;G')Pl&"biOff@qN"9`q%O22D>;"YnAsfr'YW7`6[/o2tX!T=]><jiZ&k52>-^t+_
-e6G[MD7k1":h"T]M:JOLW_SG&L+*;<$HsODi9CmGge:_J-e/D2BrfiS`[.un2`4'a
-MseCj-YdUAWI*PMUTKfejB.g$,:g+C6Tr<t8"%"+Lb.QPcI2;,)2#^uhs4\1KM:-"
-N*KV.*F,6*UO"WnaX,"$.ML5cb91TkX"(1P#D"C+f,Et3*p])_+qFE/hJ6=6Ts]^!
-_la#r2go;KYO]p4l0?%d68`)T^q,?BHcZm?aSTJ!iq7tu)7:;"9Zchp:#s$5OPt`i
-]B#Q0_K-7,^oRWLlUdkF9dHIkFn)pIT="^BKY51IZKDf)^W1fFT@;lX=3/j'^fZPF
-VQYR0O+4`aDh"C[p\mCpac"F
-~>
-grestore
-currentdict /inputf undef
-currentdict /pstr undef
diff --git a/doc/design-paper/graphtraffic.pdf b/doc/design-paper/graphtraffic.pdf
deleted file mode 100644
index e37382f6e6..0000000000
--- a/doc/design-paper/graphtraffic.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/interaction.eps b/doc/design-paper/interaction.eps
deleted file mode 100644
index 9b4e3db619..0000000000
--- a/doc/design-paper/interaction.eps
+++ /dev/null
@@ -1,463 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: interaction.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 3d
-%%CreationDate: Sat Jan 31 05:25:23 2004
-%%For: nickm@totoro.wangafu.net ()
-%%BoundingBox: 0 0 449 235
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 235 moveto 0 0 lineto 449 0 lineto 449 235 lineto closepath clip newpath
--62.3 239.8 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Times-Bold /Times-Bold-iso isovec ReEncode
-/Times-Roman /Times-Roman-iso isovec ReEncode
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% Polyline
-15.000 slw
-n 6000 300 m
- 6000 3975 l gs col0 s gr
-% Polyline
-7.500 slw
-gs clippath
-3615 555 m 3615 495 l 3464 495 l 3584 525 l 3464 555 l cp
-eoclip
-n 1200 525 m
- 3600 525 l gs col0 s gr gr
-
-% arrowhead
-n 3464 555 m 3584 525 l 3464 495 l 3464 555 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-1185 795 m 1185 855 l 1336 855 l 1216 825 l 1336 795 l cp
-eoclip
-n 3600 825 m
- 1200 825 l gs col0 s gr gr
-
-% arrowhead
-n 1336 795 m 1216 825 l 1336 855 l 1336 795 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-15.000 slw
-n 1200 300 m
- 1200 3975 l gs col0 s gr
-% Polyline
-7.500 slw
-gs clippath
-3615 1155 m 3615 1095 l 3464 1095 l 3584 1125 l 3464 1155 l cp
-eoclip
-n 1200 1125 m
- 3600 1125 l gs col0 s gr gr
-
-% arrowhead
-n 3464 1155 m 3584 1125 l 3464 1095 l 3464 1155 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-15.000 slw
-n 3600 300 m
- 3600 3975 l gs col0 s gr
-% Polyline
-7.500 slw
-gs clippath
-6015 1230 m 6015 1170 l 5864 1170 l 5984 1200 l 5864 1230 l cp
-eoclip
-n 3600 1200 m
- 6000 1200 l gs col0 s gr gr
-
-% arrowhead
-n 5864 1230 m 5984 1200 l 5864 1170 l 5864 1230 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3585 1470 m 3585 1530 l 3736 1530 l 3616 1500 l 3736 1470 l cp
-eoclip
-n 6000 1500 m
- 3600 1500 l gs col0 s gr gr
-
-% arrowhead
-n 3736 1470 m 3616 1500 l 3736 1530 l 3736 1470 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-1185 1545 m 1185 1605 l 1336 1605 l 1216 1575 l 1336 1545 l cp
-eoclip
-n 3600 1575 m
- 1200 1575 l gs col0 s gr gr
-
-% arrowhead
-n 1336 1545 m 1216 1575 l 1336 1605 l 1336 1545 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [15 45] 45 sd
-n 1050 1800 m
- 8325 1800 l gs col0 s gr [] 0 sd
-% Polyline
-gs clippath
-3615 2130 m 3615 2070 l 3464 2070 l 3584 2100 l 3464 2130 l cp
-eoclip
-n 1200 2100 m
- 3600 2100 l gs col0 s gr gr
-
-% arrowhead
-n 3464 2130 m 3584 2100 l 3464 2070 l 3464 2130 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6015 2205 m 6015 2145 l 5864 2145 l 5984 2175 l 5864 2205 l cp
-eoclip
-n 3600 2175 m
- 6000 2175 l gs col0 s gr gr
-
-% arrowhead
-n 5864 2205 m 5984 2175 l 5864 2145 l 5864 2205 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [60] 0 sd
-gs clippath
-8190 2430 m 8190 2370 l 8039 2370 l 8159 2400 l 8039 2430 l cp
-5985 2370 m 5985 2430 l 6136 2430 l 6016 2400 l 6136 2370 l cp
-eoclip
-n 6000 2400 m
- 8175 2400 l gs col0 s gr gr
- [] 0 sd
-% arrowhead
-n 6136 2370 m 6016 2400 l 6136 2430 l 6136 2370 l cp gs 0.00 setgray ef gr col0 s
-% arrowhead
-n 8039 2430 m 8159 2400 l 8039 2370 l 8039 2430 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3585 2520 m 3585 2580 l 3736 2580 l 3616 2550 l 3736 2520 l cp
-eoclip
-n 6000 2550 m
- 3600 2550 l gs col0 s gr gr
-
-% arrowhead
-n 3736 2520 m 3616 2550 l 3736 2580 l 3736 2520 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-1185 2595 m 1185 2655 l 1336 2655 l 1216 2625 l 1336 2595 l cp
-eoclip
-n 3600 2625 m
- 1200 2625 l gs col0 s gr gr
-
-% arrowhead
-n 1336 2595 m 1216 2625 l 1336 2655 l 1336 2595 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3615 3030 m 3615 2970 l 3464 2970 l 3584 3000 l 3464 3030 l cp
-eoclip
-n 1200 3000 m
- 3600 3000 l gs col0 s gr gr
-
-% arrowhead
-n 3464 3030 m 3584 3000 l 3464 2970 l 3464 3030 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6015 3105 m 6015 3045 l 5864 3045 l 5984 3075 l 5864 3105 l cp
-eoclip
-n 3600 3075 m
- 6000 3075 l gs col0 s gr gr
-
-% arrowhead
-n 5864 3105 m 5984 3075 l 5864 3045 l 5864 3105 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-8190 3180 m 8190 3120 l 8039 3120 l 8159 3150 l 8039 3180 l cp
-eoclip
-n 6000 3150 m
- 8175 3150 l gs col0 s gr gr
-
-% arrowhead
-n 8039 3180 m 8159 3150 l 8039 3120 l 8039 3180 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-5985 3420 m 5985 3480 l 6136 3480 l 6016 3450 l 6136 3420 l cp
-eoclip
-n 8175 3450 m
- 6000 3450 l gs col0 s gr gr
-
-% arrowhead
-n 6136 3420 m 6016 3450 l 6136 3480 l 6136 3420 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-5985 3495 m 5985 3555 l 6136 3555 l 6016 3525 l 6136 3495 l cp
-eoclip
-n 8175 3525 m
- 6000 3525 l gs col0 s gr gr
-
-% arrowhead
-n 6136 3495 m 6016 3525 l 6136 3555 l 6136 3495 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-5985 3570 m 5985 3630 l 6136 3630 l 6016 3600 l 6136 3570 l cp
-eoclip
-n 8175 3600 m
- 6000 3600 l gs col0 s gr gr
-
-% arrowhead
-n 6136 3570 m 6016 3600 l 6136 3630 l 6136 3570 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3585 3495 m 3585 3555 l 3736 3555 l 3616 3525 l 3736 3495 l cp
-eoclip
-n 6000 3525 m
- 3600 3525 l gs col0 s gr gr
-
-% arrowhead
-n 3736 3495 m 3616 3525 l 3736 3555 l 3736 3495 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3585 3645 m 3585 3705 l 3736 3705 l 3616 3675 l 3736 3645 l cp
-eoclip
-n 6000 3675 m
- 3600 3675 l gs col0 s gr gr
-
-% arrowhead
-n 3736 3645 m 3616 3675 l 3736 3705 l 3736 3645 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3585 3570 m 3585 3630 l 3736 3630 l 3616 3600 l 3736 3570 l cp
-eoclip
-n 6000 3600 m
- 3600 3600 l gs col0 s gr gr
-
-% arrowhead
-n 3736 3570 m 3616 3600 l 3736 3630 l 3736 3570 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-1185 3645 m 1185 3705 l 1336 3705 l 1216 3675 l 1336 3645 l cp
-eoclip
-n 3600 3675 m
- 1200 3675 l gs col0 s gr gr
-
-% arrowhead
-n 1336 3645 m 1216 3675 l 1336 3705 l 1336 3645 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-1185 3720 m 1185 3780 l 1336 3780 l 1216 3750 l 1336 3720 l cp
-eoclip
-n 3600 3750 m
- 1200 3750 l gs col0 s gr gr
-
-% arrowhead
-n 1336 3720 m 1216 3750 l 1336 3780 l 1336 3720 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-1185 3795 m 1185 3855 l 1336 3855 l 1216 3825 l 1336 3795 l cp
-eoclip
-n 3600 3825 m
- 1200 3825 l gs col0 s gr gr
-
-% arrowhead
-n 1336 3795 m 1216 3825 l 1336 3855 l 1336 3795 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-15.000 slw
-n 8175 300 m
- 8175 3975 l gs col0 s gr
-% Polyline
-7.500 slw
-n 6300 825 m 7950 825 l 7950 1725 l 6300 1725 l
- cp gs col7 1.00 shd ef gr gs col0 s gr
-/Times-Bold-iso ff 180.00 scf sf
-3375 225 m
-gs 1 -1 sc (OR 1) col0 sh gr
-/Times-Bold-iso ff 180.00 scf sf
-1050 225 m
-gs 1 -1 sc (Alice) col0 sh gr
-/Times-Bold-iso ff 180.00 scf sf
-5775 225 m
-gs 1 -1 sc (OR 2) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-6075 3075 m
-gs 1 -1 sc ("HTTP GET...") col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-4800 3975 m
-gs 1 -1 sc (. . .) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7125 3975 m
-gs 1 -1 sc (. . .) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-2400 3975 m
-gs 1 -1 sc (. . .) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7125 2325 m
-gs 1 -1 sc (\(TCP handshake\)) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Bold-iso ff 180.00 scf sf
-7875 225 m
-gs 1 -1 sc (website) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7125 1425 m
-gs 1 -1 sc ({X}--AES encryption) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7125 1200 m
-gs 1 -1 sc (E\(x\)--RSA encryption) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7125 975 m
-gs 1 -1 sc (Legend:) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-2400 225 m
-gs 1 -1 sc (\(link is TLS-encrypted\)) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-1275 1050 m
-gs 1 -1 sc (Relay c1{Extend, OR2, E\(g^x2\)}) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-1275 2025 m
-gs 1 -1 sc (Relay c1{{Begin <website>:80}}) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3525 1500 m
-gs 1 -1 sc (Relay c1{Extended, g^y2, H\(K2\)}) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3675 2100 m
-gs 1 -1 sc (Relay c2{Begin <website>:80}) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3525 2550 m
-gs 1 -1 sc (Relay c1{{Connected}}) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-5925 2475 m
-gs 1 -1 sc (Relay c2{Connected}) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-1275 2925 m
-gs 1 -1 sc (Relay c1{{Data, "HTTP GET..."}}) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3675 3000 m
-gs 1 -1 sc (Relay c2{Data, "HTTP GET..."}) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-4800 225 m
-gs 1 -1 sc (\(link is TLS-encryped\)) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7050 225 m
-gs 1 -1 sc (\(unencrypted\)) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-7125 1650 m
-gs 1 -1 sc (cN--a circID) dup sw pop 2 div neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3525 3600 m
-gs 1 -1 sc (Relay c1{{Data, \(response\)}}) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-8100 3375 m
-gs 1 -1 sc (\(response\)) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-5925 3450 m
-gs 1 -1 sc (Relay c2{Data, \(response\)}) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-5925 1425 m
-gs 1 -1 sc (Created c2, g^y2, H\(K2\)) dup sw pop neg 0 rm col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3675 1125 m
-gs 1 -1 sc (Create c2, E\(g^x2\)) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-1275 450 m
-gs 1 -1 sc (Create c1, E\(g^x1\)) col0 sh gr
-/Times-Roman-iso ff 150.00 scf sf
-3525 750 m
-gs 1 -1 sc (Created c1, g^y1, H\(K1\)) dup sw pop neg 0 rm col0 sh gr
-$F2psEnd
-rs
diff --git a/doc/design-paper/interaction.fig b/doc/design-paper/interaction.fig
deleted file mode 100644
index a7b49e0a52..0000000000
--- a/doc/design-paper/interaction.fig
+++ /dev/null
@@ -1,122 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter
-100.00
-Single
--2
-1200 2
-2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
- 6000 300 6000 3975
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 1200 525 3600 525
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 825 1200 825
-2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
- 1200 300 1200 3975
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 1200 1125 3600 1125
-2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
- 3600 300 3600 3975
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 1200 6000 1200
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6000 1500 3600 1500
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 1575 1200 1575
-2 1 2 1 0 7 50 0 -1 3.000 0 0 -1 0 0 2
- 1050 1800 8325 1800
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 1200 2100 3600 2100
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 2175 6000 2175
-2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 1 2
- 1 1 1.00 60.00 120.00
- 1 1 1.00 60.00 120.00
- 6000 2400 8175 2400
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6000 2550 3600 2550
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 2625 1200 2625
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 1200 3000 3600 3000
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 3075 6000 3075
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6000 3150 8175 3150
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 8175 3450 6000 3450
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 8175 3525 6000 3525
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 8175 3600 6000 3600
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6000 3525 3600 3525
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6000 3675 3600 3675
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6000 3600 3600 3600
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 3675 1200 3675
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 3750 1200 3750
-2 1 0 1 0 7 50 0 -1 3.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3600 3825 1200 3825
-2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
- 8175 300 8175 3975
-2 2 0 1 0 7 50 0 20 3.000 0 0 -1 0 0 5
- 6300 825 7950 825 7950 1725 6300 1725 6300 825
-4 0 0 50 0 2 12 0.0000 4 135 450 3375 225 OR 1\001
-4 0 0 50 0 2 12 0.0000 4 135 420 1050 225 Alice\001
-4 0 0 50 0 2 12 0.0000 4 135 450 5775 225 OR 2\001
-4 0 0 50 0 0 10 0.0000 4 105 960 6075 3075 "HTTP GET..."\001
-4 1 0 50 0 0 10 0.0000 4 15 135 4800 3975 . . .\001
-4 1 0 50 0 0 10 0.0000 4 15 135 7125 3975 . . .\001
-4 1 0 50 0 0 10 0.0000 4 15 135 2400 3975 . . .\001
-4 1 0 50 0 0 10 0.0000 4 135 1050 7125 2325 (TCP handshake)\001
-4 0 0 50 0 2 12 0.0000 4 135 630 7875 225 website\001
-4 1 0 50 0 0 10 0.0000 4 135 1335 7125 1425 {X}--AES encryption\001
-4 1 0 50 0 0 10 0.0000 4 135 1410 7125 1200 E(x)--RSA encryption\001
-4 1 0 50 0 0 10 0.0000 4 135 480 7125 975 Legend:\001
-4 1 0 50 0 0 10 0.0000 4 135 1455 2400 225 (link is TLS-encrypted)\001
-4 0 0 50 0 0 10 0.0000 4 135 2085 1275 1050 Relay c1{Extend, OR2, E(g^x2)}\001
-4 0 0 50 0 0 10 0.0000 4 135 1965 1275 2025 Relay c1{{Begin <website>:80}}\001
-4 2 0 50 0 0 10 0.0000 4 135 2190 3525 1500 Relay c1{Extended, g^y2, H(K2)}\001
-4 0 0 50 0 0 10 0.0000 4 135 1845 3675 2100 Relay c2{Begin <website>:80}\001
-4 2 0 50 0 0 10 0.0000 4 135 1410 3525 2550 Relay c1{{Connected}}\001
-4 2 0 50 0 0 10 0.0000 4 135 1290 5925 2475 Relay c2{Connected}\001
-4 0 0 50 0 0 10 0.0000 4 135 2085 1275 2925 Relay c1{{Data, "HTTP GET..."}}\001
-4 0 0 50 0 0 10 0.0000 4 135 1965 3675 3000 Relay c2{Data, "HTTP GET..."}\001
-4 1 0 50 0 0 10 0.0000 4 135 1365 4800 225 (link is TLS-encryped)\001
-4 1 0 50 0 0 10 0.0000 4 135 870 7050 225 (unencrypted)\001
-4 1 0 50 0 0 10 0.0000 4 105 780 7125 1650 cN--a circID\001
-4 2 0 50 0 0 10 0.0000 4 135 1860 3525 3600 Relay c1{{Data, (response)}}\001
-4 2 0 50 0 0 10 0.0000 4 135 645 8100 3375 (response)\001
-4 2 0 50 0 0 10 0.0000 4 135 1650 5925 3450 Relay c2{Data, (response)}\001
-4 2 0 50 0 0 10 0.0000 4 135 1545 5925 1425 Created c2, g^y2, H(K2)\001
-4 0 0 50 0 0 10 0.0000 4 135 1170 3675 1125 Create c2, E(g^x2)\001
-4 0 0 50 0 0 10 0.0000 4 135 1170 1275 450 Create c1, E(g^x1)\001
-4 2 0 50 0 0 10 0.0000 4 135 1545 3525 750 Created c1, g^y1, H(K1)\001
diff --git a/doc/design-paper/interaction.pdf b/doc/design-paper/interaction.pdf
deleted file mode 100644
index 8def0add59..0000000000
--- a/doc/design-paper/interaction.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/interaction.png b/doc/design-paper/interaction.png
deleted file mode 100644
index 2bb904fcd9..0000000000
--- a/doc/design-paper/interaction.png
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/latex8.bst b/doc/design-paper/latex8.bst
deleted file mode 100644
index 2dd3249633..0000000000
--- a/doc/design-paper/latex8.bst
+++ /dev/null
@@ -1,1124 +0,0 @@
-
-% ---------------------------------------------------------------
-%
-% $Id$
-%
-% by Paolo.Ienne@di.epfl.ch
-%
-
-% ---------------------------------------------------------------
-%
-% no guarantee is given that the format corresponds perfectly to
-% IEEE 8.5" x 11" Proceedings, but most features should be ok.
-%
-% ---------------------------------------------------------------
-%
-% `latex8' from BibTeX standard bibliography style `abbrv'
-% version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
-% Copyright (C) 1985, all rights reserved.
-% Copying of this file is authorized only if either
-% (1) you make absolutely no changes to your copy, including name, or
-% (2) if you do make changes, you name it something other than
-% btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
-% This restriction helps ensure that all standard styles are identical.
-% The file btxbst.doc has the documentation for this style.
-
-ENTRY
- { address
- author
- booktitle
- chapter
- edition
- editor
- howpublished
- institution
- journal
- key
- month
- note
- number
- organization
- pages
- publisher
- school
- series
- title
- type
- volume
- year
- }
- {}
- { label }
-
-INTEGERS { output.state before.all mid.sentence after.sentence after.block }
-
-FUNCTION {init.state.consts}
-{ #0 'before.all :=
- #1 'mid.sentence :=
- #2 'after.sentence :=
- #3 'after.block :=
-}
-
-STRINGS { s t }
-
-FUNCTION {output.nonnull}
-{ 's :=
- output.state mid.sentence =
- { ", " * write$ }
- { output.state after.block =
- { add.period$ write$
- newline$
- "\newblock " write$
- }
- { output.state before.all =
- 'write$
- { add.period$ " " * write$ }
- if$
- }
- if$
- mid.sentence 'output.state :=
- }
- if$
- s
-}
-
-FUNCTION {output}
-{ duplicate$ empty$
- 'pop$
- 'output.nonnull
- if$
-}
-
-FUNCTION {output.check}
-{ 't :=
- duplicate$ empty$
- { pop$ "empty " t * " in " * cite$ * warning$ }
- 'output.nonnull
- if$
-}
-
-FUNCTION {output.bibitem}
-{ newline$
- "\bibitem{" write$
- cite$ write$
- "}" write$
- newline$
- ""
- before.all 'output.state :=
-}
-
-FUNCTION {fin.entry}
-{ add.period$
- write$
- newline$
-}
-
-FUNCTION {new.block}
-{ output.state before.all =
- 'skip$
- { after.block 'output.state := }
- if$
-}
-
-FUNCTION {new.sentence}
-{ output.state after.block =
- 'skip$
- { output.state before.all =
- 'skip$
- { after.sentence 'output.state := }
- if$
- }
- if$
-}
-
-FUNCTION {not}
-{ { #0 }
- { #1 }
- if$
-}
-
-FUNCTION {and}
-{ 'skip$
- { pop$ #0 }
- if$
-}
-
-FUNCTION {or}
-{ { pop$ #1 }
- 'skip$
- if$
-}
-
-FUNCTION {new.block.checka}
-{ empty$
- 'skip$
- 'new.block
- if$
-}
-
-FUNCTION {new.block.checkb}
-{ empty$
- swap$ empty$
- and
- 'skip$
- 'new.block
- if$
-}
-
-FUNCTION {new.sentence.checka}
-{ empty$
- 'skip$
- 'new.sentence
- if$
-}
-
-FUNCTION {new.sentence.checkb}
-{ empty$
- swap$ empty$
- and
- 'skip$
- 'new.sentence
- if$
-}
-
-FUNCTION {field.or.null}
-{ duplicate$ empty$
- { pop$ "" }
- 'skip$
- if$
-}
-
-FUNCTION {emphasize}
-{ duplicate$ empty$
- { pop$ "" }
- { "{\em " swap$ * "}" * }
- if$
-}
-
-INTEGERS { nameptr namesleft numnames }
-
-FUNCTION {format.names}
-{ 's :=
- #1 'nameptr :=
- s num.names$ 'numnames :=
- numnames 'namesleft :=
- { namesleft #0 > }
- { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
- nameptr #1 >
- { namesleft #1 >
- { ", " * t * }
- { numnames #2 >
- { "," * }
- 'skip$
- if$
- t "others" =
- { " et~al." * }
- { " and " * t * }
- if$
- }
- if$
- }
- 't
- if$
- nameptr #1 + 'nameptr :=
-
- namesleft #1 - 'namesleft :=
- }
- while$
-}
-
-FUNCTION {format.authors}
-{ author empty$
- { "" }
- { author format.names }
- if$
-}
-
-FUNCTION {format.editors}
-{ editor empty$
- { "" }
- { editor format.names
- editor num.names$ #1 >
- { ", editors" * }
- { ", editor" * }
- if$
- }
- if$
-}
-
-FUNCTION {format.title}
-{ title empty$
- { "" }
- { title "t" change.case$ }
- if$
-}
-
-FUNCTION {n.dashify}
-{ 't :=
- ""
- { t empty$ not }
- { t #1 #1 substring$ "-" =
- { t #1 #2 substring$ "--" = not
- { "--" *
- t #2 global.max$ substring$ 't :=
- }
- { { t #1 #1 substring$ "-" = }
- { "-" *
- t #2 global.max$ substring$ 't :=
- }
- while$
- }
- if$
- }
- { t #1 #1 substring$ *
- t #2 global.max$ substring$ 't :=
- }
- if$
- }
- while$
-}
-
-FUNCTION {format.date}
-{ year empty$
- { month empty$
- { "" }
- { "there's a month but no year in " cite$ * warning$
- month
- }
- if$
- }
- { month empty$
- 'year
- { month " " * year * }
- if$
- }
- if$
-}
-
-FUNCTION {format.btitle}
-{ title emphasize
-}
-
-FUNCTION {tie.or.space.connect}
-{ duplicate$ text.length$ #3 <
- { "~" }
- { " " }
- if$
- swap$ * *
-}
-
-FUNCTION {either.or.check}
-{ empty$
- 'pop$
- { "can't use both " swap$ * " fields in " * cite$ * warning$ }
- if$
-}
-
-FUNCTION {format.bvolume}
-{ volume empty$
- { "" }
- { "volume" volume tie.or.space.connect
- series empty$
- 'skip$
- { " of " * series emphasize * }
- if$
- "volume and number" number either.or.check
- }
- if$
-}
-
-FUNCTION {format.number.series}
-{ volume empty$
- { number empty$
- { series field.or.null }
- { output.state mid.sentence =
- { "number" }
- { "Number" }
- if$
- number tie.or.space.connect
- series empty$
- { "there's a number but no series in " cite$ * warning$ }
- { " in " * series * }
- if$
- }
- if$
- }
- { "" }
- if$
-}
-
-FUNCTION {format.edition}
-{ edition empty$
- { "" }
- { output.state mid.sentence =
- { edition "l" change.case$ " edition" * }
- { edition "t" change.case$ " edition" * }
- if$
- }
- if$
-}
-
-INTEGERS { multiresult }
-
-FUNCTION {multi.page.check}
-{ 't :=
- #0 'multiresult :=
- { multiresult not
- t empty$ not
- and
- }
- { t #1 #1 substring$
- duplicate$ "-" =
- swap$ duplicate$ "," =
- swap$ "+" =
- or or
- { #1 'multiresult := }
- { t #2 global.max$ substring$ 't := }
- if$
- }
- while$
- multiresult
-}
-
-FUNCTION {format.pages}
-{ pages empty$
- { "" }
- { pages multi.page.check
- { "pages" pages n.dashify tie.or.space.connect }
- { "page" pages tie.or.space.connect }
- if$
- }
- if$
-}
-
-FUNCTION {format.vol.num.pages}
-{ volume field.or.null
- number empty$
- 'skip$
- { "(" number * ")" * *
- volume empty$
- { "there's a number but no volume in " cite$ * warning$ }
- 'skip$
- if$
- }
- if$
- pages empty$
- 'skip$
- { duplicate$ empty$
- { pop$ format.pages }
- { ":" * pages n.dashify * }
- if$
- }
- if$
-}
-
-FUNCTION {format.chapter.pages}
-{ chapter empty$
- 'format.pages
- { type empty$
- { "chapter" }
- { type "l" change.case$ }
- if$
- chapter tie.or.space.connect
- pages empty$
- 'skip$
- { ", " * format.pages * }
- if$
- }
- if$
-}
-
-FUNCTION {format.in.ed.booktitle}
-{ booktitle empty$
- { "" }
- { editor empty$
- { "In " booktitle emphasize * }
- { "In " format.editors * ", " * booktitle emphasize * }
- if$
- }
- if$
-}
-
-FUNCTION {empty.misc.check}
-
-{ author empty$ title empty$ howpublished empty$
- month empty$ year empty$ note empty$
- and and and and and
- key empty$ not and
- { "all relevant fields are empty in " cite$ * warning$ }
- 'skip$
- if$
-}
-
-FUNCTION {format.thesis.type}
-{ type empty$
- 'skip$
- { pop$
- type "t" change.case$
- }
- if$
-}
-
-FUNCTION {format.tr.number}
-{ type empty$
- { "Technical Report" }
- 'type
- if$
- number empty$
- { "t" change.case$ }
- { number tie.or.space.connect }
- if$
-}
-
-FUNCTION {format.article.crossref}
-{ key empty$
- { journal empty$
- { "need key or journal for " cite$ * " to crossref " * crossref *
- warning$
- ""
- }
- { "In {\em " journal * "\/}" * }
- if$
- }
- { "In " key * }
- if$
- " \cite{" * crossref * "}" *
-}
-
-FUNCTION {format.crossref.editor}
-{ editor #1 "{vv~}{ll}" format.name$
- editor num.names$ duplicate$
- #2 >
- { pop$ " et~al." * }
- { #2 <
- 'skip$
- { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
- { " et~al." * }
- { " and " * editor #2 "{vv~}{ll}" format.name$ * }
- if$
- }
- if$
- }
- if$
-}
-
-FUNCTION {format.book.crossref}
-{ volume empty$
- { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
- "In "
- }
- { "Volume" volume tie.or.space.connect
- " of " *
- }
- if$
- editor empty$
- editor field.or.null author field.or.null =
- or
- { key empty$
- { series empty$
- { "need editor, key, or series for " cite$ * " to crossref " *
- crossref * warning$
- "" *
- }
- { "{\em " * series * "\/}" * }
- if$
- }
- { key * }
- if$
- }
- { format.crossref.editor * }
- if$
- " \cite{" * crossref * "}" *
-}
-
-FUNCTION {format.incoll.inproc.crossref}
-{ editor empty$
- editor field.or.null author field.or.null =
- or
- { key empty$
- { booktitle empty$
- { "need editor, key, or booktitle for " cite$ * " to crossref " *
- crossref * warning$
- ""
- }
- { "In {\em " booktitle * "\/}" * }
- if$
- }
- { "In " key * }
- if$
- }
- { "In " format.crossref.editor * }
- if$
- " \cite{" * crossref * "}" *
-}
-
-FUNCTION {article}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.title "title" output.check
- new.block
- crossref missing$
- { journal emphasize "journal" output.check
- format.vol.num.pages output
- format.date "year" output.check
- }
- { format.article.crossref output.nonnull
- format.pages output
- }
- if$
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {book}
-{ output.bibitem
- author empty$
- { format.editors "author and editor" output.check }
- { format.authors output.nonnull
- crossref missing$
- { "author and editor" editor either.or.check }
- 'skip$
- if$
- }
- if$
- new.block
- format.btitle "title" output.check
- crossref missing$
- { format.bvolume output
- new.block
- format.number.series output
- new.sentence
- publisher "publisher" output.check
- address output
- }
- { new.block
- format.book.crossref output.nonnull
- }
- if$
- format.edition output
- format.date "year" output.check
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {booklet}
-{ output.bibitem
- format.authors output
- new.block
- format.title "title" output.check
- howpublished address new.block.checkb
- howpublished output
- address output
- format.date output
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {inbook}
-{ output.bibitem
- author empty$
- { format.editors "author and editor" output.check }
- { format.authors output.nonnull
-
- crossref missing$
- { "author and editor" editor either.or.check }
- 'skip$
- if$
- }
- if$
- new.block
- format.btitle "title" output.check
- crossref missing$
- { format.bvolume output
- format.chapter.pages "chapter and pages" output.check
- new.block
- format.number.series output
- new.sentence
- publisher "publisher" output.check
- address output
- }
- { format.chapter.pages "chapter and pages" output.check
- new.block
- format.book.crossref output.nonnull
- }
- if$
- format.edition output
- format.date "year" output.check
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {incollection}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.title "title" output.check
- new.block
- crossref missing$
- { format.in.ed.booktitle "booktitle" output.check
- format.bvolume output
- format.number.series output
- format.chapter.pages output
- new.sentence
- publisher "publisher" output.check
- address output
- format.edition output
- format.date "year" output.check
- }
- { format.incoll.inproc.crossref output.nonnull
- format.chapter.pages output
- }
- if$
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {inproceedings}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.title "title" output.check
- new.block
- crossref missing$
- { format.in.ed.booktitle "booktitle" output.check
- format.bvolume output
- format.number.series output
- format.pages output
- address empty$
- { organization publisher new.sentence.checkb
- organization output
- publisher output
- format.date "year" output.check
- }
- { address output.nonnull
- format.date "year" output.check
- new.sentence
- organization output
- publisher output
- }
- if$
- }
- { format.incoll.inproc.crossref output.nonnull
- format.pages output
- }
- if$
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {conference} { inproceedings }
-
-FUNCTION {manual}
-{ output.bibitem
- author empty$
- { organization empty$
- 'skip$
- { organization output.nonnull
- address output
- }
- if$
- }
- { format.authors output.nonnull }
- if$
- new.block
- format.btitle "title" output.check
- author empty$
- { organization empty$
- { address new.block.checka
- address output
- }
- 'skip$
- if$
- }
- { organization address new.block.checkb
- organization output
- address output
- }
- if$
- format.edition output
- format.date output
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {mastersthesis}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.title "title" output.check
- new.block
- "Master's thesis" format.thesis.type output.nonnull
- school "school" output.check
- address output
- format.date "year" output.check
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {misc}
-{ output.bibitem
- format.authors output
- title howpublished new.block.checkb
- format.title output
- howpublished new.block.checka
- howpublished output
- format.date output
- new.block
- note output
- fin.entry
- empty.misc.check
-}
-
-FUNCTION {phdthesis}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.btitle "title" output.check
- new.block
- "PhD thesis" format.thesis.type output.nonnull
- school "school" output.check
- address output
- format.date "year" output.check
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {proceedings}
-{ output.bibitem
- editor empty$
- { organization output }
- { format.editors output.nonnull }
-
- if$
- new.block
- format.btitle "title" output.check
- format.bvolume output
- format.number.series output
- address empty$
- { editor empty$
- { publisher new.sentence.checka }
- { organization publisher new.sentence.checkb
- organization output
- }
- if$
- publisher output
- format.date "year" output.check
- }
- { address output.nonnull
- format.date "year" output.check
- new.sentence
- editor empty$
- 'skip$
- { organization output }
- if$
- publisher output
- }
- if$
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {techreport}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.title "title" output.check
- new.block
- format.tr.number output.nonnull
- institution "institution" output.check
- address output
- format.date "year" output.check
- new.block
- note output
- fin.entry
-}
-
-FUNCTION {unpublished}
-{ output.bibitem
- format.authors "author" output.check
- new.block
- format.title "title" output.check
- new.block
- note "note" output.check
- format.date output
- fin.entry
-}
-
-FUNCTION {default.type} { misc }
-
-MACRO {jan} {"Jan."}
-
-MACRO {feb} {"Feb."}
-
-MACRO {mar} {"Mar."}
-
-MACRO {apr} {"Apr."}
-
-MACRO {may} {"May"}
-
-MACRO {jun} {"June"}
-
-MACRO {jul} {"July"}
-
-MACRO {aug} {"Aug."}
-
-MACRO {sep} {"Sept."}
-
-MACRO {oct} {"Oct."}
-
-MACRO {nov} {"Nov."}
-
-MACRO {dec} {"Dec."}
-
-MACRO {acmcs} {"ACM Comput. Surv."}
-
-MACRO {acta} {"Acta Inf."}
-
-MACRO {cacm} {"Commun. ACM"}
-
-MACRO {ibmjrd} {"IBM J. Res. Dev."}
-
-MACRO {ibmsj} {"IBM Syst.~J."}
-
-MACRO {ieeese} {"IEEE Trans. Softw. Eng."}
-
-MACRO {ieeetc} {"IEEE Trans. Comput."}
-
-MACRO {ieeetcad}
- {"IEEE Trans. Comput.-Aided Design Integrated Circuits"}
-
-MACRO {ipl} {"Inf. Process. Lett."}
-
-MACRO {jacm} {"J.~ACM"}
-
-MACRO {jcss} {"J.~Comput. Syst. Sci."}
-
-MACRO {scp} {"Sci. Comput. Programming"}
-
-MACRO {sicomp} {"SIAM J. Comput."}
-
-MACRO {tocs} {"ACM Trans. Comput. Syst."}
-
-MACRO {tods} {"ACM Trans. Database Syst."}
-
-MACRO {tog} {"ACM Trans. Gr."}
-
-MACRO {toms} {"ACM Trans. Math. Softw."}
-
-MACRO {toois} {"ACM Trans. Office Inf. Syst."}
-
-MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."}
-
-MACRO {tcs} {"Theoretical Comput. Sci."}
-
-READ
-
-FUNCTION {sortify}
-{ purify$
- "l" change.case$
-}
-
-INTEGERS { len }
-
-FUNCTION {chop.word}
-{ 's :=
- 'len :=
- s #1 len substring$ =
- { s len #1 + global.max$ substring$ }
- 's
- if$
-}
-
-FUNCTION {sort.format.names}
-{ 's :=
- #1 'nameptr :=
- ""
- s num.names$ 'numnames :=
- numnames 'namesleft :=
- { namesleft #0 > }
- { nameptr #1 >
- { " " * }
- 'skip$
- if$
- s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't :=
- nameptr numnames = t "others" = and
- { "et al" * }
- { t sortify * }
- if$
- nameptr #1 + 'nameptr :=
- namesleft #1 - 'namesleft :=
- }
- while$
-}
-
-FUNCTION {sort.format.title}
-{ 't :=
- "A " #2
- "An " #3
- "The " #4 t chop.word
- chop.word
- chop.word
- sortify
- #1 global.max$ substring$
-}
-
-FUNCTION {author.sort}
-{ author empty$
- { key empty$
- { "to sort, need author or key in " cite$ * warning$
- ""
- }
- { key sortify }
- if$
- }
- { author sort.format.names }
- if$
-}
-
-FUNCTION {author.editor.sort}
-{ author empty$
- { editor empty$
- { key empty$
- { "to sort, need author, editor, or key in " cite$ * warning$
- ""
- }
- { key sortify }
- if$
- }
- { editor sort.format.names }
- if$
- }
- { author sort.format.names }
- if$
-}
-
-FUNCTION {author.organization.sort}
-{ author empty$
-
- { organization empty$
- { key empty$
- { "to sort, need author, organization, or key in " cite$ * warning$
- ""
- }
- { key sortify }
- if$
- }
- { "The " #4 organization chop.word sortify }
- if$
- }
- { author sort.format.names }
- if$
-}
-
-FUNCTION {editor.organization.sort}
-{ editor empty$
- { organization empty$
- { key empty$
- { "to sort, need editor, organization, or key in " cite$ * warning$
- ""
- }
- { key sortify }
- if$
- }
- { "The " #4 organization chop.word sortify }
- if$
- }
- { editor sort.format.names }
- if$
-}
-
-FUNCTION {presort}
-{ type$ "book" =
- type$ "inbook" =
- or
- 'author.editor.sort
- { type$ "proceedings" =
- 'editor.organization.sort
- { type$ "manual" =
- 'author.organization.sort
- 'author.sort
- if$
- }
- if$
- }
- if$
- " "
- *
- year field.or.null sortify
- *
- " "
- *
- title field.or.null
- sort.format.title
- *
- #1 entry.max$ substring$
- 'sort.key$ :=
-}
-
-ITERATE {presort}
-
-SORT
-
-STRINGS { longest.label }
-
-INTEGERS { number.label longest.label.width }
-
-FUNCTION {initialize.longest.label}
-{ "" 'longest.label :=
- #1 'number.label :=
- #0 'longest.label.width :=
-}
-
-FUNCTION {longest.label.pass}
-{ number.label int.to.str$ 'label :=
- number.label #1 + 'number.label :=
- label width$ longest.label.width >
- { label 'longest.label :=
- label width$ 'longest.label.width :=
- }
- 'skip$
- if$
-}
-
-EXECUTE {initialize.longest.label}
-
-ITERATE {longest.label.pass}
-
-FUNCTION {begin.bib}
-{ preamble$ empty$
- 'skip$
- { preamble$ write$ newline$ }
- if$
- "\begin{thebibliography}{" longest.label *
- "}\setlength{\itemsep}{-1ex}\small" * write$ newline$
-}
-
-EXECUTE {begin.bib}
-
-EXECUTE {init.state.consts}
-
-ITERATE {call.type$}
-
-FUNCTION {end.bib}
-{ newline$
- "\end{thebibliography}" write$ newline$
-}
-
-EXECUTE {end.bib}
-
-% end of file latex8.bst
-% ---------------------------------------------------------------
-
-
-
diff --git a/doc/design-paper/llncs.cls b/doc/design-paper/llncs.cls
deleted file mode 100644
index 697dd774ec..0000000000
--- a/doc/design-paper/llncs.cls
+++ /dev/null
@@ -1,1016 +0,0 @@
-% LLNCS DOCUMENT CLASS -- version 2.8
-% for LaTeX2e
-%
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesClass{llncs}[2000/05/16 v2.8
-^^JLaTeX document class for Lecture Notes in Computer Science]
-% Options
-\let\if@envcntreset\iffalse
-\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue}
-\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y}
-\DeclareOption{oribibl}{\let\oribibl=Y}
-\let\if@custvec\iftrue
-\DeclareOption{orivec}{\let\if@custvec\iffalse}
-\let\if@envcntsame\iffalse
-\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue}
-\let\if@envcntsect\iffalse
-\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue}
-\let\if@runhead\iffalse
-\DeclareOption{runningheads}{\let\if@runhead\iftrue}
-
-\let\if@openbib\iffalse
-\DeclareOption{openbib}{\let\if@openbib\iftrue}
-
-\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
-
-\ProcessOptions
-
-\LoadClass[twoside]{article}
-\RequirePackage{multicol} % needed for the list of participants, index
-
-\setlength{\textwidth}{12.2cm}
-\setlength{\textheight}{19.3cm}
-
-% Ragged bottom for the actual page
-\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil
-\global\let\@textbottom\relax}}
-
-\renewcommand\small{%
- \@setfontsize\small\@ixpt{11}%
- \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
- \abovedisplayshortskip \z@ \@plus2\p@
- \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
- \def\@listi{\leftmargin\leftmargini
- \parsep 0\p@ \@plus1\p@ \@minus\p@
- \topsep 8\p@ \@plus2\p@ \@minus4\p@
- \itemsep0\p@}%
- \belowdisplayskip \abovedisplayskip
-}
-
-\frenchspacing
-\widowpenalty=10000
-\clubpenalty=10000
-
-\setlength\oddsidemargin {63\p@}
-\setlength\evensidemargin {63\p@}
-\setlength\marginparwidth {90\p@}
-
-\setlength\headsep {16\p@}
-
-\setlength\footnotesep{7.7\p@}
-\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@}
-\setlength\intextsep {8mm\@plus 2\p@ \@minus 2\p@}
-
-\setcounter{secnumdepth}{2}
-
-\newcounter {chapter}
-\renewcommand\thechapter {\@arabic\c@chapter}
-
-\newif\if@mainmatter \@mainmattertrue
-\newcommand\frontmatter{\cleardoublepage
- \@mainmatterfalse\pagenumbering{Roman}}
-\newcommand\mainmatter{\cleardoublepage
- \@mainmattertrue\pagenumbering{arabic}}
-\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi
- \@mainmatterfalse}
-
-\renewcommand\part{\cleardoublepage
- \thispagestyle{empty}%
- \if@twocolumn
- \onecolumn
- \@tempswatrue
- \else
- \@tempswafalse
- \fi
- \null\vfil
- \secdef\@part\@spart}
-
-\def\@part[#1]#2{%
- \ifnum \c@secnumdepth >-2\relax
- \refstepcounter{part}%
- \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
- \else
- \addcontentsline{toc}{part}{#1}%
- \fi
- \markboth{}{}%
- {\centering
- \interlinepenalty \@M
- \normalfont
- \ifnum \c@secnumdepth >-2\relax
- \huge\bfseries \partname~\thepart
- \par
- \vskip 20\p@
- \fi
- \Huge \bfseries #2\par}%
- \@endpart}
-\def\@spart#1{%
- {\centering
- \interlinepenalty \@M
- \normalfont
- \Huge \bfseries #1\par}%
- \@endpart}
-\def\@endpart{\vfil\newpage
- \if@twoside
- \null
- \thispagestyle{empty}%
- \newpage
- \fi
- \if@tempswa
- \twocolumn
- \fi}
-
-\newcommand\chapter{\clearpage
- \thispagestyle{empty}%
- \global\@topnum\z@
- \@afterindentfalse
- \secdef\@chapter\@schapter}
-\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
- \if@mainmatter
- \refstepcounter{chapter}%
- \typeout{\@chapapp\space\thechapter.}%
- \addcontentsline{toc}{chapter}%
- {\protect\numberline{\thechapter}#1}%
- \else
- \addcontentsline{toc}{chapter}{#1}%
- \fi
- \else
- \addcontentsline{toc}{chapter}{#1}%
- \fi
- \chaptermark{#1}%
- \addtocontents{lof}{\protect\addvspace{10\p@}}%
- \addtocontents{lot}{\protect\addvspace{10\p@}}%
- \if@twocolumn
- \@topnewpage[\@makechapterhead{#2}]%
- \else
- \@makechapterhead{#2}%
- \@afterheading
- \fi}
-\def\@makechapterhead#1{%
-% \vspace*{50\p@}%
- {\centering
- \ifnum \c@secnumdepth >\m@ne
- \if@mainmatter
- \large\bfseries \@chapapp{} \thechapter
- \par\nobreak
- \vskip 20\p@
- \fi
- \fi
- \interlinepenalty\@M
- \Large \bfseries #1\par\nobreak
- \vskip 40\p@
- }}
-\def\@schapter#1{\if@twocolumn
- \@topnewpage[\@makeschapterhead{#1}]%
- \else
- \@makeschapterhead{#1}%
- \@afterheading
- \fi}
-\def\@makeschapterhead#1{%
-% \vspace*{50\p@}%
- {\centering
- \normalfont
- \interlinepenalty\@M
- \Large \bfseries #1\par\nobreak
- \vskip 40\p@
- }}
-
-\renewcommand\section{\@startsection{section}{1}{\z@}%
- {-18\p@ \@plus -4\p@ \@minus -4\p@}%
- {12\p@ \@plus 4\p@ \@minus 4\p@}%
- {\normalfont\large\bfseries\boldmath
- \rightskip=\z@ \@plus 8em\pretolerance=10000 }}
-\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
- {-18\p@ \@plus -4\p@ \@minus -4\p@}%
- {8\p@ \@plus 4\p@ \@minus 4\p@}%
- {\normalfont\normalsize\bfseries\boldmath
- \rightskip=\z@ \@plus 8em\pretolerance=10000 }}
-\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
- {-18\p@ \@plus -4\p@ \@minus -4\p@}%
- {-0.5em \@plus -0.22em \@minus -0.1em}%
- {\normalfont\normalsize\bfseries\boldmath}}
-\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
- {-12\p@ \@plus -4\p@ \@minus -4\p@}%
- {-0.5em \@plus -0.22em \@minus -0.1em}%
- {\normalfont\normalsize\itshape}}
-\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use
- \string\subparagraph\space with this class}\vskip0.5cm
-You should not use \verb|\subparagraph| with this class.\vskip0.5cm}
-
-\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00}
-\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01}
-\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02}
-\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03}
-\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04}
-\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05}
-\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06}
-\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07}
-\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08}
-\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09}
-\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A}
-
-\let\footnotesize\small
-
-\if@custvec
-\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
-{\mbox{\boldmath$\textstyle#1$}}
-{\mbox{\boldmath$\scriptstyle#1$}}
-{\mbox{\boldmath$\scriptscriptstyle#1$}}}
-\fi
-
-\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}}
-\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil
-\penalty50\hskip1em\null\nobreak\hfil\squareforqed
-\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}
-
-\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip
-\halign{\hfil
-$\displaystyle##$\hfil\cr\gets\cr\to\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets
-\cr\to\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets
-\cr\to\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
-\gets\cr\to\cr}}}}}
-\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
-$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr
-\noalign{\vskip1.2pt}=\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr
-\noalign{\vskip1pt}=\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
-<\cr
-\noalign{\vskip0.9pt}=\cr}}}}}
-\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
-$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr
-\noalign{\vskip1.2pt}=\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr
-\noalign{\vskip1pt}=\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
->\cr
-\noalign{\vskip0.9pt}=\cr}}}}}
-\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip
-\halign{\hfil
-$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr
->\cr\noalign{\vskip-1pt}<\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr
->\cr\noalign{\vskip-0.8pt}<\cr}}}
-{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
->\cr\noalign{\vskip-0.3pt}<\cr}}}}}
-\def\bbbr{{\rm I\!R}} %reelle Zahlen
-\def\bbbm{{\rm I\!M}}
-\def\bbbn{{\rm I\!N}} %natuerliche Zahlen
-\def\bbbf{{\rm I\!F}}
-\def\bbbh{{\rm I\!H}}
-\def\bbbk{{\rm I\!K}}
-\def\bbbp{{\rm I\!P}}
-\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l}
-{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}}
-\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox
-to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
-{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox
-to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox
-to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox
-to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}}
-\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
-Q$}\hbox{\raise
-0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
-{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise
-0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise
-0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise
-0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}}
-\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
-T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
-{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox
-to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox
-to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox
-to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}}
-\def\bbbs{{\mathchoice
-{\setbox0=\hbox{$\displaystyle \rm S$}\hbox{\raise0.5\ht0\hbox
-to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
-to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
-{\setbox0=\hbox{$\textstyle \rm S$}\hbox{\raise0.5\ht0\hbox
-to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
-to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptstyle \rm S$}\hbox{\raise0.5\ht0\hbox
-to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
-to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}}
-{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox
-to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
-to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}}
-\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
-{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
-{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}}
-{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}}
-
-\let\ts\,
-
-\setlength\leftmargini {17\p@}
-\setlength\leftmargin {\leftmargini}
-\setlength\leftmarginii {\leftmargini}
-\setlength\leftmarginiii {\leftmargini}
-\setlength\leftmarginiv {\leftmargini}
-\setlength \labelsep {.5em}
-\setlength \labelwidth{\leftmargini}
-\addtolength\labelwidth{-\labelsep}
-
-\def\@listI{\leftmargin\leftmargini
- \parsep 0\p@ \@plus1\p@ \@minus\p@
- \topsep 8\p@ \@plus2\p@ \@minus4\p@
- \itemsep0\p@}
-\let\@listi\@listI
-\@listi
-\def\@listii {\leftmargin\leftmarginii
- \labelwidth\leftmarginii
- \advance\labelwidth-\labelsep
- \topsep 0\p@ \@plus2\p@ \@minus\p@}
-\def\@listiii{\leftmargin\leftmarginiii
- \labelwidth\leftmarginiii
- \advance\labelwidth-\labelsep
- \topsep 0\p@ \@plus\p@\@minus\p@
- \parsep \z@
- \partopsep \p@ \@plus\z@ \@minus\p@}
-
-\renewcommand\labelitemi{\normalfont\bfseries --}
-\renewcommand\labelitemii{$\m@th\bullet$}
-
-\setlength\arraycolsep{1.4\p@}
-\setlength\tabcolsep{1.4\p@}
-
-\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}%
- {{\contentsname}}}
- \def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}}
- \def\lastand{\ifnum\value{auco}=2\relax
- \unskip{} \andname\
- \else
- \unskip \lastandname\
- \fi}%
- \def\and{\stepcounter{@auth}\relax
- \ifnum\value{@auth}=\value{auco}%
- \lastand
- \else
- \unskip,
- \fi}%
- \@starttoc{toc}\if@restonecol\twocolumn\fi}
-
-\def\l@part#1#2{\addpenalty{\@secpenalty}%
- \addvspace{2em plus\p@}% % space above part line
- \begingroup
- \parindent \z@
- \rightskip \z@ plus 5em
- \hrule\vskip5pt
- \large % same size as for a contribution heading
- \bfseries\boldmath % set line in boldface
- \leavevmode % TeX command to enter horizontal mode.
- #1\par
- \vskip5pt
- \hrule
- \vskip1pt
- \nobreak % Never break after part entry
- \endgroup}
-
-\def\@dotsep{2}
-
-\def\hyperhrefextend{\ifx\hyper@anchor\@undefined\else
-{chapter.\thechapter}\fi}
-
-\def\addnumcontentsmark#1#2#3{%
-\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline
- {\thechapter}#3}{\thepage}\hyperhrefextend}}
-\def\addcontentsmark#1#2#3{%
-\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}}
-\def\addcontentsmarkwop#1#2#3{%
-\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}}
-
-\def\@adcmk[#1]{\ifcase #1 \or
-\def\@gtempa{\addnumcontentsmark}%
- \or \def\@gtempa{\addcontentsmark}%
- \or \def\@gtempa{\addcontentsmarkwop}%
- \fi\@gtempa{toc}{chapter}}
-\def\addtocmark{\@ifnextchar[{\@adcmk}{\@adcmk[3]}}
-
-\def\l@chapter#1#2{\addpenalty{-\@highpenalty}
- \vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup
- \parindent \z@ \rightskip \@pnumwidth
- \parfillskip -\@pnumwidth
- \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
- {\large\bfseries\boldmath#1}\ifx0#2\hfil\null
- \else
- \nobreak
- \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
- \@dotsep mu$}\hfill
- \nobreak\hbox to\@pnumwidth{\hss #2}%
- \fi\par
- \penalty\@highpenalty \endgroup}
-
-\def\l@title#1#2{\addpenalty{-\@highpenalty}
- \addvspace{8pt plus 1pt}
- \@tempdima \z@
- \begingroup
- \parindent \z@ \rightskip \@tocrmarg
- \parfillskip -\@tocrmarg
- \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
- #1\nobreak
- \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
- \@dotsep mu$}\hfill
- \nobreak\hbox to\@pnumwidth{\hss #2}\par
- \penalty\@highpenalty \endgroup}
-
-\setcounter{tocdepth}{0}
-\newdimen\tocchpnum
-\newdimen\tocsecnum
-\newdimen\tocsectotal
-\newdimen\tocsubsecnum
-\newdimen\tocsubsectotal
-\newdimen\tocsubsubsecnum
-\newdimen\tocsubsubsectotal
-\newdimen\tocparanum
-\newdimen\tocparatotal
-\newdimen\tocsubparanum
-\tocchpnum=\z@ % no chapter numbers
-\tocsecnum=15\p@ % section 88. plus 2.222pt
-\tocsubsecnum=23\p@ % subsection 88.8 plus 2.222pt
-\tocsubsubsecnum=27\p@ % subsubsection 88.8.8 plus 1.444pt
-\tocparanum=35\p@ % paragraph 88.8.8.8 plus 1.666pt
-\tocsubparanum=43\p@ % subparagraph 88.8.8.8.8 plus 1.888pt
-\def\calctocindent{%
-\tocsectotal=\tocchpnum
-\advance\tocsectotal by\tocsecnum
-\tocsubsectotal=\tocsectotal
-\advance\tocsubsectotal by\tocsubsecnum
-\tocsubsubsectotal=\tocsubsectotal
-\advance\tocsubsubsectotal by\tocsubsubsecnum
-\tocparatotal=\tocsubsubsectotal
-\advance\tocparatotal by\tocparanum}
-\calctocindent
-
-\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}}
-\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}}
-\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}}
-\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}}
-\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}}
-
-\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
- \fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}}
- \@starttoc{lof}\if@restonecol\twocolumn\fi}
-\def\l@figure{\@dottedtocline{1}{0em}{1.5em}}
-
-\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
- \fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}}
- \@starttoc{lot}\if@restonecol\twocolumn\fi}
-\let\l@table\l@figure
-
-\renewcommand\listoffigures{%
- \section*{\listfigurename
- \@mkboth{\listfigurename}{\listfigurename}}%
- \@starttoc{lof}%
- }
-
-\renewcommand\listoftables{%
- \section*{\listtablename
- \@mkboth{\listtablename}{\listtablename}}%
- \@starttoc{lot}%
- }
-
-\ifx\oribibl\undefined
-\ifx\citeauthoryear\undefined
-\renewenvironment{thebibliography}[1]
- {\section*{\refname}
- \def\@biblabel##1{##1.}
- \small
- \list{\@biblabel{\@arabic\c@enumiv}}%
- {\settowidth\labelwidth{\@biblabel{#1}}%
- \leftmargin\labelwidth
- \advance\leftmargin\labelsep
- \if@openbib
- \advance\leftmargin\bibindent
- \itemindent -\bibindent
- \listparindent \itemindent
- \parsep \z@
- \fi
- \usecounter{enumiv}%
- \let\p@enumiv\@empty
- \renewcommand\theenumiv{\@arabic\c@enumiv}}%
- \if@openbib
- \renewcommand\newblock{\par}%
- \else
- \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
- \fi
- \sloppy\clubpenalty4000\widowpenalty4000%
- \sfcode`\.=\@m}
- {\def\@noitemerr
- {\@latex@warning{Empty `thebibliography' environment}}%
- \endlist}
-\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw
- {\let\protect\noexpand\immediate
- \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
-\newcount\@tempcntc
-\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
- \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do
- {\@ifundefined
- {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries
- ?}\@warning
- {Citation `\@citeb' on page \thepage \space undefined}}%
- {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}%
- \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne
- \@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}%
- \else
- \advance\@tempcntb\@ne
- \ifnum\@tempcntb=\@tempcntc
- \else\advance\@tempcntb\m@ne\@citeo
- \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}}
-\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else
- \@citea\def\@citea{,\,\hskip\z@skip}%
- \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else
- {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else
- \def\@citea{--}\fi
- \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi}
-\else
-\renewenvironment{thebibliography}[1]
- {\section*{\refname}
- \small
- \list{}%
- {\settowidth\labelwidth{}%
- \leftmargin\parindent
- \itemindent=-\parindent
- \labelsep=\z@
- \if@openbib
- \advance\leftmargin\bibindent
- \itemindent -\bibindent
- \listparindent \itemindent
- \parsep \z@
- \fi
- \usecounter{enumiv}%
- \let\p@enumiv\@empty
- \renewcommand\theenumiv{}}%
- \if@openbib
- \renewcommand\newblock{\par}%
- \else
- \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
- \fi
- \sloppy\clubpenalty4000\widowpenalty4000%
- \sfcode`\.=\@m}
- {\def\@noitemerr
- {\@latex@warning{Empty `thebibliography' environment}}%
- \endlist}
- \def\@cite#1{#1}%
- \def\@lbibitem[#1]#2{\item[]\if@filesw
- {\def\protect##1{\string ##1\space}\immediate
- \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
- \fi
-\else
-\@cons\@openbib@code{\noexpand\small}
-\fi
-
-\def\idxquad{\hskip 10\p@}% space that divides entry from number
-
-\def\@idxitem{\par\hangindent 10\p@}
-
-\def\subitem{\par\setbox0=\hbox{--\enspace}% second order
- \noindent\hangindent\wd0\box0}% index entry
-
-\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third
- \noindent\hangindent\wd0\box0}% order index entry
-
-\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax}
-
-\renewenvironment{theindex}
- {\@mkboth{\indexname}{\indexname}%
- \thispagestyle{empty}\parindent\z@
- \parskip\z@ \@plus .3\p@\relax
- \let\item\par
- \def\,{\relax\ifmmode\mskip\thinmuskip
- \else\hskip0.2em\ignorespaces\fi}%
- \normalfont\small
- \begin{multicols}{2}[\@makeschapterhead{\indexname}]%
- }
- {\end{multicols}}
-
-\renewcommand\footnoterule{%
- \kern-3\p@
- \hrule\@width 2truecm
- \kern2.6\p@}
- \newdimen\fnindent
- \fnindent1em
-\long\def\@makefntext#1{%
- \parindent \fnindent%
- \leftskip \fnindent%
- \noindent
- \llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1}
-
-\long\def\@makecaption#1#2{%
- \vskip\abovecaptionskip
- \sbox\@tempboxa{{\bfseries #1.} #2}%
- \ifdim \wd\@tempboxa >\hsize
- {\bfseries #1.} #2\par
- \else
- \global \@minipagefalse
- \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
- \fi
- \vskip\belowcaptionskip}
-
-\def\fps@figure{htbp}
-\def\fnum@figure{\figurename\thinspace\thefigure}
-\def \@floatboxreset {%
- \reset@font
- \small
- \@setnobreak
- \@setminipage
-}
-\def\fps@table{htbp}
-\def\fnum@table{\tablename~\thetable}
-\renewenvironment{table}
- {\setlength\abovecaptionskip{0\p@}%
- \setlength\belowcaptionskip{10\p@}%
- \@float{table}}
- {\end@float}
-\renewenvironment{table*}
- {\setlength\abovecaptionskip{0\p@}%
- \setlength\belowcaptionskip{10\p@}%
- \@dblfloat{table}}
- {\end@dblfloat}
-
-\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
- ext@#1\endcsname}{#1}{\protect\numberline{\csname
- the#1\endcsname}{\ignorespaces #2}}\begingroup
- \@parboxrestore
- \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
- \endgroup}
-
-% LaTeX does not provide a command to enter the authors institute
-% addresses. The \institute command is defined here.
-
-\newcounter{@inst}
-\newcounter{@auth}
-\newcounter{auco}
-\def\andname{and}
-\def\lastandname{\unskip, and}
-\newdimen\instindent
-\newbox\authrun
-\newtoks\authorrunning
-\newtoks\tocauthor
-\newbox\titrun
-\newtoks\titlerunning
-\newtoks\toctitle
-
-\def\clearheadinfo{\gdef\@author{No Author Given}%
- \gdef\@title{No Title Given}%
- \gdef\@subtitle{}%
- \gdef\@institute{No Institute Given}%
- \gdef\@thanks{}%
- \global\titlerunning={}\global\authorrunning={}%
- \global\toctitle={}\global\tocauthor={}}
-
-\def\institute#1{\gdef\@institute{#1}}
-
-\def\institutename{\par
- \begingroup
- \parskip=\z@
- \parindent=\z@
- \setcounter{@inst}{1}%
- \def\and{\par\stepcounter{@inst}%
- \noindent$^{\the@inst}$\enspace\ignorespaces}%
- \setbox0=\vbox{\def\thanks##1{}\@institute}%
- \ifnum\c@@inst=1\relax
- \else
- \setcounter{footnote}{\c@@inst}%
- \setcounter{@inst}{1}%
- \noindent$^{\the@inst}$\enspace
- \fi
- \ignorespaces
- \@institute\par
- \endgroup}
-
-\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or
- {\star\star\star}\or \dagger\or \ddagger\or
- \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
- \or \ddagger\ddagger \else\@ctrerr\fi}}
-
-\def\inst#1{\unskip$^{#1}$}
-\def\fnmsep{\unskip$^,$}
-\def\email#1{{\tt#1}}
-\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}}
-\def\homedir{\~{ }}
-
-\def\subtitle#1{\gdef\@subtitle{#1}}
-\clearheadinfo
-
-\renewcommand\maketitle{\newpage
- \refstepcounter{chapter}%
- \stepcounter{section}%
- \setcounter{section}{0}%
- \setcounter{subsection}{0}%
- \setcounter{figure}{0}
- \setcounter{table}{0}
- \setcounter{equation}{0}
- \setcounter{footnote}{0}%
- \begingroup
- \parindent=\z@
- \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
- \if@twocolumn
- \ifnum \col@number=\@ne
- \@maketitle
- \else
- \twocolumn[\@maketitle]%
- \fi
- \else
- \newpage
- \global\@topnum\z@ % Prevents figures from going at top of page.
- \@maketitle
- \fi
- \thispagestyle{empty}\@thanks
-%
- \def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}%
- \def\thanks##1{\unskip{}}\def\fnmsep{\unskip}%
- \instindent=\hsize
- \advance\instindent by-\headlineindent
- \if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else
- \addcontentsline{toc}{title}{\the\toctitle}\fi
- \if@runhead
- \if!\the\titlerunning!\else
- \edef\@title{\the\titlerunning}%
- \fi
- \global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}%
- \ifdim\wd\titrun>\instindent
- \typeout{Title too long for running head. Please supply}%
- \typeout{a shorter form with \string\titlerunning\space prior to
- \string\maketitle}%
- \global\setbox\titrun=\hbox{\small\rm
- Title Suppressed Due to Excessive Length}%
- \fi
- \xdef\@title{\copy\titrun}%
- \fi
-%
- \if!\the\tocauthor!\relax
- {\def\and{\noexpand\protect\noexpand\and}%
- \protected@xdef\toc@uthor{\@author}}%
- \else
- \def\\{\noexpand\protect\noexpand\newline}%
- \protected@xdef\scratch{\the\tocauthor}%
- \protected@xdef\toc@uthor{\scratch}%
- \fi
- \addtocontents{toc}{{\protect\raggedright\protect\leftskip15\p@
- \protect\rightskip\@tocrmarg
- \protect\itshape\toc@uthor\protect\endgraf}}%
- \if@runhead
- \if!\the\authorrunning!
- \value{@inst}=\value{@auth}%
- \setcounter{@auth}{1}%
- \else
- \edef\@author{\the\authorrunning}%
- \fi
- \global\setbox\authrun=\hbox{\small\unboldmath\@author\unskip}%
- \ifdim\wd\authrun>\instindent
- \typeout{Names of authors too long for running head. Please supply}%
- \typeout{a shorter form with \string\authorrunning\space prior to
- \string\maketitle}%
- \global\setbox\authrun=\hbox{\small\rm
- Authors Suppressed Due to Excessive Length}%
- \fi
- \xdef\@author{\copy\authrun}%
- \markboth{\@author}{\@title}%
- \fi
- \endgroup
- \setcounter{footnote}{0}%
- \clearheadinfo}
-%
-\def\@maketitle{\newpage
- \markboth{}{}%
- \def\lastand{\ifnum\value{@inst}=2\relax
- \unskip{} \andname\
- \else
- \unskip \lastandname\
- \fi}%
- \def\and{\stepcounter{@auth}\relax
- \ifnum\value{@auth}=\value{@inst}%
- \lastand
- \else
- \unskip,
- \fi}%
- \begin{center}%
- {\Large \bfseries\boldmath
- \pretolerance=10000
- \@title \par}\vskip .8cm
-\if!\@subtitle!\else {\large \bfseries\boldmath
- \vskip -.65cm
- \pretolerance=10000
- \@subtitle \par}\vskip .8cm\fi
- \setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}%
- \def\thanks##1{}\@author}%
- \global\value{@inst}=\value{@auth}%
- \global\value{auco}=\value{@auth}%
- \setcounter{@auth}{1}%
-{\lineskip .5em
-\noindent\ignorespaces
-\@author\vskip.35cm}
- {\small\institutename}
- \end{center}%
- }
-
-% definition of the "\spnewtheorem" command.
-%
-% Usage:
-%
-% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font}
-% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font}
-% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font}
-%
-% New is "cap_font" and "body_font". It stands for
-% fontdefinition of the caption and the text itself.
-%
-% "\spnewtheorem*" gives a theorem without number.
-%
-% A defined spnewthoerem environment is used as described
-% by Lamport.
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\def\@thmcountersep{}
-\def\@thmcounterend{.}
-
-\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}}
-
-% definition of \spnewtheorem with number
-
-\def\@spnthm#1#2{%
- \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}}
-\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}}
-
-\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname
- {\@definecounter{#1}\@addtoreset{#1}{#3}%
- \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
- \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}%
- \expandafter\xdef\csname #1name\endcsname{#2}%
- \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
- \global\@namedef{end#1}{\@endtheorem}}}
-
-\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
- {\@definecounter{#1}%
- \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
- \expandafter\xdef\csname #1name\endcsname{#2}%
- \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}%
- \global\@namedef{end#1}{\@endtheorem}}}
-
-\def\@spothm#1[#2]#3#4#5{%
- \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}%
- {\expandafter\@ifdefinable\csname #1\endcsname
- {\global\@namedef{the#1}{\@nameuse{the#2}}%
- \expandafter\xdef\csname #1name\endcsname{#3}%
- \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}%
- \global\@namedef{end#1}{\@endtheorem}}}}
-
-\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@
-\refstepcounter{#1}%
-\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}}
-
-\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}%
- \ignorespaces}
-
-\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname
- the#1\endcsname}{#5}{#3}{#4}\ignorespaces}
-
-\def\@spbegintheorem#1#2#3#4{\trivlist
- \item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4}
-
-\def\@spopargbegintheorem#1#2#3#4#5{\trivlist
- \item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5}
-
-% definition of \spnewtheorem* without number
-
-\def\@sthm#1#2{\@Ynthm{#1}{#2}}
-
-\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
- {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}%
- \expandafter\xdef\csname #1name\endcsname{#2}%
- \global\@namedef{end#1}{\@endtheorem}}}
-
-\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@
-\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}}
-
-\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces}
-
-\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1}
- {#4}{#2}{#3}\ignorespaces}
-
-\def\@Begintheorem#1#2#3{#3\trivlist
- \item[\hskip\labelsep{#2#1\@thmcounterend}]}
-
-\def\@Opargbegintheorem#1#2#3#4{#4\trivlist
- \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }}
-
-\if@envcntsect
- \def\@thmcountersep{.}
- \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape}
-\else
- \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape}
- \if@envcntreset
- \@addtoreset{theorem}{section}
- \else
- \@addtoreset{theorem}{chapter}
- \fi
-\fi
-
-%definition of divers theorem environments
-\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily}
-\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily}
-\if@envcntsame % alle Umgebungen wie Theorem.
- \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}}
-\else % alle Umgebungen mit eigenem Zaehler
- \if@envcntsect % mit section numeriert
- \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}}
- \else % nicht mit section numeriert
- \if@envcntreset
- \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
- \@addtoreset{#1}{section}}
- \else
- \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
- \@addtoreset{#1}{chapter}}%
- \fi
- \fi
-\fi
-\spn@wtheorem{case}{Case}{\itshape}{\rmfamily}
-\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily}
-\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape}
-\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape}
-\spn@wtheorem{example}{Example}{\itshape}{\rmfamily}
-\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily}
-\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape}
-\spn@wtheorem{note}{Note}{\itshape}{\rmfamily}
-\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily}
-\spn@wtheorem{property}{Property}{\itshape}{\rmfamily}
-\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape}
-\spn@wtheorem{question}{Question}{\itshape}{\rmfamily}
-\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily}
-\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily}
-
-\def\@takefromreset#1#2{%
- \def\@tempa{#1}%
- \let\@tempd\@elt
- \def\@elt##1{%
- \def\@tempb{##1}%
- \ifx\@tempa\@tempb\else
- \@addtoreset{##1}{#2}%
- \fi}%
- \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname
- \expandafter\def\csname cl@#2\endcsname{}%
- \@tempc
- \let\@elt\@tempd}
-
-\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist
- \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5}
- \def\@Opargbegintheorem##1##2##3##4{##4\trivlist
- \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}
- }
-
-\renewenvironment{abstract}{%
- \list{}{\advance\topsep by0.35cm\relax\small
- \leftmargin=1cm
- \labelwidth=\z@
- \listparindent=\z@
- \itemindent\listparindent
- \rightmargin\leftmargin}\item[\hskip\labelsep
- \bfseries\abstractname]}
- {\endlist}
-\renewcommand{\abstractname}{Abstract.}
-\renewcommand{\contentsname}{Table of Contents}
-\renewcommand{\figurename}{Fig.}
-\renewcommand{\tablename}{Table}
-
-\newdimen\headlineindent % dimension for space between
-\headlineindent=1.166cm % number and text of headings.
-
-\def\ps@headings{\let\@mkboth\@gobbletwo
- \let\@oddfoot\@empty\let\@evenfoot\@empty
- \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
- \leftmark\hfil}
- \def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}%
- \llap{\thepage}}
- \def\chaptermark##1{}%
- \def\sectionmark##1{}%
- \def\subsectionmark##1{}}
-
-\def\ps@titlepage{\let\@mkboth\@gobbletwo
- \let\@oddfoot\@empty\let\@evenfoot\@empty
- \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
- \hfil}
- \def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}%
- \llap{\thepage}}
- \def\chaptermark##1{}%
- \def\sectionmark##1{}%
- \def\subsectionmark##1{}}
-
-\if@runhead\ps@headings\else
-\ps@empty\fi
-
-\setlength\arraycolsep{1.4\p@}
-\setlength\tabcolsep{1.4\p@}
-
-\endinput
-
diff --git a/doc/design-paper/sptor.tex b/doc/design-paper/sptor.tex
deleted file mode 100644
index 4b659eeda1..0000000000
--- a/doc/design-paper/sptor.tex
+++ /dev/null
@@ -1,353 +0,0 @@
-\documentclass{llncs}
-
-\usepackage{url}
-\usepackage{amsmath}
-\usepackage{epsfig}
-
-\setlength{\textwidth}{5.9in}
-\setlength{\textheight}{8.4in}
-\setlength{\topmargin}{.5cm}
-\setlength{\oddsidemargin}{1cm}
-\setlength{\evensidemargin}{1cm}
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-
-
-\newcommand{\workingnote}[1]{} % The version that hides the note.
-%\newcommand{\workingnote}[1]{(**#1)} % The version that makes the note visible.
-
-
-\begin{document}
-
-\title{Design challenges and social factors in deploying low-latency anonymity}
-% Could still use a better title -PFS
-
-\author{Roger Dingledine\inst{1} \and
-Nick Mathewson\inst{1} \and
-Paul Syverson\inst{2}}
-\institute{The Tor Project \email{<\{arma,nickm\}@torproject.org>} \and
-Naval Research Laboratory \email{<syverson@itd.nrl.navy.mil>}}
-
-\maketitle
-\pagestyle{plain}
-
-\begin{abstract}
- There are many unexpected or unexpectedly difficult obstacles to
- deploying anonymous communications. We describe Tor (\emph{the}
- onion routing), how to use it, our design philosophy, and some of
- the challenges that we have faced and continue to face in building,
- deploying, and sustaining a scalable, distributed, low-latency
- anonymity network.
-\end{abstract}
-
-\section{Introduction}
-This article describes Tor, a widely-used low-latency general-purpose
-anonymous communication system, and discusses some unexpected
-challenges arising from our experiences deploying Tor. We will tell
-you how to use it, who uses it, how it works, why we designed it the
-way we did, and why this makes it usable and stable.
-
-Tor is an overlay network for anonymizing TCP streams over the
-Internet~\cite{tor-design}. Tor works on the real-world Internet,
-requires no special privileges or kernel modifications, requires
-little synchronization or coordination between nodes, and provides a
-reasonable trade-off between anonymity, usability, and efficiency.
-
-Since deployment in October 2003 the public Tor network has grown to
-about a thousand volunteer-operated nodes worldwide and over 110
-megabytes average traffic per second from hundreds of thousands of
-concurrent users.
-
-\section{Tor Design and Design Philosophy: Distributed Trust and Usability}
-
-Tor enables users to connect to Internet sites without revealing their
-logical or physical locations to those sites or to observers. It
-enables hosts to be publicly accessible yet have similar protection
-against location through its \emph{location-hidden services}.
-
-To connect to a remote server via Tor the client software first learns
-a %signed
-list of Tor nodes from several central \emph{directory servers} via a
-voting protocol (to avoid dependence on or complete trust in any one
-of these servers). It then incrementally creates a private pathway or
-\emph{circuit} across the network. This circuit consists of
-encrypted connections through authenticated Tor nodes
-whose public keys were obtained from the directory servers. The client
-software negotiates a separate set of encryption keys for each hop along the
-circuit. The nodes in the circuit are chosen at random by the client
-subject to a preference for higher performing nodes to allocate
-resources effectively and with a client-chosen preferred set of first
-nodes called \emph{entry guards} to complicate profiling attacks by
-internal adversaries~\cite{hs-attack}.
-The circuit is extended one node at a time, tunneling extensions
-through already established portions of the circuit, and each node
-along the way knows only the immediately previous and following nodes
-in the circuit, so no individual Tor node knows the complete path that
-each fixed-sized data packet (or \emph{cell}) will take. Thus,
-neither an eavesdropper nor a compromised node can see both the
-connection's source and destination. Later requests use a new
-circuit to complicate long-term linkability between different actions
-by a single user.
-
-Tor attempts to anonymize the transport layer, not the application
-layer. Thus, applications such as SSH can provide
-authenticated communication that is hidden by Tor from outside observers.
-When anonymity from communication partners is desired,
-application-level protocols that transmit identifying
-information need additional scrubbing proxies, such as
-Privoxy~\cite{privoxy} for HTTP\@. Furthermore, Tor does not relay
-arbitrary IP packets; it only anonymizes TCP streams and DNS requests.
-
-Tor, the third generation of deployed onion-routing
-designs~\cite{or-ih96,or-jsac98,tor-design}, was researched, developed,
-and deployed by the Naval Research Laboratory and the Free Haven
-Project under ONR and DARPA funding for secure government
-communications. In 2005, continuing work by Free Haven was funded by
-the Electronic Frontier Foundation for maintaining civil liberties of
-ordinary citizens online. In 2006, The Tor Project incorporated as a
-non-profit and has received continued funding from the Omidyar Network,
-the U.S. International Broadcasting Bureau, and other groups to combat
-blocking and censorship on the Internet. This diversity of funding fits
-Tor's overall philosophy: a wide variety of interests helps maintain
-both the stability and the security of the network.
-
-Usability is also a central goal. Downloading and installing Tor is
-easy. Simply go to\\
-http://www.torproject.org/ and download. Tor comes with install
-wizards and a GUI for major operating systems: GNU/Linux, OS X, and
-Windows. It also runs on various flavors of BSD and UNIX\@. Basic
-instructions, documentation, FAQs, etc.\ are available in many
-languages. The Tor GUI Vidalia makes server configuration easy, e.g.,
-choosing how much bandwidth to allocate to Tor, exit policy choices,
-etc. And, the GUI Torbutton allows Firefox users a one-click toggle of
-whether browsing goes through Tor or not. Tor is easily configured by
-a site administrator to run at either individual desktops or just at a
-site firewall or combinations of these.
-
-The ideal Tor network would be practical, useful and anonymous. When
-trade-offs arise between these properties, Tor's research strategy has
-been to remain useful enough to attract many users, and practical
-enough to support them. Only subject to these constraints do we try
-to maximize anonymity. Tor thus differs from other deployed systems
-for traffic analysis resistance in its security and flexibility. Mix
-networks such as
-% Mixmaster~\cite{mixmaster-spec} or its successor
-Mixminion~\cite{minion-design} gain the highest degrees of practical
-anonymity at the expense of introducing highly variable delays, making
-them unsuitable for applications such as web browsing. Commercial
-single-hop proxies~\cite{anonymizer} can provide good performance, but
-a single-point compromise can expose all users' traffic, and a
-single-point eavesdropper can perform traffic analysis on the entire
-network. Also, their proprietary implementations place any
-infrastructure that depends on these single-hop solutions at the mercy
-of their providers' financial health as well as network security.
-There are numerous other designs for distributed anonymous low-latency
-communication~\cite{crowds-tissec,web-mix,freedom21-security,i2p,tarzan:ccs02,morphmix:fc04}.
-Some have been deployed or even commercialized; some exist only on
-paper. Though each has something unique to offer, we feel Tor has
-advantages over each of them that make it a superior choice for most
-users and applications. For example, unlike purely P2P designs we
-neither limit ordinary users to content and services available only
-within our network nor require them to take on responsibility for
-connections outside the network, unless they separately choose to run
-server nodes. Nonetheless because we support low-latency interactive
-communications, end-to-end \emph{traffic correlation}
-attacks~\cite{danezis:pet2004,defensive-dropping,SS03,hs-attack,bauer:tr2007}
-allow an attacker who can observe both ends of a communication to
-correlate packet timing and volume, quickly linking the initiator to
-her destination.
-
-
-Our defense lies in having a diverse enough set of nodes to prevent
-most real-world adversaries from being in the right places to attack
-users, by distributing each transaction over several nodes in the
-network. This ``distributed trust'' approach means the Tor network
-can be safely operated and used by a wide variety of mutually
-distrustful users, providing sustainability and security.
-
-The Tor network has a broad range of users, making it difficult for
-eavesdroppers to track them or profile interests. These include
-ordinary citizens concerned about their privacy, corporations who
-don't want to reveal information to their competitors, and law
-enforcement and government intelligence agencies who need to do
-operations on the Internet without being noticed. Naturally,
-organizations will not want to depend on others for their security.
-If most participating providers are reliable, Tor tolerates some
-hostile infiltration of the network.
-
-This distribution of trust is central to the Tor philosophy and
-pervades Tor at all levels: Onion routing has been open source since
-the mid-nineties (mistrusting users can inspect the code themselves);
-Tor is free software (anyone could take up the development of Tor from
-the current team); anyone can use Tor without license or charge (which
-encourages a broad user base with diverse interests); Tor is designed to be
-usable (also promotes a large, diverse user base) and configurable (so
-users can easily set up and run server nodes); the Tor
-infrastructure is run by volunteers (it is not dependent on the
-economic viability or business strategy of any company) who are
-scattered around the globe (not completely under the jurisdiction of
-any single country); ongoing development and deployment has been
-funded by diverse sources (development does not fully depend on
-funding from any one source or even funding for any one primary
-purpose or sources in any one jurisdiction). All of these contribute
-to Tor's resilience and sustainability.
-
-
-\section{Social challenges}
-
-Many of the issues the Tor project needs to address extend beyond
-system design and technology development. In particular, the Tor
-project's \emph{image} with respect to its users and the rest of the
-Internet impacts the security it can provide. With this image issue
-in mind, this section discusses the Tor user base and Tor's
-interaction with other services on the Internet.
-
-\subsection{Communicating security}
-
-Usability for anonymity systems contributes to their security, because
-usability affects the possible anonymity set~\cite{econymics,back01}.
-Conversely, an unusable system attracts few users and thus can't
-provide much anonymity.
-
-This phenomenon has a second-order effect: knowing this, users should
-choose which anonymity system to use based in part on how usable and
-secure \emph{others} will find it, in order to get the protection of a
-larger anonymity set. Thus we might supplement the adage ``usability
-is a security parameter''~\cite{back01} with a new one: ``perceived
-usability is a security parameter.''~\cite{usability-network-effect}.
-
-
-
-\subsection{Reputability and perceived social value}
-Another factor impacting the network's security is its reputability,
-the perception of its social value based on its current user base. If
-Alice is the only user who has ever downloaded the software, it might
-be socially accepted, but she's not getting much anonymity. Add a
-thousand activists, and she's anonymous, but everyone thinks she's an
-activist too. Add a thousand diverse citizens (cancer survivors,
-people concerned about identity theft, law enforcement agents, and so
-on) and now she's harder to profile.
-
-Furthermore, the network's reputability affects its operator base:
-more people are willing to run a service if they believe it will be
-used by human rights workers than if they believe it will be used
-exclusively for disreputable ends. This effect becomes stronger if
-node operators themselves think they will be associated with their
-users' ends.
-
-So the more cancer survivors on Tor, the better for the human rights
-activists. The more malicious hackers, the worse for the normal
-users. Thus, reputability is an anonymity issue for two
-reasons. First, it impacts the sustainability of the network: a
-network that's always about to be shut down has difficulty attracting
-and keeping adequate nodes. Second, a disreputable network is more
-vulnerable to legal and political attacks, since it will attract fewer
-supporters.
-
-Reputability becomes even more tricky in the case of privacy networks,
-since the good uses of the network (such as publishing by journalists
-in dangerous countries, protecting road warriors from profiling and
-potential physical harm, tracking of criminals by law enforcement,
-protecting corporate research interests, etc.) are typically kept private,
-whereas network abuses or other problems tend to be more widely
-publicized.
-
-
-\subsection{Abuse}
-\label{subsec:tor-and-blacklists}
-
-For someone willing to be antisocial or even break the law, Tor is
-usually a poor choice to hide bad behavior. For example, Tor nodes are
-publicly identified, unlike the million-node botnets that are now
-common on the Internet. Nonetheless, we always expected that,
-alongside legitimate users, Tor would also attract troublemakers who
-exploit Tor to abuse services on the Internet with vandalism, rude
-mail, and so on. \emph{Exit policies} have allowed individual nodes
-to block access to specific IP/port ranges. This approach aims to
-make operators more willing to run Tor by allowing them to prevent
-their nodes from being used for abusing particular services. For
-example, by default Tor nodes block SMTP (port 25), to avoid the issue
-of spam.
-
-Exit policies are useful but insufficient: if not all nodes block a
-given service, that service may try to block Tor instead. While being
-blockable is important to being good netizens, we would like to
-encourage services to allow anonymous access. Services should not need
-to decide between blocking legitimate anonymous use and allowing
-unlimited abuse. Nonetheless, blocking IP addresses is a
-course-grained solution~\cite{netauth}: entire apartment buildings,
-campuses, and even countries sometimes share a single IP address.
-Also, whether intended or not, such blocking supports repression of
-free speech. In many locations where Internet access of various kinds
-is censored or even punished by imprisonment, Tor is a path both to
-the outside world and to others inside. Blocking posts from Tor makes
-the job of censoring authorities easier. This is a loss for both Tor
-and services that block, such as Wikipedia: we don't want to compete
-for (or divvy up) the NAT-protected entities of the world. This is
-also unfortunate because there are relatively simple technical
-solutions~\cite{nym}. Various schemes for escrowing anonymous posts
-until they are reviewed by editors would both prevent abuse and remove
-incentives for attempts to abuse. Further, pseudonymous reputation
-tracking of posters through Tor would allow those who establish
-adequate reputation to post without escrow~\cite{nym,nymble}.
-
-We stress that as far as we can tell, most Tor uses are not
-abusive. Most services have not complained, and others are actively
-working to find ways besides banning to cope with the abuse. For
-example, the Freenode IRC network had a problem with a coordinated
-group of abusers joining channels and subtly taking over the
-conversation; but when they labelled all users coming from Tor IP
-addresses as ``anonymous users,'' removing the ability of the abusers
-to blend in, the abusers stopped using Tor. This is an illustration of
-how simple
-technical mechanisms can remove the ability to abuse anonymously
-without undermining the ability to communicate anonymously and can
-thus remove the incentive to attempt abusing in this way.
-
-
-
-\section{The Future}
-\label{sec:conclusion}
-
-Tor is the largest and most diverse low-latency anonymity network
-available, but we are still in the early stages. Several major
-questions remain.
-
-First, will our volunteer-based approach to sustainability continue to
-work as well in the long term as it has the first several years?
-Besides node operation, Tor research, deployment, maintainance, and
-development is increasingly done by volunteers: package maintenance
-for various OSes, document translation, GUI design and implementation,
-live CDs, specification of new design changes, etc.\
-%
-Second, Tor is only one of many components that preserve privacy
-online. For applications where it is desirable to keep identifying
-information out of application traffic, someone must build more and
-better protocol-aware proxies that are usable by ordinary people.
-%
-Third, we need to maintain a reputation for social good, and learn how to
-coexist with the variety of Internet services and their established
-authentication mechanisms. We can't just keep escalating the blacklist
-standoff forever.
-%
-Fourth, the current Tor architecture hardly scales even to handle
-current user demand. We must deploy designs and incentives to further
-encourage clients to relay traffic too, without thereby trading away
-too much anonymity or other properties.
-
-These are difficult and open questions. Yet choosing not to solve them
-means leaving most users to a less secure network or no anonymizing
-network at all.\\
-
-\noindent{\bf Acknowledgment:} Thanks to Matt Edman for many
- helpful comments on a draft of this article.
-\bibliographystyle{plain} \bibliography{tor-design}
-
-\end{document}
-
diff --git a/doc/design-paper/tor-design.bib b/doc/design-paper/tor-design.bib
deleted file mode 100644
index 981761e94b..0000000000
--- a/doc/design-paper/tor-design.bib
+++ /dev/null
@@ -1,1493 +0,0 @@
-% hs-attack
-@inproceedings{hs-attack,
- title = {Locating Hidden Servers},
- author = {Lasse {\O}verlier and Paul Syverson},
- booktitle = {Proceedings of the 2006 IEEE Symposium on Security and Privacy},
- year = {2006},
- month = {May},
- publisher = {IEEE CS},
-}
-
-
-@TechReport{bauer:tr2007,
- author = {Kevin Bauer and Damon McCoy and Dirk Grunwald and Tadayoshi Kohno and Douglas Sicker},
- title = {Low-Resource Routing Attacks Against Anonymous Systems},
- institution = {University of Colorado at Boulder},
- year = 2007,
- number = {CU-CS-1025-07}
-}
-
-@inproceedings{bauer:wpes2007,
- title = {Low-Resource Routing Attacks Against Tor},
- author = {Kevin Bauer and Damon McCoy and Dirk Grunwald and Tadayoshi Kohno and Douglas Sicker},
- booktitle = {{Proceedings of the Workshop on Privacy in the Electronic Society (WPES 2007)}},
- year = {2007},
- month = {October},
- address = {Washington, DC, USA},
-}
-
-% fix me
-@misc{tannenbaum96,
- author = "Andrew Tannenbaum",
- title = "Computer Networks",
- year = "1996",
- publisher = "Prentice Hall, 3rd edition",
-}
-
-@article{ meadows96,
- author = "Catherine Meadows",
- title = "The {NRL} Protocol Analyzer: An Overview",
- journal = "Journal of Logic Programming",
- volume = "26",
- number = "2",
- pages = "113--131",
- year = "1996",
-}
-@inproceedings{kesdogan:pet2002,
- title = {Unobservable Surfing on the World Wide Web: Is Private Information Retrieval an
- alternative to the MIX based Approach?},
- author = {Dogan Kesdogan and Mark Borning and Michael Schmeink},
- booktitle = {Privacy Enhancing Technologies (PET 2002)},
- year = {2002},
- month = {April},
- editor = {Roger Dingledine and Paul Syverson},
- publisher = {Springer-Verlag, LNCS 2482},
-}
-
-@inproceedings{statistical-disclosure,
- title = {Statistical Disclosure Attacks},
- author = {George Danezis},
- booktitle = {Security and Privacy in the Age of Uncertainty ({SEC2003})},
- organization = {{IFIP TC11}},
- year = {2003},
- month = {May},
- address = {Athens},
- pages = {421--426},
- publisher = {Kluwer},
-}
-
-@inproceedings{limits-open,
- title = {Limits of Anonymity in Open Environments},
- author = {Dogan Kesdogan and Dakshi Agrawal and Stefan Penz},
- booktitle = {Information Hiding Workshop (IH 2002)},
- year = {2002},
- month = {October},
- editor = {Fabien Petitcolas},
- publisher = {Springer-Verlag, LNCS 2578},
-}
-
-@inproceedings{isdn-mixes,
- title = {{ISDN-mixes: Untraceable communication with very small bandwidth overhead}},
- author = {Andreas Pfitzmann and Birgit Pfitzmann and Michael Waidner},
- booktitle = {GI/ITG Conference on Communication in Distributed Systems},
- year = {1991},
- month = {February},
- pages = {451-463},
-}
-
-
-@Article{jerichow-jsac98,
- author = {Anja Jerichow and Jan M\"{u}ller and Andreas
- Pfitzmann and Birgit Pfitzmann and Michael Waidner},
- title = {Real-Time Mixes: A Bandwidth-Efficient Anonymity Protocol},
- journal = {IEEE Journal on Selected Areas in Communications},
- year = 1998,
- volume = 16,
- number = 4,
- pages = {495--509},
- month = {May}
-}
-
-@inproceedings{tarzan:ccs02,
- title = {Tarzan: A Peer-to-Peer Anonymizing Network Layer},
- author = {Michael J. Freedman and Robert Morris},
- booktitle = {9th {ACM} {C}onference on {C}omputer and {C}ommunications
- {S}ecurity ({CCS 2002})},
- year = {2002},
- month = {November},
- address = {Washington, DC},
-}
-
-@inproceedings{cebolla,
- title = {{Cebolla: Pragmatic IP Anonymity}},
- author = {Zach Brown},
- booktitle = {Ottawa Linux Symposium},
- year = {2002},
- month = {June},
-}
-
-@inproceedings{eax,
- author = "M. Bellare and P. Rogaway and D. Wagner",
- title = {The {EAX} Mode of Operation: A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and Efficiency},
- booktitle = {Fast Software Encryption 2004},
- month = {February},
- year = {2004},
-}
-
-@misc{darkside,
- title = {{The Dark Side of the Web: An Open Proxy's View}},
- author = {Vivek S. Pai and Limin Wang and KyoungSoo Park and Ruoming Pang and Larry Peterson},
- note = {\newline \url{http://codeen.cs.princeton.edu/}},
-}
-% note = {Submitted to HotNets-II. \url{http://codeen.cs.princeton.edu/}},
-
-@Misc{anonymizer,
- key = {anonymizer},
- title = {The {Anonymizer}},
- note = {\url{http://anonymizer.com/}}
-}
-
-@Misc{privoxy,
- key = {privoxy},
- title = {{Privoxy}},
- note = {\url{http://www.privoxy.org/}}
-}
-
-@Misc{i2p,
- key = {i2p},
- title = {{I2P}},
- note = {\url{http://www.i2p.net/}}
-}
-
-@Misc{nym,
- author = {Jason Holt},
- title = {nym: practical pseudonymity for anonymous networks},
- note = {Paper and source code at \url{http://www.lunkwill.org/src/nym/}}
-}
-
-@InProceedings{nymble,
- author = {Peter C. Johnson and Apu Kapadia and Patrick P. Tsang and Sean W. Smith},
- title = {Nymble: Anonymous {IP}-address Blocking},
- booktitle = {Privacy Enhancing Technologies (PET 2007)},
- year = 2007,
- publisher = {Springer-Verlag, LNCS 4776}
-}
-
-@inproceedings{anonnet,
- title = {{Analysis of an Anonymity Network for Web Browsing}},
- author = {Marc Rennhard and Sandro Rafaeli and Laurent Mathy and Bernhard Plattner and
- David Hutchison},
- booktitle = {{IEEE 7th Intl. Workshop on Enterprise Security (WET ICE
- 2002)}},
- year = {2002},
- month = {June},
- address = {Pittsburgh, USA},
-}
-% pages = {49--54},
-
-@inproceedings{econymics,
- title = {On the Economics of Anonymity},
- author = {Alessandro Acquisti and Roger Dingledine and Paul Syverson},
- booktitle = {Financial Cryptography},
- year = {2003},
- editor = {Rebecca N. Wright},
- publisher = {Springer-Verlag, LNCS 2742},
-}
-
-@inproceedings{defensive-dropping,
- title = {Timing Analysis in Low-Latency Mix-Based Systems},
- author = {Brian N. Levine and Michael K. Reiter and Chenxi Wang and Matthew Wright},
- booktitle = {Financial Cryptography},
- year = {2004},
- editor = {Ari Juels},
- publisher = {Springer-Verlag, LNCS (forthcoming)},
-}
-
-@inproceedings{morphmix:fc04,
- title = {Practical Anonymity for the Masses with MorphMix},
- author = {Marc Rennhard and Bernhard Plattner},
- booktitle = {Financial Cryptography},
- year = {2004},
- editor = {Ari Juels},
- publisher = {Springer-Verlag, LNCS (forthcoming)},
-}
-
-@inproceedings{eternity,
- title = {The Eternity Service},
- author = {Ross Anderson},
- booktitle = {Pragocrypt '96},
- year = {1996},
-}
- %note = {\url{http://www.cl.cam.ac.uk/users/rja14/eternity/eternity.html}},
-
-
-@inproceedings{minion-design,
- title = {Mixminion: Design of a Type {III} Anonymous Remailer Protocol},
- author = {George Danezis and Roger Dingledine and Nick Mathewson},
- booktitle = {2003 IEEE Symposium on Security and Privacy},
- year = {2003},
- month = {May},
- publisher = {IEEE CS},
- pages = {2--15},
-}
- %note = {\url{http://mixminion.net/minion-design.pdf}},
-
-@inproceedings{ rao-pseudonymity,
- author = "Josyula R. Rao and Pankaj Rohatgi",
- title = "Can Pseudonymity Really Guarantee Privacy?",
- booktitle = "Proceedings of the Ninth USENIX Security Symposium",
- year = {2000},
- month = Aug,
- publisher = {USENIX},
- pages = "85--96",
-}
- %note = {\url{http://www.usenix.org/publications/library/proceedings/sec2000/
-%full_papers/rao/rao.pdf}},
-
-@InProceedings{pfitzmann90how,
- author = "Birgit Pfitzmann and Andreas Pfitzmann",
- title = "How to Break the Direct {RSA}-Implementation of {MIXes}",
- booktitle = {Eurocrypt 89},
- publisher = {Springer-Verlag, LNCS 434},
- year = {1990},
- note = {\url{http://citeseer.nj.nec.com/pfitzmann90how.html}},
-}
-
-@Misc{tor-spec,
- author = {Roger Dingledine and Nick Mathewson},
- title = {Tor Protocol Specifications},
- note = {\url{https://www.torproject.org/svn/trunk/doc/tor-spec.txt}},
-}
-
-@Misc{incentives-txt,
- author = {Roger Dingledine and Nick Mathewson},
- title = {Tor Incentives Design Brainstorms},
- note = {\url{https://www.torproject.org/svn/trunk/doc/incentives.txt}},
-}
-
-@InProceedings{BM:mixencrypt,
- author = {M{\"o}ller, Bodo},
- title = {Provably Secure Public-Key Encryption for Length-Preserving Chaumian Mixes},
- booktitle = {{CT-RSA} 2003},
- publisher = {Springer-Verlag, LNCS 2612},
- year = 2003,
-}
-
-@InProceedings{back01,
- author = {Adam Back and Ulf M\"oller and Anton Stiglic},
- title = {Traffic Analysis Attacks and Trade-Offs in Anonymity Providing Systems},
- booktitle = {Information Hiding (IH 2001)},
- pages = {245--257},
- year = 2001,
- editor = {Ira S. Moskowitz},
- publisher = {Springer-Verlag, LNCS 2137},
-}
- %note = {\newline \url{http://www.cypherspace.org/adam/pubs/traffic.pdf}},
-
-@InProceedings{rackoff93cryptographic,
- author = {Charles Rackoff and Daniel R. Simon},
- title = {Cryptographic Defense Against Traffic Analysis},
- booktitle = {{ACM} Symposium on Theory of Computing},
- pages = {672--681},
- year = {1993},
-}
- %note = {\url{http://research.microsoft.com/crypto/dansimon/me.htm}},
-
-@InProceedings{freehaven-berk,
- author = {Roger Dingledine and Michael J. Freedman and David Molnar},
- title = {The Free Haven Project: Distributed Anonymous Storage Service},
- booktitle = {Designing Privacy Enhancing Technologies: Workshop
- on Design Issue in Anonymity and Unobservability},
- year = 2000,
- month = {July},
- editor = {H. Federrath},
- publisher = {Springer-Verlag, LNCS 2009},
-}
-
- @InProceedings{move-ndss05,
- author = {Angelos Stavrou and Angelos D. Keromytis and Jason Nieh and Vishal Misra and Dan Rubenstein},
- title = {MOVE: An End-to-End Solution To Network Denial of Service},
- booktitle = {{ISOC Network and Distributed System Security Symposium (NDSS05)}},
- year = 2005,
- month = {February},
- publisher = {Internet Society}
-}
-
-%note = {\url{http://freehaven.net/papers.html}},
-
-
-
-
-@InProceedings{raymond00,
- author = {J. F. Raymond},
- title = {{Traffic Analysis: Protocols, Attacks, Design Issues,
- and Open Problems}},
- booktitle = {Designing Privacy Enhancing Technologies: Workshop
- on Design Issue in Anonymity and Unobservability},
- year = 2000,
- month = {July},
- pages = {10-29},
- editor = {H. Federrath},
- publisher = {Springer-Verlag, LNCS 2009},
-}
-
-@InProceedings{sybil,
- author = "John Douceur",
- title = {{The Sybil Attack}},
- booktitle = "Proceedings of the 1st International Peer To Peer Systems Workshop (IPTPS)",
- month = Mar,
- year = 2002,
-}
-
-
-@InCollection{price-privacy,
- author = {Paul Syverson and Adam Shostack},
- editor = {L. Jean Camp and Stephen Lewis},
- title = {What Price Privacy? (and why identity theft is about neither identity nor theft)},
- booktitle = {Economics of Information Security},
- chapter = 10,
- publisher = {Kluwer},
- year = 2004,
- pages = {129--142}
-}
-
-
-@InProceedings{trickle02,
- author = {Andrei Serjantov and Roger Dingledine and Paul Syverson},
- title = {From a Trickle to a Flood: Active Attacks on Several
- Mix Types},
- booktitle = {Information Hiding (IH 2002)},
- year = {2002},
- editor = {Fabien Petitcolas},
- publisher = {Springer-Verlag, LNCS 2578},
-}
-
-@InProceedings{langos02,
- author = {Oliver Berthold and Heinrich Langos},
- title = {Dummy Traffic Against Long Term Intersection Attacks},
- booktitle = {Privacy Enhancing Technologies (PET 2002)},
- year = {2002},
- editor = {Roger Dingledine and Paul Syverson},
- publisher = {Springer-Verlag, LNCS 2482}
-}
-
-
-@InProceedings{hintz-pet02,
- author = {Andrew Hintz},
- title = {Fingerprinting Websites Using Traffic Analysis},
- booktitle = {Privacy Enhancing Technologies (PET 2002)},
- pages = {171--178},
- year = 2002,
- editor = {Roger Dingledine and Paul Syverson},
- publisher = {Springer-Verlag, LNCS 2482}
-}
-
-@InProceedings{or-discex00,
- author = {Paul Syverson and Michael Reed and David Goldschlag},
- title = {{O}nion {R}outing Access Configurations},
- booktitle = {DARPA Information Survivability Conference and
- Exposition (DISCEX 2000)},
- year = {2000},
- publisher = {IEEE CS Press},
- pages = {34--40},
- volume = {1},
-}
- %note = {\newline \url{http://www.onion-router.net/Publications.html}},
-
-@Inproceedings{or-pet00,
- title = {{Towards an Analysis of Onion Routing Security}},
- author = {Paul Syverson and Gene Tsudik and Michael Reed and
- Carl Landwehr},
- booktitle = {Designing Privacy Enhancing Technologies: Workshop
- on Design Issue in Anonymity and Unobservability},
- year = 2000,
- month = {July},
- pages = {96--114},
- editor = {H. Federrath},
- publisher = {Springer-Verlag, LNCS 2009},
-}
- %note = {\url{http://www.onion-router.net/Publications/WDIAU-2000.ps.gz}},
-
-@Inproceedings{freenet-pets00,
- title = {Freenet: A Distributed Anonymous Information Storage
- and Retrieval System},
- author = {Ian Clarke and Oskar Sandberg and Brandon Wiley and
- Theodore W. Hong},
- booktitle = {Designing Privacy Enhancing Technologies: Workshop
- on Design Issue in Anonymity and Unobservability},
- year = 2000,
- month = {July},
- pages = {46--66},
- editor = {H. Federrath},
- publisher = {Springer-Verlag, LNCS 2009},
-}
- %note = {\url{http://citeseer.nj.nec.com/clarke00freenet.html}},
-
-@InProceedings{or-ih96,
- author = {David M. Goldschlag and Michael G. Reed and Paul
- F. Syverson},
- title = {Hiding Routing Information},
- booktitle = {Information Hiding, First International Workshop},
- pages = {137--150},
- year = 1996,
- editor = {R. Anderson},
- month = {May},
- publisher = {Springer-Verlag, LNCS 1174},
-}
-
-@InProceedings{federrath-ih96,
- author = {Hannes Federrath and Anja Jerichow and Andreas Pfitzmann},
- title = {{MIXes} in Mobile Communication Systems: Location
- Management with Privacy},
- booktitle = {Information Hiding, First International Workshop},
- pages = {121--135},
- year = 1996,
- editor = {R. Anderson},
- month = {May},
- publisher = {Springer-Verlag, LNCS 1174},
-}
-
-
-@InProceedings{reed-protocols97,
- author = {Michael G. Reed and Paul F. Syverson and David
- M. Goldschlag},
- title = {Protocols Using Anonymous Connections: Mobile Applications},
- booktitle = {Security Protocols: 5th International Workshop},
- pages = {13--23},
- year = 1997,
- editor = {Bruce Christianson and Bruno Crispo and Mark Lomas
- and Michael Roe},
- month = {April},
- publisher = {Springer-Verlag, LNCS 1361}
-}
-
-
-
-@Article{or-jsac98,
- author = {Michael G. Reed and Paul F. Syverson and David
- M. Goldschlag},
- title = {Anonymous Connections and Onion Routing},
- journal = {IEEE Journal on Selected Areas in Communications},
- year = 1998,
- volume = 16,
- number = 4,
- pages = {482--494},
- month = {May},
-}
- %note = {\url{http://www.onion-router.net/Publications/JSAC-1998.ps.gz}}
-
-@Misc{TLS,
- author = {T. Dierks and C. Allen},
- title = {The {TLS} {P}rotocol --- {V}ersion 1.0},
- howpublished = {IETF RFC 2246},
- month = {January},
- year = {1999},
-}
-%note = {\url{http://www.rfc-editor.org/rfc/rfc2246.txt}},
-
-@Misc{SMTP,
- author = {J. Postel},
- title = {Simple {M}ail {T}ransfer {P}rotocol},
- howpublished = {IETF RFC 2821 (also STD0010)},
- month = {April},
- year = {2001},
- note = {\url{http://www.rfc-editor.org/rfc/rfc2821.txt}},
-}
-
-@Misc{IMAP,
- author = {M. Crispin},
- title = {Internet {M}essage {A}ccess {P}rotocol --- {V}ersion 4rev1},
- howpublished = {IETF RFC 2060},
- month = {December},
- year = {1996},
- note = {\url{http://www.rfc-editor.org/rfc/rfc2060.txt}},
-}
-
-@misc{pipenet,
- title = {PipeNet 1.1},
- author = {Wei Dai},
- year = 1996,
- month = {August},
- howpublished = {Usenet post},
- note = {\url{http://www.eskimo.com/~weidai/pipenet.txt} First mentioned
- in a post to the cypherpunks list, Feb.\ 1995.},
-}
-
-
-@Misc{POP3,
- author = {J. Myers and M. Rose},
- title = {Post {O}ffice {P}rotocol --- {V}ersion 3},
- howpublished = {IETF RFC 1939 (also STD0053)},
- month = {May},
- year = {1996},
- note = {\url{http://www.rfc-editor.org/rfc/rfc1939.txt}},
-}
-
-
-@InProceedings{shuffle,
- author = {C. Andrew Neff},
- title = {A Verifiable Secret Shuffle and its Application to E-Voting},
- booktitle = {8th ACM Conference on Computer and Communications
- Security (CCS-8)},
- pages = {116--125},
- year = 2001,
- editor = {P. Samarati},
- month = {November},
- publisher = {ACM Press},
-}
- %note = {\url{http://www.votehere.net/ada_compliant/ourtechnology/
- % technicaldocs/shuffle.pdf}},
-
-@InProceedings{dolev91,
- author = {Danny Dolev and Cynthia Dwork and Moni Naor},
- title = {Non-Malleable Cryptography},
- booktitle = {23rd ACM Symposium on the Theory of Computing (STOC)},
- pages = {542--552},
- year = 1991,
- note = {Updated version at
- \url{http://citeseer.nj.nec.com/dolev00nonmalleable.html}},
-}
-
-@TechReport{rsw96,
- author = {Ronald L. Rivest and Adi Shamir and David A. Wagner},
- title = {Time-lock puzzles and timed-release Crypto},
- year = 1996,
- type = {MIT LCS technical memo},
- number = {MIT/LCS/TR-684},
- month = {February},
- note = {\newline \url{http://citeseer.nj.nec.com/rivest96timelock.html}},
-}
-
-@InProceedings{web-mix,
- author = {Oliver Berthold and Hannes Federrath and Stefan K\"opsell},
- title = {Web {MIX}es: A system for anonymous and unobservable
- {I}nternet access},
- booktitle = {Designing Privacy Enhancing Technologies: Workshop
- on Design Issue in Anonymity and Unobservability},
- editor = {H. Federrath},
- publisher = {Springer-Verlag, LNCS 2009},
- year = {2000},
-}
-% pages = {115--129},
-
-@InProceedings{disad-free-routes,
- author = {Oliver Berthold and Andreas Pfitzmann and Ronny Standtke},
- title = {The disadvantages of free {MIX} routes and how to overcome
- them},
- booktitle = {Designing Privacy Enhancing Technologies: Workshop
- on Design Issue in Anonymity and Unobservability},
- pages = {30--45},
- year = 2000,
- editor = {H. Federrath},
- publisher = {Springer-Verlag, LNCS 2009},
-}
- %note = {\url{http://www.tik.ee.ethz.ch/~weiler/lehre/netsec/Unterlagen/anon/
- % disadvantages_berthold.pdf}},
-
-@InProceedings{boneh00,
- author = {Dan Boneh and Moni Naor},
- title = {Timed Commitments},
- booktitle = {Advances in Cryptology -- {CRYPTO} 2000},
- pages = {236--254},
- year = 2000,
- publisher = {Springer-Verlag, LNCS 1880},
- note = {\newline \url{http://crypto.stanford.edu/~dabo/abstracts/timedcommit.html}},
-}
-
-@InProceedings{goldschlag98,
- author = {David M. Goldschlag and Stuart G. Stubblebine},
- title = {Publicly Verifiable Lotteries: Applications of
- Delaying Functions},
- booktitle = {Financial Cryptography},
- pages = {214--226},
- year = 1998,
- publisher = {Springer-Verlag, LNCS 1465},
- note = {\newline \url{http://citeseer.nj.nec.com/goldschlag98publicly.html}},
-}
-
-@InProceedings{syverson98,
- author = {Paul Syverson},
- title = {Weakly Secret Bit Commitment: Applications to
- Lotteries and Fair Exchange},
- booktitle = {Computer Security Foundations Workshop (CSFW11)},
- pages = {2--13},
- year = 1998,
- address = {Rockport Massachusetts},
- month = {June},
- publisher = {IEEE CS Press},
- note = {\newline \url{http://chacs.nrl.navy.mil/publications/CHACS/1998/}},
-}
-
-@Misc{shoup-iso,
- author = {Victor Shoup},
- title = {A Proposal for an {ISO} {S}tandard for Public Key Encryption (version 2.1)},
- note = {Revised December 20, 2001. \url{http://www.shoup.net/papers/}},
-}
-
-@Misc{shoup-oaep,
- author = {Victor Shoup},
- title = {{OAEP} Reconsidered},
- howpublished = {{IACR} e-print 2000/060},
- note = {\newline \url{http://eprint.iacr.org/2000/060/}},
-}
-
-@Misc{oaep-still-alive,
- author = {E. Fujisaki and D. Pointcheval and T. Okamoto and J. Stern},
- title = {{RSA}-{OAEP} is Still Alive!},
- howpublished = {{IACR} e-print 2000/061},
- note = {\newline \url{http://eprint.iacr.org/2000/061/}},
-}
-
-@misc{echolot,
- author = {Peter Palfrader},
- title = {Echolot: a pinger for anonymous remailers},
- note = {\url{http://www.palfrader.org/echolot/}},
-}
-
-@Misc{mixmaster-attacks,
- author = {Lance Cottrell},
- title = {Mixmaster and Remailer Attacks},
- note = {\url{http://www.obscura.com/~loki/remailer/remailer-essay.html}},
-}
-
-@Misc{mixmaster-spec,
- author = {Ulf M{\"o}ller and Lance Cottrell and Peter
- Palfrader and Len Sassaman},
- title = {Mixmaster {P}rotocol --- {V}ersion 2},
- year = {2003},
- month = {July},
- howpublished = {Draft},
- note = {\url{http://www.abditum.com/mixmaster-spec.txt}},
-}
-
-@InProceedings{puzzles-tls,
- author = "Drew Dean and Adam Stubblefield",
- title = {{Using Client Puzzles to Protect TLS}},
- booktitle = "Proceedings of the 10th USENIX Security Symposium",
- year = {2001},
- month = Aug,
- publisher = {USENIX},
-}
-
-@InProceedings{breadpudding,
- author = {Markus Jakobsson and Ari Juels},
- title = {Proofs of Work and Bread Pudding Protocols},
- booktitle = {Proceedings of the IFIP TC6 and TC11 Joint Working
- Conference on Communications and Multimedia Security
- (CMS '99)},
- year = 1999,
- month = {September},
- publisher = {Kluwer}
-}
-
-@Misc{hashcash,
- author = {Adam Back},
- title = {Hash cash},
- note = {\newline \url{http://www.cypherspace.org/~adam/hashcash/}},
-}
-
-@InProceedings{oreilly-acc,
- author = {Roger Dingledine and Michael J. Freedman and David Molnar},
- title = {Accountability},
- booktitle = {Peer-to-peer: Harnessing the Benefits of a Disruptive
- Technology},
- year = {2001},
- publisher = {O'Reilly and Associates},
-}
-
-
-@InProceedings{han,
- author = {Yongfei Han},
- title = {Investigation of non-repudiation protocols},
- booktitle = {ACISP '96},
- year = 1996,
- publisher = {Springer-Verlag},
-}
-
-
-@Misc{socks5,
- key = {socks5},
- title = {{SOCKS} {P}rotocol {V}ersion 5},
- howpublished= {IETF RFC 1928},
- month = {March},
- year = 1996,
- note = {\url{http://www.ietf.org/rfc/rfc1928.txt}}
-}
-
-@InProceedings{abe,
- author = {Masayuki Abe},
- title = {Universally Verifiable {MIX} With Verification Work Independent of
- The Number of {MIX} Servers},
- booktitle = {{EUROCRYPT} 1998},
- year = {1998},
- publisher = {Springer-Verlag, LNCS 1403},
-}
-
-@InProceedings{desmedt,
- author = {Yvo Desmedt and Kaoru Kurosawa},
- title = {How To Break a Practical {MIX} and Design a New One},
- booktitle = {{EUROCRYPT} 2000},
- year = {2000},
- publisher = {Springer-Verlag, LNCS 1803},
- note = {\url{http://citeseer.nj.nec.com/447709.html}},
-}
-
-@InProceedings{mitkuro,
- author = {M. Mitomo and K. Kurosawa},
- title = {{Attack for Flash MIX}},
- booktitle = {{ASIACRYPT} 2000},
- year = {2000},
- publisher = {Springer-Verlag, LNCS 1976},
- note = {\newline \url{http://citeseer.nj.nec.com/450148.html}},
-}
-
-@InProceedings{hybrid-mix,
- author = {M. Ohkubo and M. Abe},
- title = {A {L}ength-{I}nvariant {H}ybrid {MIX}},
- booktitle = {Advances in Cryptology - {ASIACRYPT} 2000},
- year = {2000},
- publisher = {Springer-Verlag, LNCS 1976},
-}
-
-@InProceedings{PShuffle,
- author = {Jun Furukawa and Kazue Sako},
- title = {An Efficient Scheme for Proving a Shuffle},
- editor = {Joe Kilian},
- booktitle = {CRYPTO 2001},
- year = {2001},
- publisher = {Springer-Verlag, LNCS 2139},
-}
-
-
-@InProceedings{jakobsson-optimally,
- author = "Markus Jakobsson and Ari Juels",
- title = "An Optimally Robust Hybrid Mix Network (Extended Abstract)",
- booktitle = {Principles of Distributed Computing - {PODC} '01},
- year = "2001",
- publisher = {ACM Press},
- note = {\url{http://citeseer.nj.nec.com/492015.html}},
-}
-
-@InProceedings{kesdogan,
- author = {D. Kesdogan and M. Egner and T. B\"uschkes},
- title = {Stop-and-Go {MIX}es Providing Probabilistic Anonymity in an Open
- System},
- booktitle = {Information Hiding (IH 1998)},
- year = {1998},
- publisher = {Springer-Verlag, LNCS 1525},
-}
- %note = {\url{http://www.cl.cam.ac.uk/~fapp2/ihw98/ihw98-sgmix.pdf}},
-
-@InProceedings{socks4,
- author = {David Koblas and Michelle R. Koblas},
- title = {{SOCKS}},
- booktitle = {UNIX Security III Symposium (1992 USENIX Security
- Symposium)},
- pages = {77--83},
- year = 1992,
- publisher = {USENIX},
-}
-
-@InProceedings{flash-mix,
- author = {Markus Jakobsson},
- title = {Flash {M}ixing},
- booktitle = {Principles of Distributed Computing - {PODC} '99},
- year = {1999},
- publisher = {ACM Press},
- note = {\newline \url{http://citeseer.nj.nec.com/jakobsson99flash.html}},
-}
-
-@InProceedings{SK,
- author = {Joe Kilian and Kazue Sako},
- title = {Receipt-Free {MIX}-Type Voting Scheme - A Practical Solution to
- the Implementation of a Voting Booth},
- booktitle = {EUROCRYPT '95},
- year = {1995},
- publisher = {Springer-Verlag},
-}
-
-@InProceedings{OAEP,
- author = {M. Bellare and P. Rogaway},
- year = {1994},
- booktitle = {EUROCRYPT '94},
- title = {Optimal {A}symmetric {E}ncryption {P}adding : How To Encrypt With
- {RSA}},
- publisher = {Springer-Verlag},
- note = {\newline \url{http://www-cse.ucsd.edu/users/mihir/papers/oaep.html}},
-}
-@inproceedings{babel,
- title = {Mixing {E}-mail With {B}abel},
- author = {Ceki G\"ulc\"u and Gene Tsudik},
- booktitle = {{Network and Distributed Security Symposium (NDSS 96)}},
- year = 1996,
- month = {February},
- pages = {2--16},
- publisher = {IEEE},
-}
- %note = {\url{http://citeseer.nj.nec.com/2254.html}},
-
-@Misc{rprocess,
- author = {RProcess},
- title = {Selective Denial of Service Attacks},
- note = {\newline \url{http://www.eff.org/pub/Privacy/Anonymity/1999\_09\_DoS\_remail\_vuln.html}},
-}
-
-@Article{remailer-history,
- author = {Sameer Parekh},
- title = {Prospects for Remailers},
- journal = {First Monday},
- volume = {1},
- number = {2},
- month = {August},
- year = {1996},
- note = {\url{http://www.firstmonday.dk/issues/issue2/remailers/}},
-}
-
-@Article{chaum-mix,
- author = {David Chaum},
- title = {Untraceable electronic mail, return addresses, and digital pseudo-nyms},
- journal = {Communications of the ACM},
- year = {1981},
- volume = {4},
- number = {2},
- month = {February},
-}
- %note = {\url{http://www.eskimo.com/~weidai/mix-net.txt}},
-
-@InProceedings{nym-alias-net,
- author = {David Mazi\`{e}res and M. Frans Kaashoek},
- title = {{The Design, Implementation and Operation of an Email
- Pseudonym Server}},
- booktitle = {$5^{th}$ ACM Conference on Computer and
- Communications Security (CCS'98)},
- year = 1998,
- publisher = {ACM Press},
-}
- %note = {\newline \url{http://www.scs.cs.nyu.edu/~dm/}},
-
-@InProceedings{tangler,
- author = {Marc Waldman and David Mazi\`{e}res},
- title = {Tangler: A Censorship-Resistant Publishing System
- Based on Document Entanglements},
- booktitle = {$8^{th}$ ACM Conference on Computer and
- Communications Security (CCS-8)},
- pages = {86--135},
- year = 2001,
- publisher = {ACM Press},
-}
- %note = {\url{http://www.scs.cs.nyu.edu/~dm/}}
-
-@misc{neochaum,
- author = {Tim May},
- title = {Payment mixes for anonymity},
- howpublished = {E-mail archived at
- \url{http://\newline www.inet-one.com/cypherpunks/dir.2000.02.28-2000.03.05/msg00334.html}},
-}
-
-@misc{helsingius,
- author = {J. Helsingius},
- title = {{\tt anon.penet.fi} press release},
- note = {\newline \url{http://www.penet.fi/press-english.html}},
-}
-
-@InProceedings{garay97secure,
- author = {J. Garay and R. Gennaro and C. Jutla and T. Rabin},
- title = {Secure distributed storage and retrieval},
- booktitle = {11th International Workshop, WDAG '97},
- pages = {275--289},
- year = {1997},
- publisher = {Springer-Verlag, LNCS 1320},
- note = {\newline \url{http://citeseer.nj.nec.com/garay97secure.html}},
-}
-
-@InProceedings{PIK,
- author = {C. Park and K. Itoh and K. Kurosawa},
- title = {Efficient anonymous channel and all/nothing election scheme},
- booktitle = {Advances in Cryptology -- {EUROCRYPT} '93},
- pages = {248--259},
- publisher = {Springer-Verlag, LNCS 765},
-}
-
-@Misc{pgpfaq,
- key = {PGP},
- title = {{PGP} {FAQ}},
- note = {\newline \url{http://www.faqs.org/faqs/pgp-faq/}},
-}
-
-@Article{riordan-schneier,
- author = {James Riordan and Bruce Schneier},
- title = {A Certified E-mail Protocol with No Trusted Third Party},
- journal = {13th Annual Computer Security Applications Conference},
- month = {December},
- year = {1998},
- note = {\newline \url{http://www.counterpane.com/certified-email.html}},
-}
-
-
-@Article{crowds-tissec,
- author = {Michael K. Reiter and Aviel D. Rubin},
- title = {Crowds: Anonymity for Web Transactions},
- journal = {ACM TISSEC},
- year = 1998,
- volume = 1,
- number = 1,
- pages = {66--92},
- month = {June},
-}
- %note = {\url{http://citeseer.nj.nec.com/284739.html}}
-
-@Article{crowds-dimacs,
- author = {Michael K. Reiter and Aviel D. Rubin},
- title = {Crowds: Anonymity for Web Transactions},
- journal = {{DIMACS} Technical Report (Revised)},
- volume = {97},
- number = {15},
- month = {August},
- year = {1997},
-}
-
-@Misc{advogato,
- author = {Raph Levien},
- title = {Advogato's Trust Metric},
- note = {\newline \url{http://www.advogato.org/trust-metric.html}},
-}
-
-@InProceedings{publius,
- author = {Marc Waldman and Aviel Rubin and Lorrie Cranor},
- title = {Publius: {A} robust, tamper-evident, censorship-resistant and
- source-anonymous web publishing system},
- booktitle = {Proc. 9th USENIX Security Symposium},
- pages = {59--72},
- year = {2000},
- month = {August},
-}
- %note = {\newline \url{http://citeseer.nj.nec.com/waldman00publius.html}},
-
-@Misc{freedom-nyms,
- author = {Russell Samuels},
- title = {Untraceable Nym Creation on the {F}reedom {N}etwork},
- year = {1999},
- month = {November},
- day = {21},
- note = {\newline \url{http://www.freedom.net/products/whitepapers/white11.html}},
-}
-
-@techreport{freedom2-arch,
- title = {Freedom Systems 2.0 Architecture},
- author = {Philippe Boucher and Adam Shostack and Ian Goldberg},
- institution = {Zero Knowledge Systems, {Inc.}},
- year = {2000},
- month = {December},
- type = {White Paper},
- day = {18},
-}
-
-@techreport{freedom21-security,
- title = {Freedom Systems 2.1 Security Issues and Analysis},
- author = {Adam Back and Ian Goldberg and Adam Shostack},
- institution = {Zero Knowledge Systems, {Inc.}},
- year = {2001},
- month = {May},
- type = {White Paper},
-}
-
-@inproceedings{cfs:sosp01,
- title = {Wide-area cooperative storage with {CFS}},
- author = {Frank Dabek and M. Frans Kaashoek and David Karger and Robert Morris and Ion Stoica},
- booktitle = {18th {ACM} {S}ymposium on {O}perating {S}ystems {P}rinciples ({SOSP} '01)},
- year = {2001},
- month = {October},
- address = {Chateau Lake Louise, Banff, Canada},
-}
-
-@inproceedings{SS03,
- title = {Passive Attack Analysis for Connection-Based Anonymity Systems},
- author = {Andrei Serjantov and Peter Sewell},
- booktitle = {Computer Security -- ESORICS 2003},
- publisher = {Springer-Verlag, LNCS 2808},
- year = {2003},
- month = {October},
-}
- %note = {\url{http://www.cl.cam.ac.uk/users/aas23/papers_aas/conn_sys.ps}},
-
-@Misc{pk-relations,
- author = {M. Bellare and A. Desai and D. Pointcheval and P. Rogaway},
- title = {Relations Among Notions of Security for Public-Key Encryption
- Schemes},
- howpublished = {
- Extended abstract in {\em Advances in Cryptology - CRYPTO '98}, LNCS Vol. 1462.
- Springer-Verlag, 1998.
- Full version available from \newline \url{http://www-cse.ucsd.edu/users/mihir/}},
-}
-
-
-@InProceedings{mix-acc,
- author = {Roger Dingledine and Michael J. Freedman and David
- Hopwood and David Molnar},
- title = {{A Reputation System to Increase MIX-net
- Reliability}},
- booktitle = {Information Hiding (IH 2001)},
- pages = {126--141},
- year = 2001,
- editor = {Ira S. Moskowitz},
- publisher = {Springer-Verlag, LNCS 2137},
-}
- %note = {\url{http://www.freehaven.net/papers.html}},
-
-@InProceedings{casc-rep,
- author = {Roger Dingledine and Paul Syverson},
- title = {{Reliable MIX Cascade Networks through Reputation}},
- booktitle = {Financial Cryptography},
- year = 2002,
- editor = {Matt Blaze},
- publisher = {Springer-Verlag, LNCS 2357},
-}
- %note = {\newline \url{http://www.freehaven.net/papers.html}},
-
-@InProceedings{zhou96certified,
- author = {Zhou and Gollmann},
- title = {Certified Electronic Mail},
- booktitle = {{ESORICS: European Symposium on Research in Computer
- Security}},
- publisher = {Springer-Verlag, LNCS 1146},
- year = {1996},
- note = {\newline \url{http://citeseer.nj.nec.com/zhou96certified.html}},
-}
-
-@Misc{realtime-mix,
- author = {Anja Jerichow and Jan M\"uller and Andreas Pfitzmann and
- Birgit Pfitzmann and Michael Waidner},
- title = {{Real-Time MIXes: A Bandwidth-Efficient Anonymity Protocol}},
- howpublished = {IEEE Journal on Selected Areas in Communications, 1998.},
- note = {\url{http://www.zurich.ibm.com/security/publications/1998.html}},
-}
-
-@InProceedings{danezis:pet2003,
- author = {George Danezis},
- title = {Mix-networks with Restricted Routes},
- booktitle = {Privacy Enhancing Technologies (PET 2003)},
- year = 2003,
- editor = {Roger Dingledine},
- publisher = {Springer-Verlag LNCS 2760}
-}
-
-@InProceedings{gap-pets03,
- author = {Krista Bennett and Christian Grothoff},
- title = {{GAP} -- practical anonymous networking},
- booktitle = {Privacy Enhancing Technologies (PET 2003)},
- year = 2003,
- editor = {Roger Dingledine},
- publisher = {Springer-Verlag LNCS 2760}
-}
-
-@Article{hordes-jcs,
- author = {Brian Neal Levine and Clay Shields},
- title = {Hordes: A Multicast-Based Protocol for Anonymity},
- journal = {Journal of Computer Security},
- year = 2002,
- volume = 10,
- number = 3,
- pages = {213--240}
-}
-
-@TechReport{herbivore,
- author = {Sharad Goel and Mark Robson and Milo Polte and Emin G\"{u}n Sirer},
- title = {Herbivore: A Scalable and Efficient Protocol for Anonymous Communication},
- institution = {Cornell University Computing and Information Science},
- year = 2003,
- type = {Technical Report},
- number = {TR2003-1890},
- month = {February}
-}
-
-@InProceedings{p5,
- author = {Rob Sherwood and Bobby Bhattacharjee and Aravind Srinivasan},
- title = {$P^5$: A Protocol for Scalable Anonymous Communication},
- booktitle = {IEEE Symposium on Security and Privacy},
- pages = {58--70},
- year = 2002,
- publisher = {IEEE CS}
-}
-
-@phdthesis{ian-thesis,
- title = {A Pseudonymous Communications Infrastructure for the Internet},
- author = {Ian Goldberg},
- school = {UC Berkeley},
- year = {2000},
- month = {Dec},
-}
-
-@Article{taz,
- author = {Ian Goldberg and David Wagner},
- title = {TAZ Servers and the Rewebber Network: Enabling
- Anonymous Publishing on the World Wide Web},
- journal = {First Monday},
- year = 1998,
- volume = 3,
- number = 4,
- month = {August},
- note = {\url{http://www.firstmonday.dk/issues/issue3_4/goldberg/}}
-}
-
-@Misc{tcp-over-tcp-is-bad,
- key = {tcp-over-tcp-is-bad},
- title = {Why {TCP} Over {TCP} Is A Bad Idea},
- author = {Olaf Titz},
- note = {\url{http://sites.inka.de/sites/bigred/devel/tcp-tcp.html}}
-}
-
-@inproceedings{wright02,
- title = {An Analysis of the Degradation of Anonymous Protocols},
- author = {Matthew Wright and Micah Adler and Brian Neil Levine and Clay Shields},
- booktitle = {{Network and Distributed Security Symposium (NDSS 02)}},
- year = {2002},
- month = {February},
- publisher = {IEEE},
-}
-
-@inproceedings{wright03,
- title = {Defending Anonymous Communication Against Passive Logging Attacks},
- author = {Matthew Wright and Micah Adler and Brian Neil Levine and Clay Shields},
- booktitle = {IEEE Symposium on Security and Privacy},
- pages= {28--41},
- year = {2003},
- month = {May},
- publisher = {IEEE CS},
-}
-
-
-@InProceedings{attack-tor-oak05,
- author = {Steven J. Murdoch and George Danezis},
- title = {Low-cost Traffic Analysis of {T}or},
- booktitle = {IEEE Symposium on Security and Privacy},
- year = 2005,
- month = {May},
- publisher = {IEEE CS}
-}
-
-@Misc{jap-backdoor,
- author={{The AN.ON Project}},
- howpublished={Press release},
- year={2003},
- month={September},
- title={German Police proceeds against anonymity service},
- note={\url{http://www.datenschutzzentrum.de/material/themen/presse/anon-bka_e.htm}}
-}
-
-@article{shsm03,
- title = {Using Caching for Browsing Anonymity},
- author = {Anna Shubina and Sean Smith},
- journal = {ACM SIGEcom Exchanges},
- volume = {4},
- number = {2},
- year = {2003},
- month = {Sept},
- note = {\url{http://www.acm.org/sigs/sigecom/exchanges/volume_4_(03)/4.2-Shubina.pdf}},
-}
-
-@inproceedings{tor-design,
- title = {Tor: The Second-Generation Onion Router},
- author = {Roger Dingledine and Nick Mathewson and Paul Syverson},
- booktitle = {Proceedings of the 13th USENIX Security Symposium},
- year = {2004},
- month = {August},
- note = {\url{https://www.torproject.org/tor-design.pdf}}
-}
-
-@inproceedings{flow-correlation04,
- title = {On Flow Correlation Attacks and Countermeasures in Mix Networks},
- author = {Ye Zhu and Xinwen Fu and Bryan Graham and Riccardo Bettati and Wei Zhao},
- booktitle = {Proceedings of Privacy Enhancing Technologies workshop (PET 2004)},
- year = {2004},
- month = {May},
- series = {LNCS},
- note = {\url{http://students.cs.tamu.edu/xinwenfu/paper/PET04.pdf}},
-}
-
-@InProceedings{danezis:pet2004,
- author = "George Danezis",
- title = "The Traffic Analysis of Continuous-Time Mixes",
- booktitle= {Privacy Enhancing Technologies (PET 2004)},
- editor = {David Martin and Andrei Serjantov},
- month = {May},
- year = {2004},
- series = {LNCS},
- note = {\url{http://www.cl.cam.ac.uk/users/gd216/cmm2.pdf}},
-}
-
-@inproceedings{feamster:wpes2004,
- title = {Location Diversity in Anonymity Networks},
- author = {Nick Feamster and Roger Dingledine},
- booktitle = {{Proceedings of the Workshop on Privacy in the Electronic Society (WPES 2004)}},
- year = {2004},
- month = {October},
- address = {Washington, DC, USA},
- note = {\url{http://freehaven.net/doc/routing-zones/routing-zones.ps}},
-}
-
-@inproceedings{koepsell:wpes2004,
- title = {How to Achieve Blocking Resistance for Existing Systems Enabling Anonymous Web Surfing},
- author = {Stefan K\"opsell and Ulf Hilling},
- booktitle = {{Proceedings of the Workshop on Privacy in the Electronic Society (WPES 2004)}},
- year = {2004},
- month = {October},
- address = {Washington, DC, USA},
- note = {\url{http://freehaven.net/anonbib/papers/p103-koepsell.pdf}},
-}
-
-@inproceedings{sync-batching,
- title = {Synchronous Batching: From Cascades to Free Routes},
- author = {Roger Dingledine and Vitaly Shmatikov and Paul Syverson},
- booktitle = {Proceedings of Privacy Enhancing Technologies workshop (PET 2004)},
- editor = {David Martin and Andrei Serjantov},
- year = {2004},
- month = {May},
- series = {LNCS},
- note = {\url{http://freehaven.net/doc/sync-batching/sync-batching.pdf}},
-}
-
-@InProceedings{e2e-traffic,
- author = "Nick Mathewson and Roger Dingledine",
- title = "Practical Traffic Analysis: Extending and Resisting Statistical Disclosure",
- booktitle= {Privacy Enhancing Technologies (PET 2004)},
- editor = {David Martin and Andrei Serjantov},
- month = {May},
- year = {2004},
- series = {LNCS},
- note = {\url{http://freehaven.net/doc/e2e-traffic/e2e-traffic.pdf}},
-}
-
-@Misc{dtls,
- author = {E. Rescorla and N. Modadugu},
- title = {{Datagram Transport Layer Security}},
- howpublished = {IETF Draft},
- month = {December},
- year = {2003},
- note = {\url{http://www.ietf.org/internet-drafts/draft-rescorla-dtls-02.txt}},
-}
-
-@InProceedings{usability-network-effect,
- author={Roger Dingledine and Nick Mathewson},
- title={Anonymity Loves Company: Usability and the Network Effect},
- booktitle = {Designing Security Systems That People Can Use},
- year = {2005},
- publisher = {O'Reilly Media},
-}
-
-@inproceedings{usability:weis2006,
- title = {Anonymity Loves Company: Usability and the Network Effect},
- author = {Roger Dingledine and Nick Mathewson},
- booktitle = {Proceedings of the Fifth Workshop on the Economics of Information Security
- (WEIS 2006)},
- year = {2006},
- month = {June},
- address = {Cambridge, UK},
- bookurl = {http://weis2006.econinfosec.org/},
- note = {\url{http://freehaven.net/doc/wupss04/usability.pdf}},
-}
-
-@Misc{six-four,
- key = {six-four},
- title = {{The Six/Four System}},
- note = {\url{http://sourceforge.net/projects/sixfour/}}
-}
-
-@inproceedings{clayton:pet2006,
- title = {Ignoring the Great Firewall of China},
- author = {Richard Clayton and Steven J. Murdoch and Robert N. M. Watson},
- booktitle = {Proceedings of the Sixth Workshop on Privacy Enhancing Technologies (PET 2006)},
- year = {2006},
- month = {June},
- address = {Cambridge, UK},
- publisher = {Springer},
- bookurl = {http://petworkshop.org/2006/},
- note = {\url{http://www.cl.cam.ac.uk/~rnc1/ignoring.pdf}},
-}
-
-@Misc{zuckerman-threatmodels,
- key = {zuckerman-threatmodels},
- title = {We've got to adjust some of our threat models},
- author = {Ethan Zuckerman},
- note = {\url{http://www.ethanzuckerman.com/blog/?p=1019}}
-}
-
-@Misc{cgiproxy,
- key = {cgiproxy},
- title = {{CGIProxy: HTTP/FTP Proxy in a CGI Script}},
- author = {James Marshall},
- note = {\url{http://www.jmarshall.com/tools/cgiproxy/}}
-}
-
-@Misc{circumventor,
- key = {circumventor},
- title = {{How to install the Circumventor program}},
- author = {Bennett Haselton},
- note = {\url{http://www.peacefire.org/circumventor/simple-circumventor-instructions.html}}
-}
-
-@Misc{psiphon,
- key = {psiphon},
- title = {Psiphon},
- author = {Ronald Deibert et al},
- note = {\url{http://psiphon.civisec.org/}}
-}
-
-@InProceedings{tcpstego, author = {Steven J. Murdoch and Stephen Lewis},
- title = {Embedding Covert Channels into {TCP/IP}},
- booktitle = {Information Hiding: 7th International Workshop},
- pages = {247--261},
- year = {2005},
- editor = {Mauro Barni and Jordi Herrera-Joancomart\'{\i} and
-Stefan Katzenbeisser and Fernando P\'{e}rez-Gonz\'{a}lez},
- volume = {3727},
- series = {LNCS},
- address = {Barcelona, Catalonia (Spain)},
- month = {June},
- publisher = {Springer-Verlag},
- url = {http://www.cl.cam.ac.uk/~sjm217/papers/ih05coverttcp.pdf}
-}
-
-@phdthesis{blossom-thesis,
- title = {Perspective Access Networks},
- author = {Geoffrey Goodell},
- school = {Harvard University},
- year = {2006},
- month = {July},
- note = {\url{http://afs.eecs.harvard.edu/~goodell/thesis.pdf}},
-}
-
-@inproceedings{tap:pet2006,
- title = {On the Security of the Tor Authentication Protocol},
- author = {Ian Goldberg},
- booktitle = {Proceedings of the Sixth Workshop on Privacy Enhancing Technologies (PET 2006)},
- year = {2006},
- month = {June},
- address = {Cambridge, UK},
- publisher = {Springer},
- bookurl = {http://petworkshop.org/2006/},
- note = {\url{http://www.cypherpunks.ca/~iang/pubs/torsec.pdf}},
-}
-
-@inproceedings{rep-anon,
- title = {{Reputation in P2P Anonymity Systems}},
- author = {Roger Dingledine and Nick Mathewson and Paul Syverson},
- booktitle = {Proceedings of Workshop on Economics of Peer-to-Peer Systems},
- year = {2003},
- month = {June},
- note = {\url{http://freehaven.net/doc/econp2p03/econp2p03.pdf}},
-}
-
-@misc{tor-challenges,
- author = {Roger Dingledine and Nick Mathewson and Paul Syverson},
- title = {Challenges in deploying low-latency anonymity},
- year = {2005},
- note = {Manuscript}
-}
-
-@InProceedings{chaum-blind,
- author = {David Chaum},
- title = {Blind Signatures for Untraceable Payments},
- booktitle = {Advances in Cryptology: Proceedings of Crypto 82},
- pages = {199--203},
- year = 1983,
- editor = {D. Chaum and R.L. Rivest and A.T. Sherman},
- publisher = {Plenum Press}
-}
-
-@Article{netauth,
- author = {Geoffrey Goodell and Paul Syverson},
- title = {The Right Place at the Right Time: Examining the use of network location in authentication and abuse prevention},
- journal = {Communications of the ACM},
- year = 2007,
- volume = 50,
- number = 5,
- pages = {113--117},
- month = {May}
-}
-
-@misc{ip-to-country,
- key = {ip-to-country},
- title = {IP-to-country database},
- note = {\url{http://ip-to-country.webhosting.info/}},
-}
-
-@misc{mackinnon-personal,
- author = {Rebecca MacKinnon},
- title = {Private communication},
- year = {2006},
-}
-
-@inproceedings{pet05-bissias,
- title = {Privacy Vulnerabilities in Encrypted HTTP Streams},
- author = {George Dean Bissias and Marc Liberatore and Brian Neil Levine},
- booktitle = {Proceedings of Privacy Enhancing Technologies workshop (PET 2005)},
- year = {2005},
- month = {May},
- note = {\url{http://prisms.cs.umass.edu/brian/pubs/bissias.liberatore.pet.2005.pdf}},
-}
-
-@InProceedings{infranet,
- author = {Nick Feamster and Magdalena Balazinska and Greg Harfst and Hari Balakrishnan and David Karger},
- title = {Infranet: Circumventing Web Censorship and Surveillance},
- booktitle = {Proceedings of the 11th USENIX Security Symposium},
- year = {2002},
- month = {August},
- note = {\url{http://nms.lcs.mit.edu/~feamster/papers/usenixsec2002.pdf}},
-}
-
-@techreport{ ptacek98insertion,
- author = "Thomas H. Ptacek and Timothy N. Newsham",
- title = "Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection",
- institution = "Secure Networks, Inc.",
- address = "Suite 330, 1201 5th Street S.W, Calgary, Alberta, Canada, T2R-0Y6",
- year = "1998",
- url = "citeseer.ist.psu.edu/ptacek98insertion.html",
-}
-
-@inproceedings{active-wardens,
- author = "Gina Fisk and Mike Fisk and Christos Papadopoulos and Joshua Neil",
- title = "Eliminating Steganography in Internet Traffic with Active Wardens",
- booktitle = {Information Hiding Workshop (IH 2002)},
- year = {2002},
- month = {October},
- editor = {Fabien Petitcolas},
- publisher = {Springer-Verlag, LNCS 2578},
-}
-
-@inproceedings{clog-the-queue,
- title = {Don't Clog the Queue: Circuit Clogging and Mitigation in {P2P} anonymity schemes},
- author = {Jon McLachlan and Nicholas Hopper},
- booktitle = {Proceedings of Financial Cryptography (FC '08)},
- year = {2008},
- month = {January},
-}
-
-@inproceedings{snader08,
- title = {A Tune-up for {Tor}: Improving Security and Performance in the {Tor} Network},
- author = {Robin Snader and Nikita Borisov},
- booktitle = {Proceedings of the Network and Distributed Security Symposium - {NDSS} '08},
- year = {2008},
- month = {February},
- publisher = {Internet Society},
-}
-
-@inproceedings{murdoch-pet2008,
- title = {Metrics for Security and Performance in Low-Latency Anonymity Networks},
- author = {Steven J. Murdoch and Robert N. M. Watson},
- booktitle = {Proceedings of the Eighth International Symposium on Privacy Enhancing Technologies (PETS 2008)},
- year = {2008},
- month = {July},
- address = {Leuven, Belgium},
- pages = {115--132},
- editor = {Nikita Borisov and Ian Goldberg},
- publisher = {Springer},
- bookurl = {http://petsymposium.org/2008/},
-}
-
-@inproceedings{danezis-pet2008,
- title = {Bridging and Fingerprinting: Epistemic Attacks on Route Selection},
- author = {George Danezis and Paul Syverson},
- booktitle = {Proceedings of the Eighth International Symposium on Privacy Enhancing Technologies (PETS 2008)},
- year = {2008},
- month = {July},
- address = {Leuven, Belgium},
- pages = {133--150},
- editor = {Nikita Borisov and Ian Goldberg},
- publisher = {Springer},
- bookurl = {http://petsymposium.org/2008/},
-}
-
-%%% Local Variables:
-%%% mode: latex
-%%% TeX-master: "tor-design"
-%%% End:
diff --git a/doc/design-paper/tor-design.html b/doc/design-paper/tor-design.html
deleted file mode 100644
index 5fac644e62..0000000000
--- a/doc/design-paper/tor-design.html
+++ /dev/null
@@ -1,2488 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="GENERATOR" content="TtH 3.59" />
- <style type="text/css"> div.p { margin-top: 7pt;}</style>
- <style type="text/css"><!--
- td div.comp { margin-top: -0.6ex; margin-bottom: -1ex;}
- td div.comb { margin-top: -0.6ex; margin-bottom: -.6ex;}
- td div.hrcomp { line-height: 0.9; margin-top: -0.8ex; margin-bottom: -1ex;}
- td div.norm {line-height:normal;}
- span.roman {font-family: serif; font-style: normal; font-weight: normal;}
- span.overacc2 {position: relative; left: .8em; top: -1.2ex;}
- span.overacc1 {position: relative; left: .6em; top: -1.2ex;} --></style>
-
-
-<title> Tor: The Second-Generation Onion Router </title>
-</head>
-<body>
-
-<h1 align="center">Tor: The Second-Generation Onion Router </h1>
-<div class="p"><!----></div>
-
-<h3 align="center">
-Roger Dingledine, The Free Haven Project, <tt>arma@freehaven.net</tt><br>
-Nick Mathewson, The Free Haven Project, <tt>nickm@freehaven.net</tt><br>
-Paul Syverson, Naval Research Lab, <tt>syverson@itd.nrl.navy.mil</tt> </h3>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<h2> Abstract</h2>
-We present Tor, a circuit-based low-latency anonymous communication
-service. This second-generation Onion Routing system addresses limitations
-in the original design by adding perfect forward secrecy, congestion
-control, directory servers, integrity checking, configurable exit policies,
-and a practical design for location-hidden services via rendezvous
-points. Tor works on the real-world
-Internet, requires no special privileges or kernel modifications, requires
-little synchronization or coordination between nodes, and provides a
-reasonable tradeoff between anonymity, usability, and efficiency.
-We briefly describe our experiences with an international network of
-more than 30 nodes. We close with a list of open problems in anonymous communication.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc1">
-<a name="sec:intro">
-1</a>&nbsp;&nbsp;Overview</h2>
-</a>
-
-<div class="p"><!----></div>
-Onion Routing is a distributed overlay network designed to anonymize
-TCP-based applications like web browsing, secure shell,
-and instant messaging. Clients choose a path through the network and
-build a <em>circuit</em>, in which each node (or "onion router" or "OR")
-in the path knows its predecessor and successor, but no other nodes in
-the circuit. Traffic flows down the circuit in fixed-size
-<em>cells</em>, which are unwrapped by a symmetric key at each node
-(like the layers of an onion) and relayed downstream. The
-Onion Routing project published several design and analysis
-papers [<a href="#or-ih96" name="CITEor-ih96">27</a>,<a href="#or-jsac98" name="CITEor-jsac98">41</a>,<a href="#or-discex00" name="CITEor-discex00">48</a>,<a href="#or-pet00" name="CITEor-pet00">49</a>]. While a wide area Onion
-Routing network was deployed briefly, the only long-running
-public implementation was a fragile
-proof-of-concept that ran on a single machine. Even this simple deployment
-processed connections from over sixty thousand distinct IP addresses from
-all over the world at a rate of about fifty thousand per day.
-But many critical design and deployment issues were never
-resolved, and the design has not been updated in years. Here
-we describe Tor, a protocol for asynchronous, loosely federated onion
-routers that provides the following improvements over the old Onion
-Routing design:
-
-<div class="p"><!----></div>
-<b>Perfect forward secrecy:</b> In the original Onion Routing design,
-a single hostile node could record traffic and
-later compromise successive nodes in the circuit and force them
-to decrypt it. Rather than using a single multiply encrypted data
-structure (an <em>onion</em>) to lay each circuit,
-Tor now uses an incremental or <em>telescoping</em> path-building design,
-where the initiator negotiates session keys with each successive hop in
-the circuit. Once these keys are deleted, subsequently compromised nodes
-cannot decrypt old traffic. As a side benefit, onion replay detection
-is no longer necessary, and the process of building circuits is more
-reliable, since the initiator knows when a hop fails and can then try
-extending to a new node.
-
-<div class="p"><!----></div>
-<b>Separation of "protocol cleaning" from anonymity:</b>
-Onion Routing originally required a separate "application
-proxy" for each supported application protocol &mdash; most of which were
-never written, so many applications were never supported. Tor uses the
-standard and near-ubiquitous SOCKS&nbsp;[<a href="#socks4" name="CITEsocks4">32</a>] proxy interface, allowing
-us to support most TCP-based programs without modification. Tor now
-relies on the filtering features of privacy-enhancing
-application-level proxies such as Privoxy&nbsp;[<a href="#privoxy" name="CITEprivoxy">39</a>], without trying
-to duplicate those features itself.
-
-<div class="p"><!----></div>
-<b>No mixing, padding, or traffic shaping (yet):</b> Onion
-Routing originally called for batching and reordering cells as they arrived,
-assumed padding between ORs, and in
-later designs added padding between onion proxies (users) and
-ORs&nbsp;[<a href="#or-ih96" name="CITEor-ih96">27</a>,<a href="#or-jsac98" name="CITEor-jsac98">41</a>]. Tradeoffs between padding protection
-and cost were discussed, and <em>traffic shaping</em> algorithms were
-theorized&nbsp;[<a href="#or-pet00" name="CITEor-pet00">49</a>] to provide good security without expensive
-padding, but no concrete padding scheme was suggested.
-Recent research&nbsp;[<a href="#econymics" name="CITEeconymics">1</a>]
-and deployment experience&nbsp;[<a href="#freedom21-security" name="CITEfreedom21-security">4</a>] suggest that this
-level of resource use is not practical or economical; and even full
-link padding is still vulnerable&nbsp;[<a href="#defensive-dropping" name="CITEdefensive-dropping">33</a>]. Thus,
-until we have a proven and convenient design for traffic shaping or
-low-latency mixing that improves anonymity against a realistic
-adversary, we leave these strategies out.
-
-<div class="p"><!----></div>
-<b>Many TCP streams can share one circuit:</b> Onion Routing originally
-built a separate circuit for each
-application-level request, but this required
-multiple public key operations for every request, and also presented
-a threat to anonymity from building so many circuits; see
-Section&nbsp;<a href="#sec:maintaining-anonymity">9</a>. Tor multiplexes multiple TCP
-streams along each circuit to improve efficiency and anonymity.
-
-<div class="p"><!----></div>
-<b>Leaky-pipe circuit topology:</b> Through in-band signaling
-within the circuit, Tor initiators can direct traffic to nodes partway
-down the circuit. This novel approach
-allows traffic to exit the circuit from the middle &mdash; possibly
-frustrating traffic shape and volume attacks based on observing the end
-of the circuit. (It also allows for long-range padding if
-future research shows this to be worthwhile.)
-
-<div class="p"><!----></div>
-<b>Congestion control:</b> Earlier anonymity designs do not
-address traffic bottlenecks. Unfortunately, typical approaches to
-load balancing and flow control in overlay networks involve inter-node
-control communication and global views of traffic. Tor's decentralized
-congestion control uses end-to-end acks to maintain anonymity
-while allowing nodes at the edges of the network to detect congestion
-or flooding and send less data until the congestion subsides.
-
-<div class="p"><!----></div>
-<b>Directory servers:</b> The earlier Onion Routing design
-planned to flood state information through the network &mdash; an approach
-that can be unreliable and complex. Tor takes a simplified view toward distributing this
-information. Certain more trusted nodes act as <em>directory
-servers</em>: they provide signed directories describing known
-routers and their current state. Users periodically download them
-via HTTP.
-
-<div class="p"><!----></div>
-<b>Variable exit policies:</b> Tor provides a consistent mechanism
-for each node to advertise a policy describing the hosts
-and ports to which it will connect. These exit policies are critical
-in a volunteer-based distributed infrastructure, because each operator
-is comfortable with allowing different types of traffic to exit
-from his node.
-
-<div class="p"><!----></div>
-<b>End-to-end integrity checking:</b> The original Onion Routing
-design did no integrity checking on data. Any node on the
-circuit could change the contents of data cells as they passed by &mdash; for
-example, to alter a connection request so it would connect
-to a different webserver, or to `tag' encrypted traffic and look for
-corresponding corrupted traffic at the network edges&nbsp;[<a href="#minion-design" name="CITEminion-design">15</a>].
-Tor hampers these attacks by verifying data integrity before it leaves
-the network.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-<b>Rendezvous points and hidden services:</b>
-Tor provides an integrated mechanism for responder anonymity via
-location-protected servers. Previous Onion Routing designs included
-long-lived "reply onions" that could be used to build circuits
-to a hidden server, but these reply onions did not provide forward
-security, and became useless if any node in the path went down
-or rotated its keys. In Tor, clients negotiate <i>rendezvous points</i>
-to connect with hidden servers; reply onions are no longer required.
-
-<div class="p"><!----></div>
-Unlike Freedom&nbsp;[<a href="#freedom2-arch" name="CITEfreedom2-arch">8</a>], Tor does not require OS kernel
-patches or network stack support. This prevents us from anonymizing
-non-TCP protocols, but has greatly helped our portability and
-deployability.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-We have implemented all of the above features, including rendezvous
-points. Our source code is
-available under a free license, and Tor
-is not covered by the patent that affected distribution and use of
-earlier versions of Onion Routing.
-We have deployed a wide-area alpha network
-to test the design, to get more experience with usability
-and users, and to provide a research platform for experimentation.
-As of this writing, the network stands at 32 nodes spread over two continents.
-
-<div class="p"><!----></div>
-We review previous work in Section&nbsp;<a href="#sec:related-work">2</a>, describe
-our goals and assumptions in Section&nbsp;<a href="#sec:assumptions">3</a>,
-and then address the above list of improvements in
-Sections&nbsp;<a href="#sec:design">4</a>,&nbsp;<a href="#sec:rendezvous">5</a>, and&nbsp;<a href="#sec:other-design">6</a>.
-We summarize
-in Section&nbsp;<a href="#sec:attacks">7</a> how our design stands up to
-known attacks, and talk about our early deployment experiences in
-Section&nbsp;<a href="#sec:in-the-wild">8</a>. We conclude with a list of open problems in
-Section&nbsp;<a href="#sec:maintaining-anonymity">9</a> and future work for the Onion
-Routing project in Section&nbsp;<a href="#sec:conclusion">10</a>.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc2">
-<a name="sec:related-work">
-2</a>&nbsp;&nbsp;Related work</h2>
-</a>
-
-<div class="p"><!----></div>
-Modern anonymity systems date to Chaum's <b>Mix-Net</b>
-design&nbsp;[<a href="#chaum-mix" name="CITEchaum-mix">10</a>]. Chaum
-proposed hiding the correspondence between sender and recipient by
-wrapping messages in layers of public-key cryptography, and relaying them
-through a path composed of "mixes." Each mix in turn
-decrypts, delays, and re-orders messages before relaying them
-onward.
-
-<div class="p"><!----></div>
-Subsequent relay-based anonymity designs have diverged in two
-main directions. Systems like <b>Babel</b>&nbsp;[<a href="#babel" name="CITEbabel">28</a>],
-<b>Mixmaster</b>&nbsp;[<a href="#mixmaster-spec" name="CITEmixmaster-spec">36</a>],
-and <b>Mixminion</b>&nbsp;[<a href="#minion-design" name="CITEminion-design">15</a>] have tried
-to maximize anonymity at the cost of introducing comparatively large and
-variable latencies. Because of this decision, these <em>high-latency</em>
-networks resist strong global adversaries,
-but introduce too much lag for interactive tasks like web browsing,
-Internet chat, or SSH connections.
-
-<div class="p"><!----></div>
-Tor belongs to the second category: <em>low-latency</em> designs that
-try to anonymize interactive network traffic. These systems handle
-a variety of bidirectional protocols. They also provide more convenient
-mail delivery than the high-latency anonymous email
-networks, because the remote mail server provides explicit and timely
-delivery confirmation. But because these designs typically
-involve many packets that must be delivered quickly, it is
-difficult for them to prevent an attacker who can eavesdrop both ends of the
-communication from correlating the timing and volume
-of traffic entering the anonymity network with traffic leaving it&nbsp;[<a href="#SS03" name="CITESS03">45</a>].
-These
-protocols are similarly vulnerable to an active adversary who introduces
-timing patterns into traffic entering the network and looks
-for correlated patterns among exiting traffic.
-Although some work has been done to frustrate these attacks, most designs
-protect primarily against traffic analysis rather than traffic
-confirmation (see Section&nbsp;<a href="#subsec:threat-model">3.1</a>).
-
-<div class="p"><!----></div>
-The simplest low-latency designs are single-hop proxies such as the
-<b>Anonymizer</b>&nbsp;[<a href="#anonymizer" name="CITEanonymizer">3</a>]: a single trusted server strips the
-data's origin before relaying it. These designs are easy to
-analyze, but users must trust the anonymizing proxy.
-Concentrating the traffic to this single point increases the anonymity set
-(the people a given user is hiding among), but it is vulnerable if the
-adversary can observe all traffic entering and leaving the proxy.
-
-<div class="p"><!----></div>
-More complex are distributed-trust, circuit-based anonymizing systems.
-In these designs, a user establishes one or more medium-term bidirectional
-end-to-end circuits, and tunnels data in fixed-size cells.
-Establishing circuits is computationally expensive and typically
-requires public-key
-cryptography, whereas relaying cells is comparatively inexpensive and
-typically requires only symmetric encryption.
-Because a circuit crosses several servers, and each server only knows
-the adjacent servers in the circuit, no single server can link a
-user to her communication partners.
-
-<div class="p"><!----></div>
-The <b>Java Anon Proxy</b> (also known as JAP or Web MIXes) uses fixed shared
-routes known as <em>cascades</em>. As with a single-hop proxy, this
-approach aggregates users into larger anonymity sets, but again an
-attacker only needs to observe both ends of the cascade to bridge all
-the system's traffic. The Java Anon Proxy's design
-calls for padding between end users and the head of the
-cascade&nbsp;[<a href="#web-mix" name="CITEweb-mix">7</a>]. However, it is not demonstrated whether the current
-implementation's padding policy improves anonymity.
-
-<div class="p"><!----></div>
-<b>PipeNet</b>&nbsp;[<a href="#back01" name="CITEback01">5</a>,<a href="#pipenet" name="CITEpipenet">12</a>], another low-latency design proposed
-around the same time as Onion Routing, gave
-stronger anonymity but allowed a single user to shut
-down the network by not sending. Systems like <b>ISDN
-mixes</b>&nbsp;[<a href="#isdn-mixes" name="CITEisdn-mixes">38</a>] were designed for other environments with
-different assumptions.
-
-<div class="p"><!----></div>
-In P2P designs like <b>Tarzan</b>&nbsp;[<a href="#tarzan:ccs02" name="CITEtarzan:ccs02">24</a>] and
-<b>MorphMix</b>&nbsp;[<a href="#morphmix:fc04" name="CITEmorphmix:fc04">43</a>], all participants both generate
-traffic and relay traffic for others. These systems aim to conceal
-whether a given peer originated a request
-or just relayed it from another peer. While Tarzan and MorphMix use
-layered encryption as above, <b>Crowds</b>&nbsp;[<a href="#crowds-tissec" name="CITEcrowds-tissec">42</a>] simply assumes
-an adversary who cannot observe the initiator: it uses no public-key
-encryption, so any node on a circuit can read users' traffic.
-
-<div class="p"><!----></div>
-<b>Hordes</b>&nbsp;[<a href="#hordes-jcs" name="CITEhordes-jcs">34</a>] is based on Crowds but also uses multicast
-responses to hide the initiator. <b>Herbivore</b>&nbsp;[<a href="#herbivore" name="CITEherbivore">25</a>] and
-<b>P</b><sup><b>5</b></sup>&nbsp;[<a href="#p5" name="CITEp5">46</a>] go even further, requiring broadcast.
-These systems are designed primarily for communication among peers,
-although Herbivore users can make external connections by
-requesting a peer to serve as a proxy.
-
-<div class="p"><!----></div>
-Systems like <b>Freedom</b> and the original Onion Routing build circuits
-all at once, using a layered "onion" of public-key encrypted messages,
-each layer of which provides session keys and the address of the
-next server in the circuit. Tor as described herein, Tarzan, MorphMix,
-<b>Cebolla</b>&nbsp;[<a href="#cebolla" name="CITEcebolla">9</a>], and Rennhard's <b>Anonymity Network</b>&nbsp;[<a href="#anonnet" name="CITEanonnet">44</a>]
-build circuits
-in stages, extending them one hop at a time.
-Section&nbsp;<a href="#subsubsec:constructing-a-circuit">4.2</a> describes how this
-approach enables perfect forward secrecy.
-
-<div class="p"><!----></div>
-Circuit-based designs must choose which protocol layer
-to anonymize. They may intercept IP packets directly, and
-relay them whole (stripping the source address) along the
-circuit&nbsp;[<a href="#freedom2-arch" name="CITEfreedom2-arch">8</a>,<a href="#tarzan:ccs02" name="CITEtarzan:ccs02">24</a>]. Like
-Tor, they may accept TCP streams and relay the data in those streams,
-ignoring the breakdown of that data into TCP
-segments&nbsp;[<a href="#morphmix:fc04" name="CITEmorphmix:fc04">43</a>,<a href="#anonnet" name="CITEanonnet">44</a>]. Finally, like Crowds, they may accept
-application-level protocols such as HTTP and relay the application
-requests themselves.
-Making this protocol-layer decision requires a compromise between flexibility
-and anonymity. For example, a system that understands HTTP
-can strip
-identifying information from requests, can take advantage of caching
-to limit the number of requests that leave the network, and can batch
-or encode requests to minimize the number of connections.
-On the other hand, an IP-level anonymizer can handle nearly any protocol,
-even ones unforeseen by its designers (though these systems require
-kernel-level modifications to some operating systems, and so are more
-complex and less portable). TCP-level anonymity networks like Tor present
-a middle approach: they are application neutral (so long as the
-application supports, or can be tunneled across, TCP), but by treating
-application connections as data streams rather than raw TCP packets,
-they avoid the inefficiencies of tunneling TCP over
-TCP.
-
-<div class="p"><!----></div>
-Distributed-trust anonymizing systems need to prevent attackers from
-adding too many servers and thus compromising user paths.
-Tor relies on a small set of well-known directory servers, run by
-independent parties, to decide which nodes can
-join. Tarzan and MorphMix allow unknown users to run servers, and use
-a limited resource (like IP addresses) to prevent an attacker from
-controlling too much of the network. Crowds suggests requiring
-written, notarized requests from potential crowd members.
-
-<div class="p"><!----></div>
-Anonymous communication is essential for censorship-resistant
-systems like Eternity&nbsp;[<a href="#eternity" name="CITEeternity">2</a>], Free&nbsp;Haven&nbsp;[<a href="#freehaven-berk" name="CITEfreehaven-berk">19</a>],
-Publius&nbsp;[<a href="#publius" name="CITEpublius">53</a>], and Tangler&nbsp;[<a href="#tangler" name="CITEtangler">52</a>]. Tor's rendezvous
-points enable connections between mutually anonymous entities; they
-are a building block for location-hidden servers, which are needed by
-Eternity and Free&nbsp;Haven.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc3">
-<a name="sec:assumptions">
-3</a>&nbsp;&nbsp;Design goals and assumptions</h2>
-</a>
-
-<div class="p"><!----></div>
-<font size="+1"><b>Goals</b></font><br />
-Like other low-latency anonymity designs, Tor seeks to frustrate
-attackers from linking communication partners, or from linking
-multiple communications to or from a single user. Within this
-main goal, however, several considerations have directed
-Tor's evolution.
-
-<div class="p"><!----></div>
-<b>Deployability:</b> The design must be deployed and used in the
-real world. Thus it
-must not be expensive to run (for example, by requiring more bandwidth
-than volunteers are willing to provide); must not place a heavy
-liability burden on operators (for example, by allowing attackers to
-implicate onion routers in illegal activities); and must not be
-difficult or expensive to implement (for example, by requiring kernel
-patches, or separate proxies for every protocol). We also cannot
-require non-anonymous parties (such as websites)
-to run our software. (Our rendezvous point design does not meet
-this goal for non-anonymous users talking to hidden servers,
-however; see Section&nbsp;<a href="#sec:rendezvous">5</a>.)
-
-<div class="p"><!----></div>
-<b>Usability:</b> A hard-to-use system has fewer users &mdash; and because
-anonymity systems hide users among users, a system with fewer users
-provides less anonymity. Usability is thus not only a convenience:
-it is a security requirement&nbsp;[<a href="#econymics" name="CITEeconymics">1</a>,<a href="#back01" name="CITEback01">5</a>]. Tor should
-therefore not
-require modifying familiar applications; should not introduce prohibitive
-delays;
-and should require as few configuration decisions
-as possible. Finally, Tor should be easily implementable on all common
-platforms; we cannot require users to change their operating system
-to be anonymous. (Tor currently runs on Win32, Linux,
-Solaris, BSD-style Unix, MacOS X, and probably others.)
-
-<div class="p"><!----></div>
-<b>Flexibility:</b> The protocol must be flexible and well-specified,
-so Tor can serve as a test-bed for future research.
-Many of the open problems in low-latency anonymity
-networks, such as generating dummy traffic or preventing Sybil
-attacks&nbsp;[<a href="#sybil" name="CITEsybil">22</a>], may be solvable independently from the issues
-solved by
-Tor. Hopefully future systems will not need to reinvent Tor's design.
-
-<div class="p"><!----></div>
-<b>Simple design:</b> The protocol's design and security
-parameters must be well-understood. Additional features impose implementation
-and complexity costs; adding unproven techniques to the design threatens
-deployability, readability, and ease of security analysis. Tor aims to
-deploy a simple and stable system that integrates the best accepted
-approaches to protecting anonymity.<br />
-
-<div class="p"><!----></div>
-<font size="+1"><b>Non-goals</b></font><a name="subsec:non-goals">
-</a><br />
-In favoring simple, deployable designs, we have explicitly deferred
-several possible goals, either because they are solved elsewhere, or because
-they are not yet solved.
-
-<div class="p"><!----></div>
-<b>Not peer-to-peer:</b> Tarzan and MorphMix aim to scale to completely
-decentralized peer-to-peer environments with thousands of short-lived
-servers, many of which may be controlled by an adversary. This approach
-is appealing, but still has many open
-problems&nbsp;[<a href="#tarzan:ccs02" name="CITEtarzan:ccs02">24</a>,<a href="#morphmix:fc04" name="CITEmorphmix:fc04">43</a>].
-
-<div class="p"><!----></div>
-<b>Not secure against end-to-end attacks:</b> Tor does not claim
-to completely solve end-to-end timing or intersection
-attacks. Some approaches, such as having users run their own onion routers,
-may help;
-see Section&nbsp;<a href="#sec:maintaining-anonymity">9</a> for more discussion.
-
-<div class="p"><!----></div>
-<b>No protocol normalization:</b> Tor does not provide <em>protocol
-normalization</em> like Privoxy or the Anonymizer. If senders want anonymity from
-responders while using complex and variable
-protocols like HTTP, Tor must be layered with a filtering proxy such
-as Privoxy to hide differences between clients, and expunge protocol
-features that leak identity.
-Note that by this separation Tor can also provide services that
-are anonymous to the network yet authenticated to the responder, like
-SSH. Similarly, Tor does not integrate
-tunneling for non-stream-based protocols like UDP; this must be
-provided by an external service if appropriate.
-
-<div class="p"><!----></div>
-<b>Not steganographic:</b> Tor does not try to conceal who is connected
-to the network.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc3.1">
-<a name="subsec:threat-model">
-3.1</a>&nbsp;&nbsp;Threat Model</h3>
-</a>
-
-<div class="p"><!----></div>
-A global passive adversary is the most commonly assumed threat when
-analyzing theoretical anonymity designs. But like all practical
-low-latency systems, Tor does not protect against such a strong
-adversary. Instead, we assume an adversary who can observe some fraction
-of network traffic; who can generate, modify, delete, or delay
-traffic; who can operate onion routers of his own; and who can
-compromise some fraction of the onion routers.
-
-<div class="p"><!----></div>
-In low-latency anonymity systems that use layered encryption, the
-adversary's typical goal is to observe both the initiator and the
-responder. By observing both ends, passive attackers can confirm a
-suspicion that Alice is
-talking to Bob if the timing and volume patterns of the traffic on the
-connection are distinct enough; active attackers can induce timing
-signatures on the traffic to force distinct patterns. Rather
-than focusing on these <em>traffic confirmation</em> attacks,
-we aim to prevent <em>traffic
-analysis</em> attacks, where the adversary uses traffic patterns to learn
-which points in the network he should attack.
-
-<div class="p"><!----></div>
-Our adversary might try to link an initiator Alice with her
-communication partners, or try to build a profile of Alice's
-behavior. He might mount passive attacks by observing the network edges
-and correlating traffic entering and leaving the network &mdash; by
-relationships in packet timing, volume, or externally visible
-user-selected
-options. The adversary can also mount active attacks by compromising
-routers or keys; by replaying traffic; by selectively denying service
-to trustworthy routers to move users to
-compromised routers, or denying service to users to see if traffic
-elsewhere in the
-network stops; or by introducing patterns into traffic that can later be
-detected. The adversary might subvert the directory servers to give users
-differing views of network state. Additionally, he can try to decrease
-the network's reliability by attacking nodes or by performing antisocial
-activities from reliable nodes and trying to get them taken down &mdash; making
-the network unreliable flushes users to other less anonymous
-systems, where they may be easier to attack. We summarize
-in Section&nbsp;<a href="#sec:attacks">7</a> how well the Tor design defends against
-each of these attacks.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc4">
-<a name="sec:design">
-4</a>&nbsp;&nbsp;The Tor Design</h2>
-</a>
-
-<div class="p"><!----></div>
-The Tor network is an overlay network; each onion router (OR)
-runs as a normal
-user-level process without any special privileges.
-Each onion router maintains a TLS&nbsp;[<a href="#TLS" name="CITETLS">17</a>]
-connection to every other onion router.
-Each user
-runs local software called an onion proxy (OP) to fetch directories,
-establish circuits across the network,
-and handle connections from user applications. These onion proxies accept
-TCP streams and multiplex them across the circuits. The onion
-router on the other side
-of the circuit connects to the requested destinations
-and relays data.
-
-<div class="p"><!----></div>
-Each onion router maintains a long-term identity key and a short-term
-onion key. The identity
-key is used to sign TLS certificates, to sign the OR's <em>router
-descriptor</em> (a summary of its keys, address, bandwidth, exit policy,
-and so on), and (by directory servers) to sign directories. The onion key is used to decrypt requests
-from users to set up a circuit and negotiate ephemeral keys.
-The TLS protocol also establishes a short-term link key when communicating
-between ORs. Short-term keys are rotated periodically and
-independently, to limit the impact of key compromise.
-
-<div class="p"><!----></div>
-Section&nbsp;<a href="#subsec:cells">4.1</a> presents the fixed-size
-<em>cells</em> that are the unit of communication in Tor. We describe
-in Section&nbsp;<a href="#subsec:circuits">4.2</a> how circuits are
-built, extended, truncated, and destroyed. Section&nbsp;<a href="#subsec:tcp">4.3</a>
-describes how TCP streams are routed through the network. We address
-integrity checking in Section&nbsp;<a href="#subsec:integrity-checking">4.4</a>,
-and resource limiting in Section&nbsp;<a href="#subsec:rate-limit">4.5</a>.
-Finally,
-Section&nbsp;<a href="#subsec:congestion">4.6</a> talks about congestion control and
-fairness issues.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.1">
-<a name="subsec:cells">
-4.1</a>&nbsp;&nbsp;Cells</h3>
-</a>
-
-<div class="p"><!----></div>
-Onion routers communicate with one another, and with users' OPs, via
-TLS connections with ephemeral keys. Using TLS conceals the data on
-the connection with perfect forward secrecy, and prevents an attacker
-from modifying data on the wire or impersonating an OR.
-
-<div class="p"><!----></div>
-Traffic passes along these connections in fixed-size cells. Each cell
-is 512 bytes, and consists of a header and a payload. The header includes a circuit
-identifier (circID) that specifies which circuit the cell refers to
-(many circuits can be multiplexed over the single TLS connection), and
-a command to describe what to do with the cell's payload. (Circuit
-identifiers are connection-specific: each circuit has a different
-circID on each OP/OR or OR/OR connection it traverses.)
-Based on their command, cells are either <em>control</em> cells, which are
-always interpreted by the node that receives them, or <em>relay</em> cells,
-which carry end-to-end stream data. The control cell commands are:
-<em>padding</em> (currently used for keepalive, but also usable for link
-padding); <em>create</em> or <em>created</em> (used to set up a new circuit);
-and <em>destroy</em> (to tear down a circuit).
-
-<div class="p"><!----></div>
-Relay cells have an additional header (the relay header) at the front
-of the payload, containing a streamID (stream identifier: many streams can
-be multiplexed over a circuit); an end-to-end checksum for integrity
-checking; the length of the relay payload; and a relay command.
-The entire contents of the relay header and the relay cell payload
-are encrypted or decrypted together as the relay cell moves along the
-circuit, using the 128-bit AES cipher in counter mode to generate a
-cipher stream. The relay commands are: <em>relay
-data</em> (for data flowing down the stream), <em>relay begin</em> (to open a
-stream), <em>relay end</em> (to close a stream cleanly), <em>relay
-teardown</em> (to close a broken stream), <em>relay connected</em>
-(to notify the OP that a relay begin has succeeded), <em>relay
-extend</em> and <em>relay extended</em> (to extend the circuit by a hop,
-and to acknowledge), <em>relay truncate</em> and <em>relay truncated</em>
-(to tear down only part of the circuit, and to acknowledge), <em>relay
-sendme</em> (used for congestion control), and <em>relay drop</em> (used to
-implement long-range dummies).
-We give a visual overview of cell structure plus the details of relay
-cell structure, and then describe each of these cell types and commands
-in more detail below.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-<a name="tth_fIg1">
-</a> <center><img src="cell-struct.png" alt="cell-struct.png" />
-</center>
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.2">
-<a name="subsec:circuits">
-4.2</a>&nbsp;&nbsp;Circuits and streams</h3>
-</a>
-
-<div class="p"><!----></div>
-Onion Routing originally built one circuit for each
-TCP stream. Because building a circuit can take several tenths of a
-second (due to public-key cryptography and network latency),
-this design imposed high costs on applications like web browsing that
-open many TCP streams.
-
-<div class="p"><!----></div>
-In Tor, each circuit can be shared by many TCP streams. To avoid
-delays, users construct circuits preemptively. To limit linkability
-among their streams, users' OPs build a new circuit
-periodically if the previous ones have been used,
-and expire old used circuits that no longer have any open streams.
-OPs consider rotating to a new circuit once a minute: thus
-even heavy users spend negligible time
-building circuits, but a limited number of requests can be linked
-to each other through a given exit node. Also, because circuits are built
-in the background, OPs can recover from failed circuit creation
-without harming user experience.<br />
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-<a name="tth_fIg1">
-</a> <center><img src="interaction.png" alt="interaction.png" />
-
-<center>Figure 1: Alice builds a two-hop circuit and begins fetching a web page.</center>
-<a name="fig:interaction">
-</a>
-</center>
-<div class="p"><!----></div>
-<a name="subsubsec:constructing-a-circuit"></a>
-<font size="+1"><b>Constructing a circuit</b></font>
-<br />
-A user's OP constructs circuits incrementally, negotiating a
-symmetric key with each OR on the circuit, one hop at a time. To begin
-creating a new circuit, the OP (call her Alice) sends a
-<em>create</em> cell to the first node in her chosen path (call him Bob).
-(She chooses a new
-circID C<sub>AB</sub> not currently used on the connection from her to Bob.)
-The <em>create</em> cell's
-payload contains the first half of the Diffie-Hellman handshake
-(g<sup>x</sup>), encrypted to the onion key of Bob. Bob
-responds with a <em>created</em> cell containing g<sup>y</sup>
-along with a hash of the negotiated key K=g<sup>xy</sup>.
-
-<div class="p"><!----></div>
-Once the circuit has been established, Alice and Bob can send one
-another relay cells encrypted with the negotiated
-key.<a href="#tthFtNtAAB" name="tthFrefAAB"><sup>1</sup></a> More detail is given in
-the next section.
-
-<div class="p"><!----></div>
-To extend the circuit further, Alice sends a <em>relay extend</em> cell
-to Bob, specifying the address of the next OR (call her Carol), and
-an encrypted g<sup>x<sub>2</sub></sup> for her. Bob copies the half-handshake into a
-<em>create</em> cell, and passes it to Carol to extend the circuit.
-(Bob chooses a new circID C<sub>BC</sub> not currently used on the connection
-between him and Carol. Alice never needs to know this circID; only Bob
-associates C<sub>AB</sub> on his connection with Alice to C<sub>BC</sub> on
-his connection with Carol.)
-When Carol responds with a <em>created</em> cell, Bob wraps the payload
-into a <em>relay extended</em> cell and passes it back to Alice. Now
-the circuit is extended to Carol, and Alice and Carol share a common key
-K<sub>2</sub> = g<sup>x<sub>2</sub> y<sub>2</sub></sup>.
-
-<div class="p"><!----></div>
-To extend the circuit to a third node or beyond, Alice
-proceeds as above, always telling the last node in the circuit to
-extend one hop further.
-
-<div class="p"><!----></div>
-This circuit-level handshake protocol achieves unilateral entity
-authentication (Alice knows she's handshaking with the OR, but
-the OR doesn't care who is opening the circuit &mdash; Alice uses no public key
-and remains anonymous) and unilateral key authentication
-(Alice and the OR agree on a key, and Alice knows only the OR learns
-it). It also achieves forward
-secrecy and key freshness. More formally, the protocol is as follows
-(where E<sub>PK<sub>Bob</sub></sub>(&#183;) is encryption with Bob's public key,
-H is a secure hash function, and <font face="symbol">|</font
-> is concatenation):
-
-<div class="p"><!----></div>
-<a name="tth_tAb1">
-</a>
-<table>
-<tr><td align="right">Alice </td><td align="center">-&#62; </td><td align="center">Bob </td><td>: E<sub>PK<sub>Bob</sub></sub>(g<sup>x</sup>) </td></tr>
-<tr><td align="right">Bob </td><td align="center">-&#62; </td><td align="center">Alice </td><td>: g<sup>y</sup>, H(K <font face="symbol">|</font
-> "<span class="roman">handshake</span>")
-</td></tr></table>
-
-
-<div class="p"><!----></div>
- In the second step, Bob proves that it was he who received g<sup>x</sup>,
-and who chose y. We use PK encryption in the first step
-(rather than, say, using the first two steps of STS, which has a
-signature in the second step) because a single cell is too small to
-hold both a public key and a signature. Preliminary analysis with the
-NRL protocol analyzer&nbsp;[<a href="#meadows96" name="CITEmeadows96">35</a>] shows this protocol to be
-secure (including perfect forward secrecy) under the
-traditional Dolev-Yao model.<br />
-
-<div class="p"><!----></div>
-<font size="+1"><b>Relay cells</b></font><br />
-Once Alice has established the circuit (so she shares keys with each
-OR on the circuit), she can send relay cells.
-Upon receiving a relay
-cell, an OR looks up the corresponding circuit, and decrypts the relay
-header and payload with the session key for that circuit.
-If the cell is headed away from Alice the OR then checks whether the
-decrypted cell has a valid digest (as an optimization, the first
-two bytes of the integrity check are zero, so in most cases we can avoid
-computing the hash).
-If valid, it accepts the relay cell and processes it as described
-below. Otherwise,
-the OR looks up the circID and OR for the
-next step in the circuit, replaces the circID as appropriate, and
-sends the decrypted relay cell to the next OR. (If the OR at the end
-of the circuit receives an unrecognized relay cell, an error has
-occurred, and the circuit is torn down.)
-
-<div class="p"><!----></div>
-OPs treat incoming relay cells similarly: they iteratively unwrap the
-relay header and payload with the session keys shared with each
-OR on the circuit, from the closest to farthest.
-If at any stage the digest is valid, the cell must have
-originated at the OR whose encryption has just been removed.
-
-<div class="p"><!----></div>
-To construct a relay cell addressed to a given OR, Alice assigns the
-digest, and then iteratively
-encrypts the cell payload (that is, the relay header and payload) with
-the symmetric key of each hop up to that OR. Because the digest is
-encrypted to a different value at each step, only at the targeted OR
-will it have a meaningful value.<a href="#tthFtNtAAC" name="tthFrefAAC"><sup>2</sup></a>
-This <em>leaky pipe</em> circuit topology
-allows Alice's streams to exit at different ORs on a single circuit.
-Alice may choose different exit points because of their exit policies,
-or to keep the ORs from knowing that two streams
-originate from the same person.
-
-<div class="p"><!----></div>
-When an OR later replies to Alice with a relay cell, it
-encrypts the cell's relay header and payload with the single key it
-shares with Alice, and sends the cell back toward Alice along the
-circuit. Subsequent ORs add further layers of encryption as they
-relay the cell back to Alice.
-
-<div class="p"><!----></div>
-To tear down a circuit, Alice sends a <em>destroy</em> control
-cell. Each OR in the circuit receives the <em>destroy</em> cell, closes
-all streams on that circuit, and passes a new <em>destroy</em> cell
-forward. But just as circuits are built incrementally, they can also
-be torn down incrementally: Alice can send a <em>relay
-truncate</em> cell to a single OR on a circuit. That OR then sends a
-<em>destroy</em> cell forward, and acknowledges with a
-<em>relay truncated</em> cell. Alice can then extend the circuit to
-different nodes, without signaling to the intermediate nodes (or
-a limited observer) that she has changed her circuit.
-Similarly, if a node on the circuit goes down, the adjacent
-node can send a <em>relay truncated</em> cell back to Alice. Thus the
-"break a node and see which circuits go down"
-attack&nbsp;[<a href="#freedom21-security" name="CITEfreedom21-security">4</a>] is weakened.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.3">
-<a name="subsec:tcp">
-4.3</a>&nbsp;&nbsp;Opening and closing streams</h3>
-</a>
-
-<div class="p"><!----></div>
-When Alice's application wants a TCP connection to a given
-address and port, it asks the OP (via SOCKS) to make the
-connection. The OP chooses the newest open circuit (or creates one if
-needed), and chooses a suitable OR on that circuit to be the
-exit node (usually the last node, but maybe others due to exit policy
-conflicts; see Section&nbsp;<a href="#subsec:exitpolicies">6.2</a>.) The OP then opens
-the stream by sending a <em>relay begin</em> cell to the exit node,
-using a new random streamID. Once the
-exit node connects to the remote host, it responds
-with a <em>relay connected</em> cell. Upon receipt, the OP sends a
-SOCKS reply to notify the application of its success. The OP
-now accepts data from the application's TCP stream, packaging it into
-<em>relay data</em> cells and sending those cells along the circuit to
-the chosen OR.
-
-<div class="p"><!----></div>
-There's a catch to using SOCKS, however &mdash; some applications pass the
-alphanumeric hostname to the Tor client, while others resolve it into
-an IP address first and then pass the IP address to the Tor client. If
-the application does DNS resolution first, Alice thereby reveals her
-destination to the remote DNS server, rather than sending the hostname
-through the Tor network to be resolved at the far end. Common applications
-like Mozilla and SSH have this flaw.
-
-<div class="p"><!----></div>
-With Mozilla, the flaw is easy to address: the filtering HTTP
-proxy called Privoxy gives a hostname to the Tor client, so Alice's
-computer never does DNS resolution.
-But a portable general solution, such as is needed for
-SSH, is
-an open problem. Modifying or replacing the local nameserver
-can be invasive, brittle, and unportable. Forcing the resolver
-library to prefer TCP rather than UDP is hard, and also has
-portability problems. Dynamically intercepting system calls to the
-resolver library seems a promising direction. We could also provide
-a tool similar to <em>dig</em> to perform a private lookup through the
-Tor network. Currently, we encourage the use of privacy-aware proxies
-like Privoxy wherever possible.
-
-<div class="p"><!----></div>
-Closing a Tor stream is analogous to closing a TCP stream: it uses a
-two-step handshake for normal operation, or a one-step handshake for
-errors. If the stream closes abnormally, the adjacent node simply sends a
-<em>relay teardown</em> cell. If the stream closes normally, the node sends
-a <em>relay end</em> cell down the circuit, and the other side responds with
-its own <em>relay end</em> cell. Because
-all relay cells use layered encryption, only the destination OR knows
-that a given relay cell is a request to close a stream. This two-step
-handshake allows Tor to support TCP-based applications that use half-closed
-connections.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.4">
-<a name="subsec:integrity-checking">
-4.4</a>&nbsp;&nbsp;Integrity checking on streams</h3>
-</a>
-
-<div class="p"><!----></div>
-Because the old Onion Routing design used a stream cipher without integrity
-checking, traffic was
-vulnerable to a malleability attack: though the attacker could not
-decrypt cells, any changes to encrypted data
-would create corresponding changes to the data leaving the network.
-This weakness allowed an adversary who could guess the encrypted content
-to change a padding cell to a destroy
-cell; change the destination address in a <em>relay begin</em> cell to the
-adversary's webserver; or change an FTP command from
-<tt>dir</tt> to <tt>rm&nbsp;*</tt>. (Even an external
-adversary could do this, because the link encryption similarly used a
-stream cipher.)
-
-<div class="p"><!----></div>
-Because Tor uses TLS on its links, external adversaries cannot modify
-data. Addressing the insider malleability attack, however, is
-more complex.
-
-<div class="p"><!----></div>
-We could do integrity checking of the relay cells at each hop, either
-by including hashes or by using an authenticating cipher mode like
-EAX&nbsp;[<a href="#eax" name="CITEeax">6</a>], but there are some problems. First, these approaches
-impose a message-expansion overhead at each hop, and so we would have to
-either leak the path length or waste bytes by padding to a maximum
-path length. Second, these solutions can only verify traffic coming
-from Alice: ORs would not be able to produce suitable hashes for
-the intermediate hops, since the ORs on a circuit do not know the
-other ORs' session keys. Third, we have already accepted that our design
-is vulnerable to end-to-end timing attacks; so tagging attacks performed
-within the circuit provide no additional information to the attacker.
-
-<div class="p"><!----></div>
-Thus, we check integrity only at the edges of each stream. (Remember that
-in our leaky-pipe circuit topology, a stream's edge could be any hop
-in the circuit.) When Alice
-negotiates a key with a new hop, they each initialize a SHA-1
-digest with a derivative of that key,
-thus beginning with randomness that only the two of them know.
-Then they each incrementally add to the SHA-1 digest the contents of
-all relay cells they create, and include with each relay cell the
-first four bytes of the current digest. Each also keeps a SHA-1
-digest of data received, to verify that the received hashes are correct.
-
-<div class="p"><!----></div>
-To be sure of removing or modifying a cell, the attacker must be able
-to deduce the current digest state (which depends on all
-traffic between Alice and Bob, starting with their negotiated key).
-Attacks on SHA-1 where the adversary can incrementally add to a hash
-to produce a new valid hash don't work, because all hashes are
-end-to-end encrypted across the circuit. The computational overhead
-of computing the digests is minimal compared to doing the AES
-encryption performed at each hop of the circuit. We use only four
-bytes per cell to minimize overhead; the chance that an adversary will
-correctly guess a valid hash
-is
-acceptably low, given that the OP or OR tear down the circuit if they
-receive a bad hash.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.5">
-<a name="subsec:rate-limit">
-4.5</a>&nbsp;&nbsp;Rate limiting and fairness</h3>
-</a>
-
-<div class="p"><!----></div>
-Volunteers are more willing to run services that can limit
-their bandwidth usage. To accommodate them, Tor servers use a
-token bucket approach&nbsp;[<a href="#tannenbaum96" name="CITEtannenbaum96">50</a>] to
-enforce a long-term average rate of incoming bytes, while still
-permitting short-term bursts above the allowed bandwidth.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-Because the Tor protocol outputs about the same number of bytes as it
-takes in, it is sufficient in practice to limit only incoming bytes.
-With TCP streams, however, the correspondence is not one-to-one:
-relaying a single incoming byte can require an entire 512-byte cell.
-(We can't just wait for more bytes, because the local application may
-be awaiting a reply.) Therefore, we treat this case as if the entire
-cell size had been read, regardless of the cell's fullness.
-
-<div class="p"><!----></div>
-Further, inspired by Rennhard et al's design in&nbsp;[<a href="#anonnet" name="CITEanonnet">44</a>], a
-circuit's edges can heuristically distinguish interactive streams from bulk
-streams by comparing the frequency with which they supply cells. We can
-provide good latency for interactive streams by giving them preferential
-service, while still giving good overall throughput to the bulk
-streams. Such preferential treatment presents a possible end-to-end
-attack, but an adversary observing both
-ends of the stream can already learn this information through timing
-attacks.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc4.6">
-<a name="subsec:congestion">
-4.6</a>&nbsp;&nbsp;Congestion control</h3>
-</a>
-
-<div class="p"><!----></div>
-Even with bandwidth rate limiting, we still need to worry about
-congestion, either accidental or intentional. If enough users choose the
-same OR-to-OR connection for their circuits, that connection can become
-saturated. For example, an attacker could send a large file
-through the Tor network to a webserver he runs, and then
-refuse to read any of the bytes at the webserver end of the
-circuit. Without some congestion control mechanism, these bottlenecks
-can propagate back through the entire network. We don't need to
-reimplement full TCP windows (with sequence numbers,
-the ability to drop cells when we're full and retransmit later, and so
-on),
-because TCP already guarantees in-order delivery of each
-cell.
-We describe our response below.
-
-<div class="p"><!----></div>
-<b>Circuit-level throttling:</b>
-To control a circuit's bandwidth usage, each OR keeps track of two
-windows. The <em>packaging window</em> tracks how many relay data cells the OR is
-allowed to package (from incoming TCP streams) for transmission back to the OP,
-and the <em>delivery window</em> tracks how many relay data cells it is willing
-to deliver to TCP streams outside the network. Each window is initialized
-(say, to 1000 data cells). When a data cell is packaged or delivered,
-the appropriate window is decremented. When an OR has received enough
-data cells (currently 100), it sends a <em>relay sendme</em> cell towards the OP,
-with streamID zero. When an OR receives a <em>relay sendme</em> cell with
-streamID zero, it increments its packaging window. Either of these cells
-increments the corresponding window by 100. If the packaging window
-reaches 0, the OR stops reading from TCP connections for all streams
-on the corresponding circuit, and sends no more relay data cells until
-receiving a <em>relay sendme</em> cell.
-
-<div class="p"><!----></div>
-The OP behaves identically, except that it must track a packaging window
-and a delivery window for every OR in the circuit. If a packaging window
-reaches 0, it stops reading from streams destined for that OR.
-
-<div class="p"><!----></div>
-<b>Stream-level throttling</b>:
-The stream-level congestion control mechanism is similar to the
-circuit-level mechanism. ORs and OPs use <em>relay sendme</em> cells
-to implement end-to-end flow control for individual streams across
-circuits. Each stream begins with a packaging window (currently 500 cells),
-and increments the window by a fixed value (50) upon receiving a <em>relay
-sendme</em> cell. Rather than always returning a <em>relay sendme</em> cell as soon
-as enough cells have arrived, the stream-level congestion control also
-has to check whether data has been successfully flushed onto the TCP
-stream; it sends the <em>relay sendme</em> cell only when the number of bytes pending
-to be flushed is under some threshold (currently 10 cells' worth).
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-These arbitrarily chosen parameters seem to give tolerable throughput
-and delay; see Section&nbsp;<a href="#sec:in-the-wild">8</a>.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc5">
-<a name="sec:rendezvous">
-5</a>&nbsp;&nbsp;Rendezvous Points and hidden services</h2>
-</a>
-
-<div class="p"><!----></div>
-Rendezvous points are a building block for <em>location-hidden
-services</em> (also known as <em>responder anonymity</em>) in the Tor
-network. Location-hidden services allow Bob to offer a TCP
-service, such as a webserver, without revealing his IP address.
-This type of anonymity protects against distributed DoS attacks:
-attackers are forced to attack the onion routing network
-because they do not know Bob's IP address.
-
-<div class="p"><!----></div>
-Our design for location-hidden servers has the following goals.
-<b>Access-control:</b> Bob needs a way to filter incoming requests,
-so an attacker cannot flood Bob simply by making many connections to him.
-<b>Robustness:</b> Bob should be able to maintain a long-term pseudonymous
-identity even in the presence of router failure. Bob's service must
-not be tied to a single OR, and Bob must be able to migrate his service
-across ORs. <b>Smear-resistance:</b>
-A social attacker
-should not be able to "frame" a rendezvous router by
-offering an illegal or disreputable location-hidden service and
-making observers believe the router created that service.
-<b>Application-transparency:</b> Although we require users
-to run special software to access location-hidden servers, we must not
-require them to modify their applications.
-
-<div class="p"><!----></div>
-We provide location-hiding for Bob by allowing him to advertise
-several onion routers (his <em>introduction points</em>) as contact
-points. He may do this on any robust efficient
-key-value lookup system with authenticated updates, such as a
-distributed hash table (DHT) like CFS&nbsp;[<a href="#cfs:sosp01" name="CITEcfs:sosp01">11</a>].<a href="#tthFtNtAAD" name="tthFrefAAD"><sup>3</sup></a> Alice, the client, chooses an OR as her
-<em>rendezvous point</em>. She connects to one of Bob's introduction
-points, informs him of her rendezvous point, and then waits for him
-to connect to the rendezvous point. This extra level of indirection
-helps Bob's introduction points avoid problems associated with serving
-unpopular files directly (for example, if Bob serves
-material that the introduction point's community finds objectionable,
-or if Bob's service tends to get attacked by network vandals).
-The extra level of indirection also allows Bob to respond to some requests
-and ignore others.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc5.1">
-5.1</a>&nbsp;&nbsp;Rendezvous points in Tor</h3>
-
-<div class="p"><!----></div>
-The following steps are
-performed on behalf of Alice and Bob by their local OPs;
-application integration is described more fully below.
-
-<div class="p"><!----></div>
-
-<dl compact="compact">
-
- <dt><b></b></dt>
- <dd><li>Bob generates a long-term public key pair to identify his service.</dd>
- <dt><b></b></dt>
- <dd><li>Bob chooses some introduction points, and advertises them on
- the lookup service, signing the advertisement with his public key. He
- can add more later.</dd>
- <dt><b></b></dt>
- <dd><li>Bob builds a circuit to each of his introduction points, and tells
- them to wait for requests.</dd>
- <dt><b></b></dt>
- <dd><li>Alice learns about Bob's service out of band (perhaps Bob told her,
- or she found it on a website). She retrieves the details of Bob's
- service from the lookup service. If Alice wants to access Bob's
- service anonymously, she must connect to the lookup service via Tor.</dd>
- <dt><b></b></dt>
- <dd><li>Alice chooses an OR as the rendezvous point (RP) for her connection to
- Bob's service. She builds a circuit to the RP, and gives it a
- randomly chosen "rendezvous cookie" to recognize Bob.</dd>
- <dt><b></b></dt>
- <dd><li>Alice opens an anonymous stream to one of Bob's introduction
- points, and gives it a message (encrypted with Bob's public key)
- telling it about herself,
- her RP and rendezvous cookie, and the
- start of a DH
- handshake. The introduction point sends the message to Bob.</dd>
- <dt><b></b></dt>
- <dd><li>If Bob wants to talk to Alice, he builds a circuit to Alice's
- RP and sends the rendezvous cookie, the second half of the DH
- handshake, and a hash of the session
- key they now share. By the same argument as in
- Section&nbsp;<a href="#subsubsec:constructing-a-circuit">4.2</a>, Alice knows she
- shares the key only with Bob.</dd>
- <dt><b></b></dt>
- <dd><li>The RP connects Alice's circuit to Bob's. Note that RP can't
- recognize Alice, Bob, or the data they transmit.</dd>
- <dt><b></b></dt>
- <dd><li>Alice sends a <em>relay begin</em> cell along the circuit. It
- arrives at Bob's OP, which connects to Bob's
- webserver.</dd>
- <dt><b></b></dt>
- <dd><li>An anonymous stream has been established, and Alice and Bob
- communicate as normal.
-</dd>
-</dl>
-
-<div class="p"><!----></div>
-When establishing an introduction point, Bob provides the onion router
-with the public key identifying his service. Bob signs his
-messages, so others cannot usurp his introduction point
-in the future. He uses the same public key to establish the other
-introduction points for his service, and periodically refreshes his
-entry in the lookup service.
-
-<div class="p"><!----></div>
-The message that Alice gives
-the introduction point includes a hash of Bob's public key and an optional initial authorization token (the
-introduction point can do prescreening, for example to block replays). Her
-message to Bob may include an end-to-end authorization token so Bob
-can choose whether to respond.
-The authorization tokens can be used to provide selective access:
-important users can get uninterrupted access.
-During normal situations, Bob's service might simply be offered
-directly from mirrors, while Bob gives out tokens to high-priority users. If
-the mirrors are knocked down,
-those users can switch to accessing Bob's service via
-the Tor rendezvous system.
-
-<div class="p"><!----></div>
-Bob's introduction points are themselves subject to DoS &mdash; he must
-open many introduction points or risk such an attack.
-He can provide selected users with a current list or future schedule of
-unadvertised introduction points;
-this is most practical
-if there is a stable and large group of introduction points
-available. Bob could also give secret public keys
-for consulting the lookup service. All of these approaches
-limit exposure even when
-some selected users collude in the DoS.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc5.2">
-5.2</a>&nbsp;&nbsp;Integration with user applications</h3>
-
-<div class="p"><!----></div>
-Bob configures his onion proxy to know the local IP address and port of his
-service, a strategy for authorizing clients, and his public key. The onion
-proxy anonymously publishes a signed statement of Bob's
-public key, an expiration time, and
-the current introduction points for his service onto the lookup service,
-indexed
-by the hash of his public key. Bob's webserver is unmodified,
-and doesn't even know that it's hidden behind the Tor network.
-
-<div class="p"><!----></div>
-Alice's applications also work unchanged &mdash; her client interface
-remains a SOCKS proxy. We encode all of the necessary information
-into the fully qualified domain name (FQDN) Alice uses when establishing her
-connection. Location-hidden services use a virtual top level domain
-called <tt>.onion</tt>: thus hostnames take the form <tt>x.y.onion</tt> where
-<tt>x</tt> is the authorization cookie and <tt>y</tt> encodes the hash of
-the public key. Alice's onion proxy
-examines addresses; if they're destined for a hidden server, it decodes
-the key and starts the rendezvous as described above.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc5.3">
-5.3</a>&nbsp;&nbsp;Previous rendezvous work</h3>
-
-<div class="p"><!----></div>
-Rendezvous points in low-latency anonymity systems were first
-described for use in ISDN telephony&nbsp;[<a href="#jerichow-jsac98" name="CITEjerichow-jsac98">30</a>,<a href="#isdn-mixes" name="CITEisdn-mixes">38</a>].
-Later low-latency designs used rendezvous points for hiding location
-of mobile phones and low-power location
-trackers&nbsp;[<a href="#federrath-ih96" name="CITEfederrath-ih96">23</a>,<a href="#reed-protocols97" name="CITEreed-protocols97">40</a>]. Rendezvous for
-anonymizing low-latency
-Internet connections was suggested in early Onion Routing
-work&nbsp;[<a href="#or-ih96" name="CITEor-ih96">27</a>], but the first published design was by Ian
-Goldberg&nbsp;[<a href="#ian-thesis" name="CITEian-thesis">26</a>]. His design differs from
-ours in three ways. First, Goldberg suggests that Alice should manually
-hunt down a current location of the service via Gnutella; our approach
-makes lookup transparent to the user, as well as faster and more robust.
-Second, in Tor the client and server negotiate session keys
-with Diffie-Hellman, so plaintext is not exposed even at the rendezvous
-point. Third,
-our design minimizes the exposure from running the
-service, to encourage volunteers to offer introduction and rendezvous
-services. Tor's introduction points do not output any bytes to the
-clients; the rendezvous points don't know the client or the server,
-and can't read the data being transmitted. The indirection scheme is
-also designed to include authentication/authorization &mdash; if Alice doesn't
-include the right cookie with her request for service, Bob need not even
-acknowledge his existence.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc6">
-<a name="sec:other-design">
-6</a>&nbsp;&nbsp;Other design decisions</h2>
-</a>
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc6.1">
-<a name="subsec:dos">
-6.1</a>&nbsp;&nbsp;Denial of service</h3>
-</a>
-
-<div class="p"><!----></div>
-Providing Tor as a public service creates many opportunities for
-denial-of-service attacks against the network. While
-flow control and rate limiting (discussed in
-Section&nbsp;<a href="#subsec:congestion">4.6</a>) prevent users from consuming more
-bandwidth than routers are willing to provide, opportunities remain for
-users to
-consume more network resources than their fair share, or to render the
-network unusable for others.
-
-<div class="p"><!----></div>
-First of all, there are several CPU-consuming denial-of-service
-attacks wherein an attacker can force an OR to perform expensive
-cryptographic operations. For example, an attacker can
-fake the start of a TLS handshake, forcing the OR to carry out its
-(comparatively expensive) half of the handshake at no real computational
-cost to the attacker.
-
-<div class="p"><!----></div>
-We have not yet implemented any defenses for these attacks, but several
-approaches are possible. First, ORs can
-require clients to solve a puzzle&nbsp;[<a href="#puzzles-tls" name="CITEpuzzles-tls">16</a>] while beginning new
-TLS handshakes or accepting <em>create</em> cells. So long as these
-tokens are easy to verify and computationally expensive to produce, this
-approach limits the attack multiplier. Additionally, ORs can limit
-the rate at which they accept <em>create</em> cells and TLS connections,
-so that
-the computational work of processing them does not drown out the
-symmetric cryptography operations that keep cells
-flowing. This rate limiting could, however, allow an attacker
-to slow down other users when they build new circuits.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-Adversaries can also attack the Tor network's hosts and network
-links. Disrupting a single circuit or link breaks all streams passing
-along that part of the circuit. Users similarly lose service
-when a router crashes or its operator restarts it. The current
-Tor design treats such attacks as intermittent network failures, and
-depends on users and applications to respond or recover as appropriate. A
-future design could use an end-to-end TCP-like acknowledgment protocol,
-so no streams are lost unless the entry or exit point is
-disrupted. This solution would require more buffering at the network
-edges, however, and the performance and anonymity implications from this
-extra complexity still require investigation.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc6.2">
-<a name="subsec:exitpolicies">
-6.2</a>&nbsp;&nbsp;Exit policies and abuse</h3>
-</a>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-Exit abuse is a serious barrier to wide-scale Tor deployment. Anonymity
-presents would-be vandals and abusers with an opportunity to hide
-the origins of their activities. Attackers can harm the Tor network by
-implicating exit servers for their abuse. Also, applications that commonly
-use IP-based authentication (such as institutional mail or webservers)
-can be fooled by the fact that anonymous connections appear to originate
-at the exit OR.
-
-<div class="p"><!----></div>
-We stress that Tor does not enable any new class of abuse. Spammers
-and other attackers already have access to thousands of misconfigured
-systems worldwide, and the Tor network is far from the easiest way
-to launch attacks.
-But because the
-onion routers can be mistaken for the originators of the abuse,
-and the volunteers who run them may not want to deal with the hassle of
-explaining anonymity networks to irate administrators, we must block or limit
-abuse through the Tor network.
-
-<div class="p"><!----></div>
-To mitigate abuse issues, each onion router's <em>exit policy</em>
-describes to which external addresses and ports the router will
-connect. On one end of the spectrum are <em>open exit</em>
-nodes that will connect anywhere. On the other end are <em>middleman</em>
-nodes that only relay traffic to other Tor nodes, and <em>private exit</em>
-nodes that only connect to a local host or network. A private
-exit can allow a client to connect to a given host or
-network more securely &mdash; an external adversary cannot eavesdrop traffic
-between the private exit and the final destination, and so is less sure of
-Alice's destination and activities. Most onion routers in the current
-network function as
-<em>restricted exits</em> that permit connections to the world at large,
-but prevent access to certain abuse-prone addresses and services such
-as SMTP.
-The OR might also be able to authenticate clients to
-prevent exit abuse without harming anonymity&nbsp;[<a href="#or-discex00" name="CITEor-discex00">48</a>].
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-Many administrators use port restrictions to support only a
-limited set of services, such as HTTP, SSH, or AIM.
-This is not a complete solution, of course, since abuse opportunities for these
-protocols are still well known.
-
-<div class="p"><!----></div>
-We have not yet encountered any abuse in the deployed network, but if
-we do we should consider using proxies to clean traffic for certain
-protocols as it leaves the network. For example, much abusive HTTP
-behavior (such as exploiting buffer overflows or well-known script
-vulnerabilities) can be detected in a straightforward manner.
-Similarly, one could run automatic spam filtering software (such as
-SpamAssassin) on email exiting the OR network.
-
-<div class="p"><!----></div>
-ORs may also rewrite exiting traffic to append
-headers or other information indicating that the traffic has passed
-through an anonymity service. This approach is commonly used
-by email-only anonymity systems. ORs can also
-run on servers with hostnames like <tt>anonymous</tt> to further
-alert abuse targets to the nature of the anonymous traffic.
-
-<div class="p"><!----></div>
-A mixture of open and restricted exit nodes allows the most
-flexibility for volunteers running servers. But while having many
-middleman nodes provides a large and robust network,
-having only a few exit nodes reduces the number of points
-an adversary needs to monitor for traffic analysis, and places a
-greater burden on the exit nodes. This tension can be seen in the
-Java Anon Proxy
-cascade model, wherein only one node in each cascade needs to handle
-abuse complaints &mdash; but an adversary only needs to observe the entry
-and exit of a cascade to perform traffic analysis on all that
-cascade's users. The hydra model (many entries, few exits) presents a
-different compromise: only a few exit nodes are needed, but an
-adversary needs to work harder to watch all the clients; see
-Section&nbsp;<a href="#sec:conclusion">10</a>.
-
-<div class="p"><!----></div>
-Finally, we note that exit abuse must not be dismissed as a peripheral
-issue: when a system's public image suffers, it can reduce the number
-and diversity of that system's users, and thereby reduce the anonymity
-of the system itself. Like usability, public perception is a
-security parameter. Sadly, preventing abuse of open exit nodes is an
-unsolved problem, and will probably remain an arms race for the
-foreseeable future. The abuse problems faced by Princeton's CoDeeN
-project&nbsp;[<a href="#darkside" name="CITEdarkside">37</a>] give us a glimpse of likely issues.
-
-<div class="p"><!----></div>
- <h3><a name="tth_sEc6.3">
-<a name="subsec:dirservers">
-6.3</a>&nbsp;&nbsp;Directory Servers</h3>
-</a>
-
-<div class="p"><!----></div>
-First-generation Onion Routing designs&nbsp;[<a href="#freedom2-arch" name="CITEfreedom2-arch">8</a>,<a href="#or-jsac98" name="CITEor-jsac98">41</a>] used
-in-band network status updates: each router flooded a signed statement
-to its neighbors, which propagated it onward. But anonymizing networks
-have different security goals than typical link-state routing protocols.
-For example, delays (accidental or intentional)
-that can cause different parts of the network to have different views
-of link-state and topology are not only inconvenient: they give
-attackers an opportunity to exploit differences in client knowledge.
-We also worry about attacks to deceive a
-client about the router membership list, topology, or current network
-state. Such <em>partitioning attacks</em> on client knowledge help an
-adversary to efficiently deploy resources
-against a target&nbsp;[<a href="#minion-design" name="CITEminion-design">15</a>].
-
-<div class="p"><!----></div>
-Tor uses a small group of redundant, well-known onion routers to
-track changes in network topology and node state, including keys and
-exit policies. Each such <em>directory server</em> acts as an HTTP
-server, so clients can fetch current network state
-and router lists, and so other ORs can upload
-state information. Onion routers periodically publish signed
-statements of their state to each directory server. The directory servers
-combine this information with their own views of network liveness,
-and generate a signed description (a <em>directory</em>) of the entire
-network state. Client software is
-pre-loaded with a list of the directory servers and their keys,
-to bootstrap each client's view of the network.
-
-<div class="p"><!----></div>
-When a directory server receives a signed statement for an OR, it
-checks whether the OR's identity key is recognized. Directory
-servers do not advertise unrecognized ORs &mdash; if they did,
-an adversary could take over the network by creating many
-servers&nbsp;[<a href="#sybil" name="CITEsybil">22</a>]. Instead, new nodes must be approved by the
-directory
-server administrator before they are included. Mechanisms for automated
-node approval are an area of active research, and are discussed more
-in Section&nbsp;<a href="#sec:maintaining-anonymity">9</a>.
-
-<div class="p"><!----></div>
-Of course, a variety of attacks remain. An adversary who controls
-a directory server can track clients by providing them different
-information &mdash; perhaps by listing only nodes under its control, or by
-informing only certain clients about a given node. Even an external
-adversary can exploit differences in client knowledge: clients who use
-a node listed on one directory server but not the others are vulnerable.
-
-<div class="p"><!----></div>
-Thus these directory servers must be synchronized and redundant, so
-that they can agree on a common directory. Clients should only trust
-this directory if it is signed by a threshold of the directory
-servers.
-
-<div class="p"><!----></div>
-The directory servers in Tor are modeled after those in
-Mixminion&nbsp;[<a href="#minion-design" name="CITEminion-design">15</a>], but our situation is easier. First,
-we make the
-simplifying assumption that all participants agree on the set of
-directory servers. Second, while Mixminion needs to predict node
-behavior, Tor only needs a threshold consensus of the current
-state of the network. Third, we assume that we can fall back to the
-human administrators to discover and resolve problems when a consensus
-directory cannot be reached. Since there are relatively few directory
-servers (currently 3, but we expect as many as 9 as the network scales),
-we can afford operations like broadcast to simplify the consensus-building
-protocol.
-
-<div class="p"><!----></div>
-To avoid attacks where a router connects to all the directory servers
-but refuses to relay traffic from other routers, the directory servers
-must also build circuits and use them to anonymously test router
-reliability&nbsp;[<a href="#mix-acc" name="CITEmix-acc">18</a>]. Unfortunately, this defense is not yet
-designed or
-implemented.
-
-<div class="p"><!----></div>
-Using directory servers is simpler and more flexible than flooding.
-Flooding is expensive, and complicates the analysis when we
-start experimenting with non-clique network topologies. Signed
-directories can be cached by other
-onion routers,
-so directory servers are not a performance
-bottleneck when we have many users, and do not aid traffic analysis by
-forcing clients to announce their existence to any
-central point.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc7">
-<a name="sec:attacks">
-7</a>&nbsp;&nbsp;Attacks and Defenses</h2>
-</a>
-
-<div class="p"><!----></div>
-Below we summarize a variety of attacks, and discuss how well our
-design withstands them.<br />
-
-<div class="p"><!----></div>
-<font size="+1"><b>Passive attacks</b></font><br />
-<em>Observing user traffic patterns.</em> Observing a user's connection
-will not reveal her destination or data, but it will
-reveal traffic patterns (both sent and received). Profiling via user
-connection patterns requires further processing, because multiple
-application streams may be operating simultaneously or in series over
-a single circuit.
-
-<div class="p"><!----></div>
-<em>Observing user content.</em> While content at the user end is encrypted,
-connections to responders may not be (indeed, the responding website
-itself may be hostile). While filtering content is not a primary goal
-of Onion Routing, Tor can directly use Privoxy and related
-filtering services to anonymize application data streams.
-
-<div class="p"><!----></div>
-<em>Option distinguishability.</em> We allow clients to choose
-configuration options. For example, clients concerned about request
-linkability should rotate circuits more often than those concerned
-about traceability. Allowing choice may attract users with different
-needs; but clients who are
-in the minority may lose more anonymity by appearing distinct than they
-gain by optimizing their behavior&nbsp;[<a href="#econymics" name="CITEeconymics">1</a>].
-
-<div class="p"><!----></div>
-<em>End-to-end timing correlation.</em> Tor only minimally hides
-such correlations. An attacker watching patterns of
-traffic at the initiator and the responder will be
-able to confirm the correspondence with high probability. The
-greatest protection currently available against such confirmation is to hide
-the connection between the onion proxy and the first Tor node,
-by running the OP on the Tor node or behind a firewall. This approach
-requires an observer to separate traffic originating at the onion
-router from traffic passing through it: a global observer can do this,
-but it might be beyond a limited observer's capabilities.
-
-<div class="p"><!----></div>
-<em>End-to-end size correlation.</em> Simple packet counting
-will also be effective in confirming
-endpoints of a stream. However, even without padding, we may have some
-limited protection: the leaky pipe topology means different numbers
-of packets may enter one end of a circuit than exit at the other.
-
-<div class="p"><!----></div>
-<em>Website fingerprinting.</em> All the effective passive
-attacks above are traffic confirmation attacks,
-which puts them outside our design goals. There is also
-a passive traffic analysis attack that is potentially effective.
-Rather than searching exit connections for timing and volume
-correlations, the adversary may build up a database of
-"fingerprints" containing file sizes and access patterns for
-targeted websites. He can later confirm a user's connection to a given
-site simply by consulting the database. This attack has
-been shown to be effective against SafeWeb&nbsp;[<a href="#hintz-pet02" name="CITEhintz-pet02">29</a>].
-It may be less effective against Tor, since
-streams are multiplexed within the same circuit, and
-fingerprinting will be limited to
-the granularity of cells (currently 512 bytes). Additional
-defenses could include
-larger cell sizes, padding schemes to group websites
-into large sets, and link
-padding or long-range dummies.<a href="#tthFtNtAAE" name="tthFrefAAE"><sup>4</sup></a><br />
-
-<div class="p"><!----></div>
-<font size="+1"><b>Active attacks</b></font><br />
-<em>Compromise keys.</em> An attacker who learns the TLS session key can
-see control cells and encrypted relay cells on every circuit on that
-connection; learning a circuit
-session key lets him unwrap one layer of the encryption. An attacker
-who learns an OR's TLS private key can impersonate that OR for the TLS
-key's lifetime, but he must
-also learn the onion key to decrypt <em>create</em> cells (and because of
-perfect forward secrecy, he cannot hijack already established circuits
-without also compromising their session keys). Periodic key rotation
-limits the window of opportunity for these attacks. On the other hand,
-an attacker who learns a node's identity key can replace that node
-indefinitely by sending new forged descriptors to the directory servers.
-
-<div class="p"><!----></div>
-<em>Iterated compromise.</em> A roving adversary who can
-compromise ORs (by system intrusion, legal coercion, or extralegal
-coercion) could march down the circuit compromising the
-nodes until he reaches the end. Unless the adversary can complete
-this attack within the lifetime of the circuit, however, the ORs
-will have discarded the necessary information before the attack can
-be completed. (Thanks to the perfect forward secrecy of session
-keys, the attacker cannot force nodes to decrypt recorded
-traffic once the circuits have been closed.) Additionally, building
-circuits that cross jurisdictions can make legal coercion
-harder &mdash; this phenomenon is commonly called "jurisdictional
-arbitrage." The Java Anon Proxy project recently experienced the
-need for this approach, when
-a German court forced them to add a backdoor to
-their nodes&nbsp;[<a href="#jap-backdoor" name="CITEjap-backdoor">51</a>].
-
-<div class="p"><!----></div>
-<em>Run a recipient.</em> An adversary running a webserver
-trivially learns the timing patterns of users connecting to it, and
-can introduce arbitrary patterns in its responses.
-End-to-end attacks become easier: if the adversary can induce
-users to connect to his webserver (perhaps by advertising
-content targeted to those users), he now holds one end of their
-connection. There is also a danger that application
-protocols and associated programs can be induced to reveal information
-about the initiator. Tor depends on Privoxy and similar protocol cleaners
-to solve this latter problem.
-
-<div class="p"><!----></div>
-<em>Run an onion proxy.</em> It is expected that end users will
-nearly always run their own local onion proxy. However, in some
-settings, it may be necessary for the proxy to run
-remotely &mdash; typically, in institutions that want
-to monitor the activity of those connecting to the proxy.
-Compromising an onion proxy compromises all future connections
-through it.
-
-<div class="p"><!----></div>
-<em>DoS non-observed nodes.</em> An observer who can only watch some
-of the Tor network can increase the value of this traffic
-by attacking non-observed nodes to shut them down, reduce
-their reliability, or persuade users that they are not trustworthy.
-The best defense here is robustness.
-
-<div class="p"><!----></div>
-<em>Run a hostile OR.</em> In addition to being a local observer,
-an isolated hostile node can create circuits through itself, or alter
-traffic patterns to affect traffic at other nodes. Nonetheless, a hostile
-node must be immediately adjacent to both endpoints to compromise the
-anonymity of a circuit. If an adversary can
-run multiple ORs, and can persuade the directory servers
-that those ORs are trustworthy and independent, then occasionally
-some user will choose one of those ORs for the start and another
-as the end of a circuit. If an adversary
-controls m &gt; 1 of N nodes, he can correlate at most
-([m/N])<sup>2</sup> of the traffic &mdash; although an
-adversary
-could still attract a disproportionately large amount of traffic
-by running an OR with a permissive exit policy, or by
-degrading the reliability of other routers.
-
-<div class="p"><!----></div>
-<em>Introduce timing into messages.</em> This is simply a stronger
-version of passive timing attacks already discussed earlier.
-
-<div class="p"><!----></div>
-<em>Tagging attacks.</em> A hostile node could "tag" a
-cell by altering it. If the
-stream were, for example, an unencrypted request to a Web site,
-the garbled content coming out at the appropriate time would confirm
-the association. However, integrity checks on cells prevent
-this attack.
-
-<div class="p"><!----></div>
-<em>Replace contents of unauthenticated protocols.</em> When
-relaying an unauthenticated protocol like HTTP, a hostile exit node
-can impersonate the target server. Clients
-should prefer protocols with end-to-end authentication.
-
-<div class="p"><!----></div>
-<em>Replay attacks.</em> Some anonymity protocols are vulnerable
-to replay attacks. Tor is not; replaying one side of a handshake
-will result in a different negotiated session key, and so the rest
-of the recorded session can't be used.
-
-<div class="p"><!----></div>
-<em>Smear attacks.</em> An attacker could use the Tor network for
-socially disapproved acts, to bring the
-network into disrepute and get its operators to shut it down.
-Exit policies reduce the possibilities for abuse, but
-ultimately the network requires volunteers who can tolerate
-some political heat.
-
-<div class="p"><!----></div>
-<em>Distribute hostile code.</em> An attacker could trick users
-into running subverted Tor software that did not, in fact, anonymize
-their connections &mdash; or worse, could trick ORs into running weakened
-software that provided users with less anonymity. We address this
-problem (but do not solve it completely) by signing all Tor releases
-with an official public key, and including an entry in the directory
-that lists which versions are currently believed to be secure. To
-prevent an attacker from subverting the official release itself
-(through threats, bribery, or insider attacks), we provide all
-releases in source code form, encourage source audits, and
-frequently warn our users never to trust any software (even from
-us) that comes without source.<br />
-
-<div class="p"><!----></div>
-<font size="+1"><b>Directory attacks</b></font><br />
-<em>Destroy directory servers.</em> If a few directory
-servers disappear, the others still decide on a valid
-directory. So long as any directory servers remain in operation,
-they will still broadcast their views of the network and generate a
-consensus directory. (If more than half are destroyed, this
-directory will not, however, have enough signatures for clients to
-use it automatically; human intervention will be necessary for
-clients to decide whether to trust the resulting directory.)
-
-<div class="p"><!----></div>
-<em>Subvert a directory server.</em> By taking over a directory server,
-an attacker can partially influence the final directory. Since ORs
-are included or excluded by majority vote, the corrupt directory can
-at worst cast a tie-breaking vote to decide whether to include
-marginal ORs. It remains to be seen how often such marginal cases
-occur in practice.
-
-<div class="p"><!----></div>
-<em>Subvert a majority of directory servers.</em> An adversary who controls
-more than half the directory servers can include as many compromised
-ORs in the final directory as he wishes. We must ensure that directory
-server operators are independent and attack-resistant.
-
-<div class="p"><!----></div>
-<em>Encourage directory server dissent.</em> The directory
-agreement protocol assumes that directory server operators agree on
-the set of directory servers. An adversary who can persuade some
-of the directory server operators to distrust one another could
-split the quorum into mutually hostile camps, thus partitioning
-users based on which directory they use. Tor does not address
-this attack.
-
-<div class="p"><!----></div>
-<em>Trick the directory servers into listing a hostile OR.</em>
-Our threat model explicitly assumes directory server operators will
-be able to filter out most hostile ORs.
-
-<div class="p"><!----></div>
-<em>Convince the directories that a malfunctioning OR is
-working.</em> In the current Tor implementation, directory servers
-assume that an OR is running correctly if they can start a TLS
-connection to it. A hostile OR could easily subvert this test by
-accepting TLS connections from ORs but ignoring all cells. Directory
-servers must actively test ORs by building circuits and streams as
-appropriate. The tradeoffs of a similar approach are discussed
-in&nbsp;[<a href="#mix-acc" name="CITEmix-acc">18</a>].<br />
-
-<div class="p"><!----></div>
-<font size="+1"><b>Attacks against rendezvous points</b></font><br />
-<em>Make many introduction requests.</em> An attacker could
-try to deny Bob service by flooding his introduction points with
-requests. Because the introduction points can block requests that
-lack authorization tokens, however, Bob can restrict the volume of
-requests he receives, or require a certain amount of computation for
-every request he receives.
-
-<div class="p"><!----></div>
-<em>Attack an introduction point.</em> An attacker could
-disrupt a location-hidden service by disabling its introduction
-points. But because a service's identity is attached to its public
-key, the service can simply re-advertise
-itself at a different introduction point. Advertisements can also be
-done secretly so that only high-priority clients know the address of
-Bob's introduction points or so that different clients know of different
-introduction points. This forces the attacker to disable all possible
-introduction points.
-
-<div class="p"><!----></div>
-<em>Compromise an introduction point.</em> An attacker who controls
-Bob's introduction point can flood Bob with
-introduction requests, or prevent valid introduction requests from
-reaching him. Bob can notice a flood, and close the circuit. To notice
-blocking of valid requests, however, he should periodically test the
-introduction point by sending rendezvous requests and making
-sure he receives them.
-
-<div class="p"><!----></div>
-<em>Compromise a rendezvous point.</em> A rendezvous
-point is no more sensitive than any other OR on
-a circuit, since all data passing through the rendezvous is encrypted
-with a session key shared by Alice and Bob.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc8">
-<a name="sec:in-the-wild">
-8</a>&nbsp;&nbsp;Early experiences: Tor in the Wild</h2>
-</a>
-
-<div class="p"><!----></div>
-As of mid-May 2004, the Tor network consists of 32 nodes
-(24 in the US, 8 in Europe), and more are joining each week as the code
-matures. (For comparison, the current remailer network
-has about 40 nodes.) Each node has at least a 768Kb/768Kb connection, and
-many have 10Mb. The number of users varies (and of course, it's hard to
-tell for sure), but we sometimes have several hundred users &mdash; administrators at
-several companies have begun sending their entire departments' web
-traffic through Tor, to block other divisions of
-their company from reading their traffic. Tor users have reported using
-the network for web browsing, FTP, IRC, AIM, Kazaa, SSH, and
-recipient-anonymous email via rendezvous points. One user has anonymously
-set up a Wiki as a hidden service, where other users anonymously publish
-the addresses of their hidden services.
-
-<div class="p"><!----></div>
-Each Tor node currently processes roughly 800,000 relay
-cells (a bit under half a gigabyte) per week. On average, about 80%
-of each 498-byte payload is full for cells going back to the client,
-whereas about 40% is full for cells coming from the client. (The difference
-arises because most of the network's traffic is web browsing.) Interactive
-traffic like SSH brings down the average a lot &mdash; once we have more
-experience, and assuming we can resolve the anonymity issues, we may
-partition traffic into two relay cell sizes: one to handle
-bulk traffic and one for interactive traffic.
-
-<div class="p"><!----></div>
-Based in part on our restrictive default exit policy (we
-reject SMTP requests) and our low profile, we have had no abuse
-issues since the network was deployed in October
-2003. Our slow growth rate gives us time to add features,
-resolve bugs, and get a feel for what users actually want from an
-anonymity system. Even though having more users would bolster our
-anonymity sets, we are not eager to attract the Kazaa or warez
-communities &mdash; we feel that we must build a reputation for privacy, human
-rights, research, and other socially laudable activities.
-
-<div class="p"><!----></div>
-As for performance, profiling shows that Tor spends almost
-all its CPU time in AES, which is fast. Current latency is attributable
-to two factors. First, network latency is critical: we are
-intentionally bouncing traffic around the world several times. Second,
-our end-to-end congestion control algorithm focuses on protecting
-volunteer servers from accidental DoS rather than on optimizing
-performance. To quantify these effects, we did some informal tests using a network of 4
-nodes on the same machine (a heavily loaded 1GHz Athlon). We downloaded a 60
-megabyte file from <tt>debian.org</tt> every 30 minutes for 54 hours (108 sample
-points). It arrived in about 300 seconds on average, compared to 210s for a
-direct download. We ran a similar test on the production Tor network,
-fetching the front page of <tt>cnn.com</tt> (55 kilobytes):
-while a direct
-download consistently took about 0.3s, the performance through Tor varied.
-Some downloads were as fast as 0.4s, with a median at 2.8s, and
-90% finishing within 5.3s. It seems that as the network expands, the chance
-of building a slow circuit (one that includes a slow or heavily loaded node
-or link) is increasing. On the other hand, as our users remain satisfied
-with this increased latency, we can address our performance incrementally as we
-proceed with development.
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-Although Tor's clique topology and full-visibility directories present
-scaling problems, we still expect the network to support a few hundred
-nodes and maybe 10,000 users before we're forced to become
-more distributed. With luck, the experience we gain running the current
-topology will help us choose among alternatives when the time comes.
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc9">
-<a name="sec:maintaining-anonymity">
-9</a>&nbsp;&nbsp;Open Questions in Low-latency Anonymity</h2>
-</a>
-
-<div class="p"><!----></div>
-In addition to the non-goals in
-Section&nbsp;<a href="#subsec:non-goals">3</a>, many questions must be solved
-before we can be confident of Tor's security.
-
-<div class="p"><!----></div>
-Many of these open issues are questions of balance. For example,
-how often should users rotate to fresh circuits? Frequent rotation
-is inefficient, expensive, and may lead to intersection attacks and
-predecessor attacks&nbsp;[<a href="#wright03" name="CITEwright03">54</a>], but infrequent rotation makes the
-user's traffic linkable. Besides opening fresh circuits, clients can
-also exit from the middle of the circuit,
-or truncate and re-extend the circuit. More analysis is
-needed to determine the proper tradeoff.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-How should we choose path lengths? If Alice always uses two hops,
-then both ORs can be certain that by colluding they will learn about
-Alice and Bob. In our current approach, Alice always chooses at least
-three nodes unrelated to herself and her destination.
-Should Alice choose a random path length (e.g.&nbsp;from a geometric
-distribution) to foil an attacker who
-uses timing to learn that he is the fifth hop and thus concludes that
-both Alice and the responder are running ORs?
-
-<div class="p"><!----></div>
-Throughout this paper, we have assumed that end-to-end traffic
-confirmation will immediately and automatically defeat a low-latency
-anonymity system. Even high-latency anonymity systems can be
-vulnerable to end-to-end traffic confirmation, if the traffic volumes
-are high enough, and if users' habits are sufficiently
-distinct&nbsp;[<a href="#statistical-disclosure" name="CITEstatistical-disclosure">14</a>,<a href="#limits-open" name="CITElimits-open">31</a>]. Can anything be
-done to
-make low-latency systems resist these attacks as well as high-latency
-systems? Tor already makes some effort to conceal the starts and ends of
-streams by wrapping long-range control commands in identical-looking
-relay cells. Link padding could frustrate passive observers who count
-packets; long-range padding could work against observers who own the
-first hop in a circuit. But more research remains to find an efficient
-and practical approach. Volunteers prefer not to run constant-bandwidth
-padding; but no convincing traffic shaping approach has been
-specified. Recent work on long-range padding&nbsp;[<a href="#defensive-dropping" name="CITEdefensive-dropping">33</a>]
-shows promise. One could also try to reduce correlation in packet timing
-by batching and re-ordering packets, but it is unclear whether this could
-improve anonymity without introducing so much latency as to render the
-network unusable.
-
-<div class="p"><!----></div>
-A cascade topology may better defend against traffic confirmation by
-aggregating users, and making padding and
-mixing more affordable. Does the hydra topology (many input nodes,
-few output nodes) work better against some adversaries? Are we going
-to get a hydra anyway because most nodes will be middleman nodes?
-
-<div class="p"><!----></div>
-Common wisdom suggests that Alice should run her own OR for best
-anonymity, because traffic coming from her node could plausibly have
-come from elsewhere. How much mixing does this approach need? Is it
-immediately beneficial because of real-world adversaries that can't
-observe Alice's router, but can run routers of their own?
-
-<div class="p"><!----></div>
-To scale to many users, and to prevent an attacker from observing the
-whole network, it may be necessary
-to support far more servers than Tor currently anticipates.
-This introduces several issues. First, if approval by a central set
-of directory servers is no longer feasible, what mechanism should be used
-to prevent adversaries from signing up many colluding servers? Second,
-if clients can no longer have a complete picture of the network,
-how can they perform discovery while preventing attackers from
-manipulating or exploiting gaps in their knowledge? Third, if there
-are too many servers for every server to constantly communicate with
-every other, which non-clique topology should the network use?
-(Restricted-route topologies promise comparable anonymity with better
-scalability&nbsp;[<a href="#danezis-pets03" name="CITEdanezis-pets03">13</a>], but whatever topology we choose, we
-need some way to keep attackers from manipulating their position within
-it&nbsp;[<a href="#casc-rep" name="CITEcasc-rep">21</a>].) Fourth, if no central authority is tracking
-server reliability, how do we stop unreliable servers from making
-the network unusable? Fifth, do clients receive so much anonymity
-from running their own ORs that we should expect them all to do
-so&nbsp;[<a href="#econymics" name="CITEeconymics">1</a>], or do we need another incentive structure to
-motivate them? Tarzan and MorphMix present possible solutions.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-When a Tor node goes down, all its circuits (and thus streams) must break.
-Will users abandon the system because of this brittleness? How well
-does the method in Section&nbsp;<a href="#subsec:dos">6.1</a> allow streams to survive
-node failure? If affected users rebuild circuits immediately, how much
-anonymity is lost? It seems the problem is even worse in a peer-to-peer
-environment &mdash; such systems don't yet provide an incentive for peers to
-stay connected when they're done retrieving content, so we would expect
-a higher churn rate.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
- <h2><a name="tth_sEc10">
-<a name="sec:conclusion">
-10</a>&nbsp;&nbsp;Future Directions</h2>
-</a>
-
-<div class="p"><!----></div>
-Tor brings together many innovations into a unified deployable system. The
-next immediate steps include:
-
-<div class="p"><!----></div>
-<em>Scalability:</em> Tor's emphasis on deployability and design simplicity
-has led us to adopt a clique topology, semi-centralized
-directories, and a full-network-visibility model for client
-knowledge. These properties will not scale past a few hundred servers.
-Section&nbsp;<a href="#sec:maintaining-anonymity">9</a> describes some promising
-approaches, but more deployment experience will be helpful in learning
-the relative importance of these bottlenecks.
-
-<div class="p"><!----></div>
-<em>Bandwidth classes:</em> This paper assumes that all ORs have
-good bandwidth and latency. We should instead adopt the MorphMix model,
-where nodes advertise their bandwidth level (DSL, T1, T3), and
-Alice avoids bottlenecks by choosing nodes that match or
-exceed her bandwidth. In this way DSL users can usefully join the Tor
-network.
-
-<div class="p"><!----></div>
-<em>Incentives:</em> Volunteers who run nodes are rewarded with publicity
-and possibly better anonymity&nbsp;[<a href="#econymics" name="CITEeconymics">1</a>]. More nodes means increased
-scalability, and more users can mean more anonymity. We need to continue
-examining the incentive structures for participating in Tor. Further,
-we need to explore more approaches to limiting abuse, and understand
-why most people don't bother using privacy systems.
-
-<div class="p"><!----></div>
-<em>Cover traffic:</em> Currently Tor omits cover traffic &mdash; its costs
-in performance and bandwidth are clear but its security benefits are
-not well understood. We must pursue more research on link-level cover
-traffic and long-range cover traffic to determine whether some simple padding
-method offers provable protection against our chosen adversary.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-<em>Caching at exit nodes:</em> Perhaps each exit node should run a
-caching web proxy&nbsp;[<a href="#shsm03" name="CITEshsm03">47</a>], to improve anonymity for cached pages
-(Alice's request never
-leaves the Tor network), to improve speed, and to reduce bandwidth cost.
-On the other hand, forward security is weakened because caches
-constitute a record of retrieved files. We must find the right
-balance between usability and security.
-
-<div class="p"><!----></div>
-<em>Better directory distribution:</em>
-Clients currently download a description of
-the entire network every 15 minutes. As the state grows larger
-and clients more numerous, we may need a solution in which
-clients receive incremental updates to directory state.
-More generally, we must find more
-scalable yet practical ways to distribute up-to-date snapshots of
-network status without introducing new attacks.
-
-<div class="p"><!----></div>
-<em>Further specification review:</em> Our public
-byte-level specification&nbsp;[<a href="#tor-spec" name="CITEtor-spec">20</a>] needs
-external review. We hope that as Tor
-is deployed, more people will examine its
-specification.
-
-<div class="p"><!----></div>
-<em>Multisystem interoperability:</em> We are currently working with the
-designer of MorphMix to unify the specification and implementation of
-the common elements of our two systems. So far, this seems
-to be relatively straightforward. Interoperability will allow testing
-and direct comparison of the two designs for trust and scalability.
-
-<div class="p"><!----></div>
-<em>Wider-scale deployment:</em> The original goal of Tor was to
-gain experience in deploying an anonymizing overlay network, and
-learn from having actual users. We are now at a point in design
-and development where we can start deploying a wider network. Once
-we have many actual users, we will doubtlessly be better
-able to evaluate some of our design decisions, including our
-robustness/latency tradeoffs, our performance tradeoffs (including
-cell size), our abuse-prevention mechanisms, and
-our overall usability.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<h2>Acknowledgments</h2>
- We thank Peter Palfrader, Geoff Goodell, Adam Shostack, Joseph Sokol-Margolis,
- John Bashinski, and Zack Brown
- for editing and comments;
- Matej Pfajfar, Andrei Serjantov, Marc Rennhard for design discussions;
- Bram Cohen for congestion control discussions;
- Adam Back for suggesting telescoping circuits; and
- Cathy Meadows for formal analysis of the <em>extend</em> protocol.
- This work has been supported by ONR and DARPA.
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-
-<div class="p"><!----></div>
-<h2>References</h2>
-
-<dl compact="compact">
-<font size="-1"></font> <dt><a href="#CITEeconymics" name="econymics">[1]</a></dt><dd>
-A.&nbsp;Acquisti, R.&nbsp;Dingledine, and P.&nbsp;Syverson.
- On the economics of anonymity.
- In R.&nbsp;N. Wright, editor, <em>Financial Cryptography</em>.
- Springer-Verlag, LNCS 2742, 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEeternity" name="eternity">[2]</a></dt><dd>
-R.&nbsp;Anderson.
- The eternity service.
- In <em>Pragocrypt '96</em>, 1996.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEanonymizer" name="anonymizer">[3]</a></dt><dd>
-The Anonymizer.
- <tt>&lt;http://anonymizer.com/&#62;.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEfreedom21-security" name="freedom21-security">[4]</a></dt><dd>
-A.&nbsp;Back, I.&nbsp;Goldberg, and A.&nbsp;Shostack.
- Freedom systems 2.1 security issues and analysis.
- White paper, Zero Knowledge Systems, Inc., May 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEback01" name="back01">[5]</a></dt><dd>
-A.&nbsp;Back, U.&nbsp;M&#246;ller, and A.&nbsp;Stiglic.
- Traffic analysis attacks and trade-offs in anonymity providing
- systems.
- In I.&nbsp;S. Moskowitz, editor, <em>Information Hiding (IH 2001)</em>, pages
- 245-257. Springer-Verlag, LNCS 2137, 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEeax" name="eax">[6]</a></dt><dd>
-M.&nbsp;Bellare, P.&nbsp;Rogaway, and D.&nbsp;Wagner.
- The EAX mode of operation: A two-pass authenticated-encryption
- scheme optimized for simplicity and efficiency.
- In <em>Fast Software Encryption 2004</em>, February 2004.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEweb-mix" name="web-mix">[7]</a></dt><dd>
-O.&nbsp;Berthold, H.&nbsp;Federrath, and S.&nbsp;K&#246;psell.
- Web MIXes: A system for anonymous and unobservable Internet
- access.
- In H.&nbsp;Federrath, editor, <em>Designing Privacy Enhancing
- Technologies: Workshop on Design Issue in Anonymity and Unobservability</em>.
- Springer-Verlag, LNCS 2009, 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEfreedom2-arch" name="freedom2-arch">[8]</a></dt><dd>
-P.&nbsp;Boucher, A.&nbsp;Shostack, and I.&nbsp;Goldberg.
- Freedom systems 2.0 architecture.
- White paper, Zero Knowledge Systems, Inc., December 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEcebolla" name="cebolla">[9]</a></dt><dd>
-Z.&nbsp;Brown.
- Cebolla: Pragmatic IP Anonymity.
- In <em>Ottawa Linux Symposium</em>, June 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEchaum-mix" name="chaum-mix">[10]</a></dt><dd>
-D.&nbsp;Chaum.
- Untraceable electronic mail, return addresses, and digital
- pseudo-nyms.
- <em>Communications of the ACM</em>, 4(2), February 1981.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEcfs:sosp01" name="cfs:sosp01">[11]</a></dt><dd>
-F.&nbsp;Dabek, M.&nbsp;F. Kaashoek, D.&nbsp;Karger, R.&nbsp;Morris, and I.&nbsp;Stoica.
- Wide-area cooperative storage with CFS.
- In <em>18th ACM Symposium on Operating Systems Principles
- (SOSP '01)</em>, Chateau Lake Louise, Banff, Canada, October 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEpipenet" name="pipenet">[12]</a></dt><dd>
-W.&nbsp;Dai.
- Pipenet 1.1.
- Usenet post, August 1996.
- <tt>&lt;http://www.eskimo.com/&nbsp;weidai/pipenet.txt&#62; First mentioned in a
- post to the cypherpunks list, Feb.&nbsp;1995.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEdanezis-pets03" name="danezis-pets03">[13]</a></dt><dd>
-G.&nbsp;Danezis.
- Mix-networks with restricted routes.
- In R.&nbsp;Dingledine, editor, <em>Privacy Enhancing Technologies (PET
- 2003)</em>. Springer-Verlag LNCS 2760, 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEstatistical-disclosure" name="statistical-disclosure">[14]</a></dt><dd>
-G.&nbsp;Danezis.
- Statistical disclosure attacks.
- In <em>Security and Privacy in the Age of Uncertainty (SEC2003)</em>,
- pages 421-426, Athens, May 2003. IFIP TC11, Kluwer.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEminion-design" name="minion-design">[15]</a></dt><dd>
-G.&nbsp;Danezis, R.&nbsp;Dingledine, and N.&nbsp;Mathewson.
- Mixminion: Design of a type III anonymous remailer protocol.
- In <em>2003 IEEE Symposium on Security and Privacy</em>, pages 2-15.
- IEEE CS, May 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEpuzzles-tls" name="puzzles-tls">[16]</a></dt><dd>
-D.&nbsp;Dean and A.&nbsp;Stubblefield.
- Using Client Puzzles to Protect TLS.
- In <em>Proceedings of the 10th USENIX Security Symposium</em>. USENIX,
- Aug. 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITETLS" name="TLS">[17]</a></dt><dd>
-T.&nbsp;Dierks and C.&nbsp;Allen.
- The TLS Protocol - Version 1.0.
- IETF RFC 2246, January 1999.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEmix-acc" name="mix-acc">[18]</a></dt><dd>
-R.&nbsp;Dingledine, M.&nbsp;J. Freedman, D.&nbsp;Hopwood, and D.&nbsp;Molnar.
- A Reputation System to Increase MIX-net Reliability.
- In I.&nbsp;S. Moskowitz, editor, <em>Information Hiding (IH 2001)</em>, pages
- 126-141. Springer-Verlag, LNCS 2137, 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEfreehaven-berk" name="freehaven-berk">[19]</a></dt><dd>
-R.&nbsp;Dingledine, M.&nbsp;J. Freedman, and D.&nbsp;Molnar.
- The free haven project: Distributed anonymous storage service.
- In H.&nbsp;Federrath, editor, <em>Designing Privacy Enhancing
- Technologies: Workshop on Design Issue in Anonymity and Unobservability</em>.
- Springer-Verlag, LNCS 2009, July 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEtor-spec" name="tor-spec">[20]</a></dt><dd>
-R.&nbsp;Dingledine and N.&nbsp;Mathewson.
- Tor protocol specifications.
- <tt>&lt;http://freehaven.net/tor/tor-spec.txt&#62;.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEcasc-rep" name="casc-rep">[21]</a></dt><dd>
-R.&nbsp;Dingledine and P.&nbsp;Syverson.
- Reliable MIX Cascade Networks through Reputation.
- In M.&nbsp;Blaze, editor, <em>Financial Cryptography</em>. Springer-Verlag,
- LNCS 2357, 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEsybil" name="sybil">[22]</a></dt><dd>
-J.&nbsp;Douceur.
- The Sybil Attack.
- In <em>Proceedings of the 1st International Peer To Peer Systems
- Workshop (IPTPS)</em>, Mar. 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEfederrath-ih96" name="federrath-ih96">[23]</a></dt><dd>
-H.&nbsp;Federrath, A.&nbsp;Jerichow, and A.&nbsp;Pfitzmann.
- MIXes in mobile communication systems: Location management with
- privacy.
- In R.&nbsp;Anderson, editor, <em>Information Hiding, First International
- Workshop</em>, pages 121-135. Springer-Verlag, LNCS 1174, May 1996.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEtarzan:ccs02" name="tarzan:ccs02">[24]</a></dt><dd>
-M.&nbsp;J. Freedman and R.&nbsp;Morris.
- Tarzan: A peer-to-peer anonymizing network layer.
- In <em>9th ACM Conference on Computer and Communications
- Security (CCS 2002)</em>, Washington, DC, November 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEherbivore" name="herbivore">[25]</a></dt><dd>
-S.&nbsp;Goel, M.&nbsp;Robson, M.&nbsp;Polte, and E.&nbsp;G. Sirer.
- Herbivore: A scalable and efficient protocol for anonymous
- communication.
- Technical Report TR2003-1890, Cornell University Computing and
- Information Science, February 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEian-thesis" name="ian-thesis">[26]</a></dt><dd>
-I.&nbsp;Goldberg.
- <em>A Pseudonymous Communications Infrastructure for the Internet</em>.
- PhD thesis, UC Berkeley, Dec 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEor-ih96" name="or-ih96">[27]</a></dt><dd>
-D.&nbsp;M. Goldschlag, M.&nbsp;G. Reed, and P.&nbsp;F. Syverson.
- Hiding routing information.
- In R.&nbsp;Anderson, editor, <em>Information Hiding, First International
- Workshop</em>, pages 137-150. Springer-Verlag, LNCS 1174, May 1996.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEbabel" name="babel">[28]</a></dt><dd>
-C.&nbsp;G&#252;lc&#252; and G.&nbsp;Tsudik.
- Mixing E-mail with Babel.
- In <em>Network and Distributed Security Symposium (NDSS 96)</em>,
- pages 2-16. IEEE, February 1996.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEhintz-pet02" name="hintz-pet02">[29]</a></dt><dd>
-A.&nbsp;Hintz.
- Fingerprinting websites using traffic analysis.
- In R.&nbsp;Dingledine and P.&nbsp;Syverson, editors, <em>Privacy Enhancing
- Technologies (PET 2002)</em>, pages 171-178. Springer-Verlag, LNCS 2482, 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEjerichow-jsac98" name="jerichow-jsac98">[30]</a></dt><dd>
-A.&nbsp;Jerichow, J.&nbsp;M&#252;ller, A.&nbsp;Pfitzmann, B.&nbsp;Pfitzmann, and M.&nbsp;Waidner.
- Real-time mixes: A bandwidth-efficient anonymity protocol.
- <em>IEEE Journal on Selected Areas in Communications</em>,
- 16(4):495-509, May 1998.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITElimits-open" name="limits-open">[31]</a></dt><dd>
-D.&nbsp;Kesdogan, D.&nbsp;Agrawal, and S.&nbsp;Penz.
- Limits of anonymity in open environments.
- In F.&nbsp;Petitcolas, editor, <em>Information Hiding Workshop (IH
- 2002)</em>. Springer-Verlag, LNCS 2578, October 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEsocks4" name="socks4">[32]</a></dt><dd>
-D.&nbsp;Koblas and M.&nbsp;R. Koblas.
- SOCKS.
- In <em>UNIX Security III Symposium (1992 USENIX Security
- Symposium)</em>, pages 77-83. USENIX, 1992.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEdefensive-dropping" name="defensive-dropping">[33]</a></dt><dd>
-B.&nbsp;N. Levine, M.&nbsp;K. Reiter, C.&nbsp;Wang, and M.&nbsp;Wright.
- Timing analysis in low-latency mix-based systems.
- In A.&nbsp;Juels, editor, <em>Financial Cryptography</em>. Springer-Verlag,
- LNCS (forthcoming), 2004.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEhordes-jcs" name="hordes-jcs">[34]</a></dt><dd>
-B.&nbsp;N. Levine and C.&nbsp;Shields.
- Hordes: A multicast-based protocol for anonymity.
- <em>Journal of Computer Security</em>, 10(3):213-240, 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEmeadows96" name="meadows96">[35]</a></dt><dd>
-C.&nbsp;Meadows.
- The NRL protocol analyzer: An overview.
- <em>Journal of Logic Programming</em>, 26(2):113-131, 1996.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEmixmaster-spec" name="mixmaster-spec">[36]</a></dt><dd>
-U.&nbsp;M&#246;ller, L.&nbsp;Cottrell, P.&nbsp;Palfrader, and L.&nbsp;Sassaman.
- Mixmaster Protocol - Version 2.
- Draft, July 2003.
- <tt>&lt;http://www.abditum.com/mixmaster-spec.txt&#62;.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEdarkside" name="darkside">[37]</a></dt><dd>
-V.&nbsp;S. Pai, L.&nbsp;Wang, K.&nbsp;Park, R.&nbsp;Pang, and L.&nbsp;Peterson.
- The Dark Side of the Web: An Open Proxy's View.
- <tt>&lt;http://codeen.cs.princeton.edu/&#62;.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEisdn-mixes" name="isdn-mixes">[38]</a></dt><dd>
-A.&nbsp;Pfitzmann, B.&nbsp;Pfitzmann, and M.&nbsp;Waidner.
- ISDN-mixes: Untraceable communication with very small bandwidth
- overhead.
- In <em>GI/ITG Conference on Communication in Distributed Systems</em>,
- pages 451-463, February 1991.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEprivoxy" name="privoxy">[39]</a></dt><dd>
-Privoxy.
- <tt>&lt;http://www.privoxy.org/&#62;.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEreed-protocols97" name="reed-protocols97">[40]</a></dt><dd>
-M.&nbsp;G. Reed, P.&nbsp;F. Syverson, and D.&nbsp;M. Goldschlag.
- Protocols using anonymous connections: Mobile applications.
- In B.&nbsp;Christianson, B.&nbsp;Crispo, M.&nbsp;Lomas, and M.&nbsp;Roe, editors, <em>
- Security Protocols: 5th International Workshop</em>, pages 13-23.
- Springer-Verlag, LNCS 1361, April 1997.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEor-jsac98" name="or-jsac98">[41]</a></dt><dd>
-M.&nbsp;G. Reed, P.&nbsp;F. Syverson, and D.&nbsp;M. Goldschlag.
- Anonymous connections and onion routing.
- <em>IEEE Journal on Selected Areas in Communications</em>,
- 16(4):482-494, May 1998.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEcrowds-tissec" name="crowds-tissec">[42]</a></dt><dd>
-M.&nbsp;K. Reiter and A.&nbsp;D. Rubin.
- Crowds: Anonymity for web transactions.
- <em>ACM TISSEC</em>, 1(1):66-92, June 1998.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEmorphmix:fc04" name="morphmix:fc04">[43]</a></dt><dd>
-M.&nbsp;Rennhard and B.&nbsp;Plattner.
- Practical anonymity for the masses with morphmix.
- In A.&nbsp;Juels, editor, <em>Financial Cryptography</em>. Springer-Verlag,
- LNCS (forthcoming), 2004.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEanonnet" name="anonnet">[44]</a></dt><dd>
-M.&nbsp;Rennhard, S.&nbsp;Rafaeli, L.&nbsp;Mathy, B.&nbsp;Plattner, and D.&nbsp;Hutchison.
- Analysis of an Anonymity Network for Web Browsing.
- In <em>IEEE 7th Intl. Workshop on Enterprise Security (WET ICE
- 2002)</em>, Pittsburgh, USA, June 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITESS03" name="SS03">[45]</a></dt><dd>
-A.&nbsp;Serjantov and P.&nbsp;Sewell.
- Passive attack analysis for connection-based anonymity systems.
- In <em>Computer Security - ESORICS 2003</em>. Springer-Verlag, LNCS
- 2808, October 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEp5" name="p5">[46]</a></dt><dd>
-R.&nbsp;Sherwood, B.&nbsp;Bhattacharjee, and A.&nbsp;Srinivasan.
- p<sup>5</sup>: A protocol for scalable anonymous communication.
- In <em>IEEE Symposium on Security and Privacy</em>, pages 58-70. IEEE
- CS, 2002.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEshsm03" name="shsm03">[47]</a></dt><dd>
-A.&nbsp;Shubina and S.&nbsp;Smith.
- Using caching for browsing anonymity.
- <em>ACM SIGEcom Exchanges</em>, 4(2), Sept 2003.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEor-discex00" name="or-discex00">[48]</a></dt><dd>
-P.&nbsp;Syverson, M.&nbsp;Reed, and D.&nbsp;Goldschlag.
- Onion Routing access configurations.
- In <em>DARPA Information Survivability Conference and Exposition
- (DISCEX 2000)</em>, volume&nbsp;1, pages 34-40. IEEE CS Press, 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEor-pet00" name="or-pet00">[49]</a></dt><dd>
-P.&nbsp;Syverson, G.&nbsp;Tsudik, M.&nbsp;Reed, and C.&nbsp;Landwehr.
- Towards an Analysis of Onion Routing Security.
- In H.&nbsp;Federrath, editor, <em>Designing Privacy Enhancing
- Technologies: Workshop on Design Issue in Anonymity and Unobservability</em>,
- pages 96-114. Springer-Verlag, LNCS 2009, July 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEtannenbaum96" name="tannenbaum96">[50]</a></dt><dd>
-A.&nbsp;Tannenbaum.
- Computer networks, 1996.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEjap-backdoor" name="jap-backdoor">[51]</a></dt><dd>
-The AN.ON Project.
- German police proceeds against anonymity service.
- Press release, September 2003.
-
- <tt>&lt;http://www.datenschutzzentrum.de/material/themen/presse/anon-bka_e.htm&#62;.
-
-<div class="p"><!----></div>
-</tt></dd>
- <dt><a href="#CITEtangler" name="tangler">[52]</a></dt><dd>
-M.&nbsp;Waldman and D.&nbsp;Mazi&#232;res.
- Tangler: A censorship-resistant publishing system based on document
- entanglements.
- In <em>8<sup>th</sup> ACM Conference on Computer and Communications
- Security (CCS-8)</em>, pages 86-135. ACM Press, 2001.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEpublius" name="publius">[53]</a></dt><dd>
-M.&nbsp;Waldman, A.&nbsp;Rubin, and L.&nbsp;Cranor.
- Publius: A robust, tamper-evident, censorship-resistant and
- source-anonymous web publishing system.
- In <em>Proc. 9th USENIX Security Symposium</em>, pages 59-72, August
- 2000.
-
-<div class="p"><!----></div>
-</dd>
- <dt><a href="#CITEwright03" name="wright03">[54]</a></dt><dd>
-M.&nbsp;Wright, M.&nbsp;Adler, B.&nbsp;N. Levine, and C.&nbsp;Shields.
- Defending anonymous communication against passive logging attacks.
- In <em>IEEE Symposium on Security and Privacy</em>, pages 28-41. IEEE
- CS, May 2003.</dd>
-</dl>
-
-
-<div class="p"><!----></div>
-<hr /><h3>Footnotes:</h3>
-
-<div class="p"><!----></div>
-<a name="tthFtNtAAB"></a><a href="#tthFrefAAB"><sup>1</sup></a>Actually, the negotiated key is used to derive two
- symmetric keys: one for each direction.
-<div class="p"><!----></div>
-<a name="tthFtNtAAC"></a><a href="#tthFrefAAC"><sup>2</sup></a>
- With 48 bits of digest per cell, the probability of an accidental
-collision is far lower than the chance of hardware failure.
-<div class="p"><!----></div>
-<a name="tthFtNtAAD"></a><a href="#tthFrefAAD"><sup>3</sup></a>
-Rather than rely on an external infrastructure, the Onion Routing network
-can run the lookup service itself. Our current implementation provides a
-simple lookup system on the
-directory servers.
-<div class="p"><!----></div>
-<a name="tthFtNtAAE"></a><a href="#tthFrefAAE"><sup>4</sup></a>Note that this fingerprinting
-attack should not be confused with the much more complicated latency
-attacks of&nbsp;[<a href="#back01" name="CITEback01">5</a>], which require a fingerprint of the latencies
-of all circuits through the network, combined with those from the
-network edges to the target user and the responder website.
-<br /><br /><hr /><small>File translated from
-T<sub><font size="-1">E</font></sub>X
-by <a href="http://hutchinson.belmont.ma.us/tth/">
-T<sub><font size="-1">T</font></sub>H</a>,
-version 3.59.<br />On 18 May 2004, 10:45.</small>
-</body></html>
-
diff --git a/doc/design-paper/tor-design.pdf b/doc/design-paper/tor-design.pdf
deleted file mode 100644
index 76a2265153..0000000000
--- a/doc/design-paper/tor-design.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/design-paper/tor-design.tex b/doc/design-paper/tor-design.tex
deleted file mode 100644
index dff1b4068b..0000000000
--- a/doc/design-paper/tor-design.tex
+++ /dev/null
@@ -1,1988 +0,0 @@
-\documentclass[twocolumn]{article}
-\usepackage{usenix}
-
-%\documentclass[times,10pt,twocolumn]{article}
-%\usepackage{latex8}
-%\usepackage{times}
-\usepackage{url}
-\usepackage{graphics}
-\usepackage{amsmath}
-\usepackage{epsfig}
-
-\pagestyle{empty}
-
-\renewcommand\url{\begingroup \def\UrlLeft{<}\def\UrlRight{>}\urlstyle{tt}\Url}
-\newcommand\emailaddr{\begingroup \def\UrlLeft{<}\def\UrlRight{>}\urlstyle{tt}\Url}
-
-\newcommand{\workingnote}[1]{} % The version that hides the note.
-%\newcommand{\workingnote}[1]{(**#1)} % The version that makes the note visible.
-
-% If an URL ends up with '%'s in it, that's because the line *in the .bib/.tex
-% file* is too long, so break it there (it doesn't matter if the next line is
-% indented with spaces). -DH
-
-%\newif\ifpdf
-%\ifx\pdfoutput\undefined
-% \pdffalse
-%\else
-% \pdfoutput=1
-% \pdftrue
-%\fi
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-
-% Cut down on whitespace above and below figures displayed at head/foot of
-% page.
-\setlength{\textfloatsep}{3mm}
-% Cut down on whitespace above and below figures displayed in middle of page
-\setlength{\intextsep}{3mm}
-
-\begin{document}
-
-%% Use dvipdfm instead. --DH
-%\ifpdf
-% \pdfcompresslevel=9
-% \pdfpagewidth=\the\paperwidth
-% \pdfpageheight=\the\paperheight
-%\fi
-
-\title{Tor: The Second-Generation Onion Router} %\\DRAFT VERSION}
-% Putting the 'Private' back in 'Virtual Private Network'
-
-\author{Roger Dingledine \\ The Free Haven Project \\ arma@freehaven.net \and
-Nick Mathewson \\ The Free Haven Project \\ nickm@freehaven.net \and
-Paul Syverson \\ Naval Research Lab \\ syverson@itd.nrl.navy.mil}
-
-\maketitle
-\thispagestyle{empty}
-
-\begin{abstract}
-We present Tor, a circuit-based low-latency anonymous communication
-service. This second-generation Onion Routing system addresses limitations
-in the original design by adding perfect forward secrecy, congestion
-control, directory servers, integrity checking, configurable exit policies,
-and a practical design for location-hidden services via rendezvous
-points. Tor works on the real-world
-Internet, requires no special privileges or kernel modifications, requires
-little synchronization or coordination between nodes, and provides a
-reasonable tradeoff between anonymity, usability, and efficiency.
-We briefly describe our experiences with an international network of
-more than 30 nodes. % that has been running for several months.
-We close with a list of open problems in anonymous communication.
-\end{abstract}
-
-%\begin{center}
-%\textbf{Keywords:} anonymity, peer-to-peer, remailer, nymserver, reply block
-%\end{center}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\section{Overview}
-\label{sec:intro}
-
-Onion Routing is a distributed overlay network designed to anonymize
-TCP-based applications like web browsing, secure shell,
-and instant messaging. Clients choose a path through the network and
-build a \emph{circuit}, in which each node (or ``onion router'' or ``OR'')
-in the path knows its predecessor and successor, but no other nodes in
-the circuit. Traffic flows down the circuit in fixed-size
-\emph{cells}, which are unwrapped by a symmetric key at each node
-(like the layers of an onion) and relayed downstream. The
-Onion Routing project published several design and analysis
-papers \cite{or-ih96,or-jsac98,or-discex00,or-pet00}. While a wide area Onion
-Routing network was deployed briefly, the only long-running
-public implementation was a fragile
-proof-of-concept that ran on a single machine. Even this simple deployment
-processed connections from over sixty thousand distinct IP addresses from
-all over the world at a rate of about fifty thousand per day.
-But many critical design and deployment issues were never
-resolved, and the design has not been updated in years. Here
-we describe Tor, a protocol for asynchronous, loosely federated onion
-routers that provides the following improvements over the old Onion
-Routing design:
-
-\textbf{Perfect forward secrecy:} In the original Onion Routing design,
-a single hostile node could record traffic and
-later compromise successive nodes in the circuit and force them
-to decrypt it. Rather than using a single multiply encrypted data
-structure (an \emph{onion}) to lay each circuit,
-Tor now uses an incremental or \emph{telescoping} path-building design,
-where the initiator negotiates session keys with each successive hop in
-the circuit. Once these keys are deleted, subsequently compromised nodes
-cannot decrypt old traffic. As a side benefit, onion replay detection
-is no longer necessary, and the process of building circuits is more
-reliable, since the initiator knows when a hop fails and can then try
-extending to a new node.
-
-\textbf{Separation of ``protocol cleaning'' from anonymity:}
-Onion Routing originally required a separate ``application
-proxy'' for each supported application protocol---most of which were
-never written, so many applications were never supported. Tor uses the
-standard and near-ubiquitous SOCKS~\cite{socks4} proxy interface, allowing
-us to support most TCP-based programs without modification. Tor now
-relies on the filtering features of privacy-enhancing
-application-level proxies such as Privoxy~\cite{privoxy}, without trying
-to duplicate those features itself.
-
-\textbf{No mixing, padding, or traffic shaping (yet):} Onion
-Routing originally called for batching and reordering cells as they arrived,
-assumed padding between ORs, and in
-later designs added padding between onion proxies (users) and
-ORs~\cite{or-ih96,or-jsac98}. Tradeoffs between padding protection
-and cost were discussed, and \emph{traffic shaping} algorithms were
-theorized~\cite{or-pet00} to provide good security without expensive
-padding, but no concrete padding scheme was suggested.
-Recent research~\cite{econymics}
-and deployment experience~\cite{freedom21-security} suggest that this
-level of resource use is not practical or economical; and even full
-link padding is still vulnerable~\cite{defensive-dropping}. Thus,
-until we have a proven and convenient design for traffic shaping or
-low-latency mixing that improves anonymity against a realistic
-adversary, we leave these strategies out.
-
-\textbf{Many TCP streams can share one circuit:} Onion Routing originally
-built a separate circuit for each
-application-level request, but this required
-multiple public key operations for every request, and also presented
-a threat to anonymity from building so many circuits; see
-Section~\ref{sec:maintaining-anonymity}. Tor multiplexes multiple TCP
-streams along each circuit to improve efficiency and anonymity.
-
-\textbf{Leaky-pipe circuit topology:} Through in-band signaling
-within the circuit, Tor initiators can direct traffic to nodes partway
-down the circuit. This novel approach
-allows traffic to exit the circuit from the middle---possibly
-frustrating traffic shape and volume attacks based on observing the end
-of the circuit. (It also allows for long-range padding if
-future research shows this to be worthwhile.)
-
-\textbf{Congestion control:} Earlier anonymity designs do not
-address traffic bottlenecks. Unfortunately, typical approaches to
-load balancing and flow control in overlay networks involve inter-node
-control communication and global views of traffic. Tor's decentralized
-congestion control uses end-to-end acks to maintain anonymity
-while allowing nodes at the edges of the network to detect congestion
-or flooding and send less data until the congestion subsides.
-
-\textbf{Directory servers:} The earlier Onion Routing design
-planned to flood state information through the network---an approach
-that can be unreliable and complex. % open to partitioning attacks.
-Tor takes a simplified view toward distributing this
-information. Certain more trusted nodes act as \emph{directory
-servers}: they provide signed directories describing known
-routers and their current state. Users periodically download them
-via HTTP.
-
-\textbf{Variable exit policies:} Tor provides a consistent mechanism
-for each node to advertise a policy describing the hosts
-and ports to which it will connect. These exit policies are critical
-in a volunteer-based distributed infrastructure, because each operator
-is comfortable with allowing different types of traffic to exit
-from his node.
-
-\textbf{End-to-end integrity checking:} The original Onion Routing
-design did no integrity checking on data. Any node on the
-circuit could change the contents of data cells as they passed by---for
-example, to alter a connection request so it would connect
-to a different webserver, or to `tag' encrypted traffic and look for
-corresponding corrupted traffic at the network edges~\cite{minion-design}.
-Tor hampers these attacks by verifying data integrity before it leaves
-the network.
-
-%\textbf{Improved robustness to failed nodes:} A failed node
-%in the old design meant that circuit building failed, but thanks to
-%Tor's step-by-step circuit building, users notice failed nodes
-%while building circuits and route around them. Additionally, liveness
-%information from directories allows users to avoid unreliable nodes in
-%the first place.
-%% Can't really claim this, now that we've found so many variants of
-%% attack on partial-circuit-building. -RD
-
-\textbf{Rendezvous points and hidden services:}
-Tor provides an integrated mechanism for responder anonymity via
-location-protected servers. Previous Onion Routing designs included
-long-lived ``reply onions'' that could be used to build circuits
-to a hidden server, but these reply onions did not provide forward
-security, and became useless if any node in the path went down
-or rotated its keys. In Tor, clients negotiate {\it rendezvous points}
-to connect with hidden servers; reply onions are no longer required.
-
-Unlike Freedom~\cite{freedom2-arch}, Tor does not require OS kernel
-patches or network stack support. This prevents us from anonymizing
-non-TCP protocols, but has greatly helped our portability and
-deployability.
-
-%Unlike Freedom~\cite{freedom2-arch}, Tor only anonymizes
-%TCP-based protocols---not requiring patches (or built-in support) in an
-%operating system's network stack has been valuable to Tor's
-%portability and deployability.
-
-We have implemented all of the above features, including rendezvous
-points. Our source code is
-available under a free license, and Tor
-%, as far as we know, is unencumbered by patents.
-is not covered by the patent that affected distribution and use of
-earlier versions of Onion Routing.
-We have deployed a wide-area alpha network
-to test the design, to get more experience with usability
-and users, and to provide a research platform for experimentation.
-As of this writing, the network stands at 32 nodes %in thirteen
-%distinct administrative domains
-spread over two continents.
-
-We review previous work in Section~\ref{sec:related-work}, describe
-our goals and assumptions in Section~\ref{sec:assumptions},
-and then address the above list of improvements in
-Sections~\ref{sec:design},~\ref{sec:rendezvous}, and~\ref{sec:other-design}.
-We summarize
-in Section~\ref{sec:attacks} how our design stands up to
-known attacks, and talk about our early deployment experiences in
-Section~\ref{sec:in-the-wild}. We conclude with a list of open problems in
-Section~\ref{sec:maintaining-anonymity} and future work for the Onion
-Routing project in Section~\ref{sec:conclusion}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\section{Related work}
-\label{sec:related-work}
-
-Modern anonymity systems date to Chaum's {\bf Mix-Net}
-design~\cite{chaum-mix}. Chaum
-proposed hiding the correspondence between sender and recipient by
-wrapping messages in layers of public-key cryptography, and relaying them
-through a path composed of ``mixes.'' Each mix in turn
-decrypts, delays, and re-orders messages before relaying them
-onward.
-%toward their destinations.
-
-Subsequent relay-based anonymity designs have diverged in two
-main directions. Systems like {\bf Babel}~\cite{babel},
-{\bf Mixmaster}~\cite{mixmaster-spec},
-and {\bf Mixminion}~\cite{minion-design} have tried
-to maximize anonymity at the cost of introducing comparatively large and
-variable latencies. Because of this decision, these \emph{high-latency}
-networks resist strong global adversaries,
-but introduce too much lag for interactive tasks like web browsing,
-Internet chat, or SSH connections.
-
-Tor belongs to the second category: \emph{low-latency} designs that
-try to anonymize interactive network traffic. These systems handle
-a variety of bidirectional protocols. They also provide more convenient
-mail delivery than the high-latency anonymous email
-networks, because the remote mail server provides explicit and timely
-delivery confirmation. But because these designs typically
-involve many packets that must be delivered quickly, it is
-difficult for them to prevent an attacker who can eavesdrop both ends of the
-communication from correlating the timing and volume
-of traffic entering the anonymity network with traffic leaving it~\cite{SS03}.
-These
-protocols are similarly vulnerable to an active adversary who introduces
-timing patterns into traffic entering the network and looks
-for correlated patterns among exiting traffic.
-Although some work has been done to frustrate these attacks, most designs
-protect primarily against traffic analysis rather than traffic
-confirmation (see Section~\ref{subsec:threat-model}).
-
-The simplest low-latency designs are single-hop proxies such as the
-{\bf Anonymizer}~\cite{anonymizer}: a single trusted server strips the
-data's origin before relaying it. These designs are easy to
-analyze, but users must trust the anonymizing proxy.
-Concentrating the traffic to this single point increases the anonymity set
-(the people a given user is hiding among), but it is vulnerable if the
-adversary can observe all traffic entering and leaving the proxy.
-
-More complex are distributed-trust, circuit-based anonymizing systems.
-In these designs, a user establishes one or more medium-term bidirectional
-end-to-end circuits, and tunnels data in fixed-size cells.
-Establishing circuits is computationally expensive and typically
-requires public-key
-cryptography, whereas relaying cells is comparatively inexpensive and
-typically requires only symmetric encryption.
-Because a circuit crosses several servers, and each server only knows
-the adjacent servers in the circuit, no single server can link a
-user to her communication partners.
-
-The {\bf Java Anon Proxy} (also known as JAP or Web MIXes) uses fixed shared
-routes known as \emph{cascades}. As with a single-hop proxy, this
-approach aggregates users into larger anonymity sets, but again an
-attacker only needs to observe both ends of the cascade to bridge all
-the system's traffic. The Java Anon Proxy's design
-calls for padding between end users and the head of the
-cascade~\cite{web-mix}. However, it is not demonstrated whether the current
-implementation's padding policy improves anonymity.
-
-{\bf PipeNet}~\cite{back01, pipenet}, another low-latency design proposed
-around the same time as Onion Routing, gave
-stronger anonymity but allowed a single user to shut
-down the network by not sending. Systems like {\bf ISDN
-mixes}~\cite{isdn-mixes} were designed for other environments with
-different assumptions.
-%XXX please can we fix this sentence to something less demeaning
-
-In P2P designs like {\bf Tarzan}~\cite{tarzan:ccs02} and
-{\bf MorphMix}~\cite{morphmix:fc04}, all participants both generate
-traffic and relay traffic for others. These systems aim to conceal
-whether a given peer originated a request
-or just relayed it from another peer. While Tarzan and MorphMix use
-layered encryption as above, {\bf Crowds}~\cite{crowds-tissec} simply assumes
-an adversary who cannot observe the initiator: it uses no public-key
-encryption, so any node on a circuit can read users' traffic.
-
-{\bf Hordes}~\cite{hordes-jcs} is based on Crowds but also uses multicast
-responses to hide the initiator. {\bf Herbivore}~\cite{herbivore} and
-$\mbox{\bf P}^{\mathbf 5}$~\cite{p5} go even further, requiring broadcast.
-These systems are designed primarily for communication among peers,
-although Herbivore users can make external connections by
-requesting a peer to serve as a proxy.
-
-Systems like {\bf Freedom} and the original Onion Routing build circuits
-all at once, using a layered ``onion'' of public-key encrypted messages,
-each layer of which provides session keys and the address of the
-next server in the circuit. Tor as described herein, Tarzan, MorphMix,
-{\bf Cebolla}~\cite{cebolla}, and Rennhard's {\bf Anonymity Network}~\cite{anonnet}
-build circuits
-in stages, extending them one hop at a time.
-Section~\ref{subsubsec:constructing-a-circuit} describes how this
-approach enables perfect forward secrecy.
-
-Circuit-based designs must choose which protocol layer
-to anonymize. They may intercept IP packets directly, and
-relay them whole (stripping the source address) along the
-circuit~\cite{freedom2-arch,tarzan:ccs02}. Like
-Tor, they may accept TCP streams and relay the data in those streams,
-ignoring the breakdown of that data into TCP
-segments~\cite{morphmix:fc04,anonnet}. Finally, like Crowds, they may accept
-application-level protocols such as HTTP and relay the application
-requests themselves.
-Making this protocol-layer decision requires a compromise between flexibility
-and anonymity. For example, a system that understands HTTP
-can strip
-identifying information from requests, can take advantage of caching
-to limit the number of requests that leave the network, and can batch
-or encode requests to minimize the number of connections.
-On the other hand, an IP-level anonymizer can handle nearly any protocol,
-even ones unforeseen by its designers (though these systems require
-kernel-level modifications to some operating systems, and so are more
-complex and less portable). TCP-level anonymity networks like Tor present
-a middle approach: they are application neutral (so long as the
-application supports, or can be tunneled across, TCP), but by treating
-application connections as data streams rather than raw TCP packets,
-they avoid the inefficiencies of tunneling TCP over
-TCP.
-
-Distributed-trust anonymizing systems need to prevent attackers from
-adding too many servers and thus compromising user paths.
-Tor relies on a small set of well-known directory servers, run by
-independent parties, to decide which nodes can
-join. Tarzan and MorphMix allow unknown users to run servers, and use
-a limited resource (like IP addresses) to prevent an attacker from
-controlling too much of the network. Crowds suggests requiring
-written, notarized requests from potential crowd members.
-
-Anonymous communication is essential for censorship-resistant
-systems like Eternity~\cite{eternity}, Free~Haven~\cite{freehaven-berk},
-Publius~\cite{publius}, and Tangler~\cite{tangler}. Tor's rendezvous
-points enable connections between mutually anonymous entities; they
-are a building block for location-hidden servers, which are needed by
-Eternity and Free~Haven.
-
-% didn't include rewebbers. No clear place to put them, so I'll leave
-% them out for now. -RD
-
-\section{Design goals and assumptions}
-\label{sec:assumptions}
-
-\noindent{\large\bf Goals}\\
-Like other low-latency anonymity designs, Tor seeks to frustrate
-attackers from linking communication partners, or from linking
-multiple communications to or from a single user. Within this
-main goal, however, several considerations have directed
-Tor's evolution.
-
-\textbf{Deployability:} The design must be deployed and used in the
-real world. Thus it
-must not be expensive to run (for example, by requiring more bandwidth
-than volunteers are willing to provide); must not place a heavy
-liability burden on operators (for example, by allowing attackers to
-implicate onion routers in illegal activities); and must not be
-difficult or expensive to implement (for example, by requiring kernel
-patches, or separate proxies for every protocol). We also cannot
-require non-anonymous parties (such as websites)
-to run our software. (Our rendezvous point design does not meet
-this goal for non-anonymous users talking to hidden servers,
-however; see Section~\ref{sec:rendezvous}.)
-
-\textbf{Usability:} A hard-to-use system has fewer users---and because
-anonymity systems hide users among users, a system with fewer users
-provides less anonymity. Usability is thus not only a convenience:
-it is a security requirement~\cite{econymics,back01}. Tor should
-therefore not
-require modifying familiar applications; should not introduce prohibitive
-delays;
-and should require as few configuration decisions
-as possible. Finally, Tor should be easily implementable on all common
-platforms; we cannot require users to change their operating system
-to be anonymous. (Tor currently runs on Win32, Linux,
-Solaris, BSD-style Unix, MacOS X, and probably others.)
-
-\textbf{Flexibility:} The protocol must be flexible and well-specified,
-so Tor can serve as a test-bed for future research.
-Many of the open problems in low-latency anonymity
-networks, such as generating dummy traffic or preventing Sybil
-attacks~\cite{sybil}, may be solvable independently from the issues
-solved by
-Tor. Hopefully future systems will not need to reinvent Tor's design.
-%(But note that while a flexible design benefits researchers,
-%there is a danger that differing choices of extensions will make users
-%distinguishable. Experiments should be run on a separate network.)
-
-\textbf{Simple design:} The protocol's design and security
-parameters must be well-understood. Additional features impose implementation
-and complexity costs; adding unproven techniques to the design threatens
-deployability, readability, and ease of security analysis. Tor aims to
-deploy a simple and stable system that integrates the best accepted
-approaches to protecting anonymity.\\
-
-\noindent{\large\bf Non-goals}\label{subsec:non-goals}\\
-In favoring simple, deployable designs, we have explicitly deferred
-several possible goals, either because they are solved elsewhere, or because
-they are not yet solved.
-
-\textbf{Not peer-to-peer:} Tarzan and MorphMix aim to scale to completely
-decentralized peer-to-peer environments with thousands of short-lived
-servers, many of which may be controlled by an adversary. This approach
-is appealing, but still has many open
-problems~\cite{tarzan:ccs02,morphmix:fc04}.
-
-\textbf{Not secure against end-to-end attacks:} Tor does not claim
-to completely solve end-to-end timing or intersection
-attacks. Some approaches, such as having users run their own onion routers,
-may help;
-see Section~\ref{sec:maintaining-anonymity} for more discussion.
-
-\textbf{No protocol normalization:} Tor does not provide \emph{protocol
-normalization} like Privoxy or the Anonymizer. If senders want anonymity from
-responders while using complex and variable
-protocols like HTTP, Tor must be layered with a filtering proxy such
-as Privoxy to hide differences between clients, and expunge protocol
-features that leak identity.
-Note that by this separation Tor can also provide services that
-are anonymous to the network yet authenticated to the responder, like
-SSH. Similarly, Tor does not integrate
-tunneling for non-stream-based protocols like UDP; this must be
-provided by an external service if appropriate.
-
-\textbf{Not steganographic:} Tor does not try to conceal who is connected
-to the network.
-
-\subsection{Threat Model}
-\label{subsec:threat-model}
-
-A global passive adversary is the most commonly assumed threat when
-analyzing theoretical anonymity designs. But like all practical
-low-latency systems, Tor does not protect against such a strong
-adversary. Instead, we assume an adversary who can observe some fraction
-of network traffic; who can generate, modify, delete, or delay
-traffic; who can operate onion routers of his own; and who can
-compromise some fraction of the onion routers.
-
-In low-latency anonymity systems that use layered encryption, the
-adversary's typical goal is to observe both the initiator and the
-responder. By observing both ends, passive attackers can confirm a
-suspicion that Alice is
-talking to Bob if the timing and volume patterns of the traffic on the
-connection are distinct enough; active attackers can induce timing
-signatures on the traffic to force distinct patterns. Rather
-than focusing on these \emph{traffic confirmation} attacks,
-we aim to prevent \emph{traffic
-analysis} attacks, where the adversary uses traffic patterns to learn
-which points in the network he should attack.
-
-Our adversary might try to link an initiator Alice with her
-communication partners, or try to build a profile of Alice's
-behavior. He might mount passive attacks by observing the network edges
-and correlating traffic entering and leaving the network---by
-relationships in packet timing, volume, or externally visible
-user-selected
-options. The adversary can also mount active attacks by compromising
-routers or keys; by replaying traffic; by selectively denying service
-to trustworthy routers to move users to
-compromised routers, or denying service to users to see if traffic
-elsewhere in the
-network stops; or by introducing patterns into traffic that can later be
-detected. The adversary might subvert the directory servers to give users
-differing views of network state. Additionally, he can try to decrease
-the network's reliability by attacking nodes or by performing antisocial
-activities from reliable nodes and trying to get them taken down---making
-the network unreliable flushes users to other less anonymous
-systems, where they may be easier to attack. We summarize
-in Section~\ref{sec:attacks} how well the Tor design defends against
-each of these attacks.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\section{The Tor Design}
-\label{sec:design}
-
-The Tor network is an overlay network; each onion router (OR)
-runs as a normal
-user-level process without any special privileges.
-Each onion router maintains a TLS~\cite{TLS}
-connection to every other onion router.
-%(We discuss alternatives to this clique-topology assumption in
-%Section~\ref{sec:maintaining-anonymity}.)
-% A subset of the ORs also act as
-%directory servers, tracking which routers are in the network;
-%see Section~\ref{subsec:dirservers} for directory server details.
-Each user
-runs local software called an onion proxy (OP) to fetch directories,
-establish circuits across the network,
-and handle connections from user applications. These onion proxies accept
-TCP streams and multiplex them across the circuits. The onion
-router on the other side
-of the circuit connects to the requested destinations
-and relays data.
-
-Each onion router maintains a long-term identity key and a short-term
-onion key. The identity
-key is used to sign TLS certificates, to sign the OR's \emph{router
-descriptor} (a summary of its keys, address, bandwidth, exit policy,
-and so on), and (by directory servers) to sign directories. %Changing
-%the identity key of a router is considered equivalent to creating a
-%new router.
-The onion key is used to decrypt requests
-from users to set up a circuit and negotiate ephemeral keys.
-The TLS protocol also establishes a short-term link key when communicating
-between ORs. Short-term keys are rotated periodically and
-independently, to limit the impact of key compromise.
-
-Section~\ref{subsec:cells} presents the fixed-size
-\emph{cells} that are the unit of communication in Tor. We describe
-in Section~\ref{subsec:circuits} how circuits are
-built, extended, truncated, and destroyed. Section~\ref{subsec:tcp}
-describes how TCP streams are routed through the network. We address
-integrity checking in Section~\ref{subsec:integrity-checking},
-and resource limiting in Section~\ref{subsec:rate-limit}.
-Finally,
-Section~\ref{subsec:congestion} talks about congestion control and
-fairness issues.
-
-\subsection{Cells}
-\label{subsec:cells}
-
-Onion routers communicate with one another, and with users' OPs, via
-TLS connections with ephemeral keys. Using TLS conceals the data on
-the connection with perfect forward secrecy, and prevents an attacker
-from modifying data on the wire or impersonating an OR.
-
-Traffic passes along these connections in fixed-size cells. Each cell
-is 512 bytes, %(but see Section~\ref{sec:conclusion} for a discussion of
-%allowing large cells and small cells on the same network),
-and consists of a header and a payload. The header includes a circuit
-identifier (circID) that specifies which circuit the cell refers to
-(many circuits can be multiplexed over the single TLS connection), and
-a command to describe what to do with the cell's payload. (Circuit
-identifiers are connection-specific: each circuit has a different
-circID on each OP/OR or OR/OR connection it traverses.)
-Based on their command, cells are either \emph{control} cells, which are
-always interpreted by the node that receives them, or \emph{relay} cells,
-which carry end-to-end stream data. The control cell commands are:
-\emph{padding} (currently used for keepalive, but also usable for link
-padding); \emph{create} or \emph{created} (used to set up a new circuit);
-and \emph{destroy} (to tear down a circuit).
-
-Relay cells have an additional header (the relay header) at the front
-of the payload, containing a streamID (stream identifier: many streams can
-be multiplexed over a circuit); an end-to-end checksum for integrity
-checking; the length of the relay payload; and a relay command.
-The entire contents of the relay header and the relay cell payload
-are encrypted or decrypted together as the relay cell moves along the
-circuit, using the 128-bit AES cipher in counter mode to generate a
-cipher stream. The relay commands are: \emph{relay
-data} (for data flowing down the stream), \emph{relay begin} (to open a
-stream), \emph{relay end} (to close a stream cleanly), \emph{relay
-teardown} (to close a broken stream), \emph{relay connected}
-(to notify the OP that a relay begin has succeeded), \emph{relay
-extend} and \emph{relay extended} (to extend the circuit by a hop,
-and to acknowledge), \emph{relay truncate} and \emph{relay truncated}
-(to tear down only part of the circuit, and to acknowledge), \emph{relay
-sendme} (used for congestion control), and \emph{relay drop} (used to
-implement long-range dummies).
-We give a visual overview of cell structure plus the details of relay
-cell structure, and then describe each of these cell types and commands
-in more detail below.
-
-%\begin{figure}[h]
-%\unitlength=1cm
-%\centering
-%\begin{picture}(8.0,1.5)
-%\put(4,.5){\makebox(0,0)[c]{\epsfig{file=cell-struct,width=7cm}}}
-%\end{picture}
-%\end{figure}
-
-\begin{figure}[h]
-\centering
-\mbox{\epsfig{figure=cell-struct,width=7cm}}
-\end{figure}
-
-\subsection{Circuits and streams}
-\label{subsec:circuits}
-
-Onion Routing originally built one circuit for each
-TCP stream. Because building a circuit can take several tenths of a
-second (due to public-key cryptography and network latency),
-this design imposed high costs on applications like web browsing that
-open many TCP streams.
-
-In Tor, each circuit can be shared by many TCP streams. To avoid
-delays, users construct circuits preemptively. To limit linkability
-among their streams, users' OPs build a new circuit
-periodically if the previous ones have been used,
-and expire old used circuits that no longer have any open streams.
-OPs consider rotating to a new circuit once a minute: thus
-even heavy users spend negligible time
-building circuits, but a limited number of requests can be linked
-to each other through a given exit node. Also, because circuits are built
-in the background, OPs can recover from failed circuit creation
-without harming user experience.\\
-
-\begin{figure}[h]
-\centering
-\mbox{\epsfig{figure=interaction,width=8.75cm}}
-\caption{Alice builds a two-hop circuit and begins fetching a web page.}
-\label{fig:interaction}
-\end{figure}
-
-\noindent{\large\bf Constructing a circuit}\label{subsubsec:constructing-a-circuit}\\
-%\subsubsection{Constructing a circuit}
-A user's OP constructs circuits incrementally, negotiating a
-symmetric key with each OR on the circuit, one hop at a time. To begin
-creating a new circuit, the OP (call her Alice) sends a
-\emph{create} cell to the first node in her chosen path (call him Bob).
-(She chooses a new
-circID $C_{AB}$ not currently used on the connection from her to Bob.)
-The \emph{create} cell's
-payload contains the first half of the Diffie-Hellman handshake
-($g^x$), encrypted to the onion key of Bob. Bob
-responds with a \emph{created} cell containing $g^y$
-along with a hash of the negotiated key $K=g^{xy}$.
-
-Once the circuit has been established, Alice and Bob can send one
-another relay cells encrypted with the negotiated
-key.\footnote{Actually, the negotiated key is used to derive two
- symmetric keys: one for each direction.} More detail is given in
-the next section.
-
-To extend the circuit further, Alice sends a \emph{relay extend} cell
-to Bob, specifying the address of the next OR (call her Carol), and
-an encrypted $g^{x_2}$ for her. Bob copies the half-handshake into a
-\emph{create} cell, and passes it to Carol to extend the circuit.
-(Bob chooses a new circID $C_{BC}$ not currently used on the connection
-between him and Carol. Alice never needs to know this circID; only Bob
-associates $C_{AB}$ on his connection with Alice to $C_{BC}$ on
-his connection with Carol.)
-When Carol responds with a \emph{created} cell, Bob wraps the payload
-into a \emph{relay extended} cell and passes it back to Alice. Now
-the circuit is extended to Carol, and Alice and Carol share a common key
-$K_2 = g^{x_2 y_2}$.
-
-To extend the circuit to a third node or beyond, Alice
-proceeds as above, always telling the last node in the circuit to
-extend one hop further.
-
-This circuit-level handshake protocol achieves unilateral entity
-authentication (Alice knows she's handshaking with the OR, but
-the OR doesn't care who is opening the circuit---Alice uses no public key
-and remains anonymous) and unilateral key authentication
-(Alice and the OR agree on a key, and Alice knows only the OR learns
-it). It also achieves forward
-secrecy and key freshness. More formally, the protocol is as follows
-(where $E_{PK_{Bob}}(\cdot)$ is encryption with Bob's public key,
-$H$ is a secure hash function, and $|$ is concatenation):
-\begin{equation*}
-\begin{aligned}
-\mathrm{Alice} \rightarrow \mathrm{Bob}&: E_{PK_{Bob}}(g^x) \\
-\mathrm{Bob} \rightarrow \mathrm{Alice}&: g^y, H(K | \mathrm{``handshake"}) \\
-\end{aligned}
-\end{equation*}
-
-\noindent In the second step, Bob proves that it was he who received $g^x$,
-and who chose $y$. We use PK encryption in the first step
-(rather than, say, using the first two steps of STS, which has a
-signature in the second step) because a single cell is too small to
-hold both a public key and a signature. Preliminary analysis with the
-NRL protocol analyzer~\cite{meadows96} shows this protocol to be
-secure (including perfect forward secrecy) under the
-traditional Dolev-Yao model.\\
-
-\noindent{\large\bf Relay cells}\\
-%\subsubsection{Relay cells}
-%
-Once Alice has established the circuit (so she shares keys with each
-OR on the circuit), she can send relay cells.
-%Recall that every relay cell has a streamID that indicates to which
-%stream the cell belongs. %This streamID allows a relay cell to be
-%addressed to any OR on the circuit.
-Upon receiving a relay
-cell, an OR looks up the corresponding circuit, and decrypts the relay
-header and payload with the session key for that circuit.
-If the cell is headed away from Alice the OR then checks whether the
-decrypted cell has a valid digest (as an optimization, the first
-two bytes of the integrity check are zero, so in most cases we can avoid
-computing the hash).
-%is recognized---either because it
-%corresponds to an open stream at this OR for the given circuit, or because
-%it is the control streamID (zero).
-If valid, it accepts the relay cell and processes it as described
-below. Otherwise,
-the OR looks up the circID and OR for the
-next step in the circuit, replaces the circID as appropriate, and
-sends the decrypted relay cell to the next OR. (If the OR at the end
-of the circuit receives an unrecognized relay cell, an error has
-occurred, and the circuit is torn down.)
-
-OPs treat incoming relay cells similarly: they iteratively unwrap the
-relay header and payload with the session keys shared with each
-OR on the circuit, from the closest to farthest.
-If at any stage the digest is valid, the cell must have
-originated at the OR whose encryption has just been removed.
-
-To construct a relay cell addressed to a given OR, Alice assigns the
-digest, and then iteratively
-encrypts the cell payload (that is, the relay header and payload) with
-the symmetric key of each hop up to that OR. Because the digest is
-encrypted to a different value at each step, only at the targeted OR
-will it have a meaningful value.\footnote{
- % Should we just say that 2^56 is itself negligible?
- % Assuming 4-hop circuits with 10 streams per hop, there are 33
- % possible bad streamIDs before the last circuit. This still
- % gives an error only once every 2 million terabytes (approx).
-With 48 bits of digest per cell, the probability of an accidental
-collision is far lower than the chance of hardware failure.}
-This \emph{leaky pipe} circuit topology
-allows Alice's streams to exit at different ORs on a single circuit.
-Alice may choose different exit points because of their exit policies,
-or to keep the ORs from knowing that two streams
-originate from the same person.
-
-When an OR later replies to Alice with a relay cell, it
-encrypts the cell's relay header and payload with the single key it
-shares with Alice, and sends the cell back toward Alice along the
-circuit. Subsequent ORs add further layers of encryption as they
-relay the cell back to Alice.
-
-To tear down a circuit, Alice sends a \emph{destroy} control
-cell. Each OR in the circuit receives the \emph{destroy} cell, closes
-all streams on that circuit, and passes a new \emph{destroy} cell
-forward. But just as circuits are built incrementally, they can also
-be torn down incrementally: Alice can send a \emph{relay
-truncate} cell to a single OR on a circuit. That OR then sends a
-\emph{destroy} cell forward, and acknowledges with a
-\emph{relay truncated} cell. Alice can then extend the circuit to
-different nodes, without signaling to the intermediate nodes (or
-a limited observer) that she has changed her circuit.
-Similarly, if a node on the circuit goes down, the adjacent
-node can send a \emph{relay truncated} cell back to Alice. Thus the
-``break a node and see which circuits go down''
-attack~\cite{freedom21-security} is weakened.
-
-\subsection{Opening and closing streams}
-\label{subsec:tcp}
-
-When Alice's application wants a TCP connection to a given
-address and port, it asks the OP (via SOCKS) to make the
-connection. The OP chooses the newest open circuit (or creates one if
-needed), and chooses a suitable OR on that circuit to be the
-exit node (usually the last node, but maybe others due to exit policy
-conflicts; see Section~\ref{subsec:exitpolicies}.) The OP then opens
-the stream by sending a \emph{relay begin} cell to the exit node,
-using a new random streamID. Once the
-exit node connects to the remote host, it responds
-with a \emph{relay connected} cell. Upon receipt, the OP sends a
-SOCKS reply to notify the application of its success. The OP
-now accepts data from the application's TCP stream, packaging it into
-\emph{relay data} cells and sending those cells along the circuit to
-the chosen OR.
-
-There's a catch to using SOCKS, however---some applications pass the
-alphanumeric hostname to the Tor client, while others resolve it into
-an IP address first and then pass the IP address to the Tor client. If
-the application does DNS resolution first, Alice thereby reveals her
-destination to the remote DNS server, rather than sending the hostname
-through the Tor network to be resolved at the far end. Common applications
-like Mozilla and SSH have this flaw.
-
-With Mozilla, the flaw is easy to address: the filtering HTTP
-proxy called Privoxy gives a hostname to the Tor client, so Alice's
-computer never does DNS resolution.
-But a portable general solution, such as is needed for
-SSH, is
-an open problem. Modifying or replacing the local nameserver
-can be invasive, brittle, and unportable. Forcing the resolver
-library to prefer TCP rather than UDP is hard, and also has
-portability problems. Dynamically intercepting system calls to the
-resolver library seems a promising direction. We could also provide
-a tool similar to \emph{dig} to perform a private lookup through the
-Tor network. Currently, we encourage the use of privacy-aware proxies
-like Privoxy wherever possible.
-
-Closing a Tor stream is analogous to closing a TCP stream: it uses a
-two-step handshake for normal operation, or a one-step handshake for
-errors. If the stream closes abnormally, the adjacent node simply sends a
-\emph{relay teardown} cell. If the stream closes normally, the node sends
-a \emph{relay end} cell down the circuit, and the other side responds with
-its own \emph{relay end} cell. Because
-all relay cells use layered encryption, only the destination OR knows
-that a given relay cell is a request to close a stream. This two-step
-handshake allows Tor to support TCP-based applications that use half-closed
-connections.
-% such as broken HTTP clients that close their side of the
-%stream after writing but are still willing to read.
-
-\subsection{Integrity checking on streams}
-\label{subsec:integrity-checking}
-
-Because the old Onion Routing design used a stream cipher without integrity
-checking, traffic was
-vulnerable to a malleability attack: though the attacker could not
-decrypt cells, any changes to encrypted data
-would create corresponding changes to the data leaving the network.
-This weakness allowed an adversary who could guess the encrypted content
-to change a padding cell to a destroy
-cell; change the destination address in a \emph{relay begin} cell to the
-adversary's webserver; or change an FTP command from
-{\tt dir} to {\tt rm~*}. (Even an external
-adversary could do this, because the link encryption similarly used a
-stream cipher.)
-
-Because Tor uses TLS on its links, external adversaries cannot modify
-data. Addressing the insider malleability attack, however, is
-more complex.
-
-We could do integrity checking of the relay cells at each hop, either
-by including hashes or by using an authenticating cipher mode like
-EAX~\cite{eax}, but there are some problems. First, these approaches
-impose a message-expansion overhead at each hop, and so we would have to
-either leak the path length or waste bytes by padding to a maximum
-path length. Second, these solutions can only verify traffic coming
-from Alice: ORs would not be able to produce suitable hashes for
-the intermediate hops, since the ORs on a circuit do not know the
-other ORs' session keys. Third, we have already accepted that our design
-is vulnerable to end-to-end timing attacks; so tagging attacks performed
-within the circuit provide no additional information to the attacker.
-
-Thus, we check integrity only at the edges of each stream. (Remember that
-in our leaky-pipe circuit topology, a stream's edge could be any hop
-in the circuit.) When Alice
-negotiates a key with a new hop, they each initialize a SHA-1
-digest with a derivative of that key,
-thus beginning with randomness that only the two of them know.
-Then they each incrementally add to the SHA-1 digest the contents of
-all relay cells they create, and include with each relay cell the
-first four bytes of the current digest. Each also keeps a SHA-1
-digest of data received, to verify that the received hashes are correct.
-
-To be sure of removing or modifying a cell, the attacker must be able
-to deduce the current digest state (which depends on all
-traffic between Alice and Bob, starting with their negotiated key).
-Attacks on SHA-1 where the adversary can incrementally add to a hash
-to produce a new valid hash don't work, because all hashes are
-end-to-end encrypted across the circuit. The computational overhead
-of computing the digests is minimal compared to doing the AES
-encryption performed at each hop of the circuit. We use only four
-bytes per cell to minimize overhead; the chance that an adversary will
-correctly guess a valid hash
-%, plus the payload the current cell,
-is
-acceptably low, given that the OP or OR tear down the circuit if they
-receive a bad hash.
-
-\subsection{Rate limiting and fairness}
-\label{subsec:rate-limit}
-
-Volunteers are more willing to run services that can limit
-their bandwidth usage. To accommodate them, Tor servers use a
-token bucket approach~\cite{tannenbaum96} to
-enforce a long-term average rate of incoming bytes, while still
-permitting short-term bursts above the allowed bandwidth.
-% Current bucket sizes are set to ten seconds' worth of traffic.
-
-%Further, we want to avoid starving any Tor streams. Entire circuits
-%could starve if we read greedily from connections and one connection
-%uses all the remaining bandwidth. We solve this by dividing the number
-%of tokens in the bucket by the number of connections that want to read,
-%and reading at most that number of bytes from each connection. We iterate
-%this procedure until the number of tokens in the bucket is under some
-%threshold (currently 10KB), at which point we greedily read from connections.
-
-Because the Tor protocol outputs about the same number of bytes as it
-takes in, it is sufficient in practice to limit only incoming bytes.
-With TCP streams, however, the correspondence is not one-to-one:
-relaying a single incoming byte can require an entire 512-byte cell.
-(We can't just wait for more bytes, because the local application may
-be awaiting a reply.) Therefore, we treat this case as if the entire
-cell size had been read, regardless of the cell's fullness.
-
-Further, inspired by Rennhard et al's design in~\cite{anonnet}, a
-circuit's edges can heuristically distinguish interactive streams from bulk
-streams by comparing the frequency with which they supply cells. We can
-provide good latency for interactive streams by giving them preferential
-service, while still giving good overall throughput to the bulk
-streams. Such preferential treatment presents a possible end-to-end
-attack, but an adversary observing both
-ends of the stream can already learn this information through timing
-attacks.
-
-\subsection{Congestion control}
-\label{subsec:congestion}
-
-Even with bandwidth rate limiting, we still need to worry about
-congestion, either accidental or intentional. If enough users choose the
-same OR-to-OR connection for their circuits, that connection can become
-saturated. For example, an attacker could send a large file
-through the Tor network to a webserver he runs, and then
-refuse to read any of the bytes at the webserver end of the
-circuit. Without some congestion control mechanism, these bottlenecks
-can propagate back through the entire network. We don't need to
-reimplement full TCP windows (with sequence numbers,
-the ability to drop cells when we're full and retransmit later, and so
-on),
-because TCP already guarantees in-order delivery of each
-cell.
-%But we need to investigate further the effects of the current
-%parameters on throughput and latency, while also keeping privacy in mind;
-%see Section~\ref{sec:maintaining-anonymity} for more discussion.
-We describe our response below.
-
-\textbf{Circuit-level throttling:}
-To control a circuit's bandwidth usage, each OR keeps track of two
-windows. The \emph{packaging window} tracks how many relay data cells the OR is
-allowed to package (from incoming TCP streams) for transmission back to the OP,
-and the \emph{delivery window} tracks how many relay data cells it is willing
-to deliver to TCP streams outside the network. Each window is initialized
-(say, to 1000 data cells). When a data cell is packaged or delivered,
-the appropriate window is decremented. When an OR has received enough
-data cells (currently 100), it sends a \emph{relay sendme} cell towards the OP,
-with streamID zero. When an OR receives a \emph{relay sendme} cell with
-streamID zero, it increments its packaging window. Either of these cells
-increments the corresponding window by 100. If the packaging window
-reaches 0, the OR stops reading from TCP connections for all streams
-on the corresponding circuit, and sends no more relay data cells until
-receiving a \emph{relay sendme} cell.
-
-The OP behaves identically, except that it must track a packaging window
-and a delivery window for every OR in the circuit. If a packaging window
-reaches 0, it stops reading from streams destined for that OR.
-
-\textbf{Stream-level throttling}:
-The stream-level congestion control mechanism is similar to the
-circuit-level mechanism. ORs and OPs use \emph{relay sendme} cells
-to implement end-to-end flow control for individual streams across
-circuits. Each stream begins with a packaging window (currently 500 cells),
-and increments the window by a fixed value (50) upon receiving a \emph{relay
-sendme} cell. Rather than always returning a \emph{relay sendme} cell as soon
-as enough cells have arrived, the stream-level congestion control also
-has to check whether data has been successfully flushed onto the TCP
-stream; it sends the \emph{relay sendme} cell only when the number of bytes pending
-to be flushed is under some threshold (currently 10 cells' worth).
-
-%% Maybe omit this next paragraph. -NM
-%Currently, non-data relay cells do not affect the windows. Thus we
-%avoid potential deadlock issues, for example, arising because a stream
-%can't send a \emph{relay sendme} cell when its packaging window is empty.
-
-These arbitrarily chosen parameters seem to give tolerable throughput
-and delay; see Section~\ref{sec:in-the-wild}.
-
-\section{Rendezvous Points and hidden services}
-\label{sec:rendezvous}
-
-Rendezvous points are a building block for \emph{location-hidden
-services} (also known as \emph{responder anonymity}) in the Tor
-network. Location-hidden services allow Bob to offer a TCP
-service, such as a webserver, without revealing his IP address.
-This type of anonymity protects against distributed DoS attacks:
-attackers are forced to attack the onion routing network
-because they do not know Bob's IP address.
-
-Our design for location-hidden servers has the following goals.
-\textbf{Access-control:} Bob needs a way to filter incoming requests,
-so an attacker cannot flood Bob simply by making many connections to him.
-\textbf{Robustness:} Bob should be able to maintain a long-term pseudonymous
-identity even in the presence of router failure. Bob's service must
-not be tied to a single OR, and Bob must be able to migrate his service
-across ORs. \textbf{Smear-resistance:}
-A social attacker
-should not be able to ``frame'' a rendezvous router by
-offering an illegal or disreputable location-hidden service and
-making observers believe the router created that service.
-\textbf{Application-transparency:} Although we require users
-to run special software to access location-hidden servers, we must not
-require them to modify their applications.
-
-We provide location-hiding for Bob by allowing him to advertise
-several onion routers (his \emph{introduction points}) as contact
-points. He may do this on any robust efficient
-key-value lookup system with authenticated updates, such as a
-distributed hash table (DHT) like CFS~\cite{cfs:sosp01}.\footnote{
-Rather than rely on an external infrastructure, the Onion Routing network
-can run the lookup service itself. Our current implementation provides a
-simple lookup system on the
-directory servers.} Alice, the client, chooses an OR as her
-\emph{rendezvous point}. She connects to one of Bob's introduction
-points, informs him of her rendezvous point, and then waits for him
-to connect to the rendezvous point. This extra level of indirection
-helps Bob's introduction points avoid problems associated with serving
-unpopular files directly (for example, if Bob serves
-material that the introduction point's community finds objectionable,
-or if Bob's service tends to get attacked by network vandals).
-The extra level of indirection also allows Bob to respond to some requests
-and ignore others.
-
-\subsection{Rendezvous points in Tor}
-
-The following steps are
-%We give an overview of the steps of a rendezvous. These are
-performed on behalf of Alice and Bob by their local OPs;
-application integration is described more fully below.
-
-\begin{tightlist}
-\item Bob generates a long-term public key pair to identify his service.
-\item Bob chooses some introduction points, and advertises them on
- the lookup service, signing the advertisement with his public key. He
- can add more later.
-\item Bob builds a circuit to each of his introduction points, and tells
- them to wait for requests.
-\item Alice learns about Bob's service out of band (perhaps Bob told her,
- or she found it on a website). She retrieves the details of Bob's
- service from the lookup service. If Alice wants to access Bob's
- service anonymously, she must connect to the lookup service via Tor.
-\item Alice chooses an OR as the rendezvous point (RP) for her connection to
- Bob's service. She builds a circuit to the RP, and gives it a
- randomly chosen ``rendezvous cookie'' to recognize Bob.
-\item Alice opens an anonymous stream to one of Bob's introduction
- points, and gives it a message (encrypted with Bob's public key)
- telling it about herself,
- her RP and rendezvous cookie, and the
- start of a DH
- handshake. The introduction point sends the message to Bob.
-\item If Bob wants to talk to Alice, he builds a circuit to Alice's
- RP and sends the rendezvous cookie, the second half of the DH
- handshake, and a hash of the session
- key they now share. By the same argument as in
- Section~\ref{subsubsec:constructing-a-circuit}, Alice knows she
- shares the key only with Bob.
-\item The RP connects Alice's circuit to Bob's. Note that RP can't
- recognize Alice, Bob, or the data they transmit.
-\item Alice sends a \emph{relay begin} cell along the circuit. It
- arrives at Bob's OP, which connects to Bob's
- webserver.
-\item An anonymous stream has been established, and Alice and Bob
- communicate as normal.
-\end{tightlist}
-
-When establishing an introduction point, Bob provides the onion router
-with the public key identifying his service. Bob signs his
-messages, so others cannot usurp his introduction point
-in the future. He uses the same public key to establish the other
-introduction points for his service, and periodically refreshes his
-entry in the lookup service.
-
-The message that Alice gives
-the introduction point includes a hash of Bob's public key % to identify
-%the service, along with
-and an optional initial authorization token (the
-introduction point can do prescreening, for example to block replays). Her
-message to Bob may include an end-to-end authorization token so Bob
-can choose whether to respond.
-The authorization tokens can be used to provide selective access:
-important users can get uninterrupted access.
-%important users get tokens to ensure uninterrupted access. %to the
-%service.
-During normal situations, Bob's service might simply be offered
-directly from mirrors, while Bob gives out tokens to high-priority users. If
-the mirrors are knocked down,
-%by distributed DoS attacks or even
-%physical attack,
-those users can switch to accessing Bob's service via
-the Tor rendezvous system.
-
-Bob's introduction points are themselves subject to DoS---he must
-open many introduction points or risk such an attack.
-He can provide selected users with a current list or future schedule of
-unadvertised introduction points;
-this is most practical
-if there is a stable and large group of introduction points
-available. Bob could also give secret public keys
-for consulting the lookup service. All of these approaches
-limit exposure even when
-some selected users collude in the DoS\@.
-
-\subsection{Integration with user applications}
-
-Bob configures his onion proxy to know the local IP address and port of his
-service, a strategy for authorizing clients, and his public key. The onion
-proxy anonymously publishes a signed statement of Bob's
-public key, an expiration time, and
-the current introduction points for his service onto the lookup service,
-indexed
-by the hash of his public key. Bob's webserver is unmodified,
-and doesn't even know that it's hidden behind the Tor network.
-
-Alice's applications also work unchanged---her client interface
-remains a SOCKS proxy. We encode all of the necessary information
-into the fully qualified domain name (FQDN) Alice uses when establishing her
-connection. Location-hidden services use a virtual top level domain
-called {\tt .onion}: thus hostnames take the form {\tt x.y.onion} where
-{\tt x} is the authorization cookie and {\tt y} encodes the hash of
-the public key. Alice's onion proxy
-examines addresses; if they're destined for a hidden server, it decodes
-the key and starts the rendezvous as described above.
-
-\subsection{Previous rendezvous work}
-%XXXX Should this get integrated into the earlier related work section? -NM
-
-Rendezvous points in low-latency anonymity systems were first
-described for use in ISDN telephony~\cite{jerichow-jsac98,isdn-mixes}.
-Later low-latency designs used rendezvous points for hiding location
-of mobile phones and low-power location
-trackers~\cite{federrath-ih96,reed-protocols97}. Rendezvous for
-anonymizing low-latency
-Internet connections was suggested in early Onion Routing
-work~\cite{or-ih96}, but the first published design was by Ian
-Goldberg~\cite{ian-thesis}. His design differs from
-ours in three ways. First, Goldberg suggests that Alice should manually
-hunt down a current location of the service via Gnutella; our approach
-makes lookup transparent to the user, as well as faster and more robust.
-Second, in Tor the client and server negotiate session keys
-with Diffie-Hellman, so plaintext is not exposed even at the rendezvous
-point. Third,
-our design minimizes the exposure from running the
-service, to encourage volunteers to offer introduction and rendezvous
-services. Tor's introduction points do not output any bytes to the
-clients; the rendezvous points don't know the client or the server,
-and can't read the data being transmitted. The indirection scheme is
-also designed to include authentication/authorization---if Alice doesn't
-include the right cookie with her request for service, Bob need not even
-acknowledge his existence.
-
-\section{Other design decisions}
-\label{sec:other-design}
-
-\subsection{Denial of service}
-\label{subsec:dos}
-
-Providing Tor as a public service creates many opportunities for
-denial-of-service attacks against the network. While
-flow control and rate limiting (discussed in
-Section~\ref{subsec:congestion}) prevent users from consuming more
-bandwidth than routers are willing to provide, opportunities remain for
-users to
-consume more network resources than their fair share, or to render the
-network unusable for others.
-
-First of all, there are several CPU-consuming denial-of-service
-attacks wherein an attacker can force an OR to perform expensive
-cryptographic operations. For example, an attacker can
-%\emph{create} cell full of junk bytes can force an OR to perform an RSA
-%decrypt.
-%Similarly, an attacker can
-fake the start of a TLS handshake, forcing the OR to carry out its
-(comparatively expensive) half of the handshake at no real computational
-cost to the attacker.
-
-We have not yet implemented any defenses for these attacks, but several
-approaches are possible. First, ORs can
-require clients to solve a puzzle~\cite{puzzles-tls} while beginning new
-TLS handshakes or accepting \emph{create} cells. So long as these
-tokens are easy to verify and computationally expensive to produce, this
-approach limits the attack multiplier. Additionally, ORs can limit
-the rate at which they accept \emph{create} cells and TLS connections,
-so that
-the computational work of processing them does not drown out the
-symmetric cryptography operations that keep cells
-flowing. This rate limiting could, however, allow an attacker
-to slow down other users when they build new circuits.
-
-% What about link-to-link rate limiting?
-
-Adversaries can also attack the Tor network's hosts and network
-links. Disrupting a single circuit or link breaks all streams passing
-along that part of the circuit. Users similarly lose service
-when a router crashes or its operator restarts it. The current
-Tor design treats such attacks as intermittent network failures, and
-depends on users and applications to respond or recover as appropriate. A
-future design could use an end-to-end TCP-like acknowledgment protocol,
-so no streams are lost unless the entry or exit point is
-disrupted. This solution would require more buffering at the network
-edges, however, and the performance and anonymity implications from this
-extra complexity still require investigation.
-
-\subsection{Exit policies and abuse}
-\label{subsec:exitpolicies}
-
-% originally, we planned to put the "users only know the hostname,
-% not the IP, but exit policies are by IP" problem here too. Not
-% worth putting in the submission, but worth thinking about putting
-% in sometime somehow. -RD
-
-Exit abuse is a serious barrier to wide-scale Tor deployment. Anonymity
-presents would-be vandals and abusers with an opportunity to hide
-the origins of their activities. Attackers can harm the Tor network by
-implicating exit servers for their abuse. Also, applications that commonly
-use IP-based authentication (such as institutional mail or webservers)
-can be fooled by the fact that anonymous connections appear to originate
-at the exit OR.
-
-We stress that Tor does not enable any new class of abuse. Spammers
-and other attackers already have access to thousands of misconfigured
-systems worldwide, and the Tor network is far from the easiest way
-to launch attacks.
-%Indeed, because of its limited
-%anonymity, Tor is probably not a good way to commit crimes.
-But because the
-onion routers can be mistaken for the originators of the abuse,
-and the volunteers who run them may not want to deal with the hassle of
-explaining anonymity networks to irate administrators, we must block or limit
-abuse through the Tor network.
-
-To mitigate abuse issues, each onion router's \emph{exit policy}
-describes to which external addresses and ports the router will
-connect. On one end of the spectrum are \emph{open exit}
-nodes that will connect anywhere. On the other end are \emph{middleman}
-nodes that only relay traffic to other Tor nodes, and \emph{private exit}
-nodes that only connect to a local host or network. A private
-exit can allow a client to connect to a given host or
-network more securely---an external adversary cannot eavesdrop traffic
-between the private exit and the final destination, and so is less sure of
-Alice's destination and activities. Most onion routers in the current
-network function as
-\emph{restricted exits} that permit connections to the world at large,
-but prevent access to certain abuse-prone addresses and services such
-as SMTP.
-The OR might also be able to authenticate clients to
-prevent exit abuse without harming anonymity~\cite{or-discex00}.
-
-%The abuse issues on closed (e.g. military) networks are different
-%from the abuse on open networks like the Internet. While these IP-based
-%access controls are still commonplace on the Internet, on closed networks,
-%nearly all participants will be honest, and end-to-end authentication
-%can be assumed for important traffic.
-
-Many administrators use port restrictions to support only a
-limited set of services, such as HTTP, SSH, or AIM.
-This is not a complete solution, of course, since abuse opportunities for these
-protocols are still well known.
-
-We have not yet encountered any abuse in the deployed network, but if
-we do we should consider using proxies to clean traffic for certain
-protocols as it leaves the network. For example, much abusive HTTP
-behavior (such as exploiting buffer overflows or well-known script
-vulnerabilities) can be detected in a straightforward manner.
-Similarly, one could run automatic spam filtering software (such as
-SpamAssassin) on email exiting the OR network.
-
-ORs may also rewrite exiting traffic to append
-headers or other information indicating that the traffic has passed
-through an anonymity service. This approach is commonly used
-by email-only anonymity systems. ORs can also
-run on servers with hostnames like {\tt anonymous} to further
-alert abuse targets to the nature of the anonymous traffic.
-
-A mixture of open and restricted exit nodes allows the most
-flexibility for volunteers running servers. But while having many
-middleman nodes provides a large and robust network,
-having only a few exit nodes reduces the number of points
-an adversary needs to monitor for traffic analysis, and places a
-greater burden on the exit nodes. This tension can be seen in the
-Java Anon Proxy
-cascade model, wherein only one node in each cascade needs to handle
-abuse complaints---but an adversary only needs to observe the entry
-and exit of a cascade to perform traffic analysis on all that
-cascade's users. The hydra model (many entries, few exits) presents a
-different compromise: only a few exit nodes are needed, but an
-adversary needs to work harder to watch all the clients; see
-Section~\ref{sec:conclusion}.
-
-Finally, we note that exit abuse must not be dismissed as a peripheral
-issue: when a system's public image suffers, it can reduce the number
-and diversity of that system's users, and thereby reduce the anonymity
-of the system itself. Like usability, public perception is a
-security parameter. Sadly, preventing abuse of open exit nodes is an
-unsolved problem, and will probably remain an arms race for the
-foreseeable future. The abuse problems faced by Princeton's CoDeeN
-project~\cite{darkside} give us a glimpse of likely issues.
-
-\subsection{Directory Servers}
-\label{subsec:dirservers}
-
-First-generation Onion Routing designs~\cite{freedom2-arch,or-jsac98} used
-in-band network status updates: each router flooded a signed statement
-to its neighbors, which propagated it onward. But anonymizing networks
-have different security goals than typical link-state routing protocols.
-For example, delays (accidental or intentional)
-that can cause different parts of the network to have different views
-of link-state and topology are not only inconvenient: they give
-attackers an opportunity to exploit differences in client knowledge.
-We also worry about attacks to deceive a
-client about the router membership list, topology, or current network
-state. Such \emph{partitioning attacks} on client knowledge help an
-adversary to efficiently deploy resources
-against a target~\cite{minion-design}.
-
-Tor uses a small group of redundant, well-known onion routers to
-track changes in network topology and node state, including keys and
-exit policies. Each such \emph{directory server} acts as an HTTP
-server, so clients can fetch current network state
-and router lists, and so other ORs can upload
-state information. Onion routers periodically publish signed
-statements of their state to each directory server. The directory servers
-combine this information with their own views of network liveness,
-and generate a signed description (a \emph{directory}) of the entire
-network state. Client software is
-pre-loaded with a list of the directory servers and their keys,
-to bootstrap each client's view of the network.
-% XXX this means that clients will be forced to upgrade as the
-% XXX dirservers change or get compromised. argue that this is ok.
-
-When a directory server receives a signed statement for an OR, it
-checks whether the OR's identity key is recognized. Directory
-servers do not advertise unrecognized ORs---if they did,
-an adversary could take over the network by creating many
-servers~\cite{sybil}. Instead, new nodes must be approved by the
-directory
-server administrator before they are included. Mechanisms for automated
-node approval are an area of active research, and are discussed more
-in Section~\ref{sec:maintaining-anonymity}.
-
-Of course, a variety of attacks remain. An adversary who controls
-a directory server can track clients by providing them different
-information---perhaps by listing only nodes under its control, or by
-informing only certain clients about a given node. Even an external
-adversary can exploit differences in client knowledge: clients who use
-a node listed on one directory server but not the others are vulnerable.
-
-Thus these directory servers must be synchronized and redundant, so
-that they can agree on a common directory. Clients should only trust
-this directory if it is signed by a threshold of the directory
-servers.
-
-The directory servers in Tor are modeled after those in
-Mixminion~\cite{minion-design}, but our situation is easier. First,
-we make the
-simplifying assumption that all participants agree on the set of
-directory servers. Second, while Mixminion needs to predict node
-behavior, Tor only needs a threshold consensus of the current
-state of the network. Third, we assume that we can fall back to the
-human administrators to discover and resolve problems when a consensus
-directory cannot be reached. Since there are relatively few directory
-servers (currently 3, but we expect as many as 9 as the network scales),
-we can afford operations like broadcast to simplify the consensus-building
-protocol.
-
-To avoid attacks where a router connects to all the directory servers
-but refuses to relay traffic from other routers, the directory servers
-must also build circuits and use them to anonymously test router
-reliability~\cite{mix-acc}. Unfortunately, this defense is not yet
-designed or
-implemented.
-
-Using directory servers is simpler and more flexible than flooding.
-Flooding is expensive, and complicates the analysis when we
-start experimenting with non-clique network topologies. Signed
-directories can be cached by other
-onion routers,
-so directory servers are not a performance
-bottleneck when we have many users, and do not aid traffic analysis by
-forcing clients to announce their existence to any
-central point.
-
-\section{Attacks and Defenses}
-\label{sec:attacks}
-
-Below we summarize a variety of attacks, and discuss how well our
-design withstands them.\\
-
-\noindent{\large\bf Passive attacks}\\
-\emph{Observing user traffic patterns.} Observing a user's connection
-will not reveal her destination or data, but it will
-reveal traffic patterns (both sent and received). Profiling via user
-connection patterns requires further processing, because multiple
-application streams may be operating simultaneously or in series over
-a single circuit.
-
-\emph{Observing user content.} While content at the user end is encrypted,
-connections to responders may not be (indeed, the responding website
-itself may be hostile). While filtering content is not a primary goal
-of Onion Routing, Tor can directly use Privoxy and related
-filtering services to anonymize application data streams.
-
-\emph{Option distinguishability.} We allow clients to choose
-configuration options. For example, clients concerned about request
-linkability should rotate circuits more often than those concerned
-about traceability. Allowing choice may attract users with different
-%There is economic incentive to attract users by
-%allowing this choice;
-needs; but clients who are
-in the minority may lose more anonymity by appearing distinct than they
-gain by optimizing their behavior~\cite{econymics}.
-
-\emph{End-to-end timing correlation.} Tor only minimally hides
-such correlations. An attacker watching patterns of
-traffic at the initiator and the responder will be
-able to confirm the correspondence with high probability. The
-greatest protection currently available against such confirmation is to hide
-the connection between the onion proxy and the first Tor node,
-by running the OP on the Tor node or behind a firewall. This approach
-requires an observer to separate traffic originating at the onion
-router from traffic passing through it: a global observer can do this,
-but it might be beyond a limited observer's capabilities.
-
-\emph{End-to-end size correlation.} Simple packet counting
-will also be effective in confirming
-endpoints of a stream. However, even without padding, we may have some
-limited protection: the leaky pipe topology means different numbers
-of packets may enter one end of a circuit than exit at the other.
-
-\emph{Website fingerprinting.} All the effective passive
-attacks above are traffic confirmation attacks,
-which puts them outside our design goals. There is also
-a passive traffic analysis attack that is potentially effective.
-Rather than searching exit connections for timing and volume
-correlations, the adversary may build up a database of
-``fingerprints'' containing file sizes and access patterns for
-targeted websites. He can later confirm a user's connection to a given
-site simply by consulting the database. This attack has
-been shown to be effective against SafeWeb~\cite{hintz-pet02}.
-It may be less effective against Tor, since
-streams are multiplexed within the same circuit, and
-fingerprinting will be limited to
-the granularity of cells (currently 512 bytes). Additional
-defenses could include
-larger cell sizes, padding schemes to group websites
-into large sets, and link
-padding or long-range dummies.\footnote{Note that this fingerprinting
-attack should not be confused with the much more complicated latency
-attacks of~\cite{back01}, which require a fingerprint of the latencies
-of all circuits through the network, combined with those from the
-network edges to the target user and the responder website.}\\
-
-\noindent{\large\bf Active attacks}\\
-\emph{Compromise keys.} An attacker who learns the TLS session key can
-see control cells and encrypted relay cells on every circuit on that
-connection; learning a circuit
-session key lets him unwrap one layer of the encryption. An attacker
-who learns an OR's TLS private key can impersonate that OR for the TLS
-key's lifetime, but he must
-also learn the onion key to decrypt \emph{create} cells (and because of
-perfect forward secrecy, he cannot hijack already established circuits
-without also compromising their session keys). Periodic key rotation
-limits the window of opportunity for these attacks. On the other hand,
-an attacker who learns a node's identity key can replace that node
-indefinitely by sending new forged descriptors to the directory servers.
-
-\emph{Iterated compromise.} A roving adversary who can
-compromise ORs (by system intrusion, legal coercion, or extralegal
-coercion) could march down the circuit compromising the
-nodes until he reaches the end. Unless the adversary can complete
-this attack within the lifetime of the circuit, however, the ORs
-will have discarded the necessary information before the attack can
-be completed. (Thanks to the perfect forward secrecy of session
-keys, the attacker cannot force nodes to decrypt recorded
-traffic once the circuits have been closed.) Additionally, building
-circuits that cross jurisdictions can make legal coercion
-harder---this phenomenon is commonly called ``jurisdictional
-arbitrage.'' The Java Anon Proxy project recently experienced the
-need for this approach, when
-a German court forced them to add a backdoor to
-their nodes~\cite{jap-backdoor}.
-
-\emph{Run a recipient.} An adversary running a webserver
-trivially learns the timing patterns of users connecting to it, and
-can introduce arbitrary patterns in its responses.
-End-to-end attacks become easier: if the adversary can induce
-users to connect to his webserver (perhaps by advertising
-content targeted to those users), he now holds one end of their
-connection. There is also a danger that application
-protocols and associated programs can be induced to reveal information
-about the initiator. Tor depends on Privoxy and similar protocol cleaners
-to solve this latter problem.
-
-\emph{Run an onion proxy.} It is expected that end users will
-nearly always run their own local onion proxy. However, in some
-settings, it may be necessary for the proxy to run
-remotely---typically, in institutions that want
-to monitor the activity of those connecting to the proxy.
-Compromising an onion proxy compromises all future connections
-through it.
-
-\emph{DoS non-observed nodes.} An observer who can only watch some
-of the Tor network can increase the value of this traffic
-by attacking non-observed nodes to shut them down, reduce
-their reliability, or persuade users that they are not trustworthy.
-The best defense here is robustness.
-
-\emph{Run a hostile OR.} In addition to being a local observer,
-an isolated hostile node can create circuits through itself, or alter
-traffic patterns to affect traffic at other nodes. Nonetheless, a hostile
-node must be immediately adjacent to both endpoints to compromise the
-anonymity of a circuit. If an adversary can
-run multiple ORs, and can persuade the directory servers
-that those ORs are trustworthy and independent, then occasionally
-some user will choose one of those ORs for the start and another
-as the end of a circuit. If an adversary
-controls $m>1$ of $N$ nodes, he can correlate at most
-$\left(\frac{m}{N}\right)^2$ of the traffic---although an
-adversary
-could still attract a disproportionately large amount of traffic
-by running an OR with a permissive exit policy, or by
-degrading the reliability of other routers.
-
-\emph{Introduce timing into messages.} This is simply a stronger
-version of passive timing attacks already discussed earlier.
-
-\emph{Tagging attacks.} A hostile node could ``tag'' a
-cell by altering it. If the
-stream were, for example, an unencrypted request to a Web site,
-the garbled content coming out at the appropriate time would confirm
-the association. However, integrity checks on cells prevent
-this attack.
-
-\emph{Replace contents of unauthenticated protocols.} When
-relaying an unauthenticated protocol like HTTP, a hostile exit node
-can impersonate the target server. Clients
-should prefer protocols with end-to-end authentication.
-
-\emph{Replay attacks.} Some anonymity protocols are vulnerable
-to replay attacks. Tor is not; replaying one side of a handshake
-will result in a different negotiated session key, and so the rest
-of the recorded session can't be used.
-
-\emph{Smear attacks.} An attacker could use the Tor network for
-socially disapproved acts, to bring the
-network into disrepute and get its operators to shut it down.
-Exit policies reduce the possibilities for abuse, but
-ultimately the network requires volunteers who can tolerate
-some political heat.
-
-\emph{Distribute hostile code.} An attacker could trick users
-into running subverted Tor software that did not, in fact, anonymize
-their connections---or worse, could trick ORs into running weakened
-software that provided users with less anonymity. We address this
-problem (but do not solve it completely) by signing all Tor releases
-with an official public key, and including an entry in the directory
-that lists which versions are currently believed to be secure. To
-prevent an attacker from subverting the official release itself
-(through threats, bribery, or insider attacks), we provide all
-releases in source code form, encourage source audits, and
-frequently warn our users never to trust any software (even from
-us) that comes without source.\\
-
-\noindent{\large\bf Directory attacks}\\
-\emph{Destroy directory servers.} If a few directory
-servers disappear, the others still decide on a valid
-directory. So long as any directory servers remain in operation,
-they will still broadcast their views of the network and generate a
-consensus directory. (If more than half are destroyed, this
-directory will not, however, have enough signatures for clients to
-use it automatically; human intervention will be necessary for
-clients to decide whether to trust the resulting directory.)
-
-\emph{Subvert a directory server.} By taking over a directory server,
-an attacker can partially influence the final directory. Since ORs
-are included or excluded by majority vote, the corrupt directory can
-at worst cast a tie-breaking vote to decide whether to include
-marginal ORs. It remains to be seen how often such marginal cases
-occur in practice.
-
-\emph{Subvert a majority of directory servers.} An adversary who controls
-more than half the directory servers can include as many compromised
-ORs in the final directory as he wishes. We must ensure that directory
-server operators are independent and attack-resistant.
-
-\emph{Encourage directory server dissent.} The directory
-agreement protocol assumes that directory server operators agree on
-the set of directory servers. An adversary who can persuade some
-of the directory server operators to distrust one another could
-split the quorum into mutually hostile camps, thus partitioning
-users based on which directory they use. Tor does not address
-this attack.
-
-\emph{Trick the directory servers into listing a hostile OR.}
-Our threat model explicitly assumes directory server operators will
-be able to filter out most hostile ORs.
-% If this is not true, an
-% attacker can flood the directory with compromised servers.
-
-\emph{Convince the directories that a malfunctioning OR is
-working.} In the current Tor implementation, directory servers
-assume that an OR is running correctly if they can start a TLS
-connection to it. A hostile OR could easily subvert this test by
-accepting TLS connections from ORs but ignoring all cells. Directory
-servers must actively test ORs by building circuits and streams as
-appropriate. The tradeoffs of a similar approach are discussed
-in~\cite{mix-acc}.\\
-
-\noindent{\large\bf Attacks against rendezvous points}\\
-\emph{Make many introduction requests.} An attacker could
-try to deny Bob service by flooding his introduction points with
-requests. Because the introduction points can block requests that
-lack authorization tokens, however, Bob can restrict the volume of
-requests he receives, or require a certain amount of computation for
-every request he receives.
-
-\emph{Attack an introduction point.} An attacker could
-disrupt a location-hidden service by disabling its introduction
-points. But because a service's identity is attached to its public
-key, the service can simply re-advertise
-itself at a different introduction point. Advertisements can also be
-done secretly so that only high-priority clients know the address of
-Bob's introduction points or so that different clients know of different
-introduction points. This forces the attacker to disable all possible
-introduction points.
-
-\emph{Compromise an introduction point.} An attacker who controls
-Bob's introduction point can flood Bob with
-introduction requests, or prevent valid introduction requests from
-reaching him. Bob can notice a flood, and close the circuit. To notice
-blocking of valid requests, however, he should periodically test the
-introduction point by sending rendezvous requests and making
-sure he receives them.
-
-\emph{Compromise a rendezvous point.} A rendezvous
-point is no more sensitive than any other OR on
-a circuit, since all data passing through the rendezvous is encrypted
-with a session key shared by Alice and Bob.
-
-\section{Early experiences: Tor in the Wild}
-\label{sec:in-the-wild}
-
-As of mid-May 2004, the Tor network consists of 32 nodes
-(24 in the US, 8 in Europe), and more are joining each week as the code
-matures. (For comparison, the current remailer network
-has about 40 nodes.) % We haven't asked PlanetLab to provide
-%Tor nodes, since their AUP wouldn't allow exit nodes (see
-%also~\cite{darkside}) and because we aim to build a long-term community of
-%node operators and developers.}
-Each node has at least a 768Kb/768Kb connection, and
-many have 10Mb. The number of users varies (and of course, it's hard to
-tell for sure), but we sometimes have several hundred users---administrators at
-several companies have begun sending their entire departments' web
-traffic through Tor, to block other divisions of
-their company from reading their traffic. Tor users have reported using
-the network for web browsing, FTP, IRC, AIM, Kazaa, SSH, and
-recipient-anonymous email via rendezvous points. One user has anonymously
-set up a Wiki as a hidden service, where other users anonymously publish
-the addresses of their hidden services.
-
-Each Tor node currently processes roughly 800,000 relay
-cells (a bit under half a gigabyte) per week. On average, about 80\%
-of each 498-byte payload is full for cells going back to the client,
-whereas about 40\% is full for cells coming from the client. (The difference
-arises because most of the network's traffic is web browsing.) Interactive
-traffic like SSH brings down the average a lot---once we have more
-experience, and assuming we can resolve the anonymity issues, we may
-partition traffic into two relay cell sizes: one to handle
-bulk traffic and one for interactive traffic.
-
-Based in part on our restrictive default exit policy (we
-reject SMTP requests) and our low profile, we have had no abuse
-issues since the network was deployed in October
-2003. Our slow growth rate gives us time to add features,
-resolve bugs, and get a feel for what users actually want from an
-anonymity system. Even though having more users would bolster our
-anonymity sets, we are not eager to attract the Kazaa or warez
-communities---we feel that we must build a reputation for privacy, human
-rights, research, and other socially laudable activities.
-
-As for performance, profiling shows that Tor spends almost
-all its CPU time in AES, which is fast. Current latency is attributable
-to two factors. First, network latency is critical: we are
-intentionally bouncing traffic around the world several times. Second,
-our end-to-end congestion control algorithm focuses on protecting
-volunteer servers from accidental DoS rather than on optimizing
-performance. % Right now the first $500 \times 500\mbox{B}=250\mbox{KB}$
-%of the stream arrives
-%quickly, and after that throughput depends on the rate that \emph{relay
-%sendme} acknowledgments arrive.
-To quantify these effects, we did some informal tests using a network of 4
-nodes on the same machine (a heavily loaded 1GHz Athlon). We downloaded a 60
-megabyte file from {\tt debian.org} every 30 minutes for 54 hours (108 sample
-points). It arrived in about 300 seconds on average, compared to 210s for a
-direct download. We ran a similar test on the production Tor network,
-fetching the front page of {\tt cnn.com} (55 kilobytes):
-% every 20 seconds for 8952 data points
-while a direct
-download consistently took about 0.3s, the performance through Tor varied.
-Some downloads were as fast as 0.4s, with a median at 2.8s, and
-90\% finishing within 5.3s. It seems that as the network expands, the chance
-of building a slow circuit (one that includes a slow or heavily loaded node
-or link) is increasing. On the other hand, as our users remain satisfied
-with this increased latency, we can address our performance incrementally as we
-proceed with development. %\footnote{For example, we have just begun pushing
-%a pipelining patch to the production network that seems to decrease
-%latency for medium-to-large files; we will present revised benchmarks
-%as they become available.}
-
-%With the current network's topology and load, users can typically get 1-2
-%megabits sustained transfer rate, which is good enough for now.
-%Indeed, the Tor
-%design aims foremost to provide a security research platform; performance
-%only needs to be sufficient to retain users~\cite{econymics,back01}.
-%We can tweak the congestion control
-%parameters to provide faster throughput at the cost of
-%larger buffers at each node; adding the heuristics mentioned in
-%Section~\ref{subsec:rate-limit} to favor low-volume
-%streams may also help. More research remains to find the
-%right balance.
-% We should say _HOW MUCH_ latency there is in these cases. -NM
-
-%performs badly on lossy networks. may need airhook or something else as
-%transport alternative?
-
-Although Tor's clique topology and full-visibility directories present
-scaling problems, we still expect the network to support a few hundred
-nodes and maybe 10,000 users before we're forced to become
-more distributed. With luck, the experience we gain running the current
-topology will help us choose among alternatives when the time comes.
-
-\section{Open Questions in Low-latency Anonymity}
-\label{sec:maintaining-anonymity}
-
-In addition to the non-goals in
-Section~\ref{subsec:non-goals}, many questions must be solved
-before we can be confident of Tor's security.
-
-Many of these open issues are questions of balance. For example,
-how often should users rotate to fresh circuits? Frequent rotation
-is inefficient, expensive, and may lead to intersection attacks and
-predecessor attacks~\cite{wright03}, but infrequent rotation makes the
-user's traffic linkable. Besides opening fresh circuits, clients can
-also exit from the middle of the circuit,
-or truncate and re-extend the circuit. More analysis is
-needed to determine the proper tradeoff.
-
-%% Duplicated by 'Better directory distribution' in section 9.
-%
-%A similar question surrounds timing of directory operations: how often
-%should directories be updated? Clients that update infrequently receive
-%an inaccurate picture of the network, but frequent updates can overload
-%the directory servers. More generally, we must find more
-%decentralized yet practical ways to distribute up-to-date snapshots of
-%network status without introducing new attacks.
-
-How should we choose path lengths? If Alice always uses two hops,
-then both ORs can be certain that by colluding they will learn about
-Alice and Bob. In our current approach, Alice always chooses at least
-three nodes unrelated to herself and her destination.
-%% This point is subtle, but not IMO necessary. Anybody who thinks
-%% about it will see that it's implied by the above sentence; anybody
-%% who doesn't think about it is safe in his ignorance.
-%
-%Thus normally she chooses
-%three nodes, but if she is running an OR and her destination is on an OR,
-%she uses five.
-Should Alice choose a random path length (e.g.~from a geometric
-distribution) to foil an attacker who
-uses timing to learn that he is the fifth hop and thus concludes that
-both Alice and the responder are running ORs?
-
-Throughout this paper, we have assumed that end-to-end traffic
-confirmation will immediately and automatically defeat a low-latency
-anonymity system. Even high-latency anonymity systems can be
-vulnerable to end-to-end traffic confirmation, if the traffic volumes
-are high enough, and if users' habits are sufficiently
-distinct~\cite{statistical-disclosure,limits-open}. Can anything be
-done to
-make low-latency systems resist these attacks as well as high-latency
-systems? Tor already makes some effort to conceal the starts and ends of
-streams by wrapping long-range control commands in identical-looking
-relay cells. Link padding could frustrate passive observers who count
-packets; long-range padding could work against observers who own the
-first hop in a circuit. But more research remains to find an efficient
-and practical approach. Volunteers prefer not to run constant-bandwidth
-padding; but no convincing traffic shaping approach has been
-specified. Recent work on long-range padding~\cite{defensive-dropping}
-shows promise. One could also try to reduce correlation in packet timing
-by batching and re-ordering packets, but it is unclear whether this could
-improve anonymity without introducing so much latency as to render the
-network unusable.
-
-A cascade topology may better defend against traffic confirmation by
-aggregating users, and making padding and
-mixing more affordable. Does the hydra topology (many input nodes,
-few output nodes) work better against some adversaries? Are we going
-to get a hydra anyway because most nodes will be middleman nodes?
-
-Common wisdom suggests that Alice should run her own OR for best
-anonymity, because traffic coming from her node could plausibly have
-come from elsewhere. How much mixing does this approach need? Is it
-immediately beneficial because of real-world adversaries that can't
-observe Alice's router, but can run routers of their own?
-
-To scale to many users, and to prevent an attacker from observing the
-whole network, it may be necessary
-to support far more servers than Tor currently anticipates.
-This introduces several issues. First, if approval by a central set
-of directory servers is no longer feasible, what mechanism should be used
-to prevent adversaries from signing up many colluding servers? Second,
-if clients can no longer have a complete picture of the network,
-how can they perform discovery while preventing attackers from
-manipulating or exploiting gaps in their knowledge? Third, if there
-are too many servers for every server to constantly communicate with
-every other, which non-clique topology should the network use?
-(Restricted-route topologies promise comparable anonymity with better
-scalability~\cite{danezis:pet2003}, but whatever topology we choose, we
-need some way to keep attackers from manipulating their position within
-it~\cite{casc-rep}.) Fourth, if no central authority is tracking
-server reliability, how do we stop unreliable servers from making
-the network unusable? Fifth, do clients receive so much anonymity
-from running their own ORs that we should expect them all to do
-so~\cite{econymics}, or do we need another incentive structure to
-motivate them? Tarzan and MorphMix present possible solutions.
-
-% advogato, captcha
-
-When a Tor node goes down, all its circuits (and thus streams) must break.
-Will users abandon the system because of this brittleness? How well
-does the method in Section~\ref{subsec:dos} allow streams to survive
-node failure? If affected users rebuild circuits immediately, how much
-anonymity is lost? It seems the problem is even worse in a peer-to-peer
-environment---such systems don't yet provide an incentive for peers to
-stay connected when they're done retrieving content, so we would expect
-a higher churn rate.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\section{Future Directions}
-\label{sec:conclusion}
-
-Tor brings together many innovations into a unified deployable system. The
-next immediate steps include:
-
-\emph{Scalability:} Tor's emphasis on deployability and design simplicity
-has led us to adopt a clique topology, semi-centralized
-directories, and a full-network-visibility model for client
-knowledge. These properties will not scale past a few hundred servers.
-Section~\ref{sec:maintaining-anonymity} describes some promising
-approaches, but more deployment experience will be helpful in learning
-the relative importance of these bottlenecks.
-
-\emph{Bandwidth classes:} This paper assumes that all ORs have
-good bandwidth and latency. We should instead adopt the MorphMix model,
-where nodes advertise their bandwidth level (DSL, T1, T3), and
-Alice avoids bottlenecks by choosing nodes that match or
-exceed her bandwidth. In this way DSL users can usefully join the Tor
-network.
-
-\emph{Incentives:} Volunteers who run nodes are rewarded with publicity
-and possibly better anonymity~\cite{econymics}. More nodes means increased
-scalability, and more users can mean more anonymity. We need to continue
-examining the incentive structures for participating in Tor. Further,
-we need to explore more approaches to limiting abuse, and understand
-why most people don't bother using privacy systems.
-
-\emph{Cover traffic:} Currently Tor omits cover traffic---its costs
-in performance and bandwidth are clear but its security benefits are
-not well understood. We must pursue more research on link-level cover
-traffic and long-range cover traffic to determine whether some simple padding
-method offers provable protection against our chosen adversary.
-
-%%\emph{Offer two relay cell sizes:} Traffic on the Internet tends to be
-%%large for bulk transfers and small for interactive traffic. One cell
-%%size cannot be optimal for both types of traffic.
-% This should go in the spec and todo, but not the paper yet. -RD
-
-\emph{Caching at exit nodes:} Perhaps each exit node should run a
-caching web proxy~\cite{shsm03}, to improve anonymity for cached pages
-(Alice's request never
-leaves the Tor network), to improve speed, and to reduce bandwidth cost.
-On the other hand, forward security is weakened because caches
-constitute a record of retrieved files. We must find the right
-balance between usability and security.
-
-\emph{Better directory distribution:}
-Clients currently download a description of
-the entire network every 15 minutes. As the state grows larger
-and clients more numerous, we may need a solution in which
-clients receive incremental updates to directory state.
-More generally, we must find more
-scalable yet practical ways to distribute up-to-date snapshots of
-network status without introducing new attacks.
-
-\emph{Further specification review:} Our public
-byte-level specification~\cite{tor-spec} needs
-external review. We hope that as Tor
-is deployed, more people will examine its
-specification.
-
-\emph{Multisystem interoperability:} We are currently working with the
-designer of MorphMix to unify the specification and implementation of
-the common elements of our two systems. So far, this seems
-to be relatively straightforward. Interoperability will allow testing
-and direct comparison of the two designs for trust and scalability.
-
-\emph{Wider-scale deployment:} The original goal of Tor was to
-gain experience in deploying an anonymizing overlay network, and
-learn from having actual users. We are now at a point in design
-and development where we can start deploying a wider network. Once
-we have many actual users, we will doubtlessly be better
-able to evaluate some of our design decisions, including our
-robustness/latency tradeoffs, our performance tradeoffs (including
-cell size), our abuse-prevention mechanisms, and
-our overall usability.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%% commented out for anonymous submission
-\section*{Acknowledgments}
- We thank Peter Palfrader, Geoff Goodell, Adam Shostack, Joseph Sokol-Margolis,
- John Bashinski, and Zack Brown
- for editing and comments;
- Matej Pfajfar, Andrei Serjantov, Marc Rennhard for design discussions;
- Bram Cohen for congestion control discussions;
- Adam Back for suggesting telescoping circuits; and
- Cathy Meadows for formal analysis of the \emph{extend} protocol.
- This work has been supported by ONR and DARPA.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\bibliographystyle{latex8}
-\bibliography{tor-design}
-
-\end{document}
-
-% Style guide:
-% U.S. spelling
-% avoid contractions (it's, can't, etc.)
-% prefer ``for example'' or ``such as'' to e.g.
-% prefer ``that is'' to i.e.
-% 'mix', 'mixes' (as noun)
-% 'mix-net'
-% 'mix', 'mixing' (as verb)
-% 'middleman' [Not with a hyphen; the hyphen has been optional
-% since Middle English.]
-% 'nymserver'
-% 'Cypherpunk', 'Cypherpunks', 'Cypherpunk remailer'
-% 'Onion Routing design', 'onion router' [note capitalization]
-% 'SOCKS'
-% Try not to use \cite as a noun.
-% 'Authorizating' sounds great, but it isn't a word.
-% 'First, second, third', not 'Firstly, secondly, thirdly'.
-% 'circuit', not 'channel'
-% Typography: no space on either side of an em dash---ever.
-% Hyphens are for multi-part words; en dashs imply movement or
-% opposition (The Alice--Bob connection); and em dashes are
-% for punctuation---like that.
-% A relay cell; a control cell; a \emph{create} cell; a
-% \emph{relay truncated} cell. Never ``a \emph{relay truncated}.''
-%
-% 'Substitute ``Damn'' every time you're inclined to write ``very;'' your
-% editor will delete it and the writing will be just as it should be.'
-% -- Mark Twain
diff --git a/doc/design-paper/usenix.sty b/doc/design-paper/usenix.sty
deleted file mode 100644
index 4442f11574..0000000000
--- a/doc/design-paper/usenix.sty
+++ /dev/null
@@ -1,98 +0,0 @@
-% usenix-2e.sty - to be used with latex2e (the new one) for USENIX.
-% To use this style file, do this:
-%
-% \documentclass[twocolumn]{article}
-% \usepackage{usenix-2e}
-% and put {\rm ....} around the author names.
-%
-% $Id$
-%
-% The following definitions are modifications of standard article.sty
-% definitions, arranged to do a better job of matching the USENIX
-% guidelines.
-% It will automatically select two-column mode and the Times-Roman
-% font.
-
-%
-% USENIX papers are two-column.
-% Times-Roman font is nice if you can get it (requires NFSS,
-% which is in latex2e.
-
-\if@twocolumn\else\input twocolumn.sty\fi
-\usepackage{times}
-
-%
-% USENIX wants margins of: 7/8" side, 1" bottom, and 3/4" top.
-% 0.25" gutter between columns.
-% Gives active areas of 6.75" x 9.25"
-%
-\setlength{\textheight}{9.0in}
-\setlength{\columnsep}{0.25in}
-%%\setlength{\textwidth}{6.75in}
-\setlength{\textwidth}{7.00in}
-%\setlength{\footheight}{0.0in}
-\setlength{\topmargin}{-0.25in}
-\setlength{\headheight}{0.0in}
-\setlength{\headsep}{0.0in}
-\setlength{\evensidemargin}{-0.125in}
-\setlength{\oddsidemargin}{-0.125in}
-
-%
-% Usenix wants no page numbers for submitted papers, so that they can
-% number them themselves.
-%
-\pagestyle{empty}
-
-%
-% Usenix titles are in 14-point bold type, with no date, and with no
-% change in the empty page headers. The whol author section is 12 point
-% italic--- you must use {\rm } around the actual author names to get
-% them in roman.
-%
-\def\maketitle{\par
- \begingroup
- \renewcommand\thefootnote{\fnsymbol{footnote}}%
- \def\@makefnmark{\hbox to\z@{$\m@th^{\@thefnmark}$\hss}}%
- \long\def\@makefntext##1{\parindent 1em\noindent
- \hbox to1.8em{\hss$\m@th^{\@thefnmark}$}##1}%
- \if@twocolumn
- \twocolumn[\@maketitle]%
- \else \newpage
- \global\@topnum\z@
- \@maketitle \fi\@thanks
- \endgroup
- \setcounter{footnote}{0}%
- \let\maketitle\relax
- \let\@maketitle\relax
- \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax}
-
-\def\@maketitle{\newpage
- \vbox to 2.5in{
- \vspace*{\fill}
- \vskip 2em
- \begin{center}%
- {\Large\bf \@title \par}%
- \vskip 0.375in minus 0.300in
- {\large\it
- \lineskip .5em
- \begin{tabular}[t]{c}\@author
- \end{tabular}\par}%
- \end{center}%
- \par
- \vspace*{\fill}
-% \vskip 1.5em
- }
-}
-
-%
-% The abstract is preceded by a 12-pt bold centered heading
-\def\abstract{\begin{center}%
-{\large\bf \abstractname\vspace{-.5em}\vspace{\z@}}%
-\end{center}}
-\def\endabstract{}
-
-%
-% Main section titles are 12-pt bold. Others can be same or smaller.
-%
-\def\section{\@startsection {section}{1}{\z@}{-3.5ex plus-1ex minus
- -.2ex}{2.3ex plus.2ex}{\reset@font\large\bf}}
diff --git a/doc/design-paper/usenixsubmit.cls b/doc/design-paper/usenixsubmit.cls
deleted file mode 100644
index 743ffcfe4a..0000000000
--- a/doc/design-paper/usenixsubmit.cls
+++ /dev/null
@@ -1,7 +0,0 @@
-% Created by Anil Somayaji
-
-\ProvidesClass{usenixsubmit}
-\LoadClass[11pt,letterpaper]{article}
-\usepackage{times}
-\usepackage[margin=1in]{geometry}
-
diff --git a/doc/privoxy-osx-universal-binary.txt b/doc/privoxy-osx-universal-binary.txt
deleted file mode 100644
index 02a726b83d..0000000000
--- a/doc/privoxy-osx-universal-binary.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-# working patch and options from pnx in #tor
-
-patch -N << "EOF"
---- GNUmakefile.in.orig 2007-11-15 02:39:01.000000000 +0100
-+++ GNUmakefile.in 2007-11-15 02:39:12.000000000 +0100
-@@ -246,7 +246,7 @@
- CFLAGS = @CFLAGS@ @CPPFLAGS@ $(OTHER_CFLAGS) $(SPECIAL_CFLAGS) -Wall \
- @STATIC_PCRE_ONLY@ -Ipcre
-
--LDFLAGS = $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS)
-+LDFLAGS = @LDFLAGS@ $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS)
-
-
- #############################################################################
-EOF
-
-autoheader && autoconf && CFLAGS="-O2 -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" LDFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" ./configure --prefix=/Library/Privoxy/ --disable-dynamic-pcrs --sysconfdir=/Library/Privoxy/ --mandir=/Library/Privoxy/ --disable-dependency-tracking && make
diff --git a/doc/roadmaps/2008-12-19-roadmap-full.pdf b/doc/roadmaps/2008-12-19-roadmap-full.pdf
deleted file mode 100644
index d87171c2d9..0000000000
--- a/doc/roadmaps/2008-12-19-roadmap-full.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/roadmaps/2009-03-11-performance.pdf b/doc/roadmaps/2009-03-11-performance.pdf
deleted file mode 100644
index 3af74ddca5..0000000000
--- a/doc/roadmaps/2009-03-11-performance.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/roadmaps/roadmap-2007.pdf b/doc/roadmaps/roadmap-2007.pdf
deleted file mode 100644
index 2422c05888..0000000000
--- a/doc/roadmaps/roadmap-2007.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/roadmaps/roadmap-2007.tex b/doc/roadmaps/roadmap-2007.tex
deleted file mode 100644
index cebe4a5905..0000000000
--- a/doc/roadmaps/roadmap-2007.tex
+++ /dev/null
@@ -1,690 +0,0 @@
-\documentclass{article}
-
-\usepackage{url}
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-\newcommand{\tmp}[1]{{\bf #1} [......] \\}
-\newcommand{\plan}[1]{ {\bf (#1)}}
-
-\begin{document}
-
-\title{Tor Development Roadmap: Wishlist for Nov 2006--Dec 2007}
-\author{Roger Dingledine \and Nick Mathewson \and Shava Nerad}
-
-\maketitle
-\pagestyle{plain}
-
-% TO DO:
-% add cites
-% add time estimates
-
-
-\section{Introduction}
-%Hi, Roger! Hi, Shava. This paragraph should get deleted soon. Right now,
-%this document goes into about as much detail as I'd like to go into for a
-%technical audience, since that's the audience I know best. It doesn't have
-%time estimates everywhere. It isn't well prioritized, and it doesn't
-%distinguish well between things that need lots of research and things that
-%don't. The breakdowns don't all make sense. There are lots of things where
-%I don't make it clear how they fit into larger goals, and lots of larger
-%goals that don't break down into little things. It isn't all stuff we can do
-%for sure, and it isn't even all stuff we can do for sure in 2007. The
-%tmp\{\} macro indicates stuff I haven't said enough about. That said, here
-%plangoes...
-
-Tor (the software) and Tor (the overall software/network/support/document
-suite) are now experiencing all the crises of success. Over the next year,
-we're probably going to grow more in terms of users, developers, and funding
-than before. This gives us the opportunity to perform long-neglected
-maintenance tasks.
-
-\section{Code and design infrastructure}
-
-\subsection{Protocol revision}
-To maintain backward compatibility, we've postponed major protocol
-changes and redesigns for a long time. Because of this, there are a number
-of sensible revisions we've been putting off until we could deploy several of
-them at once. To do each of these, we first need to discuss design
-alternatives with other cryptographers and outside collaborators to
-make sure that our choices are secure.
-
-First of all, our protocol needs better {\bf versioning support} so that we
-can make backward-incompatible changes to our core protocol. There are
-difficult anonymity issues here, since many naive designs would make it easy
-to tell clients apart (and then track them) based on their supported versions.
-
-With protocol versioning support would come the ability to {\bf future-proof
- our ciphersuites}. For example, not only our OR protocol, but also our
-directory protocol, is pretty firmly tied to the SHA-1 hash function, which
-though not yet known to be insecure for our purposes, has begun to show
-its age. We should
-remove assumptions throughout our design based on the assumption that public
-keys, secret keys, or digests will remain any particular size indefinitely.
-
-Our OR {\bf authentication protocol}, though provably
-secure\cite{tap:pet2006}, relies more on particular aspects of RSA and our
-implementation thereof than we had initially believed. To future-proof
-against changes, we should replace it with a less delicate approach.
-
-\plan{For all the above: 2 person-months to specify, spread over several
- months with time for interaction with external participants. One
- person-month to implement. Start specifying in early 2007.}
-
-We might design a {\bf stream migration} feature so that streams tunneled
-over Tor could be more resilient to dropped connections and changed IPs.
-\plan{Not in 2007.}
-
-A new protocol could support {\bf multiple cell sizes}. Right now, all data
-passes through the Tor network divided into 512-byte cells. This is
-efficient for high-bandwidth protocols, but inefficient for protocols
-like SSH or AIM that send information in small chunks. Of course, we need to
-investigate the extent to which multiple sizes could make it easier for an
-adversary to fingerprint a traffic pattern. \plan{Not in 2007.}
-
-As a part of our design, we should investigate possible {\bf cipher modes}
-other than counter mode. For example, a mode with built-in integrity
-checking, error propagation, and random access could simplify our protocol
-significantly. Sadly, many of these are patented and unavailable for us.
-\plan{Not in 2007.}
-
-\subsection{Scalability}
-
-\subsubsection{Improved directory efficiency}
-Right now, clients download a statement of the {\bf network status} made by
-each directory authority. We could reduce network bandwidth significantly by
-having the authorities jointly sign a statement reflecting their vote on the
-current network status. This would save clients up to 160K per hour, and
-make their view of the network more uniform. Of course, we'd need to make
-sure the voting process was secure and resilient to failures in the
-network.\plan{Must do; specify in 2006. 2 weeks to specify, 3-4 weeks to
- implement.}
-
-We should {\bf shorten router descriptors}, since the current format includes
-a great deal of information that's only of interest to the directory
-authorities, and not of interest to clients. We can do this by having each
-router upload a short-form and a long-form signed descriptor, and having
-clients download only the short form. Even a naive version of this would
-save about 40\% of the bandwidth currently spent by clients downloading
-descriptors.\plan{Must do; specify in 2006. 3-4 weeks.}
-
-We should {\bf have routers upload their descriptors even less often}, so
-that clients do not need to download replacements every 18 hours whether any
-information has changed or not. (As of Tor 0.1.2.3-alpha, clients tolerate
-routers that don't upload often, but routers still upload at least every 18
-hours to support older clients.) \plan{Must do, but not until 0.1.1.x is
-deprecated in mid 2007. 1 week.}
-
-\subsubsection{Non-clique topology}
-Our current network design achieves a certain amount of its anonymity by
-making clients act like each other through the simple expedient of making
-sure that all clients know all servers, and that any server can talk to any
-other server. But as the number of servers increases to serve an
-ever-greater number of clients, these assumptions become impractical.
-
-At worst, if these scalability issues become troubling before a solution is
-found, we can design and build a solution to {\bf split the network into
-multiple slices} until a better solution comes along. This is not ideal,
-since rather than looking like all other users from a point of view of path
-selection, users would ``only'' look like 200,000--300,000 other
-users.\plan{Not unless needed.}
-
-We are in the process of designing {\bf improved schemes for network
- scalability}. Some approaches focus on limiting what an adversary can know
-about what a user knows; others focus on reducing the extent to which an
-adversary can exploit this knowledge. These are currently in their infancy,
-and will probably not be needed in 2007, but they must be designed in 2007 if
-they are to be deployed in 2008.\plan{Design in 2007; unknown difficulty.
- Write a paper.}
-
-\subsubsection{Relay incentives}
-To support more users on the network, we need to get more servers. So far,
-we've relied on volunteerism to attract server operators, and so far it's
-served us well. But in the long run, we need to {\bf design incentives for
- users to run servers} and relay traffic for others. Most obviously, we
-could try to build the network so that servers offered improved service for
-other servers, but we would need to do so without weakening anonymity and
-making it obvious which connections originate from users running servers. We
-have some preliminary designs~\cite{incentives-txt,tor-challenges},
-but need to perform
-some more research to make sure they would be safe and effective.\plan{Write
- a draft paper; 2 person-months.}
-
-\subsection{Portability}
-Our {\bf Windows implementation}, though much improved, continues to lag
-behind Unix and Mac OS X, especially when running as a server. We hope to
-merge promising patches from Mike Chiussi to address this point, and bring
-Windows performance on par with other platforms.\plan{Do in 2007; 1.5 months
- to integrate not counting Mike's work.}
-
-We should have {\bf better support for portable devices}, including modes of
-operation that require less RAM, and that write to disk less frequently (to
-avoid wearing out flash RAM).\plan{Optional; 2 weeks.}
-
-We should {\bf stop using socketpair on Windows}; instead, we can use
-in-memory structures to communicate between cpuworkers and the main thread,
-and between connections.\plan{Optional; 1 week.}
-
-\subsection{Performance: resource usage}
-We've been working on {\bf using less RAM}, especially on servers. This has
-paid off a lot for directory caches in the 0.1.2, which in some cases are
-using 90\% less memory than they used to require. But we can do better,
-especially in the area around our buffer management algorithms, by using an
-approach more like the BSD and Linux kernels use instead of our current ring
-buffer approach. (For OR connections, we can just use queues of cell-sized
-chunks produced with a specialized allocator.) This could potentially save
-around 25 to 50\% of the memory currently allocated for network buffers, and
-make Tor a more attractive proposition for restricted-memory environments
-like old computers, mobile devices, and the like.\plan{Do in 2007; 2-3 weeks
- plus one week measurement.}
-
-We should improve our {\bf bandwidth limiting}. The current system has been
-crucial in making users willing to run servers: nobody is willing to run a
-server if it might use an unbounded amount of bandwidth, especially if they
-are charged for their usage. We can make our system better by letting users
-configure bandwidth limits independently for their own traffic and traffic
-relayed for others; and by adding write limits for users running directory
-servers.\plan{Do in 2006; 2-3 weeks.}
-
-On many hosts, sockets are still in short supply, and will be until we can
-migrate our protocol to UDP. We can {\bf use fewer sockets} by making our
-self-to-self connections happen internally to the code rather than involving
-the operating system's socket implementation.\plan{Optional; 1 week.}
-
-\subsection{Performance: network usage}
-We know too little about how well our current path
-selection algorithms actually spread traffic around the network in practice.
-We should {\bf research the efficacy of our traffic allocation} and either
-assure ourselves that it is close enough to optimal as to need no improvement
-(unlikely) or {\bf identify ways to improve network usage}, and get more
-users' traffic delivered faster. Performing this research will require
-careful thought about anonymity implications.
-
-We should also {\bf examine the efficacy of our congestion control
- algorithm}, and see whether we can improve client performance in the
-presence of a congested network through dynamic `sendme' window sizes or
-other means. This will have anonymity implications too if we aren't careful.
-
-\plan{For both of the above: research, design and write
- a measurement tool in 2007: 1 month. See if we can interest a graduate
- student.}
-
-We should work on making Tor's cell-based protocol perform better on
-networks with low bandwidth
-and high packet loss.\plan{Do in 2007 if we're funded to do it; 4-6 weeks.}
-
-\subsection{Performance scenario: one Tor client, many users}
-We should {\bf improve Tor's performance when a single Tor handles many
- clients}. Many organizations want to manage a single Tor client on their
-firewall for many users, rather than having each user install a separate
-Tor client. We haven't optimized for this scenario, and it is likely that
-there are some code paths in the current implementation that become
-inefficient when a single Tor is servicing hundreds or thousands of client
-connections. (Additionally, it is likely that such clients have interesting
-anonymity requirements the we should investigate.) We should profile Tor
-under appropriate loads, identify bottlenecks, and fix them.\plan{Do in 2007
- if we're funded to do it; 4-8 weeks.}
-
-\subsection{Tor servers on asymmetric bandwidth}
-
-Tor should work better on servers that have asymmetric connections like cable
-or DSL. Because Tor has separate TCP connections between each
-hop, if the incoming bytes are arriving just fine and the outgoing bytes are
-all getting dropped on the floor, the TCP push-back mechanisms don't really
-transmit this information back to the incoming streams.\plan{Do in 2007 since
- related to bandwidth limiting. 3-4 weeks.}
-
-\subsection{Running Tor as both client and server}
-
-Many performance tradeoffs and balances that might need more attention.
-We first need to track and fix whatever bottlenecks emerge; but we also
-need to invent good algorithms for prioritizing the client's traffic
-without starving the server's traffic too much.\plan{No idea; try
-profiling and improving things in 2007.}
-
-\subsection{Protocol redesign for UDP}
-Tor has relayed only TCP traffic since its first versions, and has used
-TLS-over-TCP to do so. This approach has proved reliable and flexible, but
-in the long term we will need to allow UDP traffic on the network, and switch
-some or all of the network to using a UDP transport. {\bf Supporting UDP
- traffic} will make Tor more suitable for protocols that require UDP, such
-as many VOIP protocols. {\bf Using a UDP transport} could greatly reduce
-resource limitations on servers, and make the network far less interruptible
-by lossy connections. Either of these protocol changes would require a great
-deal of design work, however. We hope to be able to enlist the aid of a few
-talented graduate students to assist with the initial design and
-specification, but the actual implementation will require significant testing
-of different reliable transport approaches.\plan{Maybe do a design in 2007 if
-we find an interested academic. Ian or Ben L might be good partners here.}
-
-\section{Blocking resistance}
-
-\subsection{Design for blocking resistance}
-We have written a design document explaining our general approach to blocking
-resistance. We should workshop it with other experts in the field to get
-their ideas about how we can improve Tor's efficacy as an anti-censorship
-tool.
-
-\subsection{Implementation: client-side and bridges-side}
-
-Our anticensorship design calls for some nodes to act as ``bridges''
-that are outside a national firewall, and others inside the firewall to
-act as pure clients. This part of the design is quite clear-cut; we're
-probably ready to begin implementing it. To {\bf implement bridges}, we
-need to have servers publish themselves as limited-availability relays
-to a special bridge authority if they judge they'd make good servers.
-We will also need to help provide documentation for port forwarding,
-and an easy configuration tool for running as a bridge.
-
-To {\bf implement clients}, we need to provide a flexible interface to
-learn about bridges and to act on knowledge of bridges. We also need
-to teach them how to know to use bridges as their first hop, and how to
-fetch directory information from both classes of directory authority.
-
-Clients also need to {\bf use the encrypted directory variant} added in Tor
-0.1.2.3-alpha. This will let them retrieve directory information over Tor
-once they've got their initial bridges. We may want to get the rest of the
-Tor user base to begin using this encrypted directory variant too, to
-provide cover.
-
-Bridges will want to be able to {\bf listen on multiple addresses and ports}
-if they can, to give the adversary more ports to block.
-
-\subsection{Research: anonymity implications from becoming a bridge}
-
-\subsection{Implementation: bridge authority}
-
-The design here is also reasonably clear-cut: we need to run some
-directory authorities with a slightly modified protocol that doesn't leak
-the entire list of bridges. Thus users can learn up-to-date information
-for bridges they already know about, but they can't learn about arbitrary
-new bridges.
-
-\subsection{Normalizing the Tor protocol on the wire}
-Additionally, we should {\bf resist content-based filters}. Though an
-adversary can't see what users are saying, some aspects of our protocol are
-easy to fingerprint {\em as} Tor. We should correct this where possible.
-
-Look like Firefox; or look like nothing?
-Future research: investigate timing similarities with other protocols.
-
-\subsection{Access control for bridges}
-Design/impl: password-protecting bridges, in light of above.
-And/or more general access control.
-
-\subsection{Research: scanning-resistance}
-
-\subsection{Research/Design/Impl: how users discover bridges}
-Our design anticipates an arms race between discovery methods and censors.
-We need to begin the infrastructure on our side quickly, preferably in a
-flexible language like Python, so we can adapt quickly to censorship.
-
-phase one: personal bridges
-phase two: families of personal bridges
-phase three: more structured social network
-phase four: bag of tricks
-Research: phase five...
-
-Integration with Psiphon, etc?
-
-\subsection{Document best practices for users}
-Document best practices for various activities common among
-blocked users (e.g. WordPress use).
-
-\subsection{Research: how to know if a bridge has been blocked?}
-
-\subsection{GeoIP maintenance, and "private" user statistics}
-How to know if the whole idea is working?
-
-\subsection{Research: hiding whether the user is reading or publishing?}
-
-\subsection{Research: how many bridges do you need to know to maintain
-reachability?}
-
-\subsection{Resisting censorship of the Tor website, docs, and mirrors}
-
-We should take some effort to consider {\bf initial distribution of Tor and
- related information} in countries where the Tor website and mirrors are
-censored. (Right now, most countries that block access to Tor block only the
-main website and leave mirrors and the network itself untouched.) Falling
-back on word-of-mouth is always a good last resort, but we should also take
-steps to make sure it's relatively easy for users to get ahold of a copy.
-
-\section{Security}
-
-\subsection{Security research projects}
-
-We should investigate approaches with some promise to help Tor resist
-end-to-end traffic correlation attacks. It's an open research question
-whether (and to what extent) {\bf mixed-latency} networks, {\bf low-volume
- long-distance padding}, or other approaches can resist these attacks, which
-are currently some of the most effective against careful Tor users. We
-should research these questions and perform simulations to identify
-opportunities for strengthening our design without dropping performance to
-unacceptable levels. %Cite something
-\plan{Start doing this in 2007; write a paper. 8-16 weeks.}
-
-We've got some preliminary results suggesting that {\bf a topology-aware
- routing algorithm}~\cite{feamster:wpes2004} could reduce Tor users'
-vulnerability against local or ISP-level adversaries, by ensuring that they
-are never in a position to watch both ends of a connection. We need to
-examine the effects of this approach in more detail and consider side-effects
-on anonymity against other kinds of adversaries. If the approach still looks
-promising, we should investigate ways for clients to implement it (or an
-approximation of it) without having to download routing tables for the whole
-Internet. \plan{Not in 2007 unless a graduate student wants to do it.}
-
-%\tmp{defenses against end-to-end correlation} We don't expect any to work
-%right now, but it would be useful to learn that one did. Alternatively,
-%proving that one didn't would free up researchers in the field to go work on
-%other things.
-%
-% See above; I think I got this.
-
-We should research the efficacy of {\bf website fingerprinting} attacks,
-wherein an adversary tries to match the distinctive traffic and timing
-pattern of the resources constituting a given website to the traffic pattern
-of a user's client. These attacks work great in simulations, but in
-practice we hear they don't work nearly as well. We should get some actual
-numbers to investigate the issue, and figure out what's going on. If we
-resist these attacks, or can improve our design to resist them, we should.
-% add cites
-\plan{Possibly part of end-to-end correlation paper. Otherwise, not in 2007
- unless a graduate student is interested.}
-
-\subsection{Implementation security}
-Right now, each Tor node stores its keys unencrypted. We should {\bf encrypt
- more Tor keys} so that Tor authorities can require a startup password. We
-should look into adding intermediary medium-term ``signing keys'' between
-identity keys and onion keys, so that a password could be required to replace
-a signing key, but not to start Tor. This would improve Tor's long-term
-security, especially in its directory authority infrastructure.\plan{Design this
- as a part of the revised ``v2.1'' directory protocol; implement it in
- 2007. 3-4 weeks.}
-
-We should also {\bf mark RAM that holds key material as non-swappable} so
-that there is no risk of recovering key material from a hard disk
-compromise. This would require submitting patches upstream to OpenSSL, where
-support for marking memory as sensitive is currently in a very preliminary
-state.\plan{Nice to do, but not in immediate Tor scope.}
-
-There are numerous tools for identifying trouble spots in code (such as
-Coverity or even VS2005's code analysis tool) and we should convince somebody
-to run some of them against the Tor codebase. Ideally, we could figure out a
-way to get our code checked periodically rather than just once.\plan{Almost
- no time once we talk somebody into it.}
-
-We should try {\bf protocol fuzzing} to identify errors in our
-implementation.\plan{Not in 2007 unless we find a grad student or
- undergraduate who wants to try.}
-
-Our guard nodes help prevent an attacker from being able to become a chosen
-client's entry point by having each client choose a few favorite entry points
-as ``guards'' and stick to them. We should implement a {\bf directory
- guards} feature to keep adversaries from enumerating Tor users by acting as
-a directory cache.\plan{Do in 2007; 2 weeks.}
-
-\subsection{Detect corrupt exits and other servers}
-With the success of our network, we've attracted servers in many locations,
-operated by many kinds of people. Unfortunately, some of these locations
-have compromised or defective networks, and some of these people are
-untrustworthy or incompetent. Our current design relies on authority
-administrators to identify bad nodes and mark them as nonfunctioning. We
-should {\bf automate the process of identifying malfunctioning nodes} as
-follows:
-
-We should create a generic {\bf feedback mechanism for add-on tools} like
-Mike Perry's ``Snakes on a Tor'' to report failing nodes to authorities.
-\plan{Do in 2006; 1-2 weeks.}
-
-We should write tools to {\bf detect more kinds of innocent node failure},
-such as nodes whose network providers intercept SSL, nodes whose network
-providers censor popular websites, and so on. We should also try to detect
-{\bf routers that snoop traffic}; we could do this by launching connections
-to throwaway accounts, and seeing which accounts get used.\plan{Do in 2007;
- ask Mike Perry if he's interested. 4-6 weeks.}
-
-We should add {\bf an efficient way for authorities to mark a set of servers
- as probably collaborating} though not necessarily otherwise dishonest.
-This happens when an administrator starts multiple routers, but doesn't mark
-them as belonging to the same family.\plan{Do during v2.1 directory protocol
- redesign; 1-2 weeks to implement.}
-
-To avoid attacks where an adversary claims good performance in order to
-attract traffic, we should {\bf have authorities measure node performance}
-(including stability and bandwidth) themselves, and not simply believe what
-they're told. Measuring stability can be done by tracking MTBF. Measuring
-bandwidth can be tricky, since it's hard to distinguish between a server with
-low capacity, and a high-capacity server with most of its capacity in
-use.\plan{Do ``Stable'' in 2007; 2-3 weeks. ``Fast'' will be harder; do it
- if we can interest a grad student.}
-
-{\bf Operating a directory authority should be easier.} We rely on authority
-operators to keep the network running well, but right now their job involves
-too much busywork and administrative overhead. A better interface for them
-to use could free their time to work on exception cases rather than on
-adding named nodes to the network.\plan{Do in 2007; 4-5 weeks.}
-
-\subsection{Protocol security}
-
-In addition to other protocol changes discussed above,
-% And should we move some of them down here? -NM
-we should add {\bf hooks for denial-of-service resistance}; we have some
-preliminary designs, but we shouldn't postpone them until we really need them.
-If somebody tries a DDoS attack against the Tor network, we won't want to
-wait for all the servers and clients to upgrade to a new
-version.\plan{Research project; do this in 2007 if funded.}
-
-\section{Development infrastructure}
-
-\subsection{Build farm}
-We've begun to deploy a cross-platform distributed build farm of hosts
-that build and test the Tor source every time it changes in our development
-repository.
-
-We need to {\bf get more participants}, so that we can test a larger variety
-of platforms. (Previously, we've only found out when our code had broken on
-obscure platforms when somebody got around to building it.)
-
-We need also to {\bf add our dependencies} to the build farm, so that we can
-ensure that libraries we need (especially libevent) do not stop working on
-any important platform between one release and the next.
-
-\plan{This is ongoing as more buildbots arrive.}
-
-\subsection{Improved testing harness}
-Currently, our {\bf unit tests} cover only about 20\% of the code base. This
-is uncomfortably low; we should write more and switch to a more flexible
-testing framework.\plan{Ongoing basis, time permitting.}
-
-We should also write flexible {\bf automated single-host deployment tests} so
-we can more easily verify that the current codebase works with the
-network.\plan{Worthwhile in 2007; would save lots of time. 2-4 weeks.}
-
-We should build automated {\bf stress testing} frameworks so we can see which
-realistic loads cause Tor to perform badly, and regularly profile Tor against
-these loads. This would give us {\it in vitro} performance values to
-supplement our deployment experience.\plan{Worthwhile in 2007; 2-6 weeks.}
-
-We should improve our memory profiling code.\plan{...}
-
-
-\subsection{Centralized build system}
-We currently rely on a separate packager to maintain the packaging system and
-to build Tor on each platform for which we distribute binaries. Separate
-package maintainers is sensible, but separate package builders has meant
-long turnaround times between source releases and package releases. We
-should create the necessary infrastructure for us to produce binaries for all
-major packages within an hour or so of source release.\plan{We should
- brainstorm this at least in 2007.}
-
-\subsection{Improved metrics}
-We need a way to {\bf measure the network's health, capacity, and degree of
- utilization}. Our current means for doing this are ad hoc and not
-completely accurate
-
-We need better ways to {\bf tell which countries are users are coming from,
- and how many there are}. A good perspective of the network helps us
-allocate resources and identify trouble spots, but our current approaches
-will work less and less well as we make it harder for adversaries to
-enumerate users. We'll probably want to shift to a smarter, statistical
-approach rather than our current ``count and extrapolate'' method.
-
-\plan{All of this in 2007 if funded; 4-8 weeks}
-
-% \tmp{We'd like to know how much of the network is getting used.}
-% I think this is covered above -NM
-
-\subsection{Controller library}
-We've done lots of design and development on our controller interface, which
-allows UI applications and other tools to interact with Tor. We could
-encourage the development of more such tools by releasing a {\bf
- general-purpose controller library}, ideally with API support for several
-popular programming languages.\plan{2006 or 2007; 1-2 weeks.}
-
-\section{User experience}
-
-\subsection{Get blocked less, get blocked less broadly}
-Right now, some services block connections from the Tor network because
-they don't have a better
-way to keep vandals from abusing them than blocking IP addresses associated
-with vandalism. Our approach so far has been to educate them about better
-solutions that currently exist, but we should also {\bf create better
-solutions for limiting vandalism by anonymous users} like credential and
-blind-signature based implementations, and encourage their use. Other
-promising starting points including writing a patch and explanation for
-Wikipedia, and helping Freenode to document, maintain, and expand its
-current Tor-friendly position.\plan{Do a writeup here in 2007; 1-2 weeks.}
-
-Those who do block Tor users also block overbroadly, sometimes blacklisting
-operators of Tor servers that do not permit exit to their services. We could
-obviate innocent reasons for doing so by designing a {\bf narrowly-targeted Tor
- RBL service} so that those who wanted to overblock Tor could no longer
-plead incompetence.\plan{Possibly in 2007 if we decide it's a good idea; 3
- weeks.}
-
-\subsection{All-in-one bundle}
-We need a well-tested, well-documented bundle of Tor and supporting
-applications configured to use it correctly. We have an initial
-implementation well under way, but it will need additional work in
-identifying requisite Firefox extensions, identifying security threats,
-improving user experience, and so on. This will need significantly more work
-before it's ready for a general public release.
-
-\subsection{LiveCD Tor}
-We need a nice bootable livecd containing a minimal OS and a few applications
-configured to use it correctly. The Anonym.OS project demonstrated that this
-is quite feasible, but their project is not currently maintained.
-
-\subsection{A Tor client in a VM}
-\tmp{a.k.a JanusVM} which is quite related to the firewall-level deployment
-section below. JanusVM is a Linux kernel running in VMWare. It gets an IP
-address from the network, and serves as a DHCP server for its host Windows
-machine. It intercepts all outgoing traffic and redirects it into Privoxy,
-Tor, etc. This Linux-in-Windows approach may help us with scalability in
-the short term, and it may also be a good long-term solution rather than
-accepting all security risks in Windows.
-
-%\subsection{Interface improvements}
-%\tmp{Allow controllers to manipulate server status.}
-% (Why is this in the User Experience section?) -RD
-% I think it's better left to a generic ``make controller iface better'' item.
-
-\subsection{Firewall-level deployment}
-Another useful deployment mode for some users is using {\bf Tor in a firewall
- configuration}, and directing all their traffic through Tor. This can be a
-little tricky to set up currently, but it's an effective way to make sure no
-traffic leaves the host un-anonymized. To achieve this, we need to {\bf
- improve and port our new TransPort} feature which allows Tor to be used
-without SOCKS support; to {\bf add an anonymizing DNS proxy} feature to Tor;
-and to {\bf construct a recommended set of firewall configurations} to redirect
-traffic to Tor.
-
-This is an area where {\bf deployment via a livecd}, or an installation
-targeted at specialized home routing hardware, could be useful.
-
-\subsection{Assess software and configurations for anonymity risks}
-Right now, users and packagers are more or less on their own when selecting
-Firefox extensions. We should {\bf assemble a recommended list of browser
- extensions} through experiment, and include this in the application bundles
-we distribute.
-
-We should also describe {\bf best practices for using Tor with each class of
- application}. For example, Ethan Zuckerman has written a detailed
-tutorial on how to use Tor, Firefox, GMail, and Wordpress to blog with
-improved safety. There are many other cases on the Internet where anonymity
-would be helpful, and there are a lot of ways to screw up using Tor.
-
-The Foxtor and Torbutton extensions serve similar purposes; we should pick a
-favorite, and merge in the useful features of the other.
-
-%\tmp{clean up our own bundled software:
-%E.g. Merge the good features of Foxtor into Torbutton}
-%
-% What else did you have in mind? -NM
-
-\subsection{Localization}
-Right now, most of our user-facing code is internationalized. We need to
-internationalize the last few hold-outs (like the Tor expert installer), and get
-more translations for the parts that are already internationalized.
-
-Also, we should look into a {\bf unified translator's solution}. Currently,
-since different tools have been internationalized using the
-framework-appropriate method, different tools require translators to localize
-them via different interfaces. Inasmuch as possible, we should make
-translators only need to use a single tool to translate the whole Tor suite.
-
-\section{Support}
-
-It would be nice to set up some {\bf user support infrastructure} and
-{\bf contributor support infrastructure}, especially focusing on server
-operators and on coordinating volunteers.
-
-This includes intuitive and easy ticket systems for bug reports and
-feature suggestions (not just mailing lists with a half dozen people
-and no clear roles for who answers what), but it also includes a more
-personalized and efficient framework for interaction so we keep the
-attention and interest of the contributors, and so we make them feel
-helpful and wanted.
-
-\section{Documentation}
-
-\subsection{Unified documentation scheme}
-
-We need to {\bf inventory our documentation.} Our documentation so far has
-been mostly produced on an {\it ad hoc} basis, in response to particular
-needs and requests. We should figure out what documentation we have, which of
-it (if any) should get priority, and whether we can't put it all into a
-single format.
-
-We could {\bf unify the docs} into a single book-like thing. This will also
-help us identify what sections of the ``book'' are missing.
-
-\subsection{Missing technical documentation}
-
-We should {\bf revise our design paper} to reflect the new decisions and
-research we've made since it was published in 2004. This will help other
-researchers evaluate and suggest improvements to Tor's current design.
-
-Other projects sometimes implement the client side of our protocol. We
-encourage this, but we should write {\bf a document about how to avoid
-excessive resource use}, so we don't need to worry that they will do so
-without regard to the effect of their choices on server resources.
-
-\subsection{Missing user documentation}
-
-Our documentation falls into two broad categories: some is `discoursive' and
-explains in detail why users should take certain actions, and other
-documentation is `comprehensive' and describes all of Tor's features. Right
-now, we have no document that is both deep, readable, and thorough. We
-should correct this by identifying missing spots in our design.
-
-\bibliographystyle{plain} \bibliography{tor-design}
-
-\end{document}
-
diff --git a/doc/roadmaps/roadmap-future.pdf b/doc/roadmaps/roadmap-future.pdf
deleted file mode 100644
index 8300ce19c9..0000000000
--- a/doc/roadmaps/roadmap-future.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/roadmaps/roadmap-future.tex b/doc/roadmaps/roadmap-future.tex
deleted file mode 100644
index 4ab240f977..0000000000
--- a/doc/roadmaps/roadmap-future.tex
+++ /dev/null
@@ -1,895 +0,0 @@
-\documentclass{article}
-
-\usepackage{url}
-\usepackage{fullpage}
-
-\newenvironment{tightlist}{\begin{list}{$\bullet$}{
- \setlength{\itemsep}{0mm}
- \setlength{\parsep}{0mm}
- % \setlength{\labelsep}{0mm}
- % \setlength{\labelwidth}{0mm}
- % \setlength{\topsep}{0mm}
- }}{\end{list}}
-\newcommand{\tmp}[1]{{\bf #1} [......] \\}
-\newcommand{\plan}[1]{ {\bf (#1)}}
-
-\begin{document}
-
-\title{Tor Development Roadmap: Wishlist for 2008 and beyond}
-\author{Roger Dingledine \and Nick Mathewson}
-\date{}
-
-\maketitle
-\pagestyle{plain}
-
-\section{Introduction}
-
-Tor (the software) and Tor (the overall software/network/support/document
-suite) are now experiencing all the crises of success. Over the next
-years, we're probably going to grow even more in terms of users, developers,
-and funding than before. This document attempts to lay out all the
-well-understood next steps that Tor needs to take. We should periodically
-reorganize it to reflect current and intended priorities.
-
-\section{Everybody can be a relay}
-
-We've made a lot of progress towards letting an ordinary Tor client also
-serve as a Tor relay. But these issues remain.
-
-\subsection{UPNP}
-
-We should teach Vidalia how to speak UPNP to automatically open and
-forward ports on common (e.g. Linksys) routers. There are some promising
-Qt-based UPNP libs out there, and in any case there are others (e.g. in
-Perl) that we can base it on.
-
-\subsection{``ORPort auto'' to look for a reachable port}
-
-Vidalia defaults to port 443 on Windows and port 8080 elsewhere. But if
-that port is already in use, or the ISP filters incoming connections
-on that port (some cablemodem providers filter 443 inbound), the user
-needs to learn how to notice this, and then pick a new one and type it
-into Vidalia.
-
-We should add a new option ``auto'' that cycles through a set of preferred
-ports, testing bindability and reachability for each of them, and only
-complains to the user once it's given up on the common choices.
-
-\subsection{Incentives design}
-
-Roger has been working with researchers at Rice University to simulate
-and analyze a new design where the directory authorities assign gold
-stars to well-behaving relays, and then all the relays give priority
-to traffic from gold-starred relays. The great feature of the design is
-that not only does it provide the (explicit) incentive to run a relay,
-but it also aims to grow the overall capacity of the network, so even
-non-relays will benefit.
-
-It needs more analysis, and perhaps more design work, before we try
-deploying it.
-
-\subsection{Windows libevent}
-
-Tor relays still don't work well or reliably on Windows XP or Windows
-Vista, because we don't use the Windows-native ``overlapped IO''
-approach. Christian King made a good start at teaching libevent about
-overlapped IO during Google Summer of Code 2007, and next steps are
-to a) finish that, b) teach Tor to do openssl calls on buffers rather
-than directly to the network, and c) teach Tor to use the new libevent
-buffers approach.
-
-\subsection{Network scaling}
-
-If we attract many more relays, we will need to handle the growing pains
-in terms of getting all the directory information to all the users.
-
-The first piece of this issue is a practical question: since the
-directory size scales linearly with more relays, at some point it
-will no longer be practical for every client to learn about every
-relay. We can try to reduce the amount of information each client needs
-to fetch (e.g. based on fetching less information preemptively as in
-Section~\ref{subsec:fewer-descriptor-fetches} below), but eventually
-clients will need to learn about only a subset of the network, and we
-will need to design good ways to divide up the network information.
-
-The second piece is an anonymity question that arises from this
-partitioning: if Tor's security comes from having all the clients
-behaving in similar ways, yet we are now giving different clients
-different directory information, how can we minimize the new anonymity
-attacks we introduce?
-
-\subsection{Using fewer sockets}
-
-Since in the current network every Tor relay can reach every other Tor
-relay, and we have many times more users than relays, pretty much every
-possible link in the network is in use. That is, the current network
-is a clique in practice.
-
-And since each of these connections requires a TCP socket, it's going
-to be hard for the network to grow much larger: many systems come with
-a default of 1024 file descriptors allowed per process, and raising
-that ulimit is hard for end users. Worse, many low-end gateway/firewall
-routers can't handle this many connections in their routing table.
-
-One approach is a restricted-route topology~\cite{danezis:pet2003}:
-predefine which relays can reach which other relays, and communicate
-these restrictions to the relays and the clients. We need to compute
-which links are acceptable in a way that's decentralized yet scalable,
-and in a way that achieves a small-worlds property; and we
-need an efficient (compact) way to characterize the topology information
-so all the users could keep up to date.
-
-Another approach would be to switch to UDP-based transport between
-relays, so we don't need to keep the TCP sockets open at all. Needs more
-investigation too.
-
-\subsection{Auto bandwidth detection and rate limiting, especially for
- asymmetric connections.}
-
-
-\subsection{Better algorithms for giving priority to local traffic}
-
-Proposal 111 made a lot of progress at separating local traffic from
-relayed traffic, so Tor users can rate limit the relayed traffic at a
-stricter level. But since we want to pass both traffic classes over the
-same TCP connection, we can't keep them entirely separate. The current
-compromise is that we treat all bytes to/from a given connectin as
-local traffic if any of the bytes within the past N seconds were local
-bytes. But a) we could use some more intelligent heuristics, and b)
-this leaks information to an active attacker about when local traffic
-was sent/received.
-
-\subsection{Tolerate absurdly wrong clocks, even for relays}
-
-Many of our users are on Windows, running with a clock several days or
-even several years off from reality. Some of them are even intentionally
-in this state so they can run software that will only run in the past.
-
-Before Tor 0.1.1.x, Tor clients would still function if their clock was
-wildly off --- they simply got a copy of the directory and believed it.
-Starting in Tor 0.1.1.x (and even moreso in Tor 0.2.0.x), the clients
-only use networkstatus documents that they believe to be recent, so
-clients with extremely wrong clocks no longer work. (This bug has been
-an unending source of vague and confusing bug reports.)
-
-The first step is for clients to recognize when all the directory material
-they're fetching has roughly the same offset from their current time,
-and then automatically correct for it.
-
-Once that's working well, clients who opt to become bridge relays should
-be able to use the same approach to serve accurate directory information
-to their bridge users.
-
-\subsection{Risks from being a relay}
-
-Three different research
-papers~\cite{back01,clog-the-queue,attack-tor-oak05} describe ways to
-identify the nodes in a circuit by running traffic through candidate nodes
-and looking for dips in the traffic while the circuit is active. These
-clogging attacks are not that scary in the Tor context so long as relays
-are never clients too. But if we're trying to encourage more clients to
-turn on relay functionality too (whether as bridge relays or as normal
-relays), then we need to understand this threat better and learn how to
-mitigate it.
-
-One promising research direction is to investigate the RelayBandwidthRate
-feature that lets Tor rate limit relayed traffic differently from local
-traffic. Since the attacker's ``clogging'' traffic is not in the same
-bandwidth class as the traffic initiated by the user, it may be harder
-to detect interference. Or it may not be.
-
-\subsection{First a bridge, then a public relay?}
-
-Once enough of the items in this section are done, I want all clients
-to start out automatically detecting their reachability and opting
-to be bridge relays.
-
-Then if they realize they have enough consistency and bandwidth, they
-should automatically upgrade to being non-exit relays.
-
-What metrics should we use for deciding when we're fast enough
-and stable enough to switch? Given that the list of bridge relays needs
-to be kept secret, it doesn't make much sense to switch back.
-
-\section{Tor on low resources / slow links}
-\subsection{Reducing directory fetches further}
-\label{subsec:fewer-descriptor-fetches}
-\subsection{AvoidDiskWrites}
-\subsection{Using less ram}
-\subsection{Better DoS resistance for tor servers / authorities}
-\section{Blocking resistance}
-\subsection{Better bridge-address-distribution strategies}
-\subsection{Get more volunteers running bridges}
-\subsection{Handle multiple bridge authorities}
-\subsection{Anonymity for bridge users: second layer of entry guards, etc?}
-\subsection{More TLS normalization}
-\subsection{Harder to block Tor software distribution}
-\subsection{Integration with Psiphon}
-\section{Packaging}
-\subsection{Switch Privoxy out for Polipo}
- - Make Vidalia able to launch more programs itself
-\subsection{Continue Torbutton improvements}
- especially better docs
-\subsection{Vidalia and stability (especially wrt ongoing Windows problems)}
- learn how to get useful crash reports (tracebacks) from Windows users
-\subsection{Polipo support on Windows}
-\subsection{Auto update for Tor, Vidalia, others}
-\subsection{Tor browser bundle for USB and standalone use}
-\subsection{LiveCD solution}
-\subsection{VM-based solution}
-\subsection{Tor-on-enclave-firewall configuration}
-\subsection{General tutorials on what common applications are Tor-friendly}
-\subsection{Controller libraries (torctl) plus documentation}
-\subsection{Localization and translation (Vidalia, Torbutton, web pages)}
-\section{Interacting better with Internet sites}
-\subsection{Make tordnsel (tor exitlist) better and more well-known}
-\subsection{Nymble}
-\subsection{Work with Wikipedia, Slashdot, Google(, IRC networks)}
-\subsection{IPv6 support for exit destinations}
-\section{Network health}
-\subsection{torflow / soat to detect bad relays}
-\subsection{make authorities more automated}
-\subsection{torstatus pages and better trend tracking}
-\subsection{better metrics for assessing network health / growth}
- - geoip usage-by-country reporting and aggregation
- (Once that's working, switch to Directory guards)
-\section{Performance research}
-\subsection{Load balance better}
-\subsection{Improve our congestion control algorithms}
-\subsection{Two-hops vs Three-hops}
-\subsection{Transport IP packets end-to-end}
-\section{Outreach and user education}
-\subsection{"Who uses Tor" use cases}
-\subsection{Law enforcement contacts}
- - "Was this IP address a Tor relay recently?" database
-\subsection{Commercial/enterprise outreach. Help them use Tor well and
- not fear it.}
-\subsection{NGO outreach and training.}
- - "How to be a safe blogger"
-\subsection{More activist coordinators, more people to answer user questions}
-\subsection{More people to hold hands of server operators}
-\subsection{Teaching the media about Tor}
-\subsection{The-dangers-of-plaintext awareness}
-\subsection{check.torproject.org and other "privacy checkers"}
-\subsection{Stronger legal FAQ for US}
-\subsection{Legal FAQs for other countries}
-\section{Anonymity research}
-\subsection{estimate relay bandwidth more securely}
-\subsection{website fingerprinting attacks}
-\subsection{safer e2e defenses}
-\subsection{Using Tor when you really need anonymity. Can you compose it
- with other steps, like more trusted guards or separate proxies?}
-\subsection{Topology-aware routing; routing-zones, steven's pet2007 paper.}
-\subsection{Exactly what do guard nodes provide?}
-
-Entry guards seem to defend against all sorts of attacks. Can we work
-through all the benefits they provide? Papers like Nikita's CCS 2007
-paper make me think their value is not well-understood by the research
-community.
-
-\section{Organizational growth and stability}
-\subsection{A contingency plan if Roger gets hit by a bus}
- - Get a new executive director
-\subsection{More diversity of funding}
- - Don't rely on any one funder as much
- - Don't rely on any sector or funder category as much
-\subsection{More Tor-funded people who are skilled at peripheral apps like
- Vidalia, Torbutton, Polipo, etc}
-\subsection{More coordinated media handling and strategy}
-\subsection{Clearer and more predictable trademark behavior}
-\subsection{More outside funding for internships, etc e.g. GSoC.}
-\section{Hidden services}
-\subsection{Scaling: how to handle many hidden services}
-\subsection{Performance: how to rendezvous with them quickly}
-\subsection{Authentication/authorization: how to tolerate DoS / load}
-\section{Tor as a general overlay network}
-\subsection{Choose paths / exit by country}
-\subsection{Easier to run your own private servers and have Tor use them
- anywhere in the path}
-\subsection{Easier to run an independent Tor network}
-\section{Code security/correctness}
-\subsection{veracode}
-\subsection{code audit}
-\subsection{more fuzzing tools}
-\subsection{build farm, better testing harness}
-\subsection{Long-overdue code refactoring and cleanup}
-\section{Protocol security}
-\subsection{safer circuit handshake}
-\subsection{protocol versioning for future compatibility}
-\subsection{cell sizes}
-\subsection{adapt to new key sizes, etc}
-
-\bibliographystyle{plain} \bibliography{tor-design}
-
-\end{document}
-
-
-
-
-\section{Code and design infrastructure}
-
-\subsection{Protocol revision}
-To maintain backward compatibility, we've postponed major protocol
-changes and redesigns for a long time. Because of this, there are a number
-of sensible revisions we've been putting off until we could deploy several of
-them at once. To do each of these, we first need to discuss design
-alternatives with other cryptographers and outside collaborators to
-make sure that our choices are secure.
-
-First of all, our protocol needs better {\bf versioning support} so that we
-can make backward-incompatible changes to our core protocol. There are
-difficult anonymity issues here, since many naive designs would make it easy
-to tell clients apart (and then track them) based on their supported versions.
-
-With protocol versioning support would come the ability to {\bf future-proof
- our ciphersuites}. For example, not only our OR protocol, but also our
-directory protocol, is pretty firmly tied to the SHA-1 hash function, which
-though not yet known to be insecure for our purposes, has begun to show
-its age. We should
-remove assumptions throughout our design based on the assumption that public
-keys, secret keys, or digests will remain any particular size indefinitely.
-
-Our OR {\bf authentication protocol}, though provably
-secure\cite{tap:pet2006}, relies more on particular aspects of RSA and our
-implementation thereof than we had initially believed. To future-proof
-against changes, we should replace it with a less delicate approach.
-
-\plan{For all the above: 2 person-months to specify, spread over several
- months with time for interaction with external participants. One
- person-month to implement. Start specifying in early 2007.}
-
-We might design a {\bf stream migration} feature so that streams tunneled
-over Tor could be more resilient to dropped connections and changed IPs.
-\plan{Not in 2007.}
-
-A new protocol could support {\bf multiple cell sizes}. Right now, all data
-passes through the Tor network divided into 512-byte cells. This is
-efficient for high-bandwidth protocols, but inefficient for protocols
-like SSH or AIM that send information in small chunks. Of course, we need to
-investigate the extent to which multiple sizes could make it easier for an
-adversary to fingerprint a traffic pattern. \plan{Not in 2007.}
-
-As a part of our design, we should investigate possible {\bf cipher modes}
-other than counter mode. For example, a mode with built-in integrity
-checking, error propagation, and random access could simplify our protocol
-significantly. Sadly, many of these are patented and unavailable for us.
-\plan{Not in 2007.}
-
-\subsection{Scalability}
-
-\subsubsection{Improved directory efficiency}
-
-We should {\bf have routers upload their descriptors even less often}, so
-that clients do not need to download replacements every 18 hours whether any
-information has changed or not. (As of Tor 0.1.2.3-alpha, clients tolerate
-routers that don't upload often, but routers still upload at least every 18
-hours to support older clients.) \plan{Must do, but not until 0.1.1.x is
-deprecated in mid 2007. 1 week.}
-
-\subsubsection{Non-clique topology}
-Our current network design achieves a certain amount of its anonymity by
-making clients act like each other through the simple expedient of making
-sure that all clients know all servers, and that any server can talk to any
-other server. But as the number of servers increases to serve an
-ever-greater number of clients, these assumptions become impractical.
-
-At worst, if these scalability issues become troubling before a solution is
-found, we can design and build a solution to {\bf split the network into
-multiple slices} until a better solution comes along. This is not ideal,
-since rather than looking like all other users from a point of view of path
-selection, users would ``only'' look like 200,000--300,000 other
-users.\plan{Not unless needed.}
-
-We are in the process of designing {\bf improved schemes for network
- scalability}. Some approaches focus on limiting what an adversary can know
-about what a user knows; others focus on reducing the extent to which an
-adversary can exploit this knowledge. These are currently in their infancy,
-and will probably not be needed in 2007, but they must be designed in 2007 if
-they are to be deployed in 2008.\plan{Design in 2007; unknown difficulty.
- Write a paper.}
-
-\subsubsection{Relay incentives}
-To support more users on the network, we need to get more servers. So far,
-we've relied on volunteerism to attract server operators, and so far it's
-served us well. But in the long run, we need to {\bf design incentives for
- users to run servers} and relay traffic for others. Most obviously, we
-could try to build the network so that servers offered improved service for
-other servers, but we would need to do so without weakening anonymity and
-making it obvious which connections originate from users running servers. We
-have some preliminary designs~\cite{incentives-txt,tor-challenges},
-but need to perform
-some more research to make sure they would be safe and effective.\plan{Write
- a draft paper; 2 person-months.}
-(XXX we did that)
-
-\subsection{Portability}
-Our {\bf Windows implementation}, though much improved, continues to lag
-behind Unix and Mac OS X, especially when running as a server. We hope to
-merge promising patches from Christian King to address this point, and bring
-Windows performance on par with other platforms.\plan{Do in 2007; 1.5 months
- to integrate not counting Mike's work.}
-
-We should have {\bf better support for portable devices}, including modes of
-operation that require less RAM, and that write to disk less frequently (to
-avoid wearing out flash RAM).\plan{Optional; 2 weeks.}
-
-\subsection{Performance: resource usage}
-We've been working on {\bf using less RAM}, especially on servers. This has
-paid off a lot for directory caches in the 0.1.2, which in some cases are
-using 90\% less memory than they used to require. But we can do better,
-especially in the area around our buffer management algorithms, by using an
-approach more like the BSD and Linux kernels use instead of our current ring
-buffer approach. (For OR connections, we can just use queues of cell-sized
-chunks produced with a specialized allocator.) This could potentially save
-around 25 to 50\% of the memory currently allocated for network buffers, and
-make Tor a more attractive proposition for restricted-memory environments
-like old computers, mobile devices, and the like.\plan{Do in 2007; 2-3 weeks
- plus one week measurement.} (XXX We did this, but we need to do something
-more/else.)
-
-\subsection{Performance: network usage}
-We know too little about how well our current path
-selection algorithms actually spread traffic around the network in practice.
-We should {\bf research the efficacy of our traffic allocation} and either
-assure ourselves that it is close enough to optimal as to need no improvement
-(unlikely) or {\bf identify ways to improve network usage}, and get more
-users' traffic delivered faster. Performing this research will require
-careful thought about anonymity implications.
-
-We should also {\bf examine the efficacy of our congestion control
- algorithm}, and see whether we can improve client performance in the
-presence of a congested network through dynamic `sendme' window sizes or
-other means. This will have anonymity implications too if we aren't careful.
-
-\plan{For both of the above: research, design and write
- a measurement tool in 2007: 1 month. See if we can interest a graduate
- student.}
-
-We should work on making Tor's cell-based protocol perform better on
-networks with low bandwidth
-and high packet loss.\plan{Do in 2007 if we're funded to do it; 4-6 weeks.}
-
-\subsection{Performance scenario: one Tor client, many users}
-We should {\bf improve Tor's performance when a single Tor handles many
- clients}. Many organizations want to manage a single Tor client on their
-firewall for many users, rather than having each user install a separate
-Tor client. We haven't optimized for this scenario, and it is likely that
-there are some code paths in the current implementation that become
-inefficient when a single Tor is servicing hundreds or thousands of client
-connections. (Additionally, it is likely that such clients have interesting
-anonymity requirements the we should investigate.) We should profile Tor
-under appropriate loads, identify bottlenecks, and fix them.\plan{Do in 2007
- if we're funded to do it; 4-8 weeks.}
-
-\subsection{Tor servers on asymmetric bandwidth}
-
-Tor should work better on servers that have asymmetric connections like cable
-or DSL. Because Tor has separate TCP connections between each
-hop, if the incoming bytes are arriving just fine and the outgoing bytes are
-all getting dropped on the floor, the TCP push-back mechanisms don't really
-transmit this information back to the incoming streams.\plan{Do in 2007 since
- related to bandwidth limiting. 3-4 weeks.}
-
-\subsection{Running Tor as both client and server}
-
-Many performance tradeoffs and balances that might need more attention.
-We first need to track and fix whatever bottlenecks emerge; but we also
-need to invent good algorithms for prioritizing the client's traffic
-without starving the server's traffic too much.\plan{No idea; try
-profiling and improving things in 2007.}
-
-\subsection{Protocol redesign for UDP}
-Tor has relayed only TCP traffic since its first versions, and has used
-TLS-over-TCP to do so. This approach has proved reliable and flexible, but
-in the long term we will need to allow UDP traffic on the network, and switch
-some or all of the network to using a UDP transport. {\bf Supporting UDP
- traffic} will make Tor more suitable for protocols that require UDP, such
-as many VOIP protocols. {\bf Using a UDP transport} could greatly reduce
-resource limitations on servers, and make the network far less interruptible
-by lossy connections. Either of these protocol changes would require a great
-deal of design work, however. We hope to be able to enlist the aid of a few
-talented graduate students to assist with the initial design and
-specification, but the actual implementation will require significant testing
-of different reliable transport approaches.\plan{Maybe do a design in 2007 if
-we find an interested academic. Ian or Ben L might be good partners here.}
-
-\section{Blocking resistance}
-
-\subsection{Design for blocking resistance}
-We have written a design document explaining our general approach to blocking
-resistance. We should workshop it with other experts in the field to get
-their ideas about how we can improve Tor's efficacy as an anti-censorship
-tool.
-
-\subsection{Implementation: client-side and bridges-side}
-
-Bridges will want to be able to {\bf listen on multiple addresses and ports}
-if they can, to give the adversary more ports to block.
-
-\subsection{Research: anonymity implications from becoming a bridge}
-
-see arma's bridge proposal; e.g. should bridge users use a second layer of
-entry guards?
-
-\subsection{Implementation: bridge authority}
-
-we run some
-directory authorities with a slightly modified protocol that doesn't leak
-the entire list of bridges. Thus users can learn up-to-date information
-for bridges they already know about, but they can't learn about arbitrary
-new bridges.
-
-we need a design for distributing the bridge authority over more than one
-server
-
-\subsection{Normalizing the Tor protocol on the wire}
-Additionally, we should {\bf resist content-based filters}. Though an
-adversary can't see what users are saying, some aspects of our protocol are
-easy to fingerprint {\em as} Tor. We should correct this where possible.
-
-Look like Firefox; or look like nothing?
-Future research: investigate timing similarities with other protocols.
-
-\subsection{Research: scanning-resistance}
-
-\subsection{Research/Design/Impl: how users discover bridges}
-Our design anticipates an arms race between discovery methods and censors.
-We need to begin the infrastructure on our side quickly, preferably in a
-flexible language like Python, so we can adapt quickly to censorship.
-
-phase one: personal bridges
-phase two: families of personal bridges
-phase three: more structured social network
-phase four: bag of tricks
-Research: phase five...
-
-Integration with Psiphon, etc?
-
-\subsection{Document best practices for users}
-Document best practices for various activities common among
-blocked users (e.g. WordPress use).
-
-\subsection{Research: how to know if a bridge has been blocked?}
-
-\subsection{GeoIP maintenance, and "private" user statistics}
-How to know if the whole idea is working?
-
-\subsection{Research: hiding whether the user is reading or publishing?}
-
-\subsection{Research: how many bridges do you need to know to maintain
-reachability?}
-
-\subsection{Resisting censorship of the Tor website, docs, and mirrors}
-
-We should take some effort to consider {\bf initial distribution of Tor and
- related information} in countries where the Tor website and mirrors are
-censored. (Right now, most countries that block access to Tor block only the
-main website and leave mirrors and the network itself untouched.) Falling
-back on word-of-mouth is always a good last resort, but we should also take
-steps to make sure it's relatively easy for users to get ahold of a copy.
-
-\section{Security}
-
-\subsection{Security research projects}
-
-We should investigate approaches with some promise to help Tor resist
-end-to-end traffic correlation attacks. It's an open research question
-whether (and to what extent) {\bf mixed-latency} networks, {\bf low-volume
- long-distance padding}, or other approaches can resist these attacks, which
-are currently some of the most effective against careful Tor users. We
-should research these questions and perform simulations to identify
-opportunities for strengthening our design without dropping performance to
-unacceptable levels. %Cite something
-\plan{Start doing this in 2007; write a paper. 8-16 weeks.}
-
-We've got some preliminary results suggesting that {\bf a topology-aware
- routing algorithm}~\cite{feamster:wpes2004} could reduce Tor users'
-vulnerability against local or ISP-level adversaries, by ensuring that they
-are never in a position to watch both ends of a connection. We need to
-examine the effects of this approach in more detail and consider side-effects
-on anonymity against other kinds of adversaries. If the approach still looks
-promising, we should investigate ways for clients to implement it (or an
-approximation of it) without having to download routing tables for the whole
-Internet. \plan{Not in 2007 unless a graduate student wants to do it.}
-
-%\tmp{defenses against end-to-end correlation} We don't expect any to work
-%right now, but it would be useful to learn that one did. Alternatively,
-%proving that one didn't would free up researchers in the field to go work on
-%other things.
-%
-% See above; I think I got this.
-
-We should research the efficacy of {\bf website fingerprinting} attacks,
-wherein an adversary tries to match the distinctive traffic and timing
-pattern of the resources constituting a given website to the traffic pattern
-of a user's client. These attacks work great in simulations, but in
-practice we hear they don't work nearly as well. We should get some actual
-numbers to investigate the issue, and figure out what's going on. If we
-resist these attacks, or can improve our design to resist them, we should.
-% add cites
-\plan{Possibly part of end-to-end correlation paper. Otherwise, not in 2007
- unless a graduate student is interested.}
-
-\subsection{Implementation security}
-
-We should also {\bf mark RAM that holds key material as non-swappable} so
-that there is no risk of recovering key material from a hard disk
-compromise. This would require submitting patches upstream to OpenSSL, where
-support for marking memory as sensitive is currently in a very preliminary
-state.\plan{Nice to do, but not in immediate Tor scope.}
-
-There are numerous tools for identifying trouble spots in code (such as
-Coverity or even VS2005's code analysis tool) and we should convince somebody
-to run some of them against the Tor codebase. Ideally, we could figure out a
-way to get our code checked periodically rather than just once.\plan{Almost
- no time once we talk somebody into it.}
-
-We should try {\bf protocol fuzzing} to identify errors in our
-implementation.\plan{Not in 2007 unless we find a grad student or
- undergraduate who wants to try.}
-
-Our guard nodes help prevent an attacker from being able to become a chosen
-client's entry point by having each client choose a few favorite entry points
-as ``guards'' and stick to them. We should implement a {\bf directory
- guards} feature to keep adversaries from enumerating Tor users by acting as
-a directory cache.\plan{Do in 2007; 2 weeks.}
-
-\subsection{Detect corrupt exits and other servers}
-With the success of our network, we've attracted servers in many locations,
-operated by many kinds of people. Unfortunately, some of these locations
-have compromised or defective networks, and some of these people are
-untrustworthy or incompetent. Our current design relies on authority
-administrators to identify bad nodes and mark them as nonfunctioning. We
-should {\bf automate the process of identifying malfunctioning nodes} as
-follows:
-
-We should create a generic {\bf feedback mechanism for add-on tools} like
-Mike Perry's ``Snakes on a Tor'' to report failing nodes to authorities.
-\plan{Do in 2006; 1-2 weeks.}
-
-We should write tools to {\bf detect more kinds of innocent node failure},
-such as nodes whose network providers intercept SSL, nodes whose network
-providers censor popular websites, and so on. We should also try to detect
-{\bf routers that snoop traffic}; we could do this by launching connections
-to throwaway accounts, and seeing which accounts get used.\plan{Do in 2007;
- ask Mike Perry if he's interested. 4-6 weeks.}
-
-We should add {\bf an efficient way for authorities to mark a set of servers
- as probably collaborating} though not necessarily otherwise dishonest.
-This happens when an administrator starts multiple routers, but doesn't mark
-them as belonging to the same family.\plan{Do during v2.1 directory protocol
- redesign; 1-2 weeks to implement.}
-
-To avoid attacks where an adversary claims good performance in order to
-attract traffic, we should {\bf have authorities measure node performance}
-(including stability and bandwidth) themselves, and not simply believe what
-they're told. We also measure stability by tracking MTBF. Measuring
-bandwidth will be tricky, since it's hard to distinguish between a server with
-low capacity, and a high-capacity server with most of its capacity in
-use. See also Nikita's NDSS 2008 paper.\plan{Do it if we can interest
-a grad student.}
-
-{\bf Operating a directory authority should be easier.} We rely on authority
-operators to keep the network running well, but right now their job involves
-too much busywork and administrative overhead. A better interface for them
-to use could free their time to work on exception cases rather than on
-adding named nodes to the network.\plan{Do in 2007; 4-5 weeks.}
-
-\subsection{Protocol security}
-
-In addition to other protocol changes discussed above,
-% And should we move some of them down here? -NM
-we should add {\bf hooks for denial-of-service resistance}; we have some
-preliminary designs, but we shouldn't postpone them until we really need them.
-If somebody tries a DDoS attack against the Tor network, we won't want to
-wait for all the servers and clients to upgrade to a new
-version.\plan{Research project; do this in 2007 if funded.}
-
-\section{Development infrastructure}
-
-\subsection{Build farm}
-We've begun to deploy a cross-platform distributed build farm of hosts
-that build and test the Tor source every time it changes in our development
-repository.
-
-We need to {\bf get more participants}, so that we can test a larger variety
-of platforms. (Previously, we've only found out when our code had broken on
-obscure platforms when somebody got around to building it.)
-
-We need also to {\bf add our dependencies} to the build farm, so that we can
-ensure that libraries we need (especially libevent) do not stop working on
-any important platform between one release and the next.
-
-\plan{This is ongoing as more buildbots arrive.}
-
-\subsection{Improved testing harness}
-Currently, our {\bf unit tests} cover only about 20\% of the code base. This
-is uncomfortably low; we should write more and switch to a more flexible
-testing framework.\plan{Ongoing basis, time permitting.}
-
-We should also write flexible {\bf automated single-host deployment tests} so
-we can more easily verify that the current codebase works with the
-network.\plan{Worthwhile in 2007; would save lots of time. 2-4 weeks.}
-
-We should build automated {\bf stress testing} frameworks so we can see which
-realistic loads cause Tor to perform badly, and regularly profile Tor against
-these loads. This would give us {\it in vitro} performance values to
-supplement our deployment experience.\plan{Worthwhile in 2007; 2-6 weeks.}
-
-We should improve our memory profiling code.\plan{...}
-
-
-\subsection{Centralized build system}
-We currently rely on a separate packager to maintain the packaging system and
-to build Tor on each platform for which we distribute binaries. Separate
-package maintainers is sensible, but separate package builders has meant
-long turnaround times between source releases and package releases. We
-should create the necessary infrastructure for us to produce binaries for all
-major packages within an hour or so of source release.\plan{We should
- brainstorm this at least in 2007.}
-
-\subsection{Improved metrics}
-We need a way to {\bf measure the network's health, capacity, and degree of
- utilization}. Our current means for doing this are ad hoc and not
-completely accurate
-
-We need better ways to {\bf tell which countries are users are coming from,
- and how many there are}. A good perspective of the network helps us
-allocate resources and identify trouble spots, but our current approaches
-will work less and less well as we make it harder for adversaries to
-enumerate users. We'll probably want to shift to a smarter, statistical
-approach rather than our current ``count and extrapolate'' method.
-
-\plan{All of this in 2007 if funded; 4-8 weeks}
-
-% \tmp{We'd like to know how much of the network is getting used.}
-% I think this is covered above -NM
-
-\subsection{Controller library}
-We've done lots of design and development on our controller interface, which
-allows UI applications and other tools to interact with Tor. We could
-encourage the development of more such tools by releasing a {\bf
- general-purpose controller library}, ideally with API support for several
-popular programming languages.\plan{2006 or 2007; 1-2 weeks.}
-
-\section{User experience}
-
-\subsection{Get blocked less, get blocked less broadly}
-Right now, some services block connections from the Tor network because
-they don't have a better
-way to keep vandals from abusing them than blocking IP addresses associated
-with vandalism. Our approach so far has been to educate them about better
-solutions that currently exist, but we should also {\bf create better
-solutions for limiting vandalism by anonymous users} like credential and
-blind-signature based implementations, and encourage their use. Other
-promising starting points including writing a patch and explanation for
-Wikipedia, and helping Freenode to document, maintain, and expand its
-current Tor-friendly position.\plan{Do a writeup here in 2007; 1-2 weeks.}
-
-Those who do block Tor users also block overbroadly, sometimes blacklisting
-operators of Tor servers that do not permit exit to their services. We could
-obviate innocent reasons for doing so by designing a {\bf narrowly-targeted Tor
- RBL service} so that those who wanted to overblock Tor could no longer
-plead incompetence.\plan{Possibly in 2007 if we decide it's a good idea; 3
- weeks.}
-
-\subsection{All-in-one bundle}
-We need a well-tested, well-documented bundle of Tor and supporting
-applications configured to use it correctly. We have an initial
-implementation well under way, but it will need additional work in
-identifying requisite Firefox extensions, identifying security threats,
-improving user experience, and so on. This will need significantly more work
-before it's ready for a general public release.
-
-\subsection{LiveCD Tor}
-We need a nice bootable livecd containing a minimal OS and a few applications
-configured to use it correctly. The Anonym.OS project demonstrated that this
-is quite feasible, but their project is not currently maintained.
-
-\subsection{A Tor client in a VM}
-\tmp{a.k.a JanusVM} which is quite related to the firewall-level deployment
-section below. JanusVM is a Linux kernel running in VMWare. It gets an IP
-address from the network, and serves as a DHCP server for its host Windows
-machine. It intercepts all outgoing traffic and redirects it into Privoxy,
-Tor, etc. This Linux-in-Windows approach may help us with scalability in
-the short term, and it may also be a good long-term solution rather than
-accepting all security risks in Windows.
-
-%\subsection{Interface improvements}
-%\tmp{Allow controllers to manipulate server status.}
-% (Why is this in the User Experience section?) -RD
-% I think it's better left to a generic ``make controller iface better'' item.
-
-\subsection{Firewall-level deployment}
-Another useful deployment mode for some users is using {\bf Tor in a firewall
- configuration}, and directing all their traffic through Tor. This can be a
-little tricky to set up currently, but it's an effective way to make sure no
-traffic leaves the host un-anonymized. To achieve this, we need to {\bf
- improve and port our new TransPort} feature which allows Tor to be used
-without SOCKS support; to {\bf add an anonymizing DNS proxy} feature to Tor;
-and to {\bf construct a recommended set of firewall configurations} to redirect
-traffic to Tor.
-
-This is an area where {\bf deployment via a livecd}, or an installation
-targeted at specialized home routing hardware, could be useful.
-
-\subsection{Assess software and configurations for anonymity risks}
-Right now, users and packagers are more or less on their own when selecting
-Firefox extensions. We should {\bf assemble a recommended list of browser
- extensions} through experiment, and include this in the application bundles
-we distribute.
-
-We should also describe {\bf best practices for using Tor with each class of
- application}. For example, Ethan Zuckerman has written a detailed
-tutorial on how to use Tor, Firefox, GMail, and Wordpress to blog with
-improved safety. There are many other cases on the Internet where anonymity
-would be helpful, and there are a lot of ways to screw up using Tor.
-
-The Foxtor and Torbutton extensions serve similar purposes; we should pick a
-favorite, and merge in the useful features of the other.
-
-%\tmp{clean up our own bundled software:
-%E.g. Merge the good features of Foxtor into Torbutton}
-%
-% What else did you have in mind? -NM
-
-\subsection{Localization}
-Right now, most of our user-facing code is internationalized. We need to
-internationalize the last few hold-outs (like the Tor expert installer), and get
-more translations for the parts that are already internationalized.
-
-Also, we should look into a {\bf unified translator's solution}. Currently,
-since different tools have been internationalized using the
-framework-appropriate method, different tools require translators to localize
-them via different interfaces. Inasmuch as possible, we should make
-translators only need to use a single tool to translate the whole Tor suite.
-
-\section{Support}
-
-It would be nice to set up some {\bf user support infrastructure} and
-{\bf contributor support infrastructure}, especially focusing on server
-operators and on coordinating volunteers.
-
-This includes intuitive and easy ticket systems for bug reports and
-feature suggestions (not just mailing lists with a half dozen people
-and no clear roles for who answers what), but it also includes a more
-personalized and efficient framework for interaction so we keep the
-attention and interest of the contributors, and so we make them feel
-helpful and wanted.
-
-\section{Documentation}
-
-\subsection{Unified documentation scheme}
-
-We need to {\bf inventory our documentation.} Our documentation so far has
-been mostly produced on an {\it ad hoc} basis, in response to particular
-needs and requests. We should figure out what documentation we have, which of
-it (if any) should get priority, and whether we can't put it all into a
-single format.
-
-We could {\bf unify the docs} into a single book-like thing. This will also
-help us identify what sections of the ``book'' are missing.
-
-\subsection{Missing technical documentation}
-
-We should {\bf revise our design paper} to reflect the new decisions and
-research we've made since it was published in 2004. This will help other
-researchers evaluate and suggest improvements to Tor's current design.
-
-Other projects sometimes implement the client side of our protocol. We
-encourage this, but we should write {\bf a document about how to avoid
-excessive resource use}, so we don't need to worry that they will do so
-without regard to the effect of their choices on server resources.
-
-\subsection{Missing user documentation}
-
-Our documentation falls into two broad categories: some is `discoursive' and
-explains in detail why users should take certain actions, and other
-documentation is `comprehensive' and describes all of Tor's features. Right
-now, we have no document that is both deep, readable, and thorough. We
-should correct this by identifying missing spots in our design.
-
-\bibliographystyle{plain} \bibliography{tor-design}
-
-\end{document}
-
diff --git a/doc/rump-fc04.mgp b/doc/rump-fc04.mgp
deleted file mode 100644
index efbf6c840c..0000000000
--- a/doc/rump-fc04.mgp
+++ /dev/null
@@ -1,175 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%deffont "standard" xfont "comic sans ms-medium-r"
-%%deffont "thick" xfont "arial black-medium-r"
-%%deffont "typewriter" xfont "courier new-bold-r"
-%%deffont "type2writer" xfont "arial narrow-bold-r"
-%%deffont "standard" tfont "standard.ttf", tmfont "kochi-mincho.ttf"
-%%deffont "thick" tfont "thick.ttf", tmfont "goth.ttf"
-%%deffont "typewriter" tfont "typewriter.ttf", tmfont "goth.ttf"
-%deffont "standard" xfont "helvetica-medium-r", tfont "arial.ttf", tmfont "times.ttf"
-%deffont "thick" xfont "helvetica-bold-r", tfont "arialbd.ttf", tmfont "hoso6.ttf"
-%deffont "italic" xfont "helvetica-italic-r", tfont "ariali.ttf", tmfont "hoso6.ttf"
-%deffont "typewriter" xfont "courier-medium-r", tfont "typewriter.ttf", tmfont "hoso6.ttf"
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Default settings per each line numbers.
-%%
-%default 1 leftfill, size 8, fore "black", back "white", font "thick", hgap 1
-%default 2 size 8, vgap 10, prefix " ", ccolor "black"
-%default 3 size 6, bar "gray70", vgap 0
-%default 4 size 6, fore "black", vgap 0, prefix " ", font "standard"
-%%
-%%default 1 area 90 90, leftfill, size 9, fore "yellow", back "blue", font "thick"
-%%default 2 size 9, vgap 10, prefix " "
-%%default 3 size 7, bar "gray70", vgap 10
-%%default 4 size 7, vgap 30, prefix " ", font "standard"
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Default settings that are applied to TAB-indented lines.
-%%
-%tab 1 size 5, vgap 40, prefix " ", icon arc "red" 50
-%tab 2 size 4, vgap 35, prefix " ", icon delta3 "blue" 40
-%tab 3 size 3, vgap 35, prefix " ", icon dia "DarkViolet" 40
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-%nodefault
-%center, size 9, font "thick", back "white", fore "black"
-
-
-
-Tor:
-%size 8
-Next-generation Onion Routing
-
-
-%size 7
-Roger Dingledine
-Nick Mathewson
-Paul Syverson
-
-%%The Free Haven Project
-%%%font "typewriter", fore "blue"
-%%http://freehaven.net/
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Low-latency anonymity system
-
-%leftfill
-Deployed: 19 nodes, hundreds of users (?)
-
-Many improvements on earlier design
-
-Free software -- available source code
-
-Design is not covered by earlier onion routing
-patent
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Perfect forward secrecy
-
-
-Telescoping circuit
-
- negotiates keys at each hop
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%page
-%%
-%%Separation from "protocol cleaning"
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-No mixing, padding, traffic shaping (yet)
-
-
-Please show us they're worth the usability tradeoff
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%page
-%%
-%%Many TCP streams can share one circuit
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Congestion control
-
-
-Simple rate limiting
-
-Plus have to keep internal nodes from overflowing
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Directory servers
-
-
-Approve new servers
-
-Tell clients who's up right now
-
- plus their keys, location, etc
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Variable exit policies
-
-
-Each server allows different outgoing connections
-
-E.g. no servers allow outgoing mail currently
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-End-to-end integrity checking
-
-
-In previous onion routing, an insider could change
-the text being transmitted:
-
-"dir" => "rm *"
-
-Even an external adversary could do this!
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Rendezvous points
-
-
-allow hidden services
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-Differences / limitations
-
-
-We're TCP-only, not all IP (but we're user-space and very portable)
-
-Not peer-to-peer
-
-No protocol normalization
-
-%%Not unobservable
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%page
-
-We have working code
-
-
-Plus a design document,
-and a byte-level specification
-
-%size 9
-http://freehaven.net/tor/
-
diff --git a/doc/spec/Makefile.am b/doc/spec/Makefile.am
index 208901d9db..e2fef42e81 100644
--- a/doc/spec/Makefile.am
+++ b/doc/spec/Makefile.am
@@ -1,5 +1,5 @@
EXTRA_DIST = tor-spec.txt rend-spec.txt control-spec.txt \
dir-spec.txt socks-extensions.txt path-spec.txt \
- version-spec.txt address-spec.txt
+ version-spec.txt address-spec.txt bridges-spec.txt
diff --git a/doc/spec/address-spec.txt b/doc/spec/address-spec.txt
index 2a84d857e6..ce6d2b65e7 100644
--- a/doc/spec/address-spec.txt
+++ b/doc/spec/address-spec.txt
@@ -1,4 +1,3 @@
-$Id$
Special Hostnames in Tor
Nick Mathewson
@@ -13,7 +12,7 @@ $Id$
These hostnames can be passed to Tor as the address part of a SOCKS4a or
SOCKS5 request. If the application is connected to Tor using an IP-only
- method (such as SOCKS4, TransPort, or NatdPort), these hostnames can be
+ method (such as SOCKS4, TransPort, or NATDPort), these hostnames can be
substituted for certain IP addresses using the MapAddress configuration
option or the MAPADDRESS control command.
@@ -34,10 +33,13 @@ $Id$
"www.google.com.foo.exit=64.233.161.99.foo.exit" to speed subsequent
lookups.
+ The .exit notation is disabled by default as of Tor 0.2.2.1-alpha, due
+ to potential application-level attacks.
+
EXAMPLES:
www.example.com.exampletornode.exit
- Connect to www.example.com from the node called "exampletornode."
+ Connect to www.example.com from the node called "exampletornode".
exampletornode.exit
@@ -54,15 +56,3 @@ $Id$
When Tor sees an address in this format, it tries to look up and connect to
the specified hidden service. See rend-spec.txt for full details.
-4. .noconnect
-
- SYNTAX: [string].noconnect
-
- When Tor sees an address in this format, it immediately closes the
- connection without attaching it to any circuit. This is useful for
- controllers that want to test whether a given application is indeed using
- the same instance of Tor that they're controlling.
-
-5. [XXX Is there a ".virtual" address that we expose too, or is that
-just intended to be internal? -RD]
-
diff --git a/doc/spec/bridges-spec.txt b/doc/spec/bridges-spec.txt
index 4a9b373c8e..647118815c 100644
--- a/doc/spec/bridges-spec.txt
+++ b/doc/spec/bridges-spec.txt
@@ -1,4 +1,3 @@
-$Id$
Tor bridges specification
diff --git a/doc/spec/control-spec-v0.txt b/doc/spec/control-spec-v0.txt
index faf75a64a4..3515d395a6 100644
--- a/doc/spec/control-spec-v0.txt
+++ b/doc/spec/control-spec-v0.txt
@@ -1,4 +1,3 @@
-$Id$
TC: A Tor control protocol (Version 0)
diff --git a/doc/spec/control-spec.txt b/doc/spec/control-spec.txt
index cf92e2b9e3..255adf00a4 100644
--- a/doc/spec/control-spec.txt
+++ b/doc/spec/control-spec.txt
@@ -1,4 +1,3 @@
-$Id$
TC: A Tor control protocol (Version 1)
@@ -16,6 +15,11 @@ $Id$
versions 0.1.0.x; the protocol in this document only works with Tor
versions in the 0.1.1.x series and later.)
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ RFC 2119.
+
1. Protocol outline
TC is a bidirectional message-based protocol. It assumes an underlying
@@ -88,32 +92,39 @@ $Id$
2.4. General-use tokens
- ; Identifiers for servers.
- ServerID = Nickname / Fingerprint
-
- Nickname = 1*19 NicknameChar
- NicknameChar = "a"-"z" / "A"-"Z" / "0" - "9"
- Fingerprint = "$" 40*HEXDIG
-
- ; A "=" indicates that the given nickname is canonical; a "~" indicates
- ; that the given nickname is not canonical. If no nickname is given at
- ; all, Tor does not even have a guess for what this router calls itself.
- LongName = Fingerprint [ ( "=" / "~" ) Nickname ]
+ ; CRLF means, "the ASCII Carriage Return character (decimal value 13)
+ ; followed by the ASCII Linefeed character (decimal value 10)."
+ CRLF = CR LF
; How a controller tells Tor about a particular OR. There are four
; possible formats:
- ; $Digest -- The router whose identity key hashes to the given digest.
+ ; $Fingerprint -- The router whose identity key hashes to the fingerprint.
; This is the preferred way to refer to an OR.
- ; $Digest~Name -- The router whose identity key hashes to the given
- ; digest, but only if the router has the given nickname.
- ; $Digest=Name -- The router whose identity key hashes to the given
- ; digest, but only if the router is Named and has the given
+ ; $Fingerprint~Nickname -- The router whose identity key hashes to the
+ ; given fingerprint, but only if the router has the given nickname.
+ ; $Fingerprint=Nickname -- The router whose identity key hashes to the
+ ; given fingerprint, but only if the router is Named and has the given
; nickname.
- ; Name -- The Named router with the given nickname, or, if no such
+ ; Nickname -- The Named router with the given nickname, or, if no such
; router exists, any router whose nickname matches the one given.
; This is not a safe way to refer to routers, since Named status
; could under some circumstances change over time.
+ ;
+ ; The tokens that implement the above follow:
+
ServerSpec = LongName / Nickname
+ LongName = Fingerprint [ ( "=" / "~" ) Nickname ]
+
+ Fingerprint = "$" 40*HEXDIG
+ NicknameChar = "a"-"z" / "A"-"Z" / "0" - "9"
+ Nickname = 1*19 NicknameChar
+
+ ; What follows is an outdated way to refer to ORs.
+ ; Feature VERBOSE_NAMES replaces ServerID with LongName in events and
+ ; GETINFO results. VERBOSE_NAMES can be enabled starting in Tor version
+ ; 0.1.2.2-alpha and it is always-on in 0.2.2.1-alpha and later.
+ ServerID = Nickname / Fingerprint
+
; Unique identifiers for streams or circuits. Currently, Tor only
; uses digits, but this may change
@@ -220,7 +231,7 @@ $Id$
"INFO" / "NOTICE" / "WARN" / "ERR" / "NEWDESC" / "ADDRMAP" /
"AUTHDIR_NEWDESCS" / "DESCCHANGED" / "STATUS_GENERAL" /
"STATUS_CLIENT" / "STATUS_SERVER" / "GUARD" / "NS" / "STREAM_BW" /
- "CLIENTS_SEEN"
+ "CLIENTS_SEEN" / "NEWCONSENSUS" / "BUILDTIMEOUT_SET"
Any events *not* listed in the SETEVENTS line are turned off; thus, sending
SETEVENTS with an empty body turns off all event reporting.
@@ -271,6 +282,9 @@ $Id$
returns "250 OK" if successful, or "551 Unable to write configuration
to disk" if it can't write the file or some other error occurs.
+ See also the "getinfo config-text" command, if the controller wants
+ to write the torrc file itself.
+
3.7. SIGNAL
Sent from the client to the server. The syntax is:
@@ -379,6 +393,10 @@ $Id$
"config-file" -- The location of Tor's configuration file ("torrc").
+ "config-text" -- The contents that Tor would write if you send it
+ a SAVECONF command, so the controller can write the file to
+ disk itself. [First implemented in 0.2.2.7-alpha.]
+
["exit-policy/prepend" -- The default exit policy lines that Tor will
*prepend* to the ExitPolicy config option.
-- Never implemented. Useful?]
@@ -462,25 +480,36 @@ $Id$
StreamID SP StreamStatus SP CircID SP Target CRLF
"orconn-status"
- A series of lines as for an OR connection status event. Each is of the
- form:
+ A series of lines as for an OR connection status event. In Tor
+ 0.1.2.2-alpha with feature VERBOSE_NAMES enabled and in Tor
+ 0.2.2.1-alpha and later by default, each line is of the form:
+ LongName SP ORStatus CRLF
+
+ In Tor versions 0.1.2.2-alpha through 0.2.2.1-alpha with feature
+ VERBOSE_NAMES turned off and before version 0.1.2.2-alpha, each line
+ is of the form:
ServerID SP ORStatus CRLF
"entry-guards"
A series of lines listing the currently chosen entry guards, if any.
- Each is of the form:
- ServerID2 SP Status [SP ISOTime] CRLF
-
- Status-with-time = ("unlisted") SP ISOTime
- Status = ("up" / "never-connected" / "down" /
- "unusable" / "unlisted" )
+ In Tor 0.1.2.2-alpha with feature VERBOSE_NAMES enabled and in Tor
+ 0.2.2.1-alpha and later by default, each line is of the form:
+ LongName SP Status [SP ISOTime] CRLF
+ In Tor versions 0.1.2.2-alpha through 0.2.2.1-alpha with feature
+ VERBOSE_NAMES turned off and before version 0.1.2.2-alpha, each line
+ is of the form:
+ ServerID2 SP Status [SP ISOTime] CRLF
ServerID2 = Nickname / 40*HEXDIG
- [From 0.1.1.4-alpha to 0.1.1.10-alpha, this was called "helper-nodes".
- Tor still supports calling it that for now, but support will be
- removed in 0.1.3.x.]
+ The definition of Status is the same for both:
+ Status = "up" / "never-connected" / "down" /
+ "unusable" / "unlisted"
+ [From 0.1.1.4-alpha to 0.1.1.10-alpha, entry-guards was called
+ "helper-nodes". Tor still supports calling "helper-nodes", but it
+ is deprecated and should not be used.]
+
[Older versions of Tor (before 0.1.2.x-final) generated 'down' instead
of unlisted/unusable. Current Tors never generate 'down'.]
@@ -503,7 +532,7 @@ $Id$
start and the rest of the interval respectively. The 'interval-start'
and 'interval-end' fields are the borders of the current interval; the
'interval-wake' field is the time within the current interval (if any)
- where we plan[ned] to start being active.
+ where we plan[ned] to start being active. The times are GMT.
"config/names"
A series of lines listing the available configuration options. Each is
@@ -564,14 +593,14 @@ $Id$
states. See Section 4.1.10 for explanations. (Only a few of the
status events are available as getinfo's currently. Let us know if
you want more exposed.)
- "status/reachability/or"
+ "status/reachability-succeeded/or"
0 or 1, depending on whether we've found our ORPort reachable.
- "status/reachability/dir"
+ "status/reachability-succeeded/dir"
0 or 1, depending on whether we've found our DirPort reachable.
- "status/reachability"
+ "status/reachability-succeeded"
"OR=" ("0"/"1") SP "DIR=" ("0"/"1")
- Combines status/reachability/*; controllers MUST ignore unrecognized
- elements in this entry.
+ Combines status/reachability-succeeded/*; controllers MUST ignore
+ unrecognized elements in this entry.
"status/bootstrap-phase"
Returns the most recent bootstrap phase status event
sent. Specifically, it returns a string starting with either
@@ -582,7 +611,7 @@ $Id$
List of currently recommended versions.
"status/version/current"
Status of the current version. One of: new, old, unrecommended,
- recommended, new in series, obsolete.
+ recommended, new in series, obsolete, unknown.
"status/clients-seen"
A summary of which countries we've seen clients from recently,
formatted the same as the CLIENTS_SEEN status event described in
@@ -600,15 +629,20 @@ $Id$
3.10. EXTENDCIRCUIT
Sent from the client to the server. The format is:
- "EXTENDCIRCUIT" SP CircuitID SP
- ServerSpec *("," ServerSpec)
- [SP "purpose=" Purpose] CRLF
+ "EXTENDCIRCUIT" SP CircuitID
+ [SP ServerSpec *("," ServerSpec)
+ SP "purpose=" Purpose] CRLF
This request takes one of two forms: either the CircuitID is zero, in
- which case it is a request for the server to build a new circuit according
- to the specified path, or the CircuitID is nonzero, in which case it is a
- request for the server to extend an existing circuit with that ID according
- to the specified path.
+ which case it is a request for the server to build a new circuit,
+ or the CircuitID is nonzero, in which case it is a request for the
+ server to extend an existing circuit with that ID according to the
+ specified path.
+
+ If the CircuitID is 0, the controller has the option of providing
+ a path for Tor to use to build the circuit. If it does not provide
+ a path, Tor will select one automatically from high capacity nodes
+ according to path-spec.txt.
If CircuitID is 0 and "purpose=" is specified, then the circuit's
purpose is set. Two choices are recognized: "general" and
@@ -750,46 +784,47 @@ $Id$
3.19. USEFEATURE
+ Adding additional features to the control protocol sometimes will break
+ backwards compatibility. Initially such features are added into Tor and
+ disabled by default. USEFEATURE can enable these additional features.
+
The syntax is:
"USEFEATURE" *(SP FeatureName) CRLF
FeatureName = 1*(ALPHA / DIGIT / "_" / "-")
- Sometimes extensions to the controller protocol break compatibility with
- older controllers. In this case, whenever possible, the extensions are
- first included in Tor disabled by default, and only enabled on a given
- controller connection when the "USEFEATURE" command is given. Once a
- "USEFEATURE" command is given, it applies to all subsequent interactions on
- the same connection; to disable an enabled feature, a new controller
- connection must be opened.
+ Feature names are case-insensitive.
- This is a forward-compatibility mechanism; each feature will eventually
- become a regular part of the control protocol in some future version of Tor.
- Tor will ignore a request to use any feature that is already on by default.
- Tor will give a "552" error if any requested feature is not recognized.
+ Once enabled, a feature stays enabled for the duration of the connection
+ to the controller. A new connection to the controller must be opened to
+ disable an enabled feature.
- Feature names are case-insensitive.
+ Features are a forward-compatibility mechanism; each feature will eventually
+ become a standard part of the control protocol. Once a feature becomes part
+ of the protocol, it is always-on. Each feature documents the version it was
+ introduced as a feature and the version in which it became part of the
+ protocol.
+
+ Tor will ignore a request to use any feature that is always-on. Tor will give
+ a 552 error in response to an unrecognized feature.
EXTENDED_EVENTS
Same as passing 'EXTENDED' to SETEVENTS; this is the preferred way to
request the extended event syntax.
- This will not be always-enabled until at least two stable releases
- after 0.1.2.3-alpha, the release where it was first used for
- anything.
+ This feature was first introduced in 0.1.2.3-alpha. It is always-on
+ and part of the protocol in Tor 0.2.2.1-alpha and later.
VERBOSE_NAMES
- Instead of ServerID as specified above, the controller should
- identify ORs by LongName in events and GETINFO results. This format is
- strictly more informative: rather than including Nickname for
- known Named routers and Fingerprint for unknown or unNamed routers, the
- LongName format includes a Fingerprint, an indication of Named status,
- and a Nickname (if one is known).
+ Replaces ServerID with LongName in events and GETINFO results. LongName
+ provides a Fingerprint for all routers, an indication of Named status,
+ and a Nickname if one is known. LongName is strictly more informative
+ than ServerID, which only provides either a Fingerprint or a Nickname.
- This will not be always-enabled until at least two stable releases
- after 0.1.2.2-alpha, the release where it was first available.
+ This feature was first introduced in 0.1.2.2-alpha. It is always-on and
+ part of the protocol in Tor 0.2.2.1-alpha and later.
3.20. RESOLVE
@@ -980,12 +1015,17 @@ $Id$
"FAILED" / ; circuit closed (was not built)
"CLOSED" ; circuit closed (was built)
- Path = ServerID *("," ServerID)
+ Path = LongName *("," LongName)
+ ; In Tor versions 0.1.2.2-alpha through 0.2.2.1-alpha with feature
+ ; VERBOSE_NAMES turned off and before version 0.1.2.2-alpha, Path
+ ; is as follows:
+ Path = ServerID *("," ServerID)
Reason = "NONE" / "TORPROTOCOL" / "INTERNAL" / "REQUESTED" /
"HIBERNATING" / "RESOURCELIMIT" / "CONNECTFAILED" /
"OR_IDENTITY" / "OR_CONN_CLOSED" / "TIMEOUT" /
- "FINISHED" / "DESTROYED" / "NOPATH" / "NOSUCHSERVICE"
+ "FINISHED" / "DESTROYED" / "NOPATH" / "NOSUCHSERVICE" /
+ "MEASUREMENT_EXPIRED"
The path is provided only when the circuit has been extended at least one
hop.
@@ -1029,7 +1069,7 @@ $Id$
Reason = "MISC" / "RESOLVEFAILED" / "CONNECTREFUSED" /
"EXITPOLICY" / "DESTROY" / "DONE" / "TIMEOUT" /
- "HIBERNATING" / "INTERNAL"/ "RESOURCELIMIT" /
+ "NOROUTE" / "HIBERNATING" / "INTERNAL"/ "RESOURCELIMIT" /
"CONNRESET" / "TORPROTOCOL" / "NOTDIRECTORY" / "END"
The "REASON" field is provided only for FAILED, CLOSED, and DETACHED
@@ -1068,19 +1108,26 @@ $Id$
4.1.3. OR Connection status changed
The syntax is:
- "650" SP "ORCONN" SP (ServerID / Target) SP ORStatus [ SP "REASON="
+
+ "650" SP "ORCONN" SP (LongName / Target) SP ORStatus [ SP "REASON="
Reason ] [ SP "NCIRCS=" NumCircuits ] CRLF
ORStatus = "NEW" / "LAUNCHED" / "CONNECTED" / "FAILED" / "CLOSED"
+ ; In Tor versions 0.1.2.2-alpha through 0.2.2.1-alpha with feature
+ ; VERBOSE_NAMES turned off and before version 0.1.2.2-alpha, OR
+ ; Connection is as follows:
+ "650" SP "ORCONN" SP (ServerID / Target) SP ORStatus [ SP "REASON="
+ Reason ] [ SP "NCIRCS=" NumCircuits ] CRLF
+
NEW is for incoming connections, and LAUNCHED is for outgoing
connections. CONNECTED means the TLS handshake has finished (in
either direction). FAILED means a connection is being closed that
hasn't finished its handshake, and CLOSED is for connections that
have handshaked.
- A ServerID is specified unless it's a NEW connection, in which
- case we don't know what server it is yet, so we use Address:Port.
+ A LongName or ServerID is specified unless it's a NEW connection, in
+ which case we don't know what server it is yet, so we use Address:Port.
If extended events are enabled (see 3.19), optional reason and
circuit counting information is provided for CLOSED and FAILED
@@ -1117,7 +1164,11 @@ $Id$
4.1.6. New descriptors available
Syntax:
- "650" SP "NEWDESC" 1*(SP ServerID) CRLF
+ "650" SP "NEWDESC" 1*(SP LongName) CRLF
+ ; In Tor versions 0.1.2.2-alpha through 0.2.2.1-alpha with feature
+ ; VERBOSE_NAMES turned off and before version 0.1.2.2-alpha, it
+ ; is as follows:
+ "650" SP "NEWDESC" 1*(SP ServerID) CRLF
4.1.7. New Address mapping
@@ -1497,6 +1548,23 @@ $Id$
should just look at ACCEPTED_SERVER_DESCRIPTOR and should ignore
this event for now.}
+ SERVER_DESCRIPTOR_STATUS
+ "STATUS=" "LISTED" / "UNLISTED"
+ We just got a new networkstatus consensus, and whether we're in
+ it or not in it has changed. Specifically, status is "listed"
+ if we're listed in it but previous to this point we didn't know
+ we were listed in a consensus; and status is "unlisted" if we
+ thought we should have been listed in it (e.g. we were listed in
+ the last one), but we're not.
+
+ {Moving from listed to unlisted is not necessarily cause for
+ alarm. The relay might have failed a few reachability tests,
+ or the Internet might have had some routing problems. So this
+ feature is mainly to let relay operators know when their relay
+ has successfully been listed in the consensus.}
+
+ [Not implemented yet. We should do this in 0.2.2.x. -RD]
+
NAMESERVER_STATUS
"NS=addr"
"STATUS=" "UP" / "DOWN"
@@ -1581,17 +1649,21 @@ $Id$
4.1.13. Bandwidth used on an application stream
The syntax is:
- "650" SP "STREAM_BW" SP StreamID SP BytesRead SP BytesWritten CRLF
- BytesRead = 1*DIGIT
+ "650" SP "STREAM_BW" SP StreamID SP BytesWritten SP BytesRead CRLF
BytesWritten = 1*DIGIT
+ BytesRead = 1*DIGIT
- BytesRead and BytesWritten are the number of bytes read and written since
- the last STREAM_BW event on this stream. These events are generated about
- once per second per stream; no events are generated for streams that have
- not read or written.
+ BytesWritten and BytesRead are the number of bytes written and read
+ by the application since the last STREAM_BW event on this stream.
- These events apply only to streams entering Tor (such as on a SOCKSPort,
- TransPort, or so on). They are not generated for exiting streams.
+ Note that from Tor's perspective, *reading* a byte on a stream means
+ that the application *wrote* the byte. That's why the order of "written"
+ vs "read" is opposite for stream_bw events compared to bw events.
+
+ These events are generated about once per second per stream; no events
+ are generated for streams that have not written or read. These events
+ apply only to streams entering Tor (such as on a SOCKSPort, TransPort,
+ or so on). They are not generated for exiting streams.
4.1.14. Per-country client stats
@@ -1610,11 +1682,11 @@ $Id$
TimeStarted is a quoted string indicating when the reported summary
counts from (in GMT).
- The CountrySummary keyword has as its argument a comma-separated
- set of "countrycode=count" pairs. For example,
- 650-CLIENTS_SEEN TimeStarted="Thu Dec 25 23:50:43 EST 2008"
- 650 CountrySummary=us=16,de=8,uk=8
-[XXX Matt Edman informs me that the time format above is wrong. -RD]
+ The CountrySummary keyword has as its argument a comma-separated,
+ possibly empty set of "countrycode=count" pairs. For example (without
+ linebreak),
+ 650-CLIENTS_SEEN TimeStarted="2008-12-25 23:50:43"
+ CountrySummary=us=16,de=8,uk=8
4.1.15. New consensus networkstatus has arrived.
@@ -1629,6 +1701,43 @@ $Id$
[First added in 0.2.1.13-alpha]
+4.1.16. New circuit buildtime has been set.
+
+ The syntax is:
+ "650" SP "BUILDTIMEOUT_SET" SP Type SP "TOTAL_TIMES=" Total SP
+ "TIMEOUT_MS=" Timeout SP "XM=" Xm SP "ALPHA=" Alpha SP
+ "CUTOFF_QUANTILE=" Quantile SP "TIMEOUT_RATE=" TimeoutRate SP
+ "CLOSE_MS=" CloseTimeout SP "CLOSE_RATE=" CloseRate
+ CRLF
+ Type = "COMPUTED" / "RESET" / "SUSPENDED" / "DISCARD" / "RESUME"
+ Total = Integer count of timeouts stored
+ Timeout = Integer timeout in milliseconds
+ Xm = Estimated integer Pareto parameter Xm in milliseconds
+ Alpha = Estimated floating point Paredo paremter alpha
+ Quantile = Floating point CDF quantile cutoff point for this timeout
+ TimeoutRate = Floating point ratio of circuits that timeout
+ CloseTimeout = How long to keep measurement circs in milliseconds
+ CloseRate = Floating point ratio of measurement circuits that are closed
+
+ A new circuit build timeout time has been set. If Type is "COMPUTED",
+ Tor has computed the value based on historical data. If Type is "RESET",
+ initialization or drastic network changes have caused Tor to reset
+ the timeout back to the default, to relearn again. If Type is
+ "SUSPENDED", Tor has detected a loss of network connectivity and has
+ temporarily changed the timeout value to the default until the network
+ recovers. If type is "DISCARD", Tor has decided to discard timeout
+ values that likely happened while the network was down. If type is
+ "RESUME", Tor has decided to resume timeout calculation.
+
+ The Total value is the count of circuit build times Tor used in
+ computing this value. It is capped internally at the maximum number
+ of build times Tor stores (NCIRCUITS_TO_OBSERVE).
+
+ The Timeout itself is provided in milliseconds. Internally, Tor rounds
+ this value to the nearest second before using it.
+
+ [First added in 0.2.2.7-alpha]
+
5. Implementation notes
5.1. Authentication
diff --git a/doc/spec/dir-spec-v1.txt b/doc/spec/dir-spec-v1.txt
index 286df664e2..a92fc7999a 100644
--- a/doc/spec/dir-spec-v1.txt
+++ b/doc/spec/dir-spec-v1.txt
@@ -1,4 +1,3 @@
-$Id$
Tor Protocol Specification
diff --git a/doc/spec/dir-spec-v2.txt b/doc/spec/dir-spec-v2.txt
index 4873c4a728..d1be27f3db 100644
--- a/doc/spec/dir-spec-v2.txt
+++ b/doc/spec/dir-spec-v2.txt
@@ -1,4 +1,3 @@
-$Id$
Tor directory protocol, version 2
diff --git a/doc/spec/dir-spec.txt b/doc/spec/dir-spec.txt
index 9a2a62bc46..6e35deb00e 100644
--- a/doc/spec/dir-spec.txt
+++ b/doc/spec/dir-spec.txt
@@ -1,4 +1,3 @@
-$Id$
Tor directory protocol, version 3
@@ -11,7 +10,7 @@ $Id$
Caches and authorities must still support older versions of the
directory protocols, until the versions of Tor that require them are
- finally out of commission. See Section XXXX on backward compatibility.
+ finally out of commission.
This document merges and supersedes the following proposals:
@@ -19,13 +18,15 @@ $Id$
103 Splitting identity key from regularly used signing key
104 Long and Short Router Descriptors
- AS OF 14 JUNE 2007, THIS SPECIFICATION HAS NOT YET BEEN COMPLETELY
- IMPLEMENTED, OR COMPLETELY COMPLETED.
-
XXX when to download certificates.
XXX timeline
XXX fill in XXXXs
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ RFC 2119.
+
0.1. History
The earliest versions of Onion Routing shipped with a list of known
@@ -183,7 +184,8 @@ $Id$
All directory information is uploaded and downloaded with HTTP.
[Authorities also generate and caches also cache documents produced and
- used by earlier versions of this protocol; see section XXX for notes.]
+ used by earlier versions of this protocol; see dir-spec-v1.txt and
+ dir-spec-v2.txt for notes on those versions.]
1.1. What's different from version 2?
@@ -592,9 +594,9 @@ $Id$
with unrecognized items; the protocols line should be preceded with
an "opt" until these Tors are obsolete.]
- "allow-single-hop-exits"
+ "allow-single-hop-exits" NL
- [At most one.]
+ [At most once.]
Present only if the router allows single-hop circuits to make exit
connections. Most Tor servers do not support this: this is
@@ -613,7 +615,7 @@ $Id$
Fingerprint is encoded in hex (using upper-case letters), with
no spaces.
- "published"
+ "published" YYYY-MM-DD HH:MM:SS NL
[Exactly once.]
@@ -628,8 +630,8 @@ $Id$
As documented in 2.1 above. See migration notes in section 2.2.1.
- "geoip-start" YYYY-MM-DD HH:MM:SS NL
- "geoip-client-origins" CC=N,CC=N,... NL
+ ("geoip-start" YYYY-MM-DD HH:MM:SS NL)
+ ("geoip-client-origins" CC=N,CC=N,... NL)
Only generated by bridge routers (see blocking.pdf), and only
when they have been configured with a geoip database.
@@ -642,6 +644,238 @@ $Id$
"geoip-start" is the time at which we began collecting geoip
statistics.
+ "geoip-start" and "geoip-client-origins" have been replaced by
+ "bridge-stats-end" and "bridge-stats-ips" in 0.2.2.4-alpha. The
+ reason is that the measurement interval with "geoip-stats" as
+ determined by subtracting "geoip-start" from "published" could
+ have had a variable length, whereas the measurement interval in
+ 0.2.2.4-alpha and later is set to be exactly 24 hours long. In
+ order to clearly distinguish the new measurement intervals from
+ the old ones, the new keywords have been introduced.
+
+ "bridge-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ A "bridge-stats-end" line, as well as any other "bridge-*" line,
+ is only added when the relay has been running as a bridge for at
+ least 24 hours.
+
+ "bridge-ips" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ unique IP addresses that have connected from that country to the
+ bridge and which are no known relays, rounded up to the nearest
+ multiple of 8.
+
+ "dirreq-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ A "dirreq-stats-end" line, as well as any other "dirreq-*" line,
+ is only added when the relay has opened its Dir port and after 24
+ hours of measuring directory requests.
+
+ "dirreq-v2-ips" CC=N,CC=N,... NL
+ [At most once.]
+ "dirreq-v3-ips" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ unique IP addresses that have connected from that country to
+ request a v2/v3 network status, rounded up to the nearest multiple
+ of 8. Only those IP addresses are counted that the directory can
+ answer with a 200 OK status code.
+
+ "dirreq-v2-reqs" CC=N,CC=N,... NL
+ [At most once.]
+ "dirreq-v3-reqs" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ requests for v2/v3 network statuses from that country, rounded up
+ to the nearest multiple of 8. Only those requests are counted that
+ the directory can answer with a 200 OK status code.
+
+ "dirreq-v2-share" num% NL
+ [At most once.]
+ "dirreq-v3-share" num% NL
+ [At most once.]
+
+ The share of v2/v3 network status requests that the directory
+ expects to receive from clients based on its advertised bandwidth
+ compared to the overall network bandwidth capacity. Shares are
+ formatted in percent with two decimal places. Shares are
+ calculated as means over the whole 24-hour interval.
+
+ "dirreq-v2-resp" status=num,... NL
+ [At most once.]
+ "dirreq-v3-resp" status=nul,... NL
+ [At most once.]
+
+ List of mappings from response statuses to the number of requests
+ for v2/v3 network statuses that were answered with that response
+ status, rounded up to the nearest multiple of 4. Only response
+ statuses with at least 1 response are reported. New response
+ statuses can be added at any time. The current list of response
+ statuses is as follows:
+
+ "ok": a network status request is answered; this number
+ corresponds to the sum of all requests as reported in
+ "dirreq-v2-reqs" or "dirreq-v3-reqs", respectively, before
+ rounding up.
+ "not-enough-sigs: a version 3 network status is not signed by a
+ sufficient number of requested authorities.
+ "unavailable": a requested network status object is unavailable.
+ "not-found": a requested network status is not found.
+ "not-modified": a network status has not been modified since the
+ If-Modified-Since time that is included in the request.
+ "busy": the directory is busy.
+
+ "dirreq-v2-direct-dl" key=val,... NL
+ [At most once.]
+ "dirreq-v3-direct-dl" key=val,... NL
+ [At most once.]
+ "dirreq-v2-tunneled-dl" key=val,... NL
+ [At most once.]
+ "dirreq-v3-tunneled-dl" key=val,... NL
+ [At most once.]
+
+ List of statistics about possible failures in the download process
+ of v2/v3 network statuses. Requests are either "direct"
+ HTTP-encoded requests over the relay's directory port, or
+ "tunneled" requests using a BEGIN_DIR cell over the relay's OR
+ port. The list of possible statistics can change, and statistics
+ can be left out from reporting. The current list of statistics is
+ as follows:
+
+ Successful downloads and failures:
+
+ "complete": a client has finished the download successfully.
+ "timeout": a download did not finish within 10 minutes after
+ starting to send the response.
+ "running": a download is still running at the end of the
+ measurement period for less than 10 minutes after starting to
+ send the response.
+
+ Download times:
+
+ "min", "max": smallest and largest measured bandwidth in B/s.
+ "d[1-4,6-9]": 1st to 4th and 6th to 9th decile of measured
+ bandwidth in B/s. For a given decile i, i/10 of all downloads
+ had a smaller bandwidth than di, and (10-i)/10 of all downloads
+ had a larger bandwidth than di.
+ "q[1,3]": 1st and 3rd quartile of measured bandwidth in B/s. One
+ fourth of all downloads had a smaller bandwidth than q1, one
+ fourth of all downloads had a larger bandwidth than q3, and the
+ remaining half of all downloads had a bandwidth between q1 and
+ q3.
+ "md": median of measured bandwidth in B/s. Half of the downloads
+ had a smaller bandwidth than md, the other half had a larger
+ bandwidth than md.
+
+ "dirreq-read-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM... NL
+ [At most once]
+ "dirreq-write-history" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM... NL
+ [At most once]
+
+ Declare how much bandwidth the OR has spent on answering directory
+ requests. Usage is divided into intervals of NSEC seconds. The
+ YYYY-MM-DD HH:MM:SS field defines the end of the most recent
+ interval. The numbers are the number of bytes used in the most
+ recent intervals, ordered from oldest to newest.
+
+ "entry-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ An "entry-stats-end" line, as well as any other "entry-*"
+ line, is first added after the relay has been running for at least
+ 24 hours.
+
+ "entry-ips" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ unique IP addresses that have connected from that country to the
+ relay and which are no known other relays, rounded up to the
+ nearest multiple of 8.
+
+ "cell-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ A "cell-stats-end" line, as well as any other "cell-*" line,
+ is first added after the relay has been running for at least 24
+ hours.
+
+ "cell-processed-cells" num,...,num NL
+ [At most once.]
+
+ Mean number of processed cells per circuit, subdivided into
+ deciles of circuits by the number of cells they have processed in
+ descending order from loudest to quietest circuits.
+
+ "cell-queued-cells" num,...,num NL
+ [At most once.]
+
+ Mean number of cells contained in queues by circuit decile. These
+ means are calculated by 1) determining the mean number of cells in
+ a single circuit between its creation and its termination and 2)
+ calculating the mean for all circuits in a given decile as
+ determined in "cell-processed-cells". Numbers have a precision of
+ two decimal places.
+
+ "cell-time-in-queue" num,...,num NL
+ [At most once.]
+
+ Mean time cells spend in circuit queues in milliseconds. Times are
+ calculated by 1) determining the mean time cells spend in the
+ queue of a single circuit and 2) calculating the mean for all
+ circuits in a given decile as determined in
+ "cell-processed-cells".
+
+ "cell-circuits-per-decile" num NL
+ [At most once.]
+
+ Mean number of circuits that are included in any of the deciles,
+ rounded up to the next integer.
+
+ "exit-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ An "exit-stats-end" line, as well as any other "exit-*" line, is
+ first added after the relay has been running for at least 24 hours
+ and only if the relay permits exiting (where exiting to a single
+ port and IP address is sufficient).
+
+ "exit-kibibytes-written" port=N,port=N,... NL
+ [At most once.]
+ "exit-kibibytes-read" port=N,port=N,... NL
+ [At most once.]
+
+ List of mappings from ports to the number of kibibytes that the
+ relay has written to or read from exit connections to that port,
+ rounded up to the next full kibibyte.
+
+ "exit-streams-opened" port=N,port=N,... NL
+ [At most once.]
+
+ List of mappings from ports to the number of opened exit streams
+ to that port, rounded up to the nearest multiple of 4.
+
"router-signature" NL Signature NL
[At end, exactly once.]
@@ -795,10 +1029,10 @@ $Id$
generate exactly the same consensus given the same set of votes.
The procedure for deciding when to generate vote and consensus status
- documents are described in section XXX below.
+ documents are described in section 1.4 on the voting timeline.
Status documents contain a preamble, an authority section, a list of
- router status entries, and one more footers signature, in that order.
+ router status entries, and one or more footer signature, in that order.
Unlike other formats described above, a SP in these documents must be a
single space character (hex 20).
@@ -905,6 +1139,53 @@ $Id$
enough votes were counted for the consensus for an authoritative
opinion to have been formed about their status.
+ "params" SP [Parameters] NL
+
+ [At most once]
+
+ Parameter ::= Keyword '=' Int32
+ Int32 ::= A decimal integer between -2147483648 and 2147483647.
+ Parameters ::= Parameter | Parameters SP Parameter
+
+ The parameters list, if present, contains a space-separated list of
+ case-sensitive key-value pairs, sorted in lexical order by
+ their keyword. Each parameter has its own meaning.
+
+ (Only included when the vote is generated with consensus-method 7 or
+ later.)
+
+ Commonly used "param" arguments at this point include:
+
+ "circwindow" -- the default package window that circuits should
+ be established with. It started out at 1000 cells, but some
+ research indicates that a lower value would mean fewer cells in
+ transit in the network at any given time. Obeyed by Tor 0.2.1.20
+ and later.
+
+ "CircuitPriorityHalflifeMsec" -- the halflife parameter used when
+ weighting which circuit will send the next cell. Obeyed by Tor
+ 0.2.2.10-alpha and later. (Versions of Tor between 0.2.2.7-alpha
+ and 0.2.2.10-alpha recognized a "CircPriorityHalflifeMsec" parameter,
+ but mishandled it badly.)
+
+ "perconnbwrate" and "perconnbwburst" -- if set, each relay sets
+ up a separate token bucket for every client OR connection,
+ and rate limits that connection indepedently. Typically left
+ unset, except when used for performance experiments around trac
+ entry 1750. Only honored by relays running Tor 0.2.2.16-alpha
+ and later. (Note that relays running 0.2.2.7-alpha through
+ 0.2.2.14-alpha looked for bwconnrate and bwconnburst, but then
+ did the wrong thing with them; see bug 1830 for details.)
+
+ "refuseunknownexits" -- if set and non-zero, exit relays look at
+ the previous hop of circuits that ask to open an exit stream,
+ and refuse to exit if they don't recognize it as a relay. The
+ goal is to make it harder for people to use them as one-hop
+ proxies. See trac entry 1751 for details.
+
+ See also "2.4.5. Consensus parameters governing behavior"
+ in path-spec.txt for a series of circuit build time related
+ consensus params.
The authority section of a vote contains the following items, followed
in turn by the authority's current key certificate:
@@ -1030,13 +1311,20 @@ $Id$
descriptors if they would cause "v" lines to be over 128 characters
long.
- "w" SP "Bandwidth=" INT NL
+ "w" SP "Bandwidth=" INT [SP "Measured=" INT] NL
[At most once.]
An estimate of the bandwidth of this server, in an arbitrary
unit (currently kilobytes per second). Used to weight router
- selection. Other weighting keywords may be added later.
+ selection.
+
+ Additionally, the Measured= keyword is present in votes by
+ participating bandwidth measurement authorities to indicate
+ a measured bandwidth currently produced by measuring stream
+ capacities.
+
+ Other weighting keywords may be added later.
Clients MUST ignore keywords they do not recognize.
"p" SP ("accept" / "reject") SP PortList NL
@@ -1051,8 +1339,57 @@ $Id$
or does not support (if 'reject') for exit to "most
addresses".
- The signature section contains the following item, which appears
- Exactly Once for a vote, and At Least Once for a consensus.
+ The footer section is delineated in all votes and consensuses supporting
+ consensus method 9 and above with the following:
+
+ "directory-footer" NL
+
+ It contains two subsections, a bandwidths-weights line and a
+ directory-signature.
+
+ The bandwidths-weights line appears At Most Once for a consensus. It does
+ not appear in votes.
+
+ "bandwidth-weights" SP
+ "Wbd=" INT SP "Wbe=" INT SP "Wbg=" INT SP "Wbm=" INT SP
+ "Wdb=" INT SP
+ "Web=" INT SP "Wed=" INT SP "Wee=" INT SP "Weg=" INT SP "Wem=" INT SP
+ "Wgb=" INT SP "Wgd=" INT SP "Wgg=" INT SP "Wgm=" INT SP
+ "Wmb=" INT SP "Wmd=" INT SP "Wme=" INT SP "Wmg=" INT SP "Wmm=" INT NL
+
+ These values represent the weights to apply to router bandwidths during
+ path selection. They are sorted in alphabetical order in the list. The
+ integer values are divided by BW_WEIGHT_SCALE=10000 or the consensus
+ param "bwweightscale". They are:
+
+ Wgg - Weight for Guard-flagged nodes in the guard position
+ Wgm - Weight for non-flagged nodes in the guard Position
+ Wgd - Weight for Guard+Exit-flagged nodes in the guard Position
+
+ Wmg - Weight for Guard-flagged nodes in the middle Position
+ Wmm - Weight for non-flagged nodes in the middle Position
+ Wme - Weight for Exit-flagged nodes in the middle Position
+ Wmd - Weight for Guard+Exit flagged nodes in the middle Position
+
+ Weg - Weight for Guard flagged nodes in the exit Position
+ Wem - Weight for non-flagged nodes in the exit Position
+ Wee - Weight for Exit-flagged nodes in the exit Position
+ Wed - Weight for Guard+Exit-flagged nodes in the exit Position
+
+ Wgb - Weight for BEGIN_DIR-supporting Guard-flagged nodes
+ Wmb - Weight for BEGIN_DIR-supporting non-flagged nodes
+ Web - Weight for BEGIN_DIR-supporting Exit-flagged nodes
+ Wdb - Weight for BEGIN_DIR-supporting Guard+Exit-flagged nodes
+
+ Wbg - Weight for Guard flagged nodes for BEGIN_DIR requests
+ Wbm - Weight for non-flagged nodes for BEGIN_DIR requests
+ Wbe - Weight for Exit-flagged nodes for BEGIN_DIR requests
+ Wbd - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests
+
+ These values are calculated as specified in Section 3.4.3.
+
+ The signature contains the following item, which appears Exactly Once
+ for a vote, and At Least Once for a consensus.
"directory-signature" SP identity SP signing-key-digest NL Signature
@@ -1065,7 +1402,7 @@ $Id$
the signing authority, and "signing-key-digest" is the hex-encoded
digest of the current authority signing key of the signing authority.
-3.3. Deciding how to vote.
+3.3. Assigning flags in a vote
(This section describes how directory authorities choose which status
flags to apply to routers, as of Tor 0.2.0.0-alpha-dev. Later directory
@@ -1128,14 +1465,11 @@ $Id$
least one /8 address space.
"Fast" -- A router is 'Fast' if it is active, and its bandwidth is
- either in the top 7/8ths for known active routers or at least 100KB/s.
+ either in the top 7/8ths for known active routers or at least 20KB/s.
"Guard" -- A router is a possible 'Guard' if its Weighted Fractional
Uptime is at least the median for "familiar" active routers, and if
its bandwidth is at least median or at least 250KB/s.
- If the total bandwidth of active non-BadExit Exit servers is less
- than one third of the total bandwidth of all active servers, no Exit is
- listed as a Guard.
To calculate weighted fractional uptime, compute the fraction
of time that the router is up in any given day, weighting so that
@@ -1179,6 +1513,13 @@ $Id$
rate limit from the router descriptor. It is given in kilobytes
per second, and capped at some arbitrary value (currently 10 MB/s).
+ The Measured= keyword on a "w" line vote is currently computed
+ by multiplying the previous published consensus bandwidth by the
+ ratio of the measured average node stream capacity to the network
+ average. If 3 or more authorities provide a Measured= keyword for
+ a router, the authorities produce a consensus containing a "w"
+ Bandwidth= keyword equal to the median of the Measured= votes.
+
The ports listed in a "p" line should be taken as those ports for
which the router's exit policy permits 'most' addresses, ignoring any
accept not for all addresses, ignoring all rejects for private
@@ -1199,6 +1540,10 @@ $Id$
Known-flags is the union of all flags known by any voter.
+ Entries are given on the "params" line for every keyword on which any
+ authority voted. The values given are the low-median of all votes on
+ that keyword.
+
"client-versions" and "server-versions" are sorted in ascending
order; A version is recommended in the consensus if it is recommended
by more than half of the voting authorities that included a
@@ -1261,6 +1606,14 @@ $Id$
one, breaking ties in favor of the lexicographically larger
vote.) The port list is encoded as specified in 3.4.2.
+ * If consensus-method 6 or later is in use and if 3 or more
+ authorities provide a Measured= keyword in their votes for
+ a router, the authorities produce a consensus containing a
+ Bandwidth= keyword equal to the median of the Measured= votes.
+
+ * If consensus-method 7 or later is in use, the params line is
+ included in the output.
+
The signatures at the end of a consensus document are sorted in
ascending order by identity digest.
@@ -1281,6 +1634,11 @@ $Id$
"3" -- Added legacy ID key support to aid in authority ID key rollovers
"4" -- No longer list routers that are not running in the consensus
"5" -- adds support for "w" and "p" lines.
+ "6" -- Prefers measured bandwidth values rather than advertised
+ "7" -- Provides keyword=integer pairs of consensus parameters
+ "8" -- Provides microdescriptor summaries
+ "9" -- Provides weights for selecting flagged routers in paths
+ "10" -- Fixes edge case bugs in router flag selection weights
Before generating a consensus, an authority must decide which consensus
method to use. To do this, it looks for the highest version number
@@ -1313,6 +1671,168 @@ $Id$
use an accept-style summary and list as much of the port list as is
possible within these 1000 bytes. [XXXX be more specific.]
+3.4.3. Computing Bandwidth Weights
+
+ Let weight_scale = 10000
+
+ Let G be the total bandwidth for Guard-flagged nodes.
+ Let M be the total bandwidth for non-flagged nodes.
+ Let E be the total bandwidth for Exit-flagged nodes.
+ Let D be the total bandwidth for Guard+Exit-flagged nodes.
+ Let T = G+M+E+D
+
+ Let Wgd be the weight for choosing a Guard+Exit for the guard position.
+ Let Wmd be the weight for choosing a Guard+Exit for the middle position.
+ Let Wed be the weight for choosing a Guard+Exit for the exit position.
+
+ Let Wme be the weight for choosing an Exit for the middle position.
+ Let Wmg be the weight for choosing a Guard for the middle position.
+
+ Let Wgg be the weight for choosing a Guard for the guard position.
+ Let Wee be the weight for choosing an Exit for the exit position.
+
+ Balanced network conditions then arise from solutions to the following
+ system of equations:
+
+ Wgg*G + Wgd*D == M + Wmd*D + Wme*E + Wmg*G (guard bw = middle bw)
+ Wgg*G + Wgd*D == Wee*E + Wed*D (guard bw = exit bw)
+ Wed*D + Wmd*D + Wgd*D == D (aka: Wed+Wmd+Wdg = 1)
+ Wmg*G + Wgg*G == G (aka: Wgg = 1-Wmg)
+ Wme*E + Wee*E == E (aka: Wee = 1-Wme)
+
+ We are short 2 constraints with the above set. The remaining constraints
+ come from examining different cases of network load. The following
+ constraints are used in consensus method 10 and above. There are another
+ incorrect and obsolete set of constraints used for these same cases in
+ consensus method 9. For those, see dir-spec.txt in Tor 0.2.2.10-alpha
+ to 0.2.2.16-alpha.
+
+ Case 1: E >= T/3 && G >= T/3 (Neither Exit nor Guard Scarce)
+
+ In this case, the additional two constraints are: Wmg == Wmd,
+ Wed == 1/3.
+
+ This leads to the solution:
+ Wgd = weight_scale/3
+ Wed = weight_scale/3
+ Wmd = weight_scale/3
+ Wee = (weight_scale*(E+G+M))/(3*E)
+ Wme = weight_scale - Wee
+ Wmg = (weight_scale*(2*G-E-M))/(3*G)
+ Wgg = weight_scale - Wmg
+
+ Case 2: E < T/3 && G < T/3 (Both are scarce)
+
+ Let R denote the more scarce class (Rare) between Guard vs Exit.
+ Let S denote the less scarce class.
+
+ Subcase a: R+D < S
+
+ In this subcase, we simply devote all of D bandwidth to the
+ scarce class.
+
+ Wgg = Wee = weight_scale
+ Wmg = Wme = Wmd = 0;
+ if E < G:
+ Wed = weight_scale
+ Wgd = 0
+ else:
+ Wed = 0
+ Wgd = weight_scale
+
+ Subcase b: R+D >= S
+
+ In this case, if M <= T/3, we have enough bandwidth to try to achieve
+ a balancing condition.
+
+ Add constraints Wgg = 1, Wmd == Wgd to maximize bandwidth in the guard
+ position while still allowing exits to be used as middle nodes:
+
+ Wee = (weight_scale*(E - G + M))/E
+ Wed = (weight_scale*(D - 2*E + 4*G - 2*M))/(3*D)
+ Wme = (weight_scale*(G-M))/E
+ Wmg = 0
+ Wgg = weight_scale
+ Wmd = (weight_scale - Wed)/2
+ Wgd = (weight_scale - Wed)/2
+
+ If this system ends up with any values out of range (ie negative, or
+ above weight_scale), use the constraints Wgg == 1 and Wee == 1, since
+ both those positions are scarce:
+
+ Wgg = weight_scale
+ Wee = weight_scale
+ Wed = (weight_scale*(D - 2*E + G + M))/(3*D)
+ Wmd = (weight_Scale*(D - 2*M + G + E))/(3*D)
+ Wme = 0
+ Wmg = 0
+ Wgd = weight_scale - Wed - Wmd
+
+ If M > T/3, then the Wmd weight above will become negative. Set it to 0
+ in this case:
+ Wmd = 0
+ Wgd = weight_scale - Wed
+
+ Case 3: One of E < T/3 or G < T/3
+
+ Let S be the scarce class (of E or G).
+
+ Subcase a: (S+D) < T/3:
+ if G=S:
+ Wgg = Wgd = weight_scale;
+ Wmd = Wed = Wmg = 0;
+ // Minor subcase, if E is more scarce than M,
+ // keep its bandwidth in place.
+ if (E < M) Wme = 0;
+ else Wme = (weight_scale*(E-M))/(2*E);
+ Wee = weight_scale-Wme;
+ if E=S:
+ Wee = Wed = weight_scale;
+ Wmd = Wgd = Wme = 0;
+ // Minor subcase, if G is more scarce than M,
+ // keep its bandwidth in place.
+ if (G < M) Wmg = 0;
+ else Wmg = (weight_scale*(G-M))/(2*G);
+ Wgg = weight_scale-Wmg;
+
+ Subcase b: (S+D) >= T/3
+ if G=S:
+ Add constraints Wgg = 1, Wmd == Wed to maximize bandwidth
+ in the guard position, while still allowing exits to be
+ used as middle nodes:
+ Wgg = weight_scale
+ Wgd = (weight_scale*(D - 2*G + E + M))/(3*D)
+ Wmg = 0
+ Wee = (weight_scale*(E+M))/(2*E)
+ Wme = weight_scale - Wee
+ Wmd = (weight_scale - Wgd)/2
+ Wed = (weight_scale - Wgd)/2
+ if E=S:
+ Add constraints Wee == 1, Wmd == Wgd to maximize bandwidth
+ in the exit position:
+ Wee = weight_scale;
+ Wed = (weight_scale*(D - 2*E + G + M))/(3*D);
+ Wme = 0;
+ Wgg = (weight_scale*(G+M))/(2*G);
+ Wmg = weight_scale - Wgg;
+ Wmd = (weight_scale - Wed)/2;
+ Wgd = (weight_scale - Wed)/2;
+
+ To ensure consensus, all calculations are performed using integer math
+ with a fixed precision determined by the bwweightscale consensus
+ parameter (defaults at 10000).
+
+ For future balancing improvements, Tor clients support 11 additional weights
+ for directory requests and middle weighting. These weights are currently
+ set at weight_scale, with the exception of the following groups of
+ assignments:
+
+ Directory requests use middle weights:
+ Wbd=Wmd, Wbg=Wmg, Wbe=Wme, Wbm=Wmm
+
+ Handle bridges and strange exit policies:
+ Wgm=Wgg, Wem=Wee, Weg=Wed
+
3.5. Detached signatures
Assuming full connectivity, every authority should compute and sign the
@@ -1884,7 +2404,6 @@ $Id$
A. Consensus-negotiation timeline.
-
Period begins: this is the Published time.
Everybody sends votes
Reconciliation: everybody tries to fetch missing votes.
diff --git a/doc/spec/path-spec.txt b/doc/spec/path-spec.txt
index dceb21dad7..2e4207bd56 100644
--- a/doc/spec/path-spec.txt
+++ b/doc/spec/path-spec.txt
@@ -1,4 +1,3 @@
-$Id$
Tor Path Specification
@@ -15,6 +14,11 @@ of their choices.
THIS SPEC ISN'T DONE YET.
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ RFC 2119.
+
1. General operation
Tor begins building circuits as soon as it has enough directory
@@ -72,6 +76,24 @@ of their choices.
is unknown (usually its target IP), but we believe the path probably
supports the request according to the rules given below.
+1.1. A server's bandwidth
+
+ Old versions of Tor did not report bandwidths in network status
+ documents, so clients had to learn them from the routers' advertised
+ server descriptors.
+
+ For versions of Tor prior to 0.2.1.17-rc, everywhere below where we
+ refer to a server's "bandwidth", we mean its clipped advertised
+ bandwidth, computed by taking the smaller of the 'rate' and
+ 'observed' arguments to the "bandwidth" element in the server's
+ descriptor. If a router's advertised bandwidth is greater than
+ MAX_BELIEVABLE_BANDWIDTH (currently 10 MB/s), we clipped to that
+ value.
+
+ For more recent versions of Tor, we take the bandwidth value declared
+ in the consensus, and fall back to the clipped advertised bandwidth
+ only if the consensus does not have bandwidths listed.
+
2. Building circuits
2.1. When we build
@@ -158,6 +180,7 @@ of their choices.
XXXX
+
2.2. Path selection and constraints
We choose the path for each new circuit before we build it. We choose the
@@ -175,26 +198,41 @@ of their choices.
below)
- XXXX Choosing the length
- For circuits that do not need to be "fast", when choosing among
- multiple candidates for a path element, we choose randomly.
+ For "fast" circuits, we only choose nodes with the Fast flag. For
+ non-"fast" circuits, all nodes are eligible.
+
+ For all circuits, we weight node selection according to router bandwidth.
+
+ We also weight the bandwidth of Exit and Guard flagged nodes depending on
+ the fraction of total bandwidth that they make up and depending upon the
+ position they are being selected for.
+
+ These weights are published in the consensus, and are computed as described
+ in Section 3.4.3 of dir-spec.txt. They are:
+
+ Wgg - Weight for Guard-flagged nodes in the guard position
+ Wgm - Weight for non-flagged nodes in the guard Position
+ Wgd - Weight for Guard+Exit-flagged nodes in the guard Position
- For "fast" circuits, we pick a given router as an exit with probability
- proportional to its advertised bandwidth [the smaller of the 'rate' and
- 'observed' arguments to the "bandwidth" element in its descriptor]. If a
- router's advertised bandwidth is greater than MAX_BELIEVABLE_BANDWIDTH
- (currently 10 MB/s), we clip to that value.
+ Wmg - Weight for Guard-flagged nodes in the middle Position
+ Wmm - Weight for non-flagged nodes in the middle Position
+ Wme - Weight for Exit-flagged nodes in the middle Position
+ Wmd - Weight for Guard+Exit flagged nodes in the middle Position
- For non-exit positions on "fast" circuits, we pick routers as above, but
- we weight the clipped advertised bandwidth of Exit-flagged nodes depending
- on the fraction of bandwidth available from non-Exit nodes. Call the
- total clipped advertised bandwidth for Exit nodes under consideration E,
- and the total clipped advertised bandwidth for all nodes under
- consideration T. If E<T/3, we do not consider Exit-flagged nodes.
- Otherwise, we weight their bandwidth with the factor (E-T/3)/E. This
- ensures that bandwidth is evenly distributed over nodes in 3-hop paths.
+ Weg - Weight for Guard flagged nodes in the exit Position
+ Wem - Weight for non-flagged nodes in the exit Position
+ Wee - Weight for Exit-flagged nodes in the exit Position
+ Wed - Weight for Guard+Exit-flagged nodes in the exit Position
- Similarly, guard nodes are weighted by the factor (G-T/3)/G, and not
- considered for non-guard positions if this value is less than 0.
+ Wgb - Weight for BEGIN_DIR-supporting Guard-flagged nodes
+ Wmb - Weight for BEGIN_DIR-supporting non-flagged nodes
+ Web - Weight for BEGIN_DIR-supporting Exit-flagged nodes
+ Wdb - Weight for BEGIN_DIR-supporting Guard+Exit-flagged nodes
+
+ Wbg - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests
+ Wbm - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests
+ Wbe - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests
+ Wbd - Weight for Guard+Exit-flagged nodes for BEGIN_DIR requests
Additionally, we may be building circuits with one or more requests in
mind. Each kind of request puts certain constraints on paths:
@@ -263,8 +301,182 @@ of their choices.
at a given node -- either via the ".exit" notation or because the
destination is running at the same location as an exit node.
+2.4. Learning when to give up ("timeout") on circuit construction
+
+ Since version 0.2.2.8-alpha, Tor attempts to learn when to give up on
+ circuits based on network conditions.
+
+2.4.1 Distribution choice and parameter estimation
+
+ Based on studies of build times, we found that the distribution of
+ circuit build times appears to be a Frechet distribution. However,
+ estimators and quantile functions of the Frechet distribution are
+ difficult to work with and slow to converge. So instead, since we
+ are only interested in the accuracy of the tail, we approximate
+ the tail of the distribution with a Pareto curve.
+
+ We calculate the parameters for a Pareto distribution fitting the data
+ using the estimators in equation 4 from:
+ http://portal.acm.org/citation.cfm?id=1647962.1648139
+
+ This is:
+
+ alpha_m = s/(ln(U(X)/Xm^n))
+
+ where s is the total number of completed circuits we have seen, and
+
+ U(X) = x_max^u * Prod_s{x_i}
+
+ with x_i as our i-th completed circuit time, x_max as the longest
+ completed circuit build time we have yet observed, u as the
+ number of unobserved timeouts that have no exact value recorded,
+ and n as u+s, the total number of circuits that either timeout or
+ complete.
+
+ Using log laws, we compute this as the sum of logs to avoid
+ overflow and ln(1.0+epsilon) precision issues:
+
+ alpha_m = s/(u*ln(x_max) + Sum_s{ln(x_i)} - n*ln(Xm))
+
+ This estimator is closely related to the parameters present in:
+ http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation
+ except they are adjusted to handle the fact that our samples are
+ right-censored at the timeout cutoff.
+
+ Additionally, because this is not a true Pareto distribution, we alter
+ how Xm is computed. The Xm parameter is computed as the midpoint of the most
+ frequently occurring 50ms histogram bin, until the point where 1000
+ circuits are recorded. After this point, the weighted average of the top
+ 'cbtnummodes' (default: 3) midpoint modes is used as Xm. All times below
+ this value are counted as having the midpoint value of this weighted average bin.
+
+ The timeout itself is calculated by using the Pareto Quantile function (the
+ inverted CDF) to give us the value on the CDF such that 80% of the mass
+ of the distribution is below the timeout value.
+
+ Thus, we expect that the Tor client will accept the fastest 80% of
+ the total number of paths on the network.
+
+2.4.2. How much data to record
+
+ From our observations, the minimum number of circuit build times for a
+ reasonable fit appears to be on the order of 100. However, to keep a
+ good fit over the long term, we store 1000 most recent circuit build times
+ in a circular array.
+
+ The Tor client should build test circuits at a rate of one per
+ minute up until 100 circuits are built. This allows a fresh Tor to have
+ a CircuitBuildTimeout estimated within 1.5 hours after install,
+ upgrade, or network change (see below).
+
+ Timeouts are stored on disk in a histogram of 50ms bin width, the same
+ width used to calculate the Xm value above. This histogram must be shuffled
+ after being read from disk, to preserve a proper expiration of old values
+ after restart.
+
+2.4.3. How to record timeouts
+
+ Circuits that pass the timeout threshold should be allowed to continue
+ building until a time corresponding to the point 'cbtclosequantile'
+ (default 95) on the Pareto curve, or 60 seconds, whichever is greater.
+
+ The actual completion times for these circuits should be recorded.
+ Implementations should completely abandon a circuit and record a value
+ as an 'unknown' timeout if the total build time exceeds this threshold.
+
+ The reason for this is that right-censored pareto estimators begin to lose
+ their accuracy if more than approximately 5% of the values are censored.
+ Since we wish to set the cutoff at 20%, we must allow circuits to continue
+ building past this cutoff point up to the 95th percentile.
+
+2.4.4. Detecting Changing Network Conditions
+
+ We attempt to detect both network connectivity loss and drastic
+ changes in the timeout characteristics.
+
+ We assume that we've had network connectivity loss if 3 circuits
+ timeout and we've received no cells or TLS handshakes since those
+ circuits began. We then temporarily set the timeout to 60 seconds
+ and stop counting timeouts.
+
+ If 3 more circuits timeout and the network still has not been
+ live within this new 60 second timeout window, we then discard
+ the previous timeouts during this period from our history.
+
+ To detect changing network conditions, we keep a history of
+ the timeout or non-timeout status of the past 20 circuits that
+ successfully completed at least one hop. If more than 90% of
+ these circuits timeout, we discard all buildtimes history, reset
+ the timeout to 60, and then begin recomputing the timeout.
+
+ If the timeout was already 60 or higher, we double the timeout.
+
+2.4.5. Consensus parameters governing behavior
+
+ Clients that implement circuit build timeout learning should obey the
+ following consensus parameters that govern behavior, in order to allow
+ us to handle bugs or other emergent behaviors due to client circuit
+ construction. If these parameters are not present in the consensus,
+ the listed default values should be used instead.
-2.4. Handling failure
+ cbtdisabled
+ Default: 0
+ Effect: If non-zero, all CircuitBuildTime learning code should be
+ disabled and history should be discarded. For use in
+ emergency situations only.
+
+ cbtnummodes
+ Default: 3
+ Effect: This value governs how many modes to use in the weighted
+ average calculation of Pareto paramter Xm. A value of 3 introduces
+ some bias (2-5% of CDF) under ideal conditions, but allows for better
+ performance in the event that a client chooses guard nodes of radically
+ different performance characteristics.
+
+ cbtrecentcount
+ Default: 20
+ Effect: This is the number of circuit build times to keep track of
+ for the following option.
+
+ cbtmaxtimeouts
+ Default: 18
+ Effect: When this many timeouts happen in the last 'cbtrecentcount'
+ circuit attempts, the client should discard all of its
+ history and begin learning a fresh timeout value.
+
+ cbtmincircs
+ Default: 100
+ Effect: This is the minimum number of circuits to build before
+ computing a timeout.
+
+ cbtquantile
+ Default: 80
+ Effect: This is the position on the quantile curve to use to set the
+ timeout value. It is a percent (0-99).
+
+ cbtclosequantile
+ Default: 95
+ Effect: This is the position on the quantile curve to use to set the
+ timeout value to use to actually close circuits. It is a percent
+ (0-99).
+
+ cbttestfreq
+ Default: 60
+ Effect: Describes how often in seconds to build a test circuit to
+ gather timeout values. Only applies if less than 'cbtmincircs'
+ have been recorded.
+
+ cbtmintimeout
+ Default: 2000
+ Effect: This is the minimum allowed timeout value in milliseconds.
+
+ cbtinitialtimeout
+ Default: 60000
+ Effect: This is the timeout value to use before computing a timeout,
+ in milliseconds.
+
+
+2.5. Handling failure
If an attempt to extend a circuit fails (either because the first create
failed or a subsequent extend failed) then the circuit is torn down and is
@@ -306,7 +518,7 @@ of their choices.
We use Guard nodes (also called "helper nodes" in the literature) to
prevent certain profiling attacks. Here's the risk: if we choose entry and
exit nodes at random, and an attacker controls C out of N servers
- (ignoring advertised bandwidth), then the
+ (ignoring bandwidth), then the
attacker will control the entry and exit node of any given circuit with
probability (C/N)^2. But as we make many different circuits over time,
then the probability that the attacker will see a sample of about (C/N)^2
diff --git a/doc/spec/proposals/000-index.txt b/doc/spec/proposals/000-index.txt
index d75157650d..f6f313e58d 100644
--- a/doc/spec/proposals/000-index.txt
+++ b/doc/spec/proposals/000-index.txt
@@ -1,7 +1,5 @@
Filename: 000-index.txt
Title: Index of Tor Proposals
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 26-Jan-2007
Status: Meta
@@ -56,7 +54,7 @@ Proposals by number:
131 Help users to verify they are using Tor [NEEDS-REVISION]
132 A Tor Web Service For Verifying Correct Browser Configuration [DRAFT]
133 Incorporate Unreachable ORs into the Tor Network [DRAFT]
-134 More robust consensus voting with diverse authority sets [ACCEPTED]
+134 More robust consensus voting with diverse authority sets [REJECTED]
135 Simplify Configuration of Private Tor Networks [CLOSED]
136 Mass authority migration with legacy keys [CLOSED]
137 Keep controllers informed as Tor bootstraps [CLOSED]
@@ -73,7 +71,7 @@ Proposals by number:
148 Stream end reasons from the client side should be uniform [CLOSED]
149 Using data from NETINFO cells [OPEN]
150 Exclude Exit Nodes from a circuit [CLOSED]
-151 Improving Tor Path Selection [DRAFT]
+151 Improving Tor Path Selection [FINISHED]
152 Optionally allow exit from single-hop circuits [CLOSED]
153 Automatic software update protocol [SUPERSEDED]
154 Automatic Software Update Protocol [SUPERSEDED]
@@ -82,6 +80,20 @@ Proposals by number:
157 Make certificate downloads specific [ACCEPTED]
158 Clients download consensus + microdescriptors [OPEN]
159 Exit Scanning [OPEN]
+160 Authorities vote for bandwidth offsets in consensus [FINISHED]
+161 Computing Bandwidth Adjustments [FINISHED]
+162 Publish the consensus in multiple flavors [OPEN]
+163 Detecting whether a connection comes from a client [OPEN]
+164 Reporting the status of server votes [OPEN]
+165 Easy migration for voting authority sets [OPEN]
+166 Including Network Statistics in Extra-Info Documents [ACCEPTED]
+167 Vote on network parameters in consensus [CLOSED]
+168 Reduce default circuit window [OPEN]
+169 Eliminate TLS renegotiation for the Tor connection handshake [DRAFT]
+170 Configuration options regarding circuit building [DRAFT]
+172 GETINFO controller option for circuit information [ACCEPTED]
+173 GETINFO Option Expansion [ACCEPTED]
+174 Optimistic Data for Tor: Server Side [OPEN]
Proposals by status:
@@ -92,7 +104,8 @@ Proposals by status:
133 Incorporate Unreachable ORs into the Tor Network
141 Download server descriptors on demand
144 Increase the diversity of circuits by detecting nodes belonging the same provider
- 151 Improving Tor Path Selection
+ 169 Eliminate TLS renegotiation for the Tor connection handshake [for 0.2.2]
+ 170 Configuration options regarding circuit building
NEEDS-REVISION:
131 Help users to verify they are using Tor
OPEN:
@@ -103,14 +116,22 @@ Proposals by status:
156 Tracking blocked ports on the client side [for 0.2.?]
158 Clients download consensus + microdescriptors
159 Exit Scanning
+ 162 Publish the consensus in multiple flavors [for 0.2.2]
+ 163 Detecting whether a connection comes from a client [for 0.2.2]
+ 164 Reporting the status of server votes [for 0.2.2]
+ 165 Easy migration for voting authority sets
+ 168 Reduce default circuit window [for 0.2.2]
+ 174 Optimistic Data for Tor: Server Side
ACCEPTED:
110 Avoiding infinite length circuits [for 0.2.1.x] [in 0.2.1.3-alpha]
117 IPv6 exits [for 0.2.1.x]
118 Advertising multiple ORPorts at once [for 0.2.1.x]
- 134 More robust consensus voting with diverse authority sets [for 0.2.2.x]
140 Provide diffs between consensuses [for 0.2.2.x]
147 Eliminate the need for v2 directories in generating v3 directories [for 0.2.1.x]
157 Make certificate downloads specific [for 0.2.1.x]
+ 166 Including Network Statistics in Extra-Info Documents [for 0.2.2]
+ 172 GETINFO controller option for circuit information
+ 173 GETINFO Option Expansion
META:
000 Index of Tor Proposals
001 The Tor Proposal Process
@@ -118,7 +139,10 @@ Proposals by status:
099 Miscellaneous proposals
FINISHED:
121 Hidden Service Authentication [in 0.2.1.x]
+ 151 Improving Tor Path Selection
155 Four Improvements of Hidden Service Performance [in 0.2.1.x]
+ 160 Authorities vote for bandwidth offsets in consensus [for 0.2.2.x]
+ 161 Computing Bandwidth Adjustments [for 0.2.2.x]
CLOSED:
101 Voting on the Tor Directory System [in 0.2.0.x]
102 Dropping "opt" from the directory format [in 0.2.0.x]
@@ -146,6 +170,7 @@ Proposals by status:
148 Stream end reasons from the client side should be uniform [in 0.2.1.9-alpha]
150 Exclude Exit Nodes from a circuit [in 0.2.1.3-alpha]
152 Optionally allow exit from single-hop circuits [in 0.2.1.6-alpha]
+ 167 Vote on network parameters in consensus [in 0.2.2]
SUPERSEDED:
112 Bring Back Pathlen Coin Weight
113 Simplifying directory authority administration
@@ -159,3 +184,5 @@ Proposals by status:
120 Shutdown descriptors when Tor servers stop
128 Families of private bridges
142 Combine Introduction and Rendezvous Points
+ REJECTED:
+ 134 More robust consensus voting with diverse authority sets
diff --git a/doc/spec/proposals/001-process.txt b/doc/spec/proposals/001-process.txt
index 3a767b5fa4..e2fe358fed 100644
--- a/doc/spec/proposals/001-process.txt
+++ b/doc/spec/proposals/001-process.txt
@@ -1,7 +1,5 @@
Filename: 001-process.txt
Title: The Tor Proposal Process
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 30-Jan-2007
Status: Meta
@@ -47,7 +45,7 @@ How to change the specs now:
Like an RFC, every proposal gets a number. Unlike RFCs, proposals can
change over time and keep the same number, until they are finally
accepted or rejected. The history for each proposal
- will be stored in the Tor Subversion repository.
+ will be stored in the Tor repository.
Once a proposal is in the repository, we should discuss and improve it
until we've reached consensus that it's a good idea, and that it's
@@ -82,9 +80,7 @@ How new proposals get added:
What should go in a proposal:
Every proposal should have a header containing these fields:
- Filename, Title, Version, Last-Modified, Author, Created, Status.
- The Version and Last-Modified fields should use the SVN Revision and Date
- tags respectively.
+ Filename, Title, Author, Created, Status.
These fields are optional but recommended:
Target, Implemented-In.
@@ -97,7 +93,7 @@ What should go in a proposal:
what the proposal's about, what it does, and about what state it's in.
After the Overview, the proposal becomes more free-form. Depending on its
- the length and complexity, the proposal can break into sections as
+ length and complexity, the proposal can break into sections as
appropriate, or follow a short discursive format. Every proposal should
contain at least the following information before it is "ACCEPTED",
though the information does not need to be in sections with these names.
@@ -131,7 +127,8 @@ What should go in a proposal:
Implementation: If the proposal will be tricky to implement in Tor's
current architecture, the document can contain some discussion of how
- to go about making it work.
+ to go about making it work. Actual patches should go on public git
+ branches, or be uploaded to trac.
Performance and scalability notes: If the feature will have an effect
on performance (in RAM, CPU, bandwidth) or scalability, there should
diff --git a/doc/spec/proposals/098-todo.txt b/doc/spec/proposals/098-todo.txt
index e891ea890c..a0bbbeb568 100644
--- a/doc/spec/proposals/098-todo.txt
+++ b/doc/spec/proposals/098-todo.txt
@@ -1,7 +1,5 @@
Filename: 098-todo.txt
Title: Proposals that should be written
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson, Roger Dingledine
Created: 26-Jan-2007
Status: Meta
diff --git a/doc/spec/proposals/099-misc.txt b/doc/spec/proposals/099-misc.txt
index ba13ea2a71..a3621dd25f 100644
--- a/doc/spec/proposals/099-misc.txt
+++ b/doc/spec/proposals/099-misc.txt
@@ -1,7 +1,5 @@
Filename: 099-misc.txt
Title: Miscellaneous proposals
-Version: $Revision$
-Last-Modified: $Date$
Author: Various
Created: 26-Jan-2007
Status: Meta
diff --git a/doc/spec/proposals/100-tor-spec-udp.txt b/doc/spec/proposals/100-tor-spec-udp.txt
index 8224682ec8..7f062222c5 100644
--- a/doc/spec/proposals/100-tor-spec-udp.txt
+++ b/doc/spec/proposals/100-tor-spec-udp.txt
@@ -1,7 +1,5 @@
Filename: 100-tor-spec-udp.txt
Title: Tor Unreliable Datagram Extension Proposal
-Version: $Revision$
-Last-Modified: $Date$
Author: Marc Liberatore
Created: 23 Feb 2006
Status: Dead
diff --git a/doc/spec/proposals/101-dir-voting.txt b/doc/spec/proposals/101-dir-voting.txt
index be900a641e..634d3f1948 100644
--- a/doc/spec/proposals/101-dir-voting.txt
+++ b/doc/spec/proposals/101-dir-voting.txt
@@ -1,7 +1,5 @@
Filename: 101-dir-voting.txt
Title: Voting on the Tor Directory System
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: Nov 2006
Status: Closed
diff --git a/doc/spec/proposals/102-drop-opt.txt b/doc/spec/proposals/102-drop-opt.txt
index 8f6a38ae6c..490376bb53 100644
--- a/doc/spec/proposals/102-drop-opt.txt
+++ b/doc/spec/proposals/102-drop-opt.txt
@@ -1,7 +1,5 @@
Filename: 102-drop-opt.txt
Title: Dropping "opt" from the directory format
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: Jan 2007
Status: Closed
diff --git a/doc/spec/proposals/103-multilevel-keys.txt b/doc/spec/proposals/103-multilevel-keys.txt
index ef51e18047..c8a7a6677b 100644
--- a/doc/spec/proposals/103-multilevel-keys.txt
+++ b/doc/spec/proposals/103-multilevel-keys.txt
@@ -1,7 +1,5 @@
Filename: 103-multilevel-keys.txt
Title: Splitting identity key from regularly used signing key.
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: Jan 2007
Status: Closed
diff --git a/doc/spec/proposals/104-short-descriptors.txt b/doc/spec/proposals/104-short-descriptors.txt
index a1c42c8ff7..90e0764fe6 100644
--- a/doc/spec/proposals/104-short-descriptors.txt
+++ b/doc/spec/proposals/104-short-descriptors.txt
@@ -1,7 +1,5 @@
Filename: 104-short-descriptors.txt
Title: Long and Short Router Descriptors
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: Jan 2007
Status: Closed
diff --git a/doc/spec/proposals/105-handshake-revision.txt b/doc/spec/proposals/105-handshake-revision.txt
index f6c209e71b..791a016c26 100644
--- a/doc/spec/proposals/105-handshake-revision.txt
+++ b/doc/spec/proposals/105-handshake-revision.txt
@@ -1,7 +1,5 @@
Filename: 105-handshake-revision.txt
Title: Version negotiation for the Tor protocol.
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson, Roger Dingledine
Created: Jan 2007
Status: Closed
diff --git a/doc/spec/proposals/106-less-tls-constraint.txt b/doc/spec/proposals/106-less-tls-constraint.txt
index 35d6bf1066..7e7621df69 100644
--- a/doc/spec/proposals/106-less-tls-constraint.txt
+++ b/doc/spec/proposals/106-less-tls-constraint.txt
@@ -1,7 +1,5 @@
Filename: 106-less-tls-constraint.txt
Title: Checking fewer things during TLS handshakes
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 9-Feb-2007
Status: Closed
diff --git a/doc/spec/proposals/107-uptime-sanity-checking.txt b/doc/spec/proposals/107-uptime-sanity-checking.txt
index b11be89380..922129b21d 100644
--- a/doc/spec/proposals/107-uptime-sanity-checking.txt
+++ b/doc/spec/proposals/107-uptime-sanity-checking.txt
@@ -1,7 +1,5 @@
Filename: 107-uptime-sanity-checking.txt
Title: Uptime Sanity Checking
-Version: $Revision$
-Last-Modified: $Date$
Author: Kevin Bauer & Damon McCoy
Created: 8-March-2007
Status: Closed
diff --git a/doc/spec/proposals/108-mtbf-based-stability.txt b/doc/spec/proposals/108-mtbf-based-stability.txt
index 2c66481530..294103760b 100644
--- a/doc/spec/proposals/108-mtbf-based-stability.txt
+++ b/doc/spec/proposals/108-mtbf-based-stability.txt
@@ -1,7 +1,5 @@
Filename: 108-mtbf-based-stability.txt
Title: Base "Stable" Flag on Mean Time Between Failures
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 10-Mar-2007
Status: Closed
diff --git a/doc/spec/proposals/109-no-sharing-ips.txt b/doc/spec/proposals/109-no-sharing-ips.txt
index 1a88b00c0f..5438cf049a 100644
--- a/doc/spec/proposals/109-no-sharing-ips.txt
+++ b/doc/spec/proposals/109-no-sharing-ips.txt
@@ -1,7 +1,5 @@
Filename: 109-no-sharing-ips.txt
Title: No more than one server per IP address.
-Version: $Revision$
-Last-Modified: $Date$
Author: Kevin Bauer & Damon McCoy
Created: 9-March-2007
Status: Closed
diff --git a/doc/spec/proposals/110-avoid-infinite-circuits.txt b/doc/spec/proposals/110-avoid-infinite-circuits.txt
index 1834cd34a7..fffc41c25a 100644
--- a/doc/spec/proposals/110-avoid-infinite-circuits.txt
+++ b/doc/spec/proposals/110-avoid-infinite-circuits.txt
@@ -1,7 +1,5 @@
Filename: 110-avoid-infinite-circuits.txt
Title: Avoiding infinite length circuits
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 13-Mar-2007
Status: Accepted
diff --git a/doc/spec/proposals/111-local-traffic-priority.txt b/doc/spec/proposals/111-local-traffic-priority.txt
index f8a37efc94..9411463c21 100644
--- a/doc/spec/proposals/111-local-traffic-priority.txt
+++ b/doc/spec/proposals/111-local-traffic-priority.txt
@@ -1,7 +1,5 @@
Filename: 111-local-traffic-priority.txt
Title: Prioritizing local traffic over relayed traffic
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 14-Mar-2007
Status: Closed
diff --git a/doc/spec/proposals/112-bring-back-pathlencoinweight.txt b/doc/spec/proposals/112-bring-back-pathlencoinweight.txt
index e7cc6b4e36..3f6c3376f0 100644
--- a/doc/spec/proposals/112-bring-back-pathlencoinweight.txt
+++ b/doc/spec/proposals/112-bring-back-pathlencoinweight.txt
@@ -1,7 +1,5 @@
Filename: 112-bring-back-pathlencoinweight.txt
Title: Bring Back Pathlen Coin Weight
-Version: $Revision$
-Last-Modified: $Date$
Author: Mike Perry
Created:
Status: Superseded
diff --git a/doc/spec/proposals/113-fast-authority-interface.txt b/doc/spec/proposals/113-fast-authority-interface.txt
index 20cf33e429..8912b53220 100644
--- a/doc/spec/proposals/113-fast-authority-interface.txt
+++ b/doc/spec/proposals/113-fast-authority-interface.txt
@@ -1,7 +1,5 @@
Filename: 113-fast-authority-interface.txt
Title: Simplifying directory authority administration
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created:
Status: Superseded
diff --git a/doc/spec/proposals/114-distributed-storage.txt b/doc/spec/proposals/114-distributed-storage.txt
index e9271fb82d..91a787d301 100644
--- a/doc/spec/proposals/114-distributed-storage.txt
+++ b/doc/spec/proposals/114-distributed-storage.txt
@@ -1,7 +1,5 @@
Filename: 114-distributed-storage.txt
Title: Distributed Storage for Tor Hidden Service Descriptors
-Version: $Revision$
-Last-Modified: $Date$
Author: Karsten Loesing
Created: 13-May-2007
Status: Closed
diff --git a/doc/spec/proposals/115-two-hop-paths.txt b/doc/spec/proposals/115-two-hop-paths.txt
index ee10d949c4..9854c9ad55 100644
--- a/doc/spec/proposals/115-two-hop-paths.txt
+++ b/doc/spec/proposals/115-two-hop-paths.txt
@@ -1,7 +1,5 @@
Filename: 115-two-hop-paths.txt
Title: Two Hop Paths
-Version: $Revision$
-Last-Modified: $Date$
Author: Mike Perry
Created:
Status: Dead
diff --git a/doc/spec/proposals/116-two-hop-paths-from-guard.txt b/doc/spec/proposals/116-two-hop-paths-from-guard.txt
index 454b344abf..f45625350b 100644
--- a/doc/spec/proposals/116-two-hop-paths-from-guard.txt
+++ b/doc/spec/proposals/116-two-hop-paths-from-guard.txt
@@ -1,7 +1,5 @@
Filename: 116-two-hop-paths-from-guard.txt
Title: Two hop paths from entry guards
-Version: $Revision$
-Last-Modified: $Date$
Author: Michael Lieberman
Created: 26-Jun-2007
Status: Dead
diff --git a/doc/spec/proposals/117-ipv6-exits.txt b/doc/spec/proposals/117-ipv6-exits.txt
index c8402821ed..00cd7cef10 100644
--- a/doc/spec/proposals/117-ipv6-exits.txt
+++ b/doc/spec/proposals/117-ipv6-exits.txt
@@ -1,7 +1,5 @@
Filename: 117-ipv6-exits.txt
Title: IPv6 exits
-Version: $Revision$
-Last-Modified: $Date$
Author: coderman
Created: 10-Jul-2007
Status: Accepted
diff --git a/doc/spec/proposals/118-multiple-orports.txt b/doc/spec/proposals/118-multiple-orports.txt
index 1bef2504d9..2381ec7ca3 100644
--- a/doc/spec/proposals/118-multiple-orports.txt
+++ b/doc/spec/proposals/118-multiple-orports.txt
@@ -1,7 +1,5 @@
Filename: 118-multiple-orports.txt
Title: Advertising multiple ORPorts at once
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 09-Jul-2007
Status: Accepted
diff --git a/doc/spec/proposals/119-controlport-auth.txt b/doc/spec/proposals/119-controlport-auth.txt
index dc57a27368..9ed1cc1cbe 100644
--- a/doc/spec/proposals/119-controlport-auth.txt
+++ b/doc/spec/proposals/119-controlport-auth.txt
@@ -1,7 +1,5 @@
Filename: 119-controlport-auth.txt
Title: New PROTOCOLINFO command for controllers
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 14-Aug-2007
Status: Closed
diff --git a/doc/spec/proposals/120-shutdown-descriptors.txt b/doc/spec/proposals/120-shutdown-descriptors.txt
index dc1265b03b..5cfe2b5bc6 100644
--- a/doc/spec/proposals/120-shutdown-descriptors.txt
+++ b/doc/spec/proposals/120-shutdown-descriptors.txt
@@ -1,7 +1,5 @@
Filename: 120-shutdown-descriptors.txt
Title: Shutdown descriptors when Tor servers stop
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 15-Aug-2007
Status: Dead
diff --git a/doc/spec/proposals/121-hidden-service-authentication.txt b/doc/spec/proposals/121-hidden-service-authentication.txt
index 828bf3c92d..0d92b53a8c 100644
--- a/doc/spec/proposals/121-hidden-service-authentication.txt
+++ b/doc/spec/proposals/121-hidden-service-authentication.txt
@@ -1,7 +1,5 @@
Filename: 121-hidden-service-authentication.txt
Title: Hidden Service Authentication
-Version: $Revision$
-Last-Modified: $Date$
Author: Tobias Kamm, Thomas Lauterbach, Karsten Loesing, Ferdinand Rieger,
Christoph Weingarten
Created: 10-Sep-2007
diff --git a/doc/spec/proposals/122-unnamed-flag.txt b/doc/spec/proposals/122-unnamed-flag.txt
index 6502b9c560..2ce7bb22b9 100644
--- a/doc/spec/proposals/122-unnamed-flag.txt
+++ b/doc/spec/proposals/122-unnamed-flag.txt
@@ -1,7 +1,5 @@
Filename: 122-unnamed-flag.txt
Title: Network status entries need a new Unnamed flag
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 04-Oct-2007
Status: Closed
diff --git a/doc/spec/proposals/123-autonaming.txt b/doc/spec/proposals/123-autonaming.txt
index 6cd25329f8..74c486985d 100644
--- a/doc/spec/proposals/123-autonaming.txt
+++ b/doc/spec/proposals/123-autonaming.txt
@@ -1,7 +1,5 @@
Filename: 123-autonaming.txt
Title: Naming authorities automatically create bindings
-Version: $Revision$
-Last-Modified: $Date$
Author: Peter Palfrader
Created: 2007-10-11
Status: Closed
diff --git a/doc/spec/proposals/124-tls-certificates.txt b/doc/spec/proposals/124-tls-certificates.txt
index 0a47772732..9472d14af8 100644
--- a/doc/spec/proposals/124-tls-certificates.txt
+++ b/doc/spec/proposals/124-tls-certificates.txt
@@ -1,7 +1,5 @@
Filename: 124-tls-certificates.txt
Title: Blocking resistant TLS certificate usage
-Version: $Revision$
-Last-Modified: $Date$
Author: Steven J. Murdoch
Created: 2007-10-25
Status: Superseded
diff --git a/doc/spec/proposals/125-bridges.txt b/doc/spec/proposals/125-bridges.txt
index 8bb3169780..9d95729d42 100644
--- a/doc/spec/proposals/125-bridges.txt
+++ b/doc/spec/proposals/125-bridges.txt
@@ -1,7 +1,5 @@
Filename: 125-bridges.txt
Title: Behavior for bridge users, bridge relays, and bridge authorities
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 11-Nov-2007
Status: Closed
diff --git a/doc/spec/proposals/126-geoip-reporting.txt b/doc/spec/proposals/126-geoip-reporting.txt
index d48a08ba38..9f3b21c670 100644
--- a/doc/spec/proposals/126-geoip-reporting.txt
+++ b/doc/spec/proposals/126-geoip-reporting.txt
@@ -1,7 +1,5 @@
Filename: 126-geoip-reporting.txt
Title: Getting GeoIP data and publishing usage summaries
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 2007-11-24
Status: Closed
diff --git a/doc/spec/proposals/127-dirport-mirrors-downloads.txt b/doc/spec/proposals/127-dirport-mirrors-downloads.txt
index 1b55a02d61..72d6c0cb9f 100644
--- a/doc/spec/proposals/127-dirport-mirrors-downloads.txt
+++ b/doc/spec/proposals/127-dirport-mirrors-downloads.txt
@@ -1,7 +1,5 @@
Filename: 127-dirport-mirrors-downloads.txt
Title: Relaying dirport requests to Tor download site / website
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 2007-12-02
Status: Draft
diff --git a/doc/spec/proposals/128-bridge-families.txt b/doc/spec/proposals/128-bridge-families.txt
index e8a0050c3c..e5bdcf95cb 100644
--- a/doc/spec/proposals/128-bridge-families.txt
+++ b/doc/spec/proposals/128-bridge-families.txt
@@ -1,7 +1,5 @@
Filename: 128-bridge-families.txt
Title: Families of private bridges
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 2007-12-xx
Status: Dead
diff --git a/doc/spec/proposals/129-reject-plaintext-ports.txt b/doc/spec/proposals/129-reject-plaintext-ports.txt
index d4767d03d8..8080ff5b75 100644
--- a/doc/spec/proposals/129-reject-plaintext-ports.txt
+++ b/doc/spec/proposals/129-reject-plaintext-ports.txt
@@ -1,7 +1,5 @@
Filename: 129-reject-plaintext-ports.txt
Title: Block Insecure Protocols by Default
-Version: $Revision$
-Last-Modified: $Date$
Author: Kevin Bauer & Damon McCoy
Created: 2008-01-15
Status: Closed
diff --git a/doc/spec/proposals/130-v2-conn-protocol.txt b/doc/spec/proposals/130-v2-conn-protocol.txt
index 16f5bf2844..60e742a622 100644
--- a/doc/spec/proposals/130-v2-conn-protocol.txt
+++ b/doc/spec/proposals/130-v2-conn-protocol.txt
@@ -1,7 +1,5 @@
Filename: 130-v2-conn-protocol.txt
Title: Version 2 Tor connection protocol
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 2007-10-25
Status: Closed
diff --git a/doc/spec/proposals/131-verify-tor-usage.txt b/doc/spec/proposals/131-verify-tor-usage.txt
index 2687139189..d3c6efe75a 100644
--- a/doc/spec/proposals/131-verify-tor-usage.txt
+++ b/doc/spec/proposals/131-verify-tor-usage.txt
@@ -1,7 +1,5 @@
Filename: 131-verify-tor-usage.txt
Title: Help users to verify they are using Tor
-Version: $Revision$
-Last-Modified: $Date$
Author: Steven J. Murdoch
Created: 2008-01-25
Status: Needs-Revision
diff --git a/doc/spec/proposals/132-browser-check-tor-service.txt b/doc/spec/proposals/132-browser-check-tor-service.txt
index d07a10dcde..6132e5d060 100644
--- a/doc/spec/proposals/132-browser-check-tor-service.txt
+++ b/doc/spec/proposals/132-browser-check-tor-service.txt
@@ -1,7 +1,5 @@
Filename: 132-browser-check-tor-service.txt
Title: A Tor Web Service For Verifying Correct Browser Configuration
-Version: $Revision$
-Last-Modified: $Date$
Author: Robert Hogan
Created: 2008-03-08
Status: Draft
diff --git a/doc/spec/proposals/134-robust-voting.txt b/doc/spec/proposals/134-robust-voting.txt
index 5d5e77fa3b..c5dfb3b47f 100644
--- a/doc/spec/proposals/134-robust-voting.txt
+++ b/doc/spec/proposals/134-robust-voting.txt
@@ -2,8 +2,10 @@ Filename: 134-robust-voting.txt
Title: More robust consensus voting with diverse authority sets
Author: Peter Palfrader
Created: 2008-04-01
-Status: Accepted
-Target: 0.2.2.x
+Status: Rejected
+
+History:
+ 2009 May 27: Added note on rejecting this proposal -- Nick
Overview:
@@ -103,3 +105,19 @@ Possible Attacks/Open Issues/Some thinking required:
Q: Can this ever force us to build a consensus with authorities we do not
recognize?
A: No, we can never build a fully connected set with them in step 3.
+
+------------------------------
+
+I'm rejecting this proposal as insecure.
+
+Suppose that we have a clique of size N, and M hostile members in the
+clique. If these hostile members stop declaring trust for up to M-1
+good members of the clique, the clique with the hostile members will
+in it will be larger than the one without them.
+
+The M hostile members will constitute a majority of this new clique
+when M > (N-(M-1)) / 2, or when M > (N + 1) / 3. This breaks our
+requirement that an adversary must compromise a majority of authorities
+in order to control the consensus.
+
+-- Nick
diff --git a/doc/spec/proposals/135-private-tor-networks.txt b/doc/spec/proposals/135-private-tor-networks.txt
index 131bbb9068..19ef68b7b1 100644
--- a/doc/spec/proposals/135-private-tor-networks.txt
+++ b/doc/spec/proposals/135-private-tor-networks.txt
@@ -1,7 +1,5 @@
Filename: 135-private-tor-networks.txt
Title: Simplify Configuration of Private Tor Networks
-Version: $Revision$
-Last-Modified: $Date$
Author: Karsten Loesing
Created: 29-Apr-2008
Status: Closed
diff --git a/doc/spec/proposals/137-bootstrap-phases.txt b/doc/spec/proposals/137-bootstrap-phases.txt
index 18d3dfae12..ebe044c707 100644
--- a/doc/spec/proposals/137-bootstrap-phases.txt
+++ b/doc/spec/proposals/137-bootstrap-phases.txt
@@ -1,7 +1,5 @@
Filename: 137-bootstrap-phases.txt
Title: Keep controllers informed as Tor bootstraps
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 07-Jun-2008
Status: Closed
diff --git a/doc/spec/proposals/138-remove-down-routers-from-consensus.txt b/doc/spec/proposals/138-remove-down-routers-from-consensus.txt
index a07764d536..776911b5c9 100644
--- a/doc/spec/proposals/138-remove-down-routers-from-consensus.txt
+++ b/doc/spec/proposals/138-remove-down-routers-from-consensus.txt
@@ -1,7 +1,5 @@
Filename: 138-remove-down-routers-from-consensus.txt
Title: Remove routers that are not Running from consensus documents
-Version: $Revision$
-Last-Modified: $Date$
Author: Peter Palfrader
Created: 11-Jun-2008
Status: Closed
diff --git a/doc/spec/proposals/140-consensus-diffs.txt b/doc/spec/proposals/140-consensus-diffs.txt
index da63bfe23c..8bc4070bfe 100644
--- a/doc/spec/proposals/140-consensus-diffs.txt
+++ b/doc/spec/proposals/140-consensus-diffs.txt
@@ -1,12 +1,15 @@
Filename: 140-consensus-diffs.txt
Title: Provide diffs between consensuses
-Version: $Revision$
-Last-Modified: $Date$
Author: Peter Palfrader
Created: 13-Jun-2008
Status: Accepted
Target: 0.2.2.x
+0. History
+
+ 22-May-2009: Restricted the ed format even more strictly for ease of
+ implementation. -nickm
+
1. Overview.
Tor clients and servers need a list of which relays are on the
@@ -135,6 +138,10 @@ Target: 0.2.2.x
Note that line numbers always apply to the file after all previous
commands have already been applied.
+ The commands MUST apply to the file from back to front, such that
+ lines are only ever referred to by their position in the original
+ file.
+
The "current line" is either the first line of the file, if this is
the first command, the last line of a block we added in an append or
change command, or the line immediate following a set of lines we just
diff --git a/doc/spec/proposals/141-jit-sd-downloads.txt b/doc/spec/proposals/141-jit-sd-downloads.txt
index b0c2b2cbcd..2ac7a086b7 100644
--- a/doc/spec/proposals/141-jit-sd-downloads.txt
+++ b/doc/spec/proposals/141-jit-sd-downloads.txt
@@ -1,7 +1,5 @@
Filename: 141-jit-sd-downloads.txt
Title: Download server descriptors on demand
-Version: $Revision$
-Last-Modified: $Date$
Author: Peter Palfrader
Created: 15-Jun-2008
Status: Draft
@@ -63,8 +61,8 @@ Status: Draft
which tries to convey a server's capacity to clients.
Currently we weigh servers differently for different purposes. There
- is a weigh for when we use a server as a guard node (our entry to the
- Tor network), there is one weigh we assign servers for exit duties,
+ is a weight for when we use a server as a guard node (our entry to the
+ Tor network), there is one weight we assign servers for exit duties,
and a third for when we need intermediate (middle) nodes.
2.2 Exit information
@@ -80,7 +78,7 @@ Status: Draft
2.3 Capability information
- Server descriptors contain information about the specific version or
+ Server descriptors contain information about the specific version of
the Tor protocol they understand [proposal 105].
Furthermore the server descriptor also contains the exact version of
diff --git a/doc/spec/proposals/142-combine-intro-and-rend-points.txt b/doc/spec/proposals/142-combine-intro-and-rend-points.txt
index 3456b285a9..3abd5c863d 100644
--- a/doc/spec/proposals/142-combine-intro-and-rend-points.txt
+++ b/doc/spec/proposals/142-combine-intro-and-rend-points.txt
@@ -1,7 +1,5 @@
Filename: 142-combine-intro-and-rend-points.txt
Title: Combine Introduction and Rendezvous Points
-Version: $Revision$
-Last-Modified: $Date$
Author: Karsten Loesing, Christian Wilms
Created: 27-Jun-2008
Status: Dead
diff --git a/doc/spec/proposals/143-distributed-storage-improvements.txt b/doc/spec/proposals/143-distributed-storage-improvements.txt
index 8789d84663..0f7468f1dc 100644
--- a/doc/spec/proposals/143-distributed-storage-improvements.txt
+++ b/doc/spec/proposals/143-distributed-storage-improvements.txt
@@ -1,7 +1,5 @@
Filename: 143-distributed-storage-improvements.txt
Title: Improvements of Distributed Storage for Tor Hidden Service Descriptors
-Version: $Revision$
-Last-Modified: $Date$
Author: Karsten Loesing
Created: 28-Jun-2008
Status: Open
diff --git a/doc/spec/proposals/145-newguard-flag.txt b/doc/spec/proposals/145-newguard-flag.txt
index 31d707d725..9e61e30be9 100644
--- a/doc/spec/proposals/145-newguard-flag.txt
+++ b/doc/spec/proposals/145-newguard-flag.txt
@@ -1,7 +1,5 @@
Filename: 145-newguard-flag.txt
Title: Separate "suitable as a guard" from "suitable as a new guard"
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 1-Jul-2008
Status: Open
diff --git a/doc/spec/proposals/146-long-term-stability.txt b/doc/spec/proposals/146-long-term-stability.txt
index 7cfd58f564..9af0017441 100644
--- a/doc/spec/proposals/146-long-term-stability.txt
+++ b/doc/spec/proposals/146-long-term-stability.txt
@@ -1,7 +1,5 @@
Filename: 146-long-term-stability.txt
Title: Add new flag to reflect long-term stability
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 19-Jun-2008
Status: Open
diff --git a/doc/spec/proposals/147-prevoting-opinions.txt b/doc/spec/proposals/147-prevoting-opinions.txt
index 2b8cf30e46..3d9659c984 100644
--- a/doc/spec/proposals/147-prevoting-opinions.txt
+++ b/doc/spec/proposals/147-prevoting-opinions.txt
@@ -1,7 +1,5 @@
Filename: 147-prevoting-opinions.txt
Title: Eliminate the need for v2 directories in generating v3 directories
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 2-Jul-2008
Status: Accepted
diff --git a/doc/spec/proposals/148-uniform-client-end-reason.txt b/doc/spec/proposals/148-uniform-client-end-reason.txt
index cec81253ea..1db3b3e596 100644
--- a/doc/spec/proposals/148-uniform-client-end-reason.txt
+++ b/doc/spec/proposals/148-uniform-client-end-reason.txt
@@ -1,7 +1,5 @@
Filename: 148-uniform-client-end-reason.txt
Title: Stream end reasons from the client side should be uniform
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 2-Jul-2008
Status: Closed
diff --git a/doc/spec/proposals/149-using-netinfo-data.txt b/doc/spec/proposals/149-using-netinfo-data.txt
index 4919514b4c..8bf8375d5d 100644
--- a/doc/spec/proposals/149-using-netinfo-data.txt
+++ b/doc/spec/proposals/149-using-netinfo-data.txt
@@ -1,7 +1,5 @@
Filename: 149-using-netinfo-data.txt
Title: Using data from NETINFO cells
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 2-Jul-2008
Status: Open
@@ -24,14 +22,14 @@ Motivation
idea of their own IP addresses, so they can publish correct
descriptors. This is also in NETINFO cells.
-Learning the time and IP
+Learning the time and IP address
We need to think about attackers here. Just because a router tells
us that we have a given IP or a given clock skew doesn't mean that
it's true. We believe this information only if we've heard it from
a majority of the routers we've connected to recently, including at
least 3 routers. Routers only believe this information if the
- majority inclues at least one authority.
+ majority includes at least one authority.
Avoiding MITM attacks
diff --git a/doc/spec/proposals/150-exclude-exit-nodes.txt b/doc/spec/proposals/150-exclude-exit-nodes.txt
index b73a9cc4d1..b497ae62c1 100644
--- a/doc/spec/proposals/150-exclude-exit-nodes.txt
+++ b/doc/spec/proposals/150-exclude-exit-nodes.txt
@@ -1,6 +1,5 @@
Filename: 150-exclude-exit-nodes.txt
Title: Exclude Exit Nodes from a circuit
-Version: $Revision$
Author: Mfr
Created: 2008-06-15
Status: Closed
diff --git a/doc/spec/proposals/151-path-selection-improvements.txt b/doc/spec/proposals/151-path-selection-improvements.txt
index e3c8f35451..af89f21193 100644
--- a/doc/spec/proposals/151-path-selection-improvements.txt
+++ b/doc/spec/proposals/151-path-selection-improvements.txt
@@ -1,16 +1,15 @@
Filename: 151-path-selection-improvements.txt
Title: Improving Tor Path Selection
-Version:
-Last-Modified:
Author: Fallon Chen, Mike Perry
Created: 5-Jul-2008
-Status: Draft
+Status: Finished
+In-Spec: path-spec.txt
Overview
The performance of paths selected can be improved by adjusting the
CircuitBuildTimeout and avoiding failing guard nodes. This proposal
- describes a method of tracking buildtime statistics at the client, and
+ describes a method of tracking buildtime statistics at the client, and
using those statistics to adjust the CircuitBuildTimeout.
Motivation
@@ -22,121 +21,123 @@ Motivation
Implementation
- Storing Build Times
+ Gathering Build Times
- Circuit build times will be stored in the circular array
- 'circuit_build_times' consisting of uint16_t elements as milliseconds.
- The total size of this array will be based on the number of circuits
+ Circuit build times are stored in the circular array
+ 'circuit_build_times' consisting of uint32_t elements as milliseconds.
+ The total size of this array is based on the number of circuits
it takes to converge on a good fit of the long term distribution of
the circuit builds for a fixed link. We do not want this value to be
too large, because it will make it difficult for clients to adapt to
moving between different links.
- From our initial observations, this value appears to be on the order
- of 1000, but will be configurable in a #define NCIRCUITS_TO_OBSERVE.
- The exact value for this #define will be determined by performing
- goodness of fit tests using measurments obtained from the shufflebt.py
- script from TorFlow.
-
+ From our observations, the minimum value for a reasonable fit appears
+ to be on the order of 500 (MIN_CIRCUITS_TO_OBSERVE). However, to keep
+ a good fit over the long term, we store 5000 most recent circuits in
+ the array (NCIRCUITS_TO_OBSERVE).
+
+ The Tor client will build test circuits at a rate of one per
+ minute (BUILD_TIMES_TEST_FREQUENCY) up to the point of
+ MIN_CIRCUITS_TO_OBSERVE. This allows a fresh Tor to have
+ a CircuitBuildTimeout estimated within 8 hours after install,
+ upgrade, or network change (see below).
+
Long Term Storage
- The long-term storage representation will be implemented by storing a
- histogram with BUILDTIME_BIN_WIDTH millisecond buckets (default 50) when
- writing out the statistics to disk. The format of this histogram on disk
- is yet to be finalized, but it will likely be of the format
- 'CircuitBuildTime <bin> <count>', with the total specified as
- 'TotalBuildTimes <total>'
+ The long-term storage representation is implemented by storing a
+ histogram with BUILDTIME_BIN_WIDTH millisecond buckets (default 50) when
+ writing out the statistics to disk. The format this takes in the
+ state file is 'CircuitBuildTime <bin-ms> <count>', with the total
+ specified as 'TotalBuildTimes <total>'
Example:
TotalBuildTimes 100
- CircuitBuildTimeBin 1 50
- CircuitBuildTimeBin 2 25
- CircuitBuildTimeBin 3 13
+ CircuitBuildTimeBin 25 50
+ CircuitBuildTimeBin 75 25
+ CircuitBuildTimeBin 125 13
...
- Reading the histogram in will entail multiplying each bin by the
- BUILDTIME_BIN_WIDTH and then inserting <count> values into the
- circuit_build_times array each with the value of
- <bin>*BUILDTIME_BIN_WIDTH. In order to evenly distribute the
- values in the circular array, a form of index skipping must
- be employed. Values from bin #N with bin count C and total T
- will occupy indexes specified by N+((T/C)*k)-1, where k is the
- set of integers ranging from 0 to C-1.
-
- For example, this would mean that the values from bin 1 would
- occupy indexes 1+(100/50)*k-1, or 0, 2, 4, 6, 8, 10 and so on.
- The values for bin 2 would occupy positions 1, 5, 9, 13. Collisions
- will be inserted at the first empty position in the array greater
- than the selected index (which may requiring looping around the
- array back to index 0).
+ Reading the histogram in will entail inserting <count> values
+ into the circuit_build_times array each with the value of
+ <bin-ms> milliseconds. In order to evenly distribute the values
+ in the circular array, the Fisher-Yates shuffle will be performed
+ after reading values from the bins.
Learning the CircuitBuildTimeout
Based on studies of build times, we found that the distribution of
- circuit buildtimes appears to be a Pareto distribution.
+ circuit buildtimes appears to be a Frechet distribution. However,
+ estimators and quantile functions of the Frechet distribution are
+ difficult to work with and slow to converge. So instead, since we
+ are only interested in the accuracy of the tail, we approximate
+ the tail of the distribution with a Pareto curve starting at
+ the mode of the circuit build time sample set.
We will calculate the parameters for a Pareto distribution
fitting the data using the estimators at
http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation.
- The timeout itself will be calculated by solving the CDF for the
- a percentile cutoff BUILDTIME_PERCENT_CUTOFF. This value
- represents the percentage of paths the Tor client will accept out of
- the total number of paths. We have not yet determined a good
- cutoff for this mathematically, but 85% seems a good choice for now.
+ The timeout itself is calculated by using the Quartile function (the
+ inverted CDF) to give us the value on the CDF such that
+ BUILDTIME_PERCENT_CUTOFF (80%) of the mass of the distribution is
+ below the timeout value.
+
+ Thus, we expect that the Tor client will accept the fastest 80% of
+ the total number of paths on the network.
+
+ Detecting Changing Network Conditions
- From http://en.wikipedia.org/wiki/Pareto_distribution#Definition,
- the calculation we need is pow(BUILDTIME_PERCENT_CUTOFF/100.0, k)/Xm.
+ We attempt to detect both network connectivity loss and drastic
+ changes in the timeout characteristics.
+
+ We assume that we've had network connectivity loss if 3 circuits
+ timeout and we've received no cells or TLS handshakes since those
+ circuits began. We then set the timeout to 60 seconds and stop
+ counting timeouts.
+
+ If 3 more circuits timeout and the network still has not been
+ live within this new 60 second timeout window, we then discard
+ the previous timeouts during this period from our history.
+
+ To detect changing network conditions, we keep a history of
+ the timeout or non-timeout status of the past RECENT_CIRCUITS (20)
+ that successfully completed at least one hop. If more than 75%
+ of these circuits timeout, we discard all buildtimes history,
+ reset the timeout to 60, and then begin recomputing the timeout.
Testing
After circuit build times, storage, and learning are implemented,
the resulting histogram should be checked for consistency by
- verifying it persists across successive Tor invocations where
+ verifying it persists across successive Tor invocations where
no circuits are built. In addition, we can also use the existing
- buildtime scripts to record build times, and verify that the histogram
+ buildtime scripts to record build times, and verify that the histogram
the python produces matches that which is output to the state file in Tor,
and verify that the Pareto parameters and cutoff points also match.
-
- Soft timeout vs Hard Timeout
-
- At some point, it may be desirable to change the cutoff from a
- single hard cutoff that destroys the circuit to a soft cutoff and
- a hard cutoff, where the soft cutoff merely triggers the building
- of a new circuit, and the hard cutoff triggers destruction of the
- circuit.
-
- Good values for hard and soft cutoffs seem to be 85% and 65%
- respectively, but we should eventually justify this with observation.
-
- When to Begin Calculation
- The number of circuits to observe (NCIRCUITS_TO_CUTOFF) before
- changing the CircuitBuildTimeout will be tunable via a #define. From
- our measurements, a good value for NCIRCUITS_TO_CUTOFF appears to be
- on the order of 100.
+ We will also verify that there are no unexpected large deviations from
+ node selection, such as nodes from distant geographical locations being
+ completely excluded.
Dealing with Timeouts
- Timeouts should be counted as the expectation of the region of
- of the Pareto distribution beyond the cutoff. The proposal will
- be updated with this value soon.
+ Timeouts should be counted as the expectation of the region of
+ of the Pareto distribution beyond the cutoff. This is done by
+ generating a random sample for each timeout at points on the
+ curve beyond the current timeout cutoff.
- Also, in the event of network failure, the observation mechanism
- should stop collecting timeout data.
+ Future Work
- Client Hints
+ At some point, it may be desirable to change the cutoff from a
+ single hard cutoff that destroys the circuit to a soft cutoff and
+ a hard cutoff, where the soft cutoff merely triggers the building
+ of a new circuit, and the hard cutoff triggers destruction of the
+ circuit.
- Some research still needs to be done to provide initial values
- for CircuitBuildTimeout based on values learned from modem
- users, DSL users, Cable Modem users, and dedicated links. A
- radiobutton in Vidalia should eventually be provided that
- sets CircuitBuildTimeout to one of these values and also
- provide the option of purging all learned data, should any exist.
+ It may also be beneficial to learn separate timeouts for each
+ guard node, as they will have slightly different distributions.
+ This will take longer to generate initial values though.
- These values can either be published in the directory, or
- shipped hardcoded for a particular Tor version.
-
Issues
Impact on anonymity
diff --git a/doc/spec/proposals/152-single-hop-circuits.txt b/doc/spec/proposals/152-single-hop-circuits.txt
index e49a4250e0..d0b28b1c72 100644
--- a/doc/spec/proposals/152-single-hop-circuits.txt
+++ b/doc/spec/proposals/152-single-hop-circuits.txt
@@ -1,7 +1,5 @@
Filename: 152-single-hop-circuits.txt
Title: Optionally allow exit from single-hop circuits
-Version:
-Last-Modified:
Author: Geoff Goodell
Created: 13-Jul-2008
Status: Closed
diff --git a/doc/spec/proposals/153-automatic-software-update-protocol.txt b/doc/spec/proposals/153-automatic-software-update-protocol.txt
index 7bc809d440..c2979bb695 100644
--- a/doc/spec/proposals/153-automatic-software-update-protocol.txt
+++ b/doc/spec/proposals/153-automatic-software-update-protocol.txt
@@ -1,7 +1,5 @@
Filename: 153-automatic-software-update-protocol.txt
Title: Automatic software update protocol
-Version: $Revision$
-Last-Modified: $Date$
Author: Jacob Appelbaum
Created: 14-July-2008
Status: Superseded
diff --git a/doc/spec/proposals/154-automatic-updates.txt b/doc/spec/proposals/154-automatic-updates.txt
index 00a820de08..4c2c6d3899 100644
--- a/doc/spec/proposals/154-automatic-updates.txt
+++ b/doc/spec/proposals/154-automatic-updates.txt
@@ -1,7 +1,5 @@
Filename: 154-automatic-updates.txt
Title: Automatic Software Update Protocol
-Version: $Revision$
-Last-Modified: $Date$
Author: Matt Edman
Created: 30-July-2008
Status: Superseded
diff --git a/doc/spec/proposals/155-four-hidden-service-improvements.txt b/doc/spec/proposals/155-four-hidden-service-improvements.txt
index f528f8baf2..e342bf1c39 100644
--- a/doc/spec/proposals/155-four-hidden-service-improvements.txt
+++ b/doc/spec/proposals/155-four-hidden-service-improvements.txt
@@ -1,7 +1,5 @@
Filename: 155-four-hidden-service-improvements.txt
Title: Four Improvements of Hidden Service Performance
-Version: $Revision$
-Last-Modified: $Date$
Author: Karsten Loesing, Christian Wilms
Created: 25-Sep-2008
Status: Finished
diff --git a/doc/spec/proposals/156-tracking-blocked-ports.txt b/doc/spec/proposals/156-tracking-blocked-ports.txt
index 1e7b0d963f..419de7e74c 100644
--- a/doc/spec/proposals/156-tracking-blocked-ports.txt
+++ b/doc/spec/proposals/156-tracking-blocked-ports.txt
@@ -1,7 +1,5 @@
Filename: 156-tracking-blocked-ports.txt
Title: Tracking blocked ports on the client side
-Version: $Revision$
-Last-Modified: $Date$
Author: Robert Hogan
Created: 14-Oct-2008
Status: Open
diff --git a/doc/spec/proposals/157-specific-cert-download.txt b/doc/spec/proposals/157-specific-cert-download.txt
index e54a987277..204b20973a 100644
--- a/doc/spec/proposals/157-specific-cert-download.txt
+++ b/doc/spec/proposals/157-specific-cert-download.txt
@@ -1,7 +1,5 @@
Filename: 157-specific-cert-download.txt
Title: Make certificate downloads specific
-Version: $Revision$
-Last-Modified: $Date$
Author: Nick Mathewson
Created: 2-Dec-2008
Status: Accepted
diff --git a/doc/spec/proposals/158-microdescriptors.txt b/doc/spec/proposals/158-microdescriptors.txt
index f478a3c834..e6966c0cef 100644
--- a/doc/spec/proposals/158-microdescriptors.txt
+++ b/doc/spec/proposals/158-microdescriptors.txt
@@ -1,11 +1,20 @@
Filename: 158-microdescriptors.txt
Title: Clients download consensus + microdescriptors
-Version: $Revision$
-Last-Modified: $Date$
Author: Roger Dingledine
Created: 17-Jan-2009
Status: Open
+0. History
+
+ 15 May 2009: Substantially revised based on discussions on or-dev
+ from late January. Removed the notion of voting on how to choose
+ microdescriptors; made it just a function of the consensus method.
+ (This lets us avoid the possibility of "desynchronization.")
+ Added suggestion to use a new consensus flavor. Specified use of
+ SHA256 for new hashes. -nickm
+
+ 15 June 2009: Cleaned up based on comments from Roger. -nickm
+
1. Overview
This proposal replaces section 3.2 of proposal 141, which was
@@ -13,9 +22,7 @@ Status: Open
circuit-building protocol to fetch a server descriptor inline at each
circuit extend, we instead put all of the information that clients need
either into the consensus itself, or into a new set of data about each
- relay called a microdescriptor. The microdescriptor is a direct
- transform from the relay descriptor, so relays don't even need to know
- this is happening.
+ relay called a microdescriptor.
Descriptor elements that are small and frequently changing should go
in the consensus itself, and descriptor elements that are small and
@@ -24,6 +31,10 @@ Status: Open
them, we'll need to resume considering some design like the one in
proposal 141.
+ Note also that any descriptor element which clients need to use to
+ decide which servers to fetch info about, or which servers to fetch
+ info from, needs to stay in the consensus.
+
2. Motivation
See
@@ -36,99 +47,91 @@ Status: Open
3. Design
There are three pieces to the proposal. First, authorities will list in
- their votes (and thus in the consensus) what relay descriptor elements
- are included in the microdescriptor, and also list the expected hash
- of microdescriptor for each relay. Second, directory mirrors will serve
- microdescriptors. Third, clients will ask for them and cache them.
+ their votes (and thus in the consensus) the expected hash of
+ microdescriptor for each relay. Second, authorities will serve
+ microdescriptors, directory mirrors will cache and serve
+ them. Third, clients will ask for them and cache them.
3.1. Consensus changes
- V3 votes should include a new line:
- microdescriptor-elements bar baz foo
- listing each descriptor element (sorted alphabetically) that authority
- included when it calculated its expected microdescriptor hashes.
+ If the authorities choose a consensus method of a given version or
+ later, a microdescriptor format is implicit in that version.
+ A microdescriptor should in every case be a pure function of the
+ router descriptor and the consensus method.
+
+ In votes, we need to include the hash of each expected microdescriptor
+ in the routerstatus section. I suggest a new "m" line for each stanza,
+ with the base64 of the SHA256 hash of the router's microdescriptor.
+
+ For every consensus method that an authority supports, it includes a
+ separate "m" line in each router section of its vote, containing:
+ "m" SP methods 1*(SP AlgorithmName "=" digest) NL
+ where methods is a comma-separated list of the consensus methods
+ that the authority believes will produce "digest".
- We also need to include the hash of each expected microdescriptor in
- the routerstatus section. I suggest a new "m" line for each stanza,
- with the base64 of the hash of the elements that the authority voted
- for above.
+ (As with base64 encoding of SHA1 hashes in consensuses, let's
+ omit the trailing =s)
The consensus microdescriptor-elements and "m" lines are then computed
as described in Section 3.1.2 below.
- I believe that means we need a new consensus-method "6" that knows
- how to compute the microdescriptor-elements and add "m" lines.
+ (This means we need a new consensus-method that knows
+ how to compute the microdescriptor-elements and add "m" lines.)
-3.1.1. Descriptor elements to include for now
+ The microdescriptor consensus uses the directory-signature format from
+ proposal 162, with the "sha256" algorithm.
- To start, the element list that authorities suggest should be
- family onion-key
- (Note that the or-dev posts above only mention onion-key, but if
- we don't also include family then clients will never learn it. It
- seemed like it should be relatively static, so putting it in the
- microdescriptor is smarter than trying to fit it into the consensus.)
+3.1.1. Descriptor elements to include for now
- We could imagine a config option "family,onion-key" so authorities
- could change their voted preferences without needing to upgrade.
+ In the first version, the microdescriptor should contain the
+ onion-key element, and the family element from the router descriptor,
+ and the exit policy summary as currently specified in dir-spec.txt.
3.1.2. Computing consensus for microdescriptor-elements and "m" lines
- One approach is for the consensus microdescriptor-elements line to
- include every element listed by a majority of authorities, sorted. The
- problem here is that it will no longer be deterministic what the correct
- hash for the "m" line should be. We could imagine telling the authority
- to go look in its descriptor and produce the right hash itself, but
- we don't want consensus calculation to be based on external data like
- that. (Plus, the authority may not have the descriptor that everybody
- else voted to use.)
-
- The better approach is to take the exact set that has the most votes
- (breaking ties by the set that has the most elements, and breaking
- ties after that by whichever is alphabetically first). That will
- increase the odds that we actually get a microdescriptor hash that
- is both a) for the descriptor we're putting in the consensus, and b)
- over the elements that we're declaring it should be for.
-
- Then the "m" line for a given relay is the one that gets the most votes
- from authorities that both a) voted for the microdescriptor-elements
- line we're using, and b) voted for the descriptor we're using.
-
- (If there's a tie, use the smaller hash. But really, if there are
- multiple such votes and they differ about a microdescriptor, we caught
- one of them lying or being buggy. We should log it to track down why.)
-
- If there are no such votes, then we leave out the "m" line for that
- relay. That means clients should avoid it for this time period. (As
- an extension it could instead mean that clients should fetch the
- descriptor and figure out its microdescriptor themselves. But let's
- not get ahead of ourselves.)
-
- It would be nice to have a more foolproof way to agree on what
- microdescriptor hash each authority should vote for, so we can avoid
- missing "m" lines. Just switching to a new consensus-method each time
- we change the set of microdescriptor-elements won't help though, since
- each authority will still have to decide what hash to vote for before
- knowing what consensus-method will be used.
-
- Here's one way we could do it. Each vote / consensus includes
- the microdescriptor-elements that were used to compute the hashes,
- and also a preferred-microdescriptor-elements set. If an authority
- has a consensus from the previous period, then it should use the
- consensus preferred-microdescriptor-elements when computing its votes
- for microdescriptor-elements and the appropriate hashes in the upcoming
- period. (If it has no previous consensus, then it just writes its
- own preferences in both lines.)
-
-3.2. Directory mirrors serve microdescriptors
-
- Directory mirrors should then read the microdescriptor-elements line
- from the consensus, and learn how to answer requests. (Directory mirrors
- continue to serve normal relay descriptors too, a) to serve old clients
- and b) to be able to construct microdescriptors on the fly.)
-
- The microdescriptors with hashes <D1>,<D2>,<D3> should be available at:
- http://<hostname>/tor/micro/d/<D1>+<D2>+<D3>.z
+ When we are generating a consensus, we use whichever m line
+ unambiguously corresponds to the descriptor digest that will be
+ included in the consensus.
+
+ (If different votes have different microdescriptor digests for a
+ single <descriptor-digest, consensus-method> pair, then at least one
+ of the authorities is broken. If this happens, the consensus should
+ contain whichever microdescriptor digest is most common. If there is
+ no winner, we break ties in the favor of the lexically earliest.
+ Either way, we should log a warning: there is definitely a bug.)
+
+ The "m" lines in a consensus contain only the digest, not a list of
+ consensus methods.
+
+3.1.3. A new flavor of consensus
+
+ Rather than inserting "m" lines in the current consensus format,
+ they should be included in a new consensus flavor (see proposal
+ 162).
+
+ This flavor can safely omit descriptor digests.
+
+ When we implement this voting method, we can remove the exit policy
+ summary from the current "ns" flavor of consensus, since no current
+ clients use them, and they take up about 5% of the compressed
+ consensus.
+
+ This new consensus flavor should be signed with the sha256 signature
+ format as documented in proposal 162.
+
+3.2. Directory mirrors fetch, cache, and serve microdescriptors
+
+ Directory mirrors should fetch, catch, and serve each microdescriptor
+ from the authorities. (They need to continue to serve normal relay
+ descriptors too, to handle old clients.)
+
+ The microdescriptors with base64 hashes <D1>,<D2>,<D3> should be
+ available at:
+ http://<hostname>/tor/micro/d/<D1>-<D2>-<D3>.z
+ (We use base64 for size and for consistency with the consensus
+ format. We use -s instead of +s to separate these items, since
+ the + character is used in base64 encoding.)
All the microdescriptors from the current consensus should also be
available at:
@@ -136,24 +139,9 @@ Status: Open
so a client that's bootstrapping doesn't need to send a 70KB URL just
to name every microdescriptor it's looking for.
- The format of a microdescriptor is the header line
- "microdescriptor-header"
- followed by each element (keyword and body), alphabetically. There's
- no need to mention what hash it's for, since it's self-identifying:
- you can hash the elements to learn this.
-
- (Do we need a footer line to show that it's over, or is the next
- microdescriptor line or EOF enough of a hint? A footer line wouldn't
- hurt much. Also, no fair voting for the microdescriptor-element
- "microdescriptor-header".)
-
+ Microdescriptors have no header or footer.
The hash of the microdescriptor is simply the hash of the concatenated
- elements -- not counting the header line or hypothetical footer line.
- Unless you prefer that?
-
- Is there a reasonable way to version these things? We could say that
- the microdescriptor-header line can contain arguments which clients
- must ignore if they don't understand them. Any better ways?
+ elements.
Directory mirrors should check to make sure that the microdescriptors
they're about to serve match the right hashes (either the hashes from
@@ -170,10 +158,14 @@ Status: Open
When a client gets a new consensus, it looks to see if there are any
microdescriptors it needs to learn. If it needs to learn more than
some threshold of the microdescriptors (half?), it requests 'all',
- else it requests only the missing ones.
+ else it requests only the missing ones. Clients MAY try to
+ determine whether the upload bandwidth for listing the
+ microdescriptors they want is more or less than the download
+ bandwidth for the microdescriptors they do not want.
Clients maintain a cache of microdescriptors along with metadata like
- when it was last referenced by a consensus. They keep a microdescriptor
+ when it was last referenced by a consensus, and which identity key
+ it corresponds to. They keep a microdescriptor
until it hasn't been mentioned in any consensus for a week. Future
clients might cache them for longer or shorter times.
@@ -190,18 +182,17 @@ Status: Open
Another future option would be to fetch some of the microdescriptors
anonymously (via a Tor circuit).
+ Another crazy option (Roger's phrasing) is to do decoy fetches as
+ well.
+
4. Transition and deployment
Phase one, the directory authorities should start voting on
- microdescriptors and microdescriptor elements, and putting them in the
- consensus. This should happen during the 0.2.1.x series, and should
- be relatively easy to do.
+ microdescriptors, and putting them in the consensus.
Phase two, directory mirrors should learn how to serve them, and learn
- how to read the consensus to find out what they should be serving. This
- phase could be done either in 0.2.1.x or early in 0.2.2.x, depending
- on how messy it turns out to be and how quickly we get around to it.
+ how to read the consensus to find out what they should be serving.
Phase three, clients should start fetching and caching them instead
- of normal descriptors. This should happen post 0.2.1.x.
+ of normal descriptors.
diff --git a/doc/spec/proposals/159-exit-scanning.txt b/doc/spec/proposals/159-exit-scanning.txt
index fbc69aa9e6..7090f2ed08 100644
--- a/doc/spec/proposals/159-exit-scanning.txt
+++ b/doc/spec/proposals/159-exit-scanning.txt
@@ -1,7 +1,5 @@
Filename: 159-exit-scanning.txt
Title: Exit Scanning
-Version: $Revision$
-Last-Modified: $Date$
Author: Mike Perry
Created: 13-Feb-2009
Status: Open
diff --git a/doc/spec/proposals/160-bandwidth-offset.txt b/doc/spec/proposals/160-bandwidth-offset.txt
new file mode 100644
index 0000000000..96935ade7d
--- /dev/null
+++ b/doc/spec/proposals/160-bandwidth-offset.txt
@@ -0,0 +1,105 @@
+Filename: 160-bandwidth-offset.txt
+Title: Authorities vote for bandwidth offsets in consensus
+Author: Roger Dingledine
+Created: 4-May-2009
+Status: Finished
+Target: 0.2.2.x
+
+1. Motivation
+
+ As part of proposal 141, we moved the bandwidth value for each relay
+ into the consensus. Now clients can know how they should load balance
+ even before they've fetched the corresponding relay descriptors.
+
+ Putting the bandwidth in the consensus also lets the directory
+ authorities choose more accurate numbers to advertise, if we come up
+ with a better algorithm for deciding weightings.
+
+ Our original plan was to teach directory authorities how to measure
+ bandwidth themselves; then every authority would vote for the bandwidth
+ it prefers, and we'd take the median of votes as usual.
+
+ The problem comes when we have 7 authorities, and only a few of them
+ have smarter bandwidth allocation algorithms. So long as the majority
+ of them are voting for the number in the relay descriptor, the minority
+ that have better numbers will be ignored.
+
+2. Options
+
+ One fix would be to demand that every authority also run the
+ new bandwidth measurement algorithms: in that case, part of the
+ responsibility of being an authority operator is that you need to run
+ this code too. But in practice we can't really require all current
+ authority operators to do that; and if we want to expand the set of
+ authority operators even further, it will become even more impractical.
+ Also, bandwidth testing adds load to the network, so we don't really
+ want to require that the number of concurrent bandwidth tests match
+ the number of authorities we have.
+
+ The better fix is to allow certain authorities to specify that they are
+ voting on bandwidth measurements: more accurate bandwidth values that
+ have actually been evaluated. In this way, authorities can vote on
+ the median measured value if sufficient measured votes exist for a router,
+ and otherwise fall back to the median value taken from the published router
+ descriptors.
+
+3. Security implications
+
+ If only some authorities choose to vote on an offset, then a majority of
+ those voting authorities can arbitrarily change the bandwidth weighting
+ for the relay. At the extreme, if there's only one offset-voting
+ authority, then that authority can dictate which relays clients will
+ find attractive.
+
+ This problem isn't entirely new: we already have the worry wrt
+ the subset of authorities that vote for BadExit.
+
+ To make it not so bad, we should deploy at least three offset-voting
+ authorities.
+
+ Also, authorities that know how to vote for offsets should vote for
+ an offset of zero for new nodes, rather than choosing not to vote on
+ any offset in those cases.
+
+4. Design
+
+ First, we need a new consensus method to support this new calculation.
+
+ Now v3 votes can have an additional value on the "w" line:
+ "w Bandwidth=X Measured=" INT.
+
+ Once we're using the new consensus method, the new way to compute the
+ Bandwidth weight is by checking if there are at least 3 "Measured"
+ votes. If so, the median of these is taken. Otherwise, the median
+ of the "Bandwidth=" values are taken, as described in Proposal 141.
+
+ Then the actual consensus looks just the same as it did before,
+ so clients never have to know that this additional calculation is
+ happening.
+
+5. Implementation
+
+ The Measured values will be read from a file provided by the scanners
+ described in proposal 161. Files with a timestamp older than 3 days
+ will be ignored.
+
+ The file will be read in from dirserv_generate_networkstatus_vote_obj()
+ in a location specified by a new config option "V3MeasuredBandwidths".
+ A helper function will be called to populate new 'measured' and
+ 'has_measured' fields of the routerstatus_t 'routerstatuses' list with
+ values read from this file.
+
+ An additional for_vote flag will be passed to
+ routerstatus_format_entry() from format_networkstatus_vote(), which will
+ indicate that the "Measured=" string should be appended to the "w Bandwith="
+ line with the measured value in the struct.
+
+ routerstatus_parse_entry_from_string() will be modified to parse the
+ "Measured=" lines into routerstatus_t struct fields.
+
+ Finally, networkstatus_compute_consensus() will set rs_out.bandwidth
+ to the median of the measured values if there are more than 3, otherwise
+ it will use the bandwidth value median as normal.
+
+
+
diff --git a/doc/spec/proposals/161-computing-bandwidth-adjustments.txt b/doc/spec/proposals/161-computing-bandwidth-adjustments.txt
new file mode 100644
index 0000000000..d219826668
--- /dev/null
+++ b/doc/spec/proposals/161-computing-bandwidth-adjustments.txt
@@ -0,0 +1,174 @@
+Title: Computing Bandwidth Adjustments
+Filename: 161-computing-bandwidth-adjustments.txt
+Author: Mike Perry
+Created: 12-May-2009
+Target: 0.2.2.x
+Status: Finished
+
+
+1. Motivation
+
+ There is high variance in the performance of the Tor network. Despite
+ our efforts to balance load evenly across the Tor nodes, some nodes are
+ significantly slower and more overloaded than others.
+
+ Proposal 160 describes how we can augment the directory authorities to
+ vote on measured bandwidths for routers. This proposal describes what
+ goes into the measuring process.
+
+
+2. Measurement Selection
+
+ The general idea is to determine a load factor representing the ratio
+ of the capacity of measured nodes to the rest of the network. This load
+ factor could be computed from three potentially relevant statistics:
+ circuit failure rates, circuit extend times, or stream capacity.
+
+ Circuit failure rates and circuit extend times appear to be
+ non-linearly proportional to node load. We've observed that the same
+ nodes when scanned at US nighttime hours (when load is presumably
+ lower) exhibit almost no circuit failure, and significantly faster
+ extend times than when scanned during the day.
+
+ Stream capacity, however, is much more uniform, even during US
+ nighttime hours. Moreover, it is a more intuitive representation of
+ node capacity, and also less dependent upon distance and latency
+ if amortized over large stream fetches.
+
+
+3. Average Stream Bandwidth Calculation
+
+ The average stream bandwidths are obtained by dividing the network into
+ slices of 50 nodes each, grouped according to advertised node bandwidth.
+
+ Two hop circuits are built using nodes from the same slice, and a large
+ file is downloaded via these circuits. The file sizes are set based
+ on node percentile rank as follows:
+
+ 0-10: 2M
+ 10-20: 1M
+ 20-30: 512k
+ 30-50: 256k
+ 50-100: 128k
+
+ These sizes are based on measurements performed during test scans.
+
+ This process is repeated until each node has been chosen to participate
+ in at least 5 circuits.
+
+
+4. Ratio Calculation
+
+ The ratios are calculated by dividing each measured value by the
+ network-wide average.
+
+
+5. Ratio Filtering
+
+ After the base ratios are calculated, a second pass is performed
+ to remove any streams with nodes of ratios less than X=0.5 from
+ the results of other nodes. In addition, all outlying streams
+ with capacity of one standard deviation below a node's average
+ are also removed.
+
+ The final ratio result will be greater of the unfiltered ratio
+ and the filtered ratio.
+
+
+6. Pseudocode for Ratio Calculation Algorithm
+
+ Here is the complete pseudocode for the ratio algorithm:
+
+ Slices = {S | S is 50 nodes of similar consensus capacity}
+ for S in Slices:
+ while exists node N in S with circ_chosen(N) < 7:
+ fetch_slice_file(build_2hop_circuit(N, (exit in S)))
+ for N in S:
+ BW_measured(N) = MEAN(b | b is bandwidth of a stream through N)
+ Bw_stddev(N) = STDDEV(b | b is bandwidth of a stream through N)
+ Bw_avg(S) = MEAN(b | b = BW_measured(N) for all N in S)
+ for N in S:
+ Normal_Streams(N) = {stream via N | bandwidth >= BW_measured(N)}
+ BW_Norm_measured(N) = MEAN(b | b is a bandwidth of Normal_Streams(N))
+
+ Bw_net_avg(Slices) = MEAN(BW_measured(N) for all N in Slices)
+ Bw_Norm_net_avg(Slices) = MEAN(BW_Norm_measured(N) for all N in Slices)
+
+ for N in all Slices:
+ Bw_net_ratio(N) = Bw_measured(N)/Bw_net_avg(Slices)
+ Bw_Norm_net_ratio(N) = BW_Norm_measured(N)/Bw_Norm_net_avg(Slices)
+
+ ResultRatio(N) = MAX(Bw_net_ratio(N), Bw_Norm_net_ratio(N))
+
+
+7. Security implications
+
+ The ratio filtering will deal with cases of sabotage by dropping
+ both very slow outliers in stream average calculations, as well
+ as dropping streams that used very slow nodes from the calculation
+ of other nodes.
+
+ This scheme will not address nodes that try to game the system by
+ providing better service to scanners. The scanners can be detected
+ at the entry by IP address, and at the exit by the destination fetch
+ IP.
+
+ Measures can be taken to obfuscate and separate the scanners' source
+ IP address from the directory authority IP address. For instance,
+ scans can happen offsite and the results can be rsynced into the
+ authorities. The destination server IP can also change.
+
+ Neither of these methods are foolproof, but such nodes can already
+ lie about their bandwidth to attract more traffic, so this solution
+ does not set us back any in that regard.
+
+
+8. Parallelization
+
+ Because each slice takes as long as 6 hours to complete, we will want
+ to parallelize as much as possible. This will be done by concurrently
+ running multiple scanners from each authority to deal with different
+ segments of the network. Each scanner piece will continually loop
+ over a portion of the network, outputting files of the form:
+
+ node_id=<idhex> SP strm_bw=<BW_measured(N)> SP
+ filt_bw=<BW_Norm_measured(N)> ns_bw=<CurrentConsensusBw(N)> NL
+
+ The most recent file from each scanner will be periodically gathered
+ by another script that uses them to produce network-wide averages
+ and calculate ratios as per the algorithm in section 6. Because nodes
+ may shift in capacity, they may appear in more than one slice and/or
+ appear more than once in the file set. The most recently measured
+ line will be chosen in this case.
+
+
+9. Integration with Proposal 160
+
+ The final results will be produced for the voting mechanism
+ described in Proposal 160 by multiplying the derived ratio by
+ the average published consensus bandwidth during the course of the
+ scan, and taking the weighted average with the previous consensus
+ bandwidth:
+
+ Bw_new = Round((Bw_current * Alpha + Bw_scan_avg*Bw_ratio)/(Alpha + 1))
+
+ The Alpha parameter is a smoothing parameter intended to prevent
+ rapid oscillation between loaded and unloaded conditions. It is
+ currently fixed at 0.333.
+
+ The Round() step consists of rounding to the 3 most significant figures
+ in base10, and then rounding that result to the nearest 1000, with
+ a minimum value of 1000.
+
+ This will produce a new bandwidth value that will be output into a
+ file consisting of lines of the form:
+
+ node_id=<idhex> SP bw=<Bw_new> NL
+
+ The first line of the file will contain a timestamp in UNIX time()
+ seconds. This will be used by the authority to decide if the
+ measured values are too old to use.
+
+ This file can be either copied or rsynced into a directory readable
+ by the directory authority.
+
diff --git a/doc/spec/proposals/162-consensus-flavors.txt b/doc/spec/proposals/162-consensus-flavors.txt
new file mode 100644
index 0000000000..e3b697afee
--- /dev/null
+++ b/doc/spec/proposals/162-consensus-flavors.txt
@@ -0,0 +1,188 @@
+Filename: 162-consensus-flavors.txt
+Title: Publish the consensus in multiple flavors
+Author: Nick Mathewson
+Created: 14-May-2009
+Target: 0.2.2
+Status: Open
+
+Overview:
+
+ This proposal describes a way to publish each consensus in
+ multiple simultaneous formats, or "flavors". This will reduce the
+ amount of time needed to deploy new consensus-like documents, and
+ reduce the size of consensus documents in the long term.
+
+Motivation:
+
+ In the future, we will almost surely want different fields and
+ data in the network-status document. Examples include:
+ - Publishing hashes of microdescriptors instead of hashes of
+ full descriptors (Proposal 158).
+ - Including different digests of descriptors, instead of the
+ perhaps-soon-to-be-totally-broken SHA1.
+
+ Note that in both cases, from the client's point of view, this
+ information _replaces_ older information. If we're using a
+ SHA256 hash, we don't need to see the SHA1. If clients only want
+ microdescriptors, they don't (necessarily) need to see hashes of
+ other things.
+
+ Our past approach to cases like this has been to shovel all of
+ the data into the consensus document. But this is rather poor
+ for bandwidth. Adding a single SHA256 hash to a consensus for
+ each router increases the compressed consensus size by 47%. In
+ comparison, replacing a single SHA1 hash with a SHA256 hash for
+ each listed router increases the consensus size by only 18%.
+
+Design in brief:
+
+ Let the voting process remain as it is, until a consensus is
+ generated. With future versions of the voting algorithm, instead
+ of just a single consensus being generated, multiple consensus
+ "flavors" are produced.
+
+ Consensuses (all of them) include a list of which flavors are
+ being generated. Caches fetch and serve all flavors of consensus
+ that are listed, regardless of whether they can parse or validate
+ them, and serve them to clients. Thus, once this design is in
+ place, we won't need to deploy more cache changes in order to get
+ new flavors of consensus to be cached.
+
+ Clients download only the consensus flavor they want.
+
+A note on hashes:
+
+ Everything in this document is specified to use SHA256, and to be
+ upgradeable to use better hashes in the future.
+
+Spec modifications:
+
+ 1. URLs and changes to the current consensus format.
+
+ Every consensus flavor has a name consisting of a sequence of one
+ or more alphanumeric characters and dashes. For compatibility
+ current descriptor flavor is called "ns".
+
+ The supported consensus flavors are defined as part of the
+ authorities' consensus method.
+
+ For each supported flavor, every authority calculates another
+ consensus document of as-yet-unspecified format, and exchanges
+ detached signatures for these documents as in the current consensus
+ design.
+
+ In addition to the consensus currently served at
+ /tor/status-vote/(current|next)/consensus.z and
+ /tor/status-vote/(current|next)/consensus/<FP1>+<FP2>+<FP3>+....z ,
+ authorities serve another consensus of each flavor "F" from the
+ locations /tor/status-vote/(current|next)/consensus-F.z. and
+ /tor/status-vote/(current|next)/consensus-F/<FP1>+....z.
+
+ When caches serve these documents, they do so from the same
+ locations.
+
+ 2. Document format: generic consensus.
+
+ The format of a flavored consensus is as-yet-unspecified, except
+ that the first line is:
+ "network-status-version" SP version SP flavor NL
+
+ where version is 3 or higher, and the flavor is a string
+ consisting of alphanumeric characters and dashes, matching the
+ corresponding flavor listed in the unflavored consensus.
+
+ 3. Document format: detached signatures.
+
+ We amend the detached signature format to include more than one
+ consensus-digest line, and more than one set of signatures.
+
+ After the consensus-digest line, we allow more lines of the form:
+ "additional-digest" SP flavor SP algname SP digest NL
+
+ Before the directory-signature lines, we allow more entries of the form:
+ "additional-signature" SP flavor SP algname SP identity SP
+ signing-key-digest NL signature.
+
+ [We do not use "consensus-digest" or "directory-signature" for flavored
+ consensuses, since this could confuse older Tors.]
+
+ The consensus-signatures URL should contain the signatures
+ for _all_ flavors of consensus.
+
+ 4. The consensus index:
+
+ Authorities additionally generate and serve a consensus-index
+ document. Its format is:
+
+ Header ValidAfter ValidUntil Documents Signatures
+
+ Header = "consensus-index" SP version NL
+ ValidAfter = as in a consensus
+ ValidUntil = as in a consensus
+ Documents = Document*
+ Document = "document" SP flavor SP SignedLength
+ 1*(SP AlgorithmName "=" Digest) NL
+ Signatures = Signature*
+ Signature = "directory-signature" SP algname SP identity
+ SP signing-key-digest NL signature
+
+ There must be one Document line for each generated consensus flavor.
+ Each Document line describes the length of the signed portion of
+ a consensus (the signatures themselves are not included), along
+ with one or more digests of that signed portion. Digests are
+ given in hex. The algorithm "sha256" MUST be included; others
+ are allowed.
+
+ The algname part of a signature describes what algorithm was
+ used to hash the identity and signing keys, and to compute the
+ signature. The algorithm "sha256" MUST be recognized;
+ signatures with unrecognized algorithms MUST be ignored.
+ (See below).
+
+ The consensus index is made available at
+ /tor/status-vote/(current|next)/consensus-index.z.
+
+ Caches should fetch this document so they can check the
+ correctness of the different consensus documents they fetch.
+ They do not need to check anything about an unrecognized
+ consensus document beyond its digest and length.
+
+ 4.1. The "sha256" signature format.
+
+ The 'SHA256' signature format for directory objects is defined as
+ the RSA signature of the OAEP+-padded SHA256 digest of the item to
+ be signed. When checking signatures, the signature MUST be treated
+ as valid if the signature material begins with SHA256(document);
+ this allows us to add other data later.
+
+Considerations:
+
+ - We should not create a new flavor of consensus when adding a
+ field instead wouldn't be too onerous.
+
+ - We should not proliferate flavors lightly: clients will be
+ distinguishable based on which flavor they download.
+
+Migration:
+
+ - Stage one: authorities begin generating and serving
+ consensus-index files.
+
+ - Stage two: Caches begin downloading consensus-index files,
+ validating them, and using them to decide what flavors of
+ consensus documents to cache. They download all listed
+ documents, and compare them to the digests given in the
+ consensus.
+
+ - Stage three: Once we want to make a significant change to the
+ consensus format, we deploy another flavor of consensus at the
+ authorities. This will immediately start getting cached by the
+ caches, and clients can start fetching the new flavor without
+ waiting a version or two for enough caches to begin supporting
+ it.
+
+Acknowledgements:
+
+ Aspects of this design and its applications to hash migration were
+ heavily influenced by IRC conversations with Marian.
+
diff --git a/doc/spec/proposals/163-detecting-clients.txt b/doc/spec/proposals/163-detecting-clients.txt
new file mode 100644
index 0000000000..d838b17063
--- /dev/null
+++ b/doc/spec/proposals/163-detecting-clients.txt
@@ -0,0 +1,115 @@
+Filename: 163-detecting-clients.txt
+Title: Detecting whether a connection comes from a client
+Author: Nick Mathewson
+Created: 22-May-2009
+Target: 0.2.2
+Status: Open
+
+
+Overview:
+
+ Some aspects of Tor's design require relays to distinguish
+ connections from clients from connections that come from relays.
+ The existing means for doing this is easy to spoof. We propose
+ a better approach.
+
+Motivation:
+
+ There are at least two reasons for which Tor servers want to tell
+ which connections come from clients and which come from other
+ servers:
+
+ 1) Some exits, proposal 152 notwithstanding, want to disallow
+ their use as single-hop proxies.
+ 2) Some performance-related proposals involve prioritizing
+ traffic from relays, or limiting traffic per client (but not
+ per relay).
+
+ Right now, we detect client vs server status based on how the
+ client opens circuits. (Check out the code that implements the
+ AllowSingleHopExits option if you want all the details.) This
+ method is depressingly easy to fake, though. This document
+ proposes better means.
+
+Goals:
+
+ To make grabbing relay privileges at least as difficult as just
+ running a relay.
+
+ In the analysis below, "using server privileges" means taking any
+ action that only servers are supposed to do, like delivering a
+ BEGIN cell to an exit node that doesn't allow single hop exits,
+ or claiming server-like amounts of bandwidth.
+
+Passive detection:
+
+ A connection is definitely a client connection if it takes one of
+ the TLS methods during setup that does not establish an identity
+ key.
+
+ A circuit is definitely a client circuit if it is initiated with
+ a CREATE_FAST cell, though the node could be a client or a server.
+
+ A node that's listed in a recent consensus is probably a server.
+
+ A node to which we have successfully extended circuits from
+ multiple origins is probably a server.
+
+Active detection:
+
+ If a node doesn't try to use server privileges at all, we never
+ need to care whether it's a server.
+
+ When a node or circuit tries to use server privileges, if it is
+ "definitely a client" as per above, we can refuse it immediately.
+
+ If it's "probably a server" as per above, we can accept it.
+
+ Otherwise, we have either a client, or a server that is neither
+ listed in any consensus or used by any other clients -- in other
+ words, a new or private server.
+
+ For these servers, we should attempt to build one or more test
+ circuits through them. If enough of the circuits succeed, the
+ node is a real relay. If not, it is probably a client.
+
+ While we are waiting for the test circuits to succeed, we should
+ allow a short grace period in which server privileges are
+ permitted. When a test is done, we should remember its outcome
+ for a while, so we don't need to do it again.
+
+Why it's hard to do good testing:
+
+ Doing a test circuit starting with an unlisted router requires
+ only that we have an open connection for it. Doing a test
+ circuit starting elsewhere _through_ an unlisted router--though
+ more reliable-- would require that we have a known address, port,
+ identity key, and onion key for the router. Only the address and
+ identity key are easily available via the current Tor protocol in
+ all cases.
+
+ We could fix this part by requiring that all servers support
+ BEGIN_DIR and support downloading at least a current descriptor
+ for themselves.
+
+Open questions:
+
+ What are the thresholds for the needed numbers of circuits
+ for us to decide that a node is a relay?
+
+ [Suggested answer: two circuits from two distinct hosts.]
+
+ How do we pick grace periods? How long do we remember the
+ outcome of a test?
+
+ [Suggested answer: 10 minute grace period; 48 hour memory of
+ test outcomes.]
+
+ If we can build circuits starting at a suspect node, but we don't
+ have enough information to try extending circuits elsewhere
+ through the node, should we conclude that the node is
+ "server-like" or not?
+
+ [Suggested answer: for now, just try making circuits through
+ the node. Extend this to extending circuits as needed.]
+
diff --git a/doc/spec/proposals/164-reporting-server-status.txt b/doc/spec/proposals/164-reporting-server-status.txt
new file mode 100644
index 0000000000..705f5f1a84
--- /dev/null
+++ b/doc/spec/proposals/164-reporting-server-status.txt
@@ -0,0 +1,91 @@
+Filename: 164-reporting-server-status.txt
+Title: Reporting the status of server votes
+Author: Nick Mathewson
+Created: 22-May-2009
+Target: 0.2.2
+Status: Open
+
+
+Overview:
+
+ When a given node isn't listed in the directory, it isn't always easy
+ to tell why. This proposal suggest a quick-and-dirty way for
+ authorities to export not only how they voted, but why, and a way to
+ collate the information.
+
+Motivation:
+
+ Right now, if you want to know the reason why your server was listed
+ a certain way in the Tor directory, the following steps are
+ recommended:
+
+ - Look through your log for reports of what the authority said
+ when you tried to upload.
+
+ - Look at the consensus; see if you're listed.
+
+ - Wait a while, see if things get better.
+
+ - Download the votes from all the authorities, and see how they
+ voted. Try to figure out why.
+
+ - If you think they'll listen to you, ask some authority
+ operators to look you up in their mtbf files and logs to see
+ why they voted as they did.
+
+ This is far too hard.
+
+Solution:
+
+ We should add a new vote-like information-only document that
+ authorities serve on request. Call it a "vote info". It is
+ generated at the same time as a vote, but used only for
+ determining why a server voted as it did. It is served from
+ /tor/status-vote-info/current/authority[.z]
+
+ It differs from a vote in that:
+
+ * Its vote-status field is 'vote-info'.
+
+ * It includes routers that the authority would not include
+ in its vote.
+
+ For these, it includes an "omitted" line with an English
+ message explaining why they were omitted.
+
+ * For each router, it includes a line describing its WFU and
+ MTBF. The format is:
+
+ "stability <mtbf> up-since='date'"
+ "uptime <wfu> down-since='date'"
+
+ * It describes the WFU and MTBF thresholds it requires to
+ vote for a given router in various roles in the header.
+ The format is:
+
+ "flag-requirement <flag-name> <field> <op> <value>"
+
+ e.g.
+
+ "flag-requirement Guard uptime > 80"
+
+ * It includes info on routers all of whose descriptors that
+ were uploaded but rejected over the past few hours. The
+ "r" lines for these are the same as for regular routers.
+ The other lines are omitted for these routers, and are
+ replaced with a single "rejected" line, explaining (in
+ English) why the router was rejected.
+
+
+ A status site (like Torweather or Torstatus or another
+ tool) can poll these files when they are generated, collate
+ the data, and make it available to server operators.
+
+Risks:
+
+ This document makes no provisions for caching these "vote
+ info" documents. If many people wind up fetching them
+ aggressively from the authorities, that would be bad.
+
+
+
diff --git a/doc/spec/proposals/165-simple-robust-voting.txt b/doc/spec/proposals/165-simple-robust-voting.txt
new file mode 100644
index 0000000000..f813285a83
--- /dev/null
+++ b/doc/spec/proposals/165-simple-robust-voting.txt
@@ -0,0 +1,133 @@
+Filename: 165-simple-robust-voting.txt
+Title: Easy migration for voting authority sets
+Author: Nick Mathewson
+Created: 2009-05-28
+Status: Open
+
+Overview:
+
+ This proposal describes any easy-to-implement, easy-to-verify way to
+ change the set of authorities without creating a "flag day" situation.
+
+Motivation:
+
+ From proposal 134 ("More robust consensus voting with diverse
+ authority sets") by Peter Palfrader:
+
+ Right now there are about five authoritative directory servers
+ in the Tor network, tho this number is expected to rise to about
+ 15 eventually.
+
+ Adding a new authority requires synchronized action from all
+ operators of directory authorities so that at any time during the
+ update at least half of all authorities are running and agree on
+ who is an authority. The latter requirement is there so that the
+ authorities can arrive at a common consensus: Each authority
+ builds the consensus based on the votes from all authorities it
+ recognizes, and so a different set of recognized authorities will
+ lead to a different consensus document.
+
+ In response to this problem, proposal 134 suggested that every
+ candidate authority list in its vote whom it believes to be an
+ authority. These A-says-B-is-an-authority relationships form a
+ directed graph. Each authority then iteratively finds the largest
+ clique in the graph and remove it, until they find one containing
+ them. They vote with this clique.
+
+ Proposal 134 had some problems:
+
+ - It had a security problem in that M hostile authorities in a
+ clique could effectively kick out M-1 honest authorities. This
+ could enable a minority of the original authorities to take over.
+
+ - It was too complex in its implications to analyze well: it took us
+ over a year to realize that it was insecure.
+
+ - It tried to solve a bigger problem: general fragmentation of
+ authority trust. Really, all we wanted to have was the ability to
+ add and remove authorities without forcing a flag day.
+
+Proposed protocol design:
+
+ A "Voting Set" is a set of authorities. Each authority has a list of
+ the voting sets it considers acceptable. These sets are chosen
+ manually by the authority operators. They must always contain the
+ authority itself. Each authority lists all of these voting sets in
+ its votes.
+
+ Authorities exchange votes with every other authority in any of their
+ voting sets.
+
+ When it is time to calculate a consensus, an authority votes with
+ whichever voting set it lists that is listed by the most members of
+ that set. In other words, given two sets S1 and S2 that an authority
+ lists, that authority will prefer to vote with S1 over S2 whenever
+ the number of other authorities in S1 that themselves list S1 is
+ higher than the number of other authorities in S2 that themselves
+ list S2.
+
+ For example, suppose authority A recognizes two sets, "A B C D" and
+ "A E F G H". Suppose that the first set is recognized by all of A,
+ B, C, and D, whereas the second set is recognized only by A, E, and
+ F. Because the first set is recognize by more of the authorities in
+ it than the other one, A will vote with the first set.
+
+ Ties are broken in favor of some arbitrary function of the identity
+ keys of the authorities in the set.
+
+How to migrate authority sets:
+
+ In steady state, each authority operator should list only the current
+ actual voting set as accepted.
+
+ When we want to add an authority, each authority operator configures
+ his or her server to list two voting sets: one containing all the old
+ authorities, and one containing the old authorities and the new
+ authority too. Once all authorities are listing the new set of
+ authorities, they will start voting with that set because of its
+ size.
+
+ What if one or two authority operators are slow to list the new set?
+ Then the other operators can stop listing the old set once there are
+ enough authorities listing the new set to make its voting successful.
+ (Note that these authorities not listing the new set will still have
+ their votes counted, since they themselves will be members of the new
+ set. They will only fail to sign the consensus generated by the
+ other authorities who are using the new set.)
+
+ When we want to remove an authority, the operators list two voting
+ sets: one containing all the authorities, and one omitting the
+ authority we want to remove. Once enough authorities list the new
+ set as acceptable, we start having authority operators stop listing
+ the old set. Once there are more listing the new set than the old
+ set, the new set will win.
+
+Data format changes:
+
+ Add a new 'voting-set' line to the vote document format. Allow it to
+ occur any number of times. Its format is:
+
+ voting-set SP 'fingerprint' SP 'fingerprint' ... NL
+
+ where each fingerprint is the hex fingerprint of an identity key of
+ an authority. Sort fingerprints in ascending order.
+
+ When the consensus method is at least 'X' (decide this when we
+ implement the proposal), add this line to the consensus format as
+ well, before the first dir-source line. [This information is not
+ redundant with the dir-source sections in the consensus: If an
+ authority is recognized but didn't vote, that authority will appear in
+ the voting-set line but not in the dir-source sections.]
+
+ We don't need to list other information about authorities in our
+ vote.
+
+Migration issues:
+
+ We should keep track somewhere of which Tor client versions
+ recognized which authorities.
+
+Acknowledgments:
+
+ The design came out of an IRC conversation with Peter Palfrader. He
+ had the basic idea first.
diff --git a/doc/spec/proposals/166-statistics-extra-info-docs.txt b/doc/spec/proposals/166-statistics-extra-info-docs.txt
new file mode 100644
index 0000000000..ab2716a71c
--- /dev/null
+++ b/doc/spec/proposals/166-statistics-extra-info-docs.txt
@@ -0,0 +1,391 @@
+Filename: 166-statistics-extra-info-docs.txt
+Title: Including Network Statistics in Extra-Info Documents
+Author: Karsten Loesing
+Created: 21-Jul-2009
+Target: 0.2.2
+Status: Accepted
+
+Change history:
+
+ 21-Jul-2009 Initial proposal for or-dev
+
+
+Overview:
+
+ The Tor network has grown to almost two thousand relays and millions
+ of casual users over the past few years. With growth has come
+ increasing performance problems and attempts by some countries to
+ block access to the Tor network. In order to address these problems,
+ we need to learn more about the Tor network. This proposal suggests to
+ measure additional statistics and include them in extra-info documents
+ to help us understand the Tor network better.
+
+
+Introduction:
+
+ As of May 2009, relays, bridges, and directories gather the following
+ data for statistical purposes:
+
+ - Relays and bridges count the number of bytes that they have pushed
+ in 15-minute intervals over the past 24 hours. Relays and bridges
+ include these data in extra-info documents that they send to the
+ directory authorities whenever they publish their server descriptor.
+
+ - Bridges further include a rough number of clients per country that
+ they have seen in the past 48 hours in their extra-info documents.
+
+ - Directories can be configured to count the number of clients they
+ see per country in the past 24 hours and to write them to a local
+ file.
+
+ Since then we extended the network statistics in Tor. These statistics
+ include:
+
+ - Directories now gather more precise statistics about connecting
+ clients. Fixes include measuring in intervals of exactly 24 hours,
+ counting unsuccessful requests, measuring download times, etc. The
+ directories append their statistics to a local file every 24 hours.
+
+ - Entry guards count the number of clients per country per day like
+ bridges do and write them to a local file every 24 hours.
+
+ - Relays measure statistics of the number of cells in their circuit
+ queues and how much time these cells spend waiting there. Relays
+ write these statistics to a local file every 24 hours.
+
+ - Exit nodes count the number of read and written bytes on exit
+ connections per port as well as the number of opened exit streams
+ per port in 24-hour intervals. Exit nodes write their statistics to
+ a local file.
+
+ The following four sections contain descriptions for adding these
+ statistics to the relays' extra-info documents.
+
+
+Directory request statistics:
+
+ The first type of statistics aims at measuring directory requests sent
+ by clients to a directory mirror or directory authority. More
+ precisely, these statistics aim at requests for v2 and v3 network
+ statuses only. These directory requests are sent non-anonymously,
+ either via HTTP-like requests to a directory's Dir port or tunneled
+ over a 1-hop circuit.
+
+ Measuring directory request statistics is useful for several reasons:
+ First, the number of locally seen directory requests can be used to
+ estimate the total number of clients in the Tor network. Second, the
+ country-wise classification of requests using a GeoIP database can
+ help counting the relative and absolute number of users per country.
+ Third, the download times can give hints on the available bandwidth
+ capacity at clients.
+
+ Directory requests do not give any hints on the contents that clients
+ send or receive over the Tor network. Every client requests network
+ statuses from the directories, so that there are no anonymity-related
+ concerns to gather these statistics. It might be, though, that clients
+ wish to hide the fact that they are connecting to the Tor network.
+ Therefore, IP addresses are resolved to country codes in memory,
+ events are accumulated over 24 hours, and numbers are rounded up to
+ multiples of 4 or 8.
+
+ "dirreq-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ A "dirreq-stats-end" line, as well as any other "dirreq-*" line,
+ is only added when the relay has opened its Dir port and after 24
+ hours of measuring directory requests.
+
+ "dirreq-v2-ips" CC=N,CC=N,... NL
+ [At most once.]
+ "dirreq-v3-ips" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ unique IP addresses that have connected from that country to
+ request a v2/v3 network status, rounded up to the nearest multiple
+ of 8. Only those IP addresses are counted that the directory can
+ answer with a 200 OK status code.
+
+ "dirreq-v2-reqs" CC=N,CC=N,... NL
+ [At most once.]
+ "dirreq-v3-reqs" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ requests for v2/v3 network statuses from that country, rounded up
+ to the nearest multiple of 8. Only those requests are counted that
+ the directory can answer with a 200 OK status code.
+
+ "dirreq-v2-share" num% NL
+ [At most once.]
+ "dirreq-v3-share" num% NL
+ [At most once.]
+
+ The share of v2/v3 network status requests that the directory
+ expects to receive from clients based on its advertised bandwidth
+ compared to the overall network bandwidth capacity. Shares are
+ formatted in percent with two decimal places. Shares are
+ calculated as means over the whole 24-hour interval.
+
+ "dirreq-v2-resp" status=num,... NL
+ [At most once.]
+ "dirreq-v3-resp" status=nul,... NL
+ [At most once.]
+
+ List of mappings from response statuses to the number of requests
+ for v2/v3 network statuses that were answered with that response
+ status, rounded up to the nearest multiple of 4. Only response
+ statuses with at least 1 response are reported. New response
+ statuses can be added at any time. The current list of response
+ statuses is as follows:
+
+ "ok": a network status request is answered; this number
+ corresponds to the sum of all requests as reported in
+ "dirreq-v2-reqs" or "dirreq-v3-reqs", respectively, before
+ rounding up.
+ "not-enough-sigs: a version 3 network status is not signed by a
+ sufficient number of requested authorities.
+ "unavailable": a requested network status object is unavailable.
+ "not-found": a requested network status is not found.
+ "not-modified": a network status has not been modified since the
+ If-Modified-Since time that is included in the request.
+ "busy": the directory is busy.
+
+ "dirreq-v2-direct-dl" key=val,... NL
+ [At most once.]
+ "dirreq-v3-direct-dl" key=val,... NL
+ [At most once.]
+ "dirreq-v2-tunneled-dl" key=val,... NL
+ [At most once.]
+ "dirreq-v3-tunneled-dl" key=val,... NL
+ [At most once.]
+
+ List of statistics about possible failures in the download process
+ of v2/v3 network statuses. Requests are either "direct"
+ HTTP-encoded requests over the relay's directory port, or
+ "tunneled" requests using a BEGIN_DIR cell over the relay's OR
+ port. The list of possible statistics can change, and statistics
+ can be left out from reporting. The current list of statistics is
+ as follows:
+
+ Successful downloads and failures:
+
+ "complete": a client has finished the download successfully.
+ "timeout": a download did not finish within 10 minutes after
+ starting to send the response.
+ "running": a download is still running at the end of the
+ measurement period for less than 10 minutes after starting to
+ send the response.
+
+ Download times:
+
+ "min", "max": smallest and largest measured bandwidth in B/s.
+ "d[1-4,6-9]": 1st to 4th and 6th to 9th decile of measured
+ bandwidth in B/s. For a given decile i, i/10 of all downloads
+ had a smaller bandwidth than di, and (10-i)/10 of all downloads
+ had a larger bandwidth than di.
+ "q[1,3]": 1st and 3rd quartile of measured bandwidth in B/s. One
+ fourth of all downloads had a smaller bandwidth than q1, one
+ fourth of all downloads had a larger bandwidth than q3, and the
+ remaining half of all downloads had a bandwidth between q1 and
+ q3.
+ "md": median of measured bandwidth in B/s. Half of the downloads
+ had a smaller bandwidth than md, the other half had a larger
+ bandwidth than md.
+
+
+Entry guard statistics:
+
+ Entry guard statistics include the number of clients per country and
+ per day that are connecting directly to an entry guard.
+
+ Entry guard statistics are important to learn more about the
+ distribution of clients to countries. In the future, this knowledge
+ can be useful to detect if there are or start to be any restrictions
+ for clients connecting from specific countries.
+
+ The information which client connects to a given entry guard is very
+ sensitive. This information must not be combined with the information
+ what contents are leaving the network at the exit nodes. Therefore,
+ entry guard statistics need to be aggregated to prevent them from
+ becoming useful for de-anonymization. Aggregation includes resolving
+ IP addresses to country codes, counting events over 24-hour intervals,
+ and rounding up numbers to the next multiple of 8.
+
+ "entry-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ An "entry-stats-end" line, as well as any other "entry-*"
+ line, is first added after the relay has been running for at least
+ 24 hours.
+
+ "entry-ips" CC=N,CC=N,... NL
+ [At most once.]
+
+ List of mappings from two-letter country codes to the number of
+ unique IP addresses that have connected from that country to the
+ relay and which are no known other relays, rounded up to the
+ nearest multiple of 8.
+
+
+Cell statistics:
+
+ The third type of statistics have to do with the time that cells spend
+ in circuit queues. In order to gather these statistics, the relay
+ memorizes when it puts a given cell in a circuit queue and when this
+ cell is flushed. The relay further notes the life time of the circuit.
+ These data are sufficient to determine the mean number of cells in a
+ queue over time and the mean time that cells spend in a queue.
+
+ Cell statistics are necessary to learn more about possible reasons for
+ the poor network performance of the Tor network, especially high
+ latencies. The same statistics are also useful to determine the
+ effects of design changes by comparing today's data with future data.
+
+ There are basically no privacy concerns from measuring cell
+ statistics, regardless of a node being an entry, middle, or exit node.
+
+ "cell-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ A "cell-stats-end" line, as well as any other "cell-*" line,
+ is first added after the relay has been running for at least 24
+ hours.
+
+ "cell-processed-cells" num,...,num NL
+ [At most once.]
+
+ Mean number of processed cells per circuit, subdivided into
+ deciles of circuits by the number of cells they have processed in
+ descending order from loudest to quietest circuits.
+
+ "cell-queued-cells" num,...,num NL
+ [At most once.]
+
+ Mean number of cells contained in queues by circuit decile. These
+ means are calculated by 1) determining the mean number of cells in
+ a single circuit between its creation and its termination and 2)
+ calculating the mean for all circuits in a given decile as
+ determined in "cell-processed-cells". Numbers have a precision of
+ two decimal places.
+
+ "cell-time-in-queue" num,...,num NL
+ [At most once.]
+
+ Mean time cells spend in circuit queues in milliseconds. Times are
+ calculated by 1) determining the mean time cells spend in the
+ queue of a single circuit and 2) calculating the mean for all
+ circuits in a given decile as determined in
+ "cell-processed-cells".
+
+ "cell-circuits-per-decile" num NL
+ [At most once.]
+
+ Mean number of circuits that are included in any of the deciles,
+ rounded up to the next integer.
+
+
+Exit statistics:
+
+ The last type of statistics affects exit nodes counting the number of
+ bytes written and read and the number of streams opened per port and
+ per 24 hours. Exit port statistics can be measured from looking at
+ headers of BEGIN and DATA cells. A BEGIN cell contains the exit port
+ that is required for the exit node to open a new exit stream.
+ Subsequent DATA cells coming from the client or being sent back to the
+ client contain a length field stating how many bytes of application
+ data are contained in the cell.
+
+ Exit port statistics are important to measure in order to identify
+ possible load-balancing problems with respect to exit policies. Exit
+ nodes that permit more ports than others are very likely overloaded
+ with traffic for those ports plus traffic for other ports. Improving
+ load balancing in the Tor network improves the overall utilization of
+ bandwidth capacity.
+
+ Exit traffic is one of the most sensitive parts of network data in the
+ Tor network. Even though these statistics do not require looking at
+ traffic contents, statistics are aggregated so that they are not
+ useful for de-anonymizing users. Only those ports are reported that
+ have seen at least 0.1% of exiting or incoming bytes, numbers of bytes
+ are rounded up to full kibibytes (KiB), and stream numbers are rounded
+ up to the next multiple of 4.
+
+ "exit-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+ [At most once.]
+
+ YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+ interval of length NSEC seconds (86400 seconds by default).
+
+ An "exit-stats-end" line, as well as any other "exit-*" line, is
+ first added after the relay has been running for at least 24 hours
+ and only if the relay permits exiting (where exiting to a single
+ port and IP address is sufficient).
+
+ "exit-kibibytes-written" port=N,port=N,... NL
+ [At most once.]
+ "exit-kibibytes-read" port=N,port=N,... NL
+ [At most once.]
+
+ List of mappings from ports to the number of kibibytes that the
+ relay has written to or read from exit connections to that port,
+ rounded up to the next full kibibyte.
+
+ "exit-streams-opened" port=N,port=N,... NL
+ [At most once.]
+
+ List of mappings from ports to the number of opened exit streams
+ to that port, rounded up to the nearest multiple of 4.
+
+
+Implementation notes:
+
+ Right now, relays that are configured accordingly write similar
+ statistics to those described in this proposal to disk every 24 hours.
+ With this proposal being implemented, relays include the contents of
+ these files in extra-info documents.
+
+ The following steps are necessary to implement this proposal:
+
+ 1. The current format of [dirreq|entry|buffer|exit]-stats files needs
+ to be adapted to the description in this proposal. This step
+ basically means renaming keywords.
+
+ 2. The timing of writing the four *-stats files should be unified, so
+ that they are written exactly 24 hours after starting the
+ relay. Right now, the measurement intervals for dirreq, entry, and
+ exit stats starts with the first observed request, and files are
+ written when observing the first request that occurs more than 24
+ hours after the beginning of the measurement interval. With this
+ proposal, the measurement intervals should all start at the same
+ time, and files should be written exactly 24 hours later.
+
+ 3. It is advantageous to cache statistics in local files in the data
+ directory until they are included in extra-info documents. The
+ reason is that the 24-hour measurement interval can be very
+ different from the 18-hour publication interval of extra-info
+ documents. When a relay crashes after finishing a measurement
+ interval, but before publishing the next extra-info document,
+ statistics would get lost. Therefore, statistics are written to
+ disk when finishing a measurement interval and read from disk when
+ generating an extra-info document. Only the statistics that were
+ appended to the *-stats files within the past 24 hours are included
+ in extra-info documents. Further, the contents of the *-stats files
+ need to be checked in the process of generating extra-info documents.
+
+ 4. With the statistics patches being tested, the ./configure options
+ should be removed and the statistics code be compiled by default.
+ It is still required for relay operators to add configuration
+ options (DirReqStatistics, ExitPortStatistics, etc.) to enable
+ gathering statistics. However, in the near future, statistics shall
+ be enabled gathered by all relays by default, where requiring a
+ ./configure option would be a barrier for many relay operators.
diff --git a/doc/spec/proposals/167-params-in-consensus.txt b/doc/spec/proposals/167-params-in-consensus.txt
new file mode 100644
index 0000000000..d23bc9c01e
--- /dev/null
+++ b/doc/spec/proposals/167-params-in-consensus.txt
@@ -0,0 +1,47 @@
+Filename: 167-params-in-consensus.txt
+Title: Vote on network parameters in consensus
+Author: Roger Dingledine
+Created: 18-Aug-2009
+Status: Closed
+Implemented-In: 0.2.2
+
+0. History
+
+
+1. Overview
+
+ Several of our new performance plans involve guessing how to tune
+ clients and relays, yet we won't be able to learn whether we guessed
+ the right tuning parameters until many people have upgraded. Instead,
+ we should have directory authorities vote on the parameters, and teach
+ Tors to read the currently recommended values out of the consensus.
+
+2. Design
+
+ V3 votes should include a new "params" line after the known-flags
+ line. It contains key=value pairs, where value is an integer.
+
+ Consensus documents that are generated with a sufficiently new consensus
+ method (7?) then include a params line that includes every key listed
+ in any vote, and the median value for that key (in case of ties,
+ we use the median closer to zero).
+
+2.1. Planned keys.
+
+ The first planned parameter is "circwindow=101", which is the initial
+ circuit packaging window that clients and relays should use. Putting
+ it in the consensus will let us perform experiments with different
+ values once enough Tors have upgraded -- see proposal 168.
+
+ Later parameters might include a weighting for how much to favor quiet
+ circuits over loud circuits in our round-robin algorithm; a weighting
+ for how much to prioritize relays over clients if we use an incentive
+ scheme like the gold-star design; and what fraction of circuits we
+ should throw out from proposal 151.
+
+2.2. What about non-integers?
+
+ I'm not sure how we would do median on non-integer values. Further,
+ I don't have any non-integer values in mind yet. So I say we cross
+ that bridge when we get to it.
+
diff --git a/doc/spec/proposals/168-reduce-circwindow.txt b/doc/spec/proposals/168-reduce-circwindow.txt
new file mode 100644
index 0000000000..c10cf41e2e
--- /dev/null
+++ b/doc/spec/proposals/168-reduce-circwindow.txt
@@ -0,0 +1,134 @@
+Filename: 168-reduce-circwindow.txt
+Title: Reduce default circuit window
+Author: Roger Dingledine
+Created: 12-Aug-2009
+Status: Open
+Target: 0.2.2
+
+0. History
+
+
+1. Overview
+
+ We should reduce the starting circuit "package window" from 1000 to
+ 101. The lower package window will mean that clients will only be able
+ to receive 101 cells (~50KB) on a circuit before they need to send a
+ 'sendme' acknowledgement cell to request 100 more.
+
+ Starting with a lower package window on exit relays should save on
+ buffer sizes (and thus memory requirements for the exit relay), and
+ should save on queue sizes (and thus latency for users).
+
+ Lowering the package window will induce an extra round-trip for every
+ additional 50298 bytes of the circuit. This extra step is clearly a
+ slow-down for large streams, but ultimately we hope that a) clients
+ fetching smaller streams will see better response, and b) slowing
+ down the large streams in this way will produce lower e2e latencies,
+ so the round-trips won't be so bad.
+
+2. Motivation
+
+ Karsten's torperf graphs show that the median download time for a 50KB
+ file over Tor in mid 2009 is 7.7 seconds, whereas the median download
+ time for 1MB and 5MB are around 50s and 150s respectively. The 7.7
+ second figure is way too high, whereas the 50s and 150s figures are
+ surprisingly low.
+
+ The median round-trip latency appears to be around 2s, with 25% of
+ the data points taking more than 5s. That's a lot of variance.
+
+ We designed Tor originally with the original goal of maximizing
+ throughput. We figured that would also optimize other network properties
+ like round-trip latency. Looks like we were wrong.
+
+3. Design
+
+ Wherever we initialize the circuit package window, initialize it to
+ 101 rather than 1000. Reducing it should be safe even when interacting
+ with old Tors: the old Tors will receive the 101 cells and send back
+ a sendme ack cell. They'll still have much higher deliver windows,
+ but the rest of their deliver window will go unused.
+
+ You can find the patch at arma/circwindow. It seems to work.
+
+3.1. Why not 100?
+
+ Tor 0.0.0 through 0.2.1.19 have a bug where they only send the sendme
+ ack cell after 101 cells rather than the intended 100 cells.
+
+ Once 0.2.1.19 is obsolete we can change it back to 100 if we like. But
+ hopefully we'll have moved to some datagram protocol long before
+ 0.2.1.19 becomes obsolete.
+
+3.2. What about stream packaging windows?
+
+ Right now the stream packaging windows start at 500. The goal was to
+ set the stream window to half the circuit window, to provide a crude
+ load balancing between streams on the same circuit. Once we lower
+ the circuit packaging window, the stream packaging window basically
+ becomes redundant.
+
+ We could leave it in -- it isn't hurting much in either case. Or we
+ could take it out -- people building other Tor clients would thank us
+ for that step. Alas, people building other Tor clients are going to
+ have to be compatible with current Tor clients, so in practice there's
+ no point taking out the stream packaging windows.
+
+3.3. What about variable circuit windows?
+
+ Once upon a time we imagined adapting the circuit package window to
+ the network conditions. That is, we would start the window small,
+ and raise it based on the latency and throughput we see.
+
+ In theory that crude imitation of TCP's windowing system would allow
+ us to adapt to fill the network better. In practice, I think we want
+ to stick with the small window and never raise it. The low cap reduces
+ the total throughput you can get from Tor for a given circuit. But
+ that's a feature, not a bug.
+
+4. Evaluation
+
+ How do we know this change is actually smart? It seems intuitive that
+ it's helpful, and some smart systems people have agreed that it's
+ a good idea (or said another way, they were shocked at how big the
+ default package window was before).
+
+ To get a more concrete sense of the benefit, though, Karsten has been
+ running torperf side-by-side on exit relays with the old package window
+ vs the new one. The results are mixed currently -- it is slightly faster
+ for fetching 40KB files, and slightly slower for fetching 50KB files.
+
+ I think it's going to be tough to get a clear conclusion that this is
+ a good design just by comparing one exit relay running the patch. The
+ trouble is that the other hops in the circuits are still getting bogged
+ down by other clients introducing too much traffic into the network.
+
+ Ultimately, we'll want to put the circwindow parameter into the
+ consensus so we can test a broader range of values once enough relays
+ have upgraded.
+
+5. Transition and deployment
+
+ We should put the circwindow in the consensus (see proposal 167),
+ with an initial value of 101. Then as more exit relays upgrade,
+ clients should seamlessly get the better behavior.
+
+ Note that upgrading the exit relay will only affect the "download"
+ package window. An old client that's uploading lots of bytes will
+ continue to use the old package window at the client side, and we
+ can't throttle that window at the exit side without breaking protocol.
+
+ The real question then is what we should backport to 0.2.1. Assuming
+ this could be a big performance win, we can't afford to wait until
+ 0.2.2.x comes out before starting to see the changes here. So we have
+ two options as I see them:
+ a) once clients in 0.2.2.x know how to read the value out of the
+ consensus, and it's been tested for a bit, backport that part to
+ 0.2.1.x.
+ b) if it's too complex to backport, just pick a number, like 101, and
+ backport that number.
+
+ Clearly choice (a) is the better one if the consensus parsing part
+ isn't very complex. Let's shoot for that, and fall back to (b) if the
+ patch turns out to be so big that we reconsider.
+
diff --git a/doc/spec/proposals/169-eliminating-renegotiation.txt b/doc/spec/proposals/169-eliminating-renegotiation.txt
new file mode 100644
index 0000000000..2c90f9c9e8
--- /dev/null
+++ b/doc/spec/proposals/169-eliminating-renegotiation.txt
@@ -0,0 +1,404 @@
+Filename: 169-eliminating-renegotiation.txt
+Title: Eliminate TLS renegotiation for the Tor connection handshake
+Author: Nick Mathewson
+Created: 27-Jan-2010
+Status: Draft
+Target: 0.2.2
+
+1. Overview
+
+ I propose a backward-compatible change to the Tor connection
+ establishment protocol to avoid the use of TLS renegotiation.
+
+ Rather than doing a TLS renegotiation to exchange certificates
+ and authenticate the original handshake, this proposal takes an
+ approach similar to Steven Murdoch's proposal 124, and uses Tor
+ cells to finish authenticating the parties' identities once the
+ initial TLS handshake is finished.
+
+ Terminological note: I use "client" below to mean the Tor
+ instance (a client or a relay) that initiates a TLS connection,
+ and "server" to mean the Tor instance (a relay) that accepts it.
+
+2. Motivation and history
+
+ In the original Tor TLS connection handshake protocol ("V1", or
+ "two-cert"), parties that wanted to authenticate provided a
+ two-cert chain of X.509 certificates during the handshake setup
+ phase. Every party that wanted to authenticate sent these
+ certificates.
+
+ In the current Tor TLS connection handshake protocol ("V2", or
+ "renegotiating"), the parties begin with a single certificate
+ sent from the server (responder) to the client (initiator), and
+ then renegotiate to a two-certs-from-each-authenticating party.
+ We made this change to make Tor's handshake look like a browser
+ speaking SSL to a webserver. (See proposal 130, and
+ tor-spec.txt.) To tell whether to use the V1 or V2 handshake,
+ servers look at the list of ciphers sent by the client. (This is
+ ugly, but there's not much else in the ClientHello that they can
+ look at.) If the list contains any cipher not used by the V1
+ protocol, the server sends back a single cert and expects a
+ renegotiation. If the client gets back a single cert, then it
+ withholds its own certificates until the TLS renegotiation phase.
+
+ In other words, initiator behavior now looks like this:
+
+ - Begin TLS negotiation with V2 cipher list; wait for
+ certificate(s).
+ - If we get a certificate chain:
+ - Then we are using the V1 handshake. Send our own
+ certificate chain as part of this initial TLS handshake
+ if we want to authenticate; otherwise, send no
+ certificates. When the handshake completes, check
+ certificates. We are now mutually authenticated.
+
+ Otherwise, if we get just a single certificate:
+ - Then we are using the V2 handshake. Do not send any
+ certificates during this handshake.
+ - When the handshake is done, immediately start a TLS
+ renegotiation. During the renegotiation, expect
+ a certificate chain from the server; send a certificate
+ chain of our own if we want to authenticate ourselves.
+ - After the renegotiation, check the certificates. Then
+ send (and expect) a VERSIONS cell from the other side to
+ establish the link protocol version.
+
+ And V2 responder behavior now looks like this:
+
+ - When we get a TLS ClientHello request, look at the cipher
+ list.
+ - If the cipher list contains only the V1 ciphersuites:
+ - Then we're doing a V1 handshake. Send a certificate
+ chain. Expect a possible client certificate chain in
+ response.
+ Otherwise, if we get other ciphersuites:
+ - We're using the V2 handshake. Send back a single
+ certificate and let the handshake complete.
+ - Do not accept any data until the client has renegotiated.
+ - When the client is renegotiating, send a certificate
+ chain, and expect (possibly multiple) certificates in
+ reply.
+ - Check the certificates when the renegotiation is done.
+ Then exchange VERSIONS cells.
+
+ Late in 2009, researchers found a flaw in most applications' use
+ of TLS renegotiation: Although TLS renegotiation does not
+ reauthenticate any information exchanged before the renegotiation
+ takes place, many applications were treating it as though it did,
+ and assuming that data sent _before_ the renegotiation was
+ authenticated with the credentials negotiated _during_ the
+ renegotiation. This problem was exacerbated by the fact that
+ most TLS libraries don't actually give you an obvious good way to
+ tell where the renegotiation occurred relative to the datastream.
+ Tor wasn't directly affected by this vulnerability, but its
+ aftermath hurts us in a few ways:
+
+ 1) OpenSSL has disabled renegotiation by default, and created
+ a "yes we know what we're doing" option we need to set to
+ turn it back on. (Two options, actually: one for openssl
+ 0.9.8l and one for 0.9.8m and later.)
+
+ 2) Some vendors have removed all renegotiation support from
+ their versions of OpenSSL entirely, forcing us to tell
+ users to either replace their versions of OpenSSL or to
+ link Tor against a hand-built one.
+
+ 3) Because of 1 and 2, I'd expect TLS renegotiation to become
+ rarer and rarer in the wild, making our own use stand out
+ more.
+
+3. Design
+
+3.1. The view in the large
+
+ Taking a cue from Steven Murdoch's proposal 124, I propose that
+ we move the work currently done by the TLS renegotiation step
+ (that is, authenticating the parties to one another) and do it
+ with Tor cells instead of with TLS.
+
+ Using _yet another_ variant response from the responder (server),
+ we allow the client to learn that it doesn't need to rehandshake
+ and can instead use a cell-based authentication system. Once the
+ TLS handshake is done, the client and server exchange VERSIONS
+ cells to determine link protocol version (including
+ handshake version). If they're using the handshake version
+ specified here, the client and server arrive at link protocol
+ version 3 (or higher), and use cells to exchange further
+ authentication information.
+
+3.2. New TLS handshake variant
+
+ We already used the list of ciphers from the clienthello to
+ indicate whether the client can speak the V2 ("renegotiating")
+ handshake or later, so we can't encode more information there.
+
+ We can, however, change the DN in the certificate passed by the
+ server back to the client. Currently, all V2 certificates are
+ generated with CN values ending with ".net". I propose that we
+ have the ".net" commonName ending reserved to indicate the V2
+ protocol, and use commonName values ending with ".com" to
+ indicate the V3 ("minimal") handshake described herein.
+
+ Now, once the initial TLS handshake is done, the client can look
+ at the server's certificate(s). If there is a certificate chain,
+ the handshake is V1. If there is a single certificate whose
+ subject commonName ends in ".net", the handshake is V2 and the
+ client should try to renegotiate as it would currently.
+ Otherwise, the client should assume that the handshake is V3+.
+ [Servers should _only_ send ".com" addesses, to allow room for
+ more signaling in the future.]
+
+3.3. Authenticating inside Tor
+
+ Once the TLS handshake is finished, if the client renegotiates,
+ then the server should go on as it does currently.
+
+ If the client implements this proposal, however, and the server
+ has shown it can understand the V3+ handshake protocol, the
+ client immediately sends a VERSIONS cell to the server
+ and waits to receive a VERSIONS cell in return. We negotiate
+ the Tor link protocol version _before_ we proceed with the
+ negotiation, in case we need to change the authentication
+ protocol in the future.
+
+ Once either party has seen the VERSIONS cell from the other, it
+ knows which version they will pick (that is, the highest version
+ shared by both parties' VERSIONS cells). All Tor instances using
+ the handshake protocol described in 3.2 MUST support at least
+ link protocol version 3 as described here.
+
+ On learning the link protocol, the server then sends the client a
+ CERT cell and a NETINFO cell. If the client wants to
+ authenticate to the server, it sends a CERT cell, an AUTHENTICATE
+ cell, and a NETINFO cell, or it may simply send a NETINFO cell if
+ it does not want to authenticate.
+
+ The CERT cell describes the keys that a Tor instance is claiming
+ to have. It is a variable-length cell. Its payload format is:
+
+ N: Number of certs in cell [1 octet]
+ N times:
+ CLEN [2 octets]
+ Certificate [CLEN octets]
+
+ Any extra octets at the end of a CERT cell MUST be ignored.
+
+ Each certificate has the form:
+
+ CertType [1 octet]
+ CertPurpose [1 octet]
+ PublicKeyLen [2 octets]
+ PublicKey [PublicKeyLen octets]
+ NotBefore [4 octets]
+ NotAfter [4 octets]
+ SignerID [HASH256_LEN octets]
+ SignatureLen [2 octets]
+ Signature [SignatureLen octets]
+
+ where CertType is 1 (meaning "RSA/SHA256")
+ CertPurpose is 1 (meaning "link certificate")
+ PublicKey is the DER encoding of the ASN.1 representation
+ of the RSA key of the subject of this certificate,
+ NotBefore is a time in HOURS since January 1, 1970, 00:00
+ UTC before which this certificate should not be
+ considered valid.
+ NotAfter is a time in HOURS since January 1, 1970, 00:00
+ UTC after which this certificate should not be
+ considered valid.
+ SignerID is the SHA-256 digest of the public key signing
+ this certificate
+ and Signature is the signature of the all other fields in
+ this certificate, using SHA256 as described in proposal
+ 158.
+
+ While authenticating, a server need send only a self-signed
+ certificate for its identity key. (Its TLS certificate already
+ contains its link key signed by its identity key.) A client that
+ wants to authenticate MUST send two certificates: one containing
+ a public link key signed by its identity key, and one self-signed
+ cert for its identity.
+
+ Tor instances MUST ignore any certificate with an unrecognized
+ CertType or CertPurpose, and MUST ignore extra bytes in the cert.
+
+ The AUTHENTICATE cell proves to the server that the client with
+ whom it completed the initial TLS handshake is the one possessing
+ the link public key in its certificate. It is a variable-length
+ cell. Its contents are:
+
+ SignatureType [2 octets]
+ SignatureLen [2 octets]
+ Signature [SignatureLen octets]
+
+ where SignatureType is 1 (meaning "RSA-SHA256") and Signature is
+ an RSA-SHA256 signature of the HMAC-SHA256, using the TLS master
+ secret key as its key, of the following elements:
+
+ - The SignatureType field (0x00 0x01)
+ - The NUL terminated ASCII string: "Tor certificate verification"
+ - client_random, as sent in the Client Hello
+ - server_random, as sent in the Server Hello
+
+ Once the above handshake is complete, the client knows (from the
+ initial TLS handshake) that it has a secure connection to an
+ entity that controls a given link public key, and knows (from the
+ CERT cell) that the link public key is a valid public key for a
+ given Tor identity.
+
+ If the client authenticates, the server learns from the CERT cell
+ that a given Tor identity has a given current public link key.
+ From the AUTHENTICATE cell, it knows that an entity with that
+ link key knows the master secret for the TLS connection, and
+ hence must be the party with whom it's talking, if TLS works.
+
+3.4. Security checks
+
+ If the TLS handshake indicates a V2 or V3+ connection, the server
+ MUST reject any connection from the client that does not begin
+ with either a renegotiation attempt or a VERSIONS cell containing
+ at least link protocol version "3". If the TLS handshake
+ indicates a V3+ connection, the client MUST reject any connection
+ where the server sends anything before the client has sent a
+ VERSIONS cell, and any connection where the VERSIONS cell does
+ not contain at least link protocol version "3".
+
+ If link protocol version 3 is chosen:
+
+ Clients and servers MUST check that all digests and signatures
+ on the certificates in CERT cells they are given are as
+ described above.
+
+ After the VERSIONS cell, clients and servers MUST close the
+ connection if anything besides a CERT or AUTH cell is sent
+ before the
+
+ CERT or AUTHENTICATE cells anywhere after the first NETINFO
+ cell must be rejected.
+
+ ... [write more here. What else?] ...
+
+3.5. Summary
+
+ We now revisit the protocol outlines from section 2 to incorporate
+ our changes. New or modified steps are marked with a *.
+
+ The new initiator behavior now looks like this:
+
+ - Begin TLS negotiation with V2 cipher list; wait for
+ certificate(s).
+ - If we get a certificate chain:
+ - Then we are using the V1 handshake. Send our own
+ certificate chain as part of this initial TLS handshake
+ if we want to authenticate; otherwise, send no
+ certificates. When the handshake completes, check
+ certificates. We are now mutually authenticated.
+ Otherwise, if we get just a single certificate:
+ - Then we are using the V2 or the V3+ handshake. Do not
+ send any certificates during this handshake.
+ * When the handshake is done, look at the server's
+ certificate's subject commonName.
+ * If it ends with ".net", we're doing a V2 handshake:
+ - Immediately start a TLS renegotiation. During the
+ renegotiation, expect a certificate chain from the
+ server; send a certificate chain of our own if we
+ want to authenticate ourselves.
+ - After the renegotiation, check the certificates. Then
+ send (and expect) a VERSIONS cell from the other side
+ to establish the link protocol version.
+ * If it ends with anything else, assume a V3 or later
+ handshake:
+ * Send a VERSIONS cell, and wait for a VERSIONS cell
+ from the server.
+ * If we are authenticating, send CERT and AUTHENTICATE
+ cells.
+ * Send a NETINFO cell. Wait for a CERT and a NETINFO
+ cell from the server.
+ * If the CERT cell contains a valid self-identity cert,
+ and the identity key in the cert can be used to check
+ the signature on the x.509 certificate we got during
+ the TLS handshake, then we know we connected to the
+ server with that identity. If any of these checks
+ fail, or the identity key was not what we expected,
+ then we close the connection.
+ * Once the NETINFO cell arrives, continue as before.
+
+ And V3+ responder behavior now looks like this:
+
+ - When we get a TLS ClientHello request, look at the cipher
+ list.
+
+ - If the cipher list contains only the V1 ciphersuites:
+ - Then we're doing a V1 handshake. Send a certificate
+ chain. Expect a possible client certificate chain in
+ response.
+ Otherwise, if we get other ciphersuites:
+ - We're using the V2 handshake. Send back a single
+ certificate whose subject commonName ends with ".com",
+ and let the handshake complete.
+ * If the client does anything besides renegotiate or send a
+ VERSIONS cell, drop the connection.
+ - If the client renegotiates immediately, it's a V2
+ connection:
+ - When the client is renegotiating, send a certificate
+ chain, and expect (possibly multiple certificates in
+ reply).
+ - Check the certificates when the renegotiation is done.
+ Then exchange VERSIONS cells.
+ * Otherwise we got a VERSIONS cell and it's a V3 handshake.
+ * Send a VERSIONS cell, a CERT cell, an AUTHENTICATE
+ cell, and a NETINFO cell.
+ * Wait for the client to send cells in reply. If the
+ client sends a CERT and an AUTHENTICATE and a NETINFO,
+ use them to authenticate the client. If the client
+ sends a NETINFO, it is unauthenticated. If it sends
+ anything else before its NETINFO, it's rejected.
+
+4. Numbers to assign
+
+ We need a version number for this link protocol. I've been
+ calling it "3".
+
+ We need to reserve command numbers for CERT and AUTH cells. I
+ suggest that in link protocol 3 and higher, we reserve command
+ numbers 128..240 for variable-length cells. (241-256 we can hold
+ for future extensions.
+
+5. Efficiency
+
+ This protocol add a round-trip step when the client sends a
+ VERSIONS cell to the server, and waits for the {VERSIONS, CERT,
+ NETINFO} response in turn. (The server then waits for the
+ client's {NETINFO} or {CERT, AUTHENTICATE, NETINFO} reply,
+ but it would have already been waiting for the client's NETINFO,
+ so that's not an additional wait.)
+
+ This is actually fewer round-trip steps than required before for
+ TLS renegotiation, so that's a win.
+
+6. Open questions:
+
+ - Should we use X.509 certificates instead of the certificate-ish
+ things we describe here? They are more standard, but more ugly.
+
+ - May we cache which certificates we've already verified? It
+ might leak in timing whether we've connected with a given server
+ before, and how recently.
+
+ - Is there a better secret than the master secret to use in the
+ AUTHENTICATE cell? Say, a portable one? Can we get at it for
+ other libraries besides OpenSSL?
+
+ - Does using the client_random and server_random data in the
+ AUTHENTICATE message actually help us? How hard is it to pull
+ them out of the OpenSSL data structure?
+
+ - Can we give some way for clients to signal "I want to use the
+ V3 protocol if possible, but I can't renegotiate, so don't give
+ me the V2"? Clients currently have a fair idea of server
+ versions, so they could potentially do the V3+ handshake with
+ servers that support it, and fall back to V1 otherwise.
+
+ - What should servers that don't have TLS renegotiation do? For
+ now, I think they should just get it. Eventually we can
+ deprecate the V2 handshake as we did with the V1 handshake.
diff --git a/doc/spec/proposals/170-user-path-config.txt b/doc/spec/proposals/170-user-path-config.txt
new file mode 100644
index 0000000000..fa74c76f73
--- /dev/null
+++ b/doc/spec/proposals/170-user-path-config.txt
@@ -0,0 +1,95 @@
+Title: Configuration options regarding circuit building
+Filename: 170-user-path-config.txt
+Author: Sebastian Hahn
+Created: 01-March-2010
+Status: Draft
+
+Overview:
+
+ This document outlines how Tor handles the user configuration
+ options to influence the circuit building process.
+
+Motivation:
+
+ Tor's treatment of the configuration *Nodes options was surprising
+ to many users, and quite a few conspiracy theories have crept up. We
+ should update our specification and code to better describe and
+ communicate what is going during circuit building, and how we're
+ honoring configuration. So far, we've been tracking a bugreport
+ about this behaviour (
+ https://bugs.torproject.org/flyspray/index.php?do=details&id=1090 )
+ and Nick replied in a thread on or-talk (
+ http://archives.seul.org/or/talk/Feb-2010/msg00117.html ).
+
+ This proposal tries to document our intention for those configuration
+ options.
+
+Design:
+
+ Five configuration options are available to users to influence Tor's
+ circuit building. EntryNodes and ExitNodes define a list of nodes
+ that are for the Entry/Exit position in all circuits. ExcludeNodes
+ is a list of nodes that are used for no circuit, and
+ ExcludeExitNodes is a list of nodes that aren't used as the last
+ hop. StrictNodes defines Tor's behaviour in case of a conflict, for
+ example when a node that is excluded is the only available
+ introduction point. Setting StrictNodes to 1 breaks Tor's
+ functionality in that case, and it will refuse to build such a
+ circuit.
+
+ Neither Nick's email nor bug 1090 have clear suggestions how we
+ should behave in each case, so I tried to come up with something
+ that made sense to me.
+
+Security implications:
+
+ Deviating from normal circuit building can break one's anonymity, so
+ the documentation of the above option should contain a warning to
+ make users aware of the pitfalls.
+
+Specification:
+
+ It is proposed that the "User configuration" part of path-spec
+ (section 2.2.2) be replaced with this:
+
+ Users can alter the default behavior for path selection with
+ configuration options. In case of conflicts (excluding and requiring
+ the same node) the "StrictNodes" option is used to determine
+ behaviour. If a nodes is both excluded and required via a
+ configuration option, the exclusion takes preference.
+
+ - If "ExitNodes" is provided, then every request requires an exit
+ node on the ExitNodes list. If a request is supported by no nodes
+ on that list, and "StrictNodes" is false, then Tor treats that
+ request as if ExitNodes were not provided.
+
+ - "EntryNodes" behaves analogously.
+
+ - If "ExcludeNodes" is provided, then no circuit uses any of the
+ nodes listed. If a circuit requires an excluded node to be used,
+ and "StrictNodes" is false, then Tor uses the node in that
+ position while not using any other of the excluded nodes.
+
+ - If "ExcludeExitNodes" is provided, then Tor will not use the nodes
+ listed for the exit position in a circuit. If a circuit requires
+ an excluded node to be used in the exit position and "StrictNodes"
+ is false, then Tor builds that circuit as if ExcludeExitNodes were
+ not provided.
+
+ - If a user tries to connect to or resolve a hostname of the form
+ <target>.<servername>.exit and the "AllowDotExit" configuration
+ option is set to 1, the request is rewritten to a request for
+ <target>, and the request is only supported by the exit whose
+ nickname or fingerprint is <servername>. If "AllowDotExit" is set
+ to 0 (default), any request for <anything>.exit is denied.
+
+ - When any of the *Nodes settings are changed, all circuits are
+ expired immediately, to prevent a situation where a previously
+ built circuit is used even though some of its nodes are now
+ excluded.
+
+
+Compatibility:
+
+ The old Strict*Nodes options are deprecated, and the StrictNodes
+ option is new. Tor users may need to update their configuration file.
diff --git a/doc/spec/proposals/172-circ-getinfo-option.txt b/doc/spec/proposals/172-circ-getinfo-option.txt
new file mode 100644
index 0000000000..b7fd79c9a8
--- /dev/null
+++ b/doc/spec/proposals/172-circ-getinfo-option.txt
@@ -0,0 +1,138 @@
+Filename: 172-circ-getinfo-option.txt
+Title: GETINFO controller option for circuit information
+Author: Damian Johnson
+Created: 03-June-2010
+Status: Accepted
+
+Overview:
+
+ This details an additional GETINFO option that would provide information
+ concerning a relay's current circuits.
+
+Motivation:
+
+ The original proposal was for connection related information, but Jake make
+ the excellent point that any information retrieved from the control port
+ is...
+
+ 1. completely ineffectual for auditing purposes since either (a) these
+ results can be fetched from netstat already or (b) the information would
+ only be provided via tor and can't be validated.
+
+ 2. The more useful uses for connection information can be achieved with
+ much less (and safer) information.
+
+ Hence the proposal is now for circuit based rather than connection based
+ information. This would strip the most controversial and sensitive data
+ entirely (ip addresses, ports, and connection based bandwidth breakdowns)
+ while still being useful for the following purposes:
+
+ - Basic Relay Usage Questions
+ How is the bandwidth I'm contributing broken down? Is it being evenly
+ distributed or is someone hogging most of it? Do these circuits belong to
+ the hidden service I'm running or something else? Now that I'm using exit
+ policy X am I desirable as an exit, or are most people just using me as a
+ relay?
+
+ - Debugging
+ Say a relay has a restrictive firewall policy for outbound connections,
+ with the ORPort whitelisted but doesn't realize that tor needs random high
+ ports. Tor would report success ("your orport is reachable - excellent")
+ yet the relay would be nonfunctional. This proposed information would
+ reveal numerous RELAY -> YOU -> UNESTABLISHED circuits, giving a good
+ indicator of what's wrong.
+
+ - Visualization
+ A nice benefit of visualizing tor's behavior is that it becomes a helpful
+ tool in puzzling out how tor works. For instance, tor spawns numerous
+ client connections at startup (even if unused as a client). As a newcomer
+ to tor these asymmetric (outbound only) connections mystified me for quite
+ a while until until Roger explained their use to me. The proposed
+ TYPE_FLAGS would let controllers clearly label them as being client
+ related, making their purpose a bit clearer.
+
+ At the moment connection data can only be retrieved via commands like
+ netstat, ss, and lsof. However, providing an alternative via the control
+ port provides several advantages:
+
+ - scrubbing for private data
+ Raw connection data has no notion of what's sensitive and what is
+ not. The relay's flags and cached consensus can be used to take
+ educated guesses concerning which connections could possibly belong
+ to client or exit traffic, but this is both difficult and inaccurate.
+ Anything provided via the control port can scrubbed to make sure we
+ aren't providing anything we think relay operators should not see.
+
+ - additional information
+ All connection querying commands strictly provide the ip address and
+ port of connections, and nothing else. However, for the uses listed
+ above the far more interesting attributes are the circuit's type,
+ bandwidth usage and uptime.
+
+ - improved performance
+ Querying connection data is an expensive activity, especially for
+ busy relays or low end processors (such as mobile devices). Tor
+ already internally knows its circuits, allowing for vastly quicker
+ lookups.
+
+ - cross platform capability
+ The connection querying utilities mentioned above not only aren't
+ available under Windows, but differ widely among different *nix
+ platforms. FreeBSD in particular takes a very unique approach,
+ dropping important options from netstat and assigning ss to a
+ spreadsheet application instead. A controller interface, however,
+ would provide a uniform means of retrieving this information.
+
+Security Implications:
+
+ This is an open question. This proposal lacks the most controversial pieces
+ of information (ip addresses and ports) and insight into potential threats
+ this would pose would be very welcomed!
+
+Specification:
+
+ The following addition would be made to the control-spec's GETINFO section:
+
+ "rcirc/id/<Circuit identity>" -- Provides entry for the associated relay
+ circuit, formatted as:
+ CIRC_ID=<circuit ID> CREATED=<timestamp> UPDATED=<timestamp> TYPE=<flag>
+ READ=<bytes> WRITE=<bytes>
+
+ none of the parameters contain whitespace, and additional results must be
+ ignored to allow for future expansion. Parameters are defined as follows:
+ CIRC_ID - Unique numeric identifier for the circuit this belongs to.
+ CREATED - Unix timestamp (as seconds since the Epoch) for when the
+ circuit was created.
+ UPDATED - Unix timestamp for when this information was last updated.
+ TYPE - Single character flags indicating attributes in the circuit:
+ (E)ntry : has a connection that doesn't belong to a known Tor server,
+ indicating that this is either the first hop or bridged
+ E(X)it : has been used for at least one exit stream
+ (R)elay : has been extended
+ Rende(Z)vous : is being used for a rendezvous point
+ (I)ntroduction : is being used for a hidden service introduction
+ (N)one of the above: none of the above have happened yet.
+ READ - Total bytes transmitted toward the exit over the circuit.
+ WRITE - Total bytes transmitted toward the client over the circuit.
+
+ "rcirc/all" -- The 'rcirc/id/*' output for all current circuits, joined by
+ newlines.
+
+ The following would be included for circ info update events.
+
+4.1.X. Relay circuit status changed
+
+ The syntax is:
+ "650" SP "RCIRC" SP CircID SP Notice [SP Created SP Updated SP Type SP
+ Read SP Write] CRLF
+
+ Notice =
+ "NEW" / ; first information being provided for this circuit
+ "UPDATE" / ; update for a previously reported circuit
+ "CLOSED" ; notice that the circuit no longer exists
+
+ Notice indicating that queryable information on a relay related circuit has
+ changed. If the Notice parameter is either "NEW" or "UPDATE" then this
+ provides the same fields that would be given by calling "GETINFO rcirc/id/"
+ with the CircID.
+
diff --git a/doc/spec/proposals/173-getinfo-option-expansion.txt b/doc/spec/proposals/173-getinfo-option-expansion.txt
new file mode 100644
index 0000000000..03e18ef8d4
--- /dev/null
+++ b/doc/spec/proposals/173-getinfo-option-expansion.txt
@@ -0,0 +1,101 @@
+Filename: 173-getinfo-option-expansion.txt
+Title: GETINFO Option Expansion
+Author: Damian Johnson
+Created: 02-June-2010
+Status: Accepted
+
+Overview:
+
+ Over the course of developing arm there's been numerous hacks and
+ workarounds to gleam pieces of basic, desirable information about the tor
+ process. As per Roger's request I've compiled a list of these pain points
+ to try and improve the control protocol interface.
+
+Motivation:
+
+ The purpose of this proposal is to expose additional process and relay
+ related information that is currently unavailable in a convenient,
+ dependable, and/or platform independent way. Examples of this are...
+
+ - The relay's total contributed bandwidth. This is a highly requested
+ piece of information and, based on the following patch from pipe, looks
+ trivial to include.
+ http://www.mail-archive.com/or-talk@freehaven.net/msg13085.html
+
+ - The process ID of the tor process. There is a high degree of guess work
+ in obtaining this. Arm for instance uses pidof, netstat, and ps yet
+ still fails on some platforms, and Orbot recently got a ticket about
+ its own attempt to fetch it with ps:
+ https://trac.torproject.org/projects/tor/ticket/1388
+
+ This just includes the pieces of missing information I've noticed
+ (suggestions or questions of their usefulness are welcome!).
+
+Security Implications:
+
+ None that I'm aware of. From a security standpoint this seems decently
+ innocuous.
+
+Specification:
+
+ The following addition would be made to the control-spec's GETINFO section:
+
+ "relay/bw-limit" -- Effective relayed bandwidth limit.
+
+ "relay/burst-limit" -- Effective relayed burst limit.
+
+ "relay/read-total" -- Total bytes relayed (download).
+
+ "relay/write-total" -- Total bytes relayed (upload).
+
+ "relay/flags" -- Space separated listing of flags currently held by the
+ relay as repored by the currently cached consensus.
+
+ "process/user" -- Username under which the tor process is running,
+ providing an empty string if none exists.
+
+ "process/pid" -- Process id belonging to the main tor process, -1 if none
+ exists for the platform.
+
+ "process/uptime" -- Total uptime of the tor process (in seconds).
+
+ "process/uptime-reset" -- Time since last reset (startup, sighup, or RELOAD
+ signal, in seconds).
+
+ "process/descriptors-used" -- Count of file descriptors used.
+
+ "process/descriptor-limit" -- File descriptor limit (getrlimit results).
+
+ "ns/authority" -- Router status info (v2 directory style) for all
+ recognized directory authorities, joined by newlines.
+
+ "state/names" -- A space-separated list of all the keys supported by this
+ version of Tor's state.
+
+ "state/val/<key>" -- Provides the current state value belonging to the
+ given key. If undefined, this provides the key's default value.
+
+ "status/ports-seen" -- A summary of which ports we've seen connections
+ circuits connect to recently, formatted the same as the EXITS_SEEN status
+ event described in Section 4.1.XX. This GETINFO option is currently
+ available only for exit relays.
+
+4.1.XX. Per-port exit stats
+
+ The syntax is:
+ "650" SP "EXITS_SEEN" SP TimeStarted SP PortSummary CRLF
+
+ We just generated a new summary of which ports we've seen exiting circuits
+ connecting to recently. The controller could display this for the user, e.g.
+ in their "relay" configuration window, to give them a sense of how they're
+ being used (popularity of the various ports they exit to). Currently only
+ exit relays will receive this event.
+
+ TimeStarted is a quoted string indicating when the reported summary
+ counts from (in GMT).
+
+ The PortSummary keyword has as its argument a comma-separated, possibly
+ empty set of "port=count" pairs. For example (without linebreak),
+ 650-EXITS_SEEN TimeStarted="2008-12-25 23:50:43"
+ PortSummary=80=16,443=8
+
diff --git a/doc/spec/proposals/174-optimistic-data-server.txt b/doc/spec/proposals/174-optimistic-data-server.txt
new file mode 100644
index 0000000000..d97c45e909
--- /dev/null
+++ b/doc/spec/proposals/174-optimistic-data-server.txt
@@ -0,0 +1,242 @@
+Filename: 174-optimistic-data-server.txt
+Title: Optimistic Data for Tor: Server Side
+Author: Ian Goldberg
+Created: 2-Aug-2010
+Status: Open
+
+Overview:
+
+When a SOCKS client opens a TCP connection through Tor (for an HTTP
+request, for example), the query latency is about 1.5x higher than it
+needs to be. Simply, the problem is that the sequence of data flows
+is this:
+
+1. The SOCKS client opens a TCP connection to the OP
+2. The SOCKS client sends a SOCKS CONNECT command
+3. The OP sends a BEGIN cell to the Exit
+4. The Exit opens a TCP connection to the Server
+5. The Exit returns a CONNECTED cell to the OP
+6. The OP returns a SOCKS CONNECTED notification to the SOCKS client
+7. The SOCKS client sends some data (the GET request, for example)
+8. The OP sends a DATA cell to the Exit
+9. The Exit sends the GET to the server
+10. The Server returns the HTTP result to the Exit
+11. The Exit sends the DATA cells to the OP
+12. The OP returns the HTTP result to the SOCKS client
+
+Note that the Exit node knows that the connection to the Server was
+successful at the end of step 4, but is unable to send the HTTP query to
+the server until step 9.
+
+This proposal (as well as its upcoming sibling concerning the client
+side) aims to reduce the latency by allowing:
+1. SOCKS clients to optimistically send data before they are notified
+ that the SOCKS connection has completed successfully
+2. OPs to optimistically send DATA cells on streams in the CONNECT_WAIT
+ state
+3. Exit nodes to accept and queue DATA cells while in the
+ EXIT_CONN_STATE_CONNECTING state
+
+This particular proposal deals with #3.
+
+In this way, the flow would be as follows:
+
+1. The SOCKS client opens a TCP connection to the OP
+2. The SOCKS client sends a SOCKS CONNECT command, followed immediately
+ by data (such as the GET request)
+3. The OP sends a BEGIN cell to the Exit, followed immediately by DATA
+ cells
+4. The Exit opens a TCP connection to the Server
+5. The Exit returns a CONNECTED cell to the OP, and sends the queued GET
+ request to the Server
+6. The OP returns a SOCKS CONNECTED notification to the SOCKS client,
+ and the Server returns the HTTP result to the Exit
+7. The Exit sends the DATA cells to the OP
+8. The OP returns the HTTP result to the SOCKS client
+
+Motivation:
+
+This change will save one OP<->Exit round trip (down to one from two).
+There are still two SOCKS Client<->OP round trips (negligible time) and
+two Exit<->Server round trips. Depending on the ratio of the
+Exit<->Server (Internet) RTT to the OP<->Exit (Tor) RTT, this will
+decrease the latency by 25 to 50 percent. Experiments validate these
+predictions. [Goldberg, PETS 2010 rump session; see
+https://thunk.cs.uwaterloo.ca/optimistic-data-pets2010-rump.pdf ]
+
+Design:
+
+The current code actually correctly handles queued data at the Exit; if
+there is queued data in a EXIT_CONN_STATE_CONNECTING stream, that data
+will be immediately sent when the connection succeeds. If the
+connection fails, the data will be correctly ignored and freed. The
+problem with the current server code is that the server currently
+drops DATA cells on streams in the EXIT_CONN_STATE_CONNECTING state.
+Also, if you try to queue data in the EXIT_CONN_STATE_RESOLVING state,
+bad things happen because streams in that state don't yet have
+conn->write_event set, and so some existing sanity checks (any stream
+with queued data is at least potentially writable) are no longer sound.
+
+The solution is to simply not drop received DATA cells while in the
+EXIT_CONN_STATE_CONNECTING state. Also do not send SENDME cells in this
+state, so that the OP cannot send more than one window's worth of data
+to be queued at the Exit. Finally, patch the sanity checks so that
+streams in the EXIT_CONN_STATE_RESOLVING state that have buffered data
+can pass.
+
+If no clients ever send such optimistic data, the new code will never be
+executed, and the behaviour of Tor will not change. When clients begin
+to send optimistic data, the performance of those clients' streams will
+improve.
+
+After discussion with nickm, it seems best to just have the server
+version number be the indicator of whether a particular Exit supports
+optimistic data. (If a client sends optimistic data to an Exit which
+does not support it, the data will be dropped, and the client's request
+will fail to complete.) What do version numbers for hypothetical future
+protocol-compatible implementations look like, though?
+
+Security implications:
+
+Servers (for sure the Exit, and possibly others, by watching the
+pattern of packets) will be able to tell that a particular client
+is using optimistic data. This will be discussed more in the sibling
+proposal.
+
+On the Exit side, servers will be queueing a little bit extra data, but
+no more than one window. Clients today can cause Exits to queue that
+much data anyway, simply by establishing a Tor connection to a slow
+machine, and sending one window of data.
+
+Specification:
+
+tor-spec section 6.2 currently says:
+
+ The OP waits for a RELAY_CONNECTED cell before sending any data.
+ Once a connection has been established, the OP and exit node
+ package stream data in RELAY_DATA cells, and upon receiving such
+ cells, echo their contents to the corresponding TCP stream.
+ RELAY_DATA cells sent to unrecognized streams are dropped.
+
+It is not clear exactly what an "unrecognized" stream is, but this last
+sentence would be changed to say that RELAY_DATA cells received on a
+stream that has processed a RELAY_BEGIN cell and has not yet issued a
+RELAY_END or a RELAY_CONNECTED cell are queued; that queue is processed
+immediately after a RELAY_CONNECTED cell is issued for the stream, or
+freed after a RELAY_END cell is issued for the stream.
+
+The earlier part of this section will be addressed in the sibling
+proposal.
+
+Compatibility:
+
+There are compatibility issues, as mentioned above. OPs MUST NOT send
+optimistic data to Exit nodes whose version numbers predate (something).
+OPs MAY send optimistic data to Exit nodes whose version numbers match
+or follow that value. (But see the question about independent server
+reimplementations, above.)
+
+Implementation:
+
+Here is a simple patch. It seems to work with both regular streams and
+hidden services, but there may be other corner cases I'm not aware of.
+(Do streams used for directory fetches, hidden services, etc. take a
+different code path?)
+
+diff --git a/src/or/connection.c b/src/or/connection.c
+index 7b1493b..f80cd6e 100644
+--- a/src/or/connection.c
++++ b/src/or/connection.c
+@@ -2845,7 +2845,13 @@ _connection_write_to_buf_impl(const char *string, size_t len,
+ return;
+ }
+
+- connection_start_writing(conn);
++ /* If we receive optimistic data in the EXIT_CONN_STATE_RESOLVING
++ * state, we don't want to try to write it right away, since
++ * conn->write_event won't be set yet. Otherwise, write data from
++ * this conn as the socket is available. */
++ if (conn->state != EXIT_CONN_STATE_RESOLVING) {
++ connection_start_writing(conn);
++ }
+ if (zlib) {
+ conn->outbuf_flushlen += buf_datalen(conn->outbuf) - old_datalen;
+ } else {
+@@ -3382,7 +3388,11 @@ assert_connection_ok(connection_t *conn, time_t now)
+ tor_assert(conn->s < 0);
+
+ if (conn->outbuf_flushlen > 0) {
+- tor_assert(connection_is_writing(conn) || conn->write_blocked_on_bw ||
++ /* With optimistic data, we may have queued data in
++ * EXIT_CONN_STATE_RESOLVING while the conn is not yet marked to writing.
++ * */
++ tor_assert(conn->state == EXIT_CONN_STATE_RESOLVING ||
++ connection_is_writing(conn) || conn->write_blocked_on_bw ||
+ (CONN_IS_EDGE(conn) && TO_EDGE_CONN(conn)->edge_blocked_on_circ));
+ }
+
+diff --git a/src/or/relay.c b/src/or/relay.c
+index fab2d88..e45ff70 100644
+--- a/src/or/relay.c
++++ b/src/or/relay.c
+@@ -1019,6 +1019,9 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
+ relay_header_t rh;
+ unsigned domain = layer_hint?LD_APP:LD_EXIT;
+ int reason;
++ int optimistic_data = 0; /* Set to 1 if we receive data on a stream
++ that's in the EXIT_CONN_STATE_RESOLVING
++ or EXIT_CONN_STATE_CONNECTING states.*/
+
+ tor_assert(cell);
+ tor_assert(circ);
+@@ -1038,9 +1041,20 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
+ /* either conn is NULL, in which case we've got a control cell, or else
+ * conn points to the recognized stream. */
+
+- if (conn && !connection_state_is_open(TO_CONN(conn)))
+- return connection_edge_process_relay_cell_not_open(
+- &rh, cell, circ, conn, layer_hint);
++ if (conn && !connection_state_is_open(TO_CONN(conn))) {
++ if ((conn->_base.state == EXIT_CONN_STATE_CONNECTING ||
++ conn->_base.state == EXIT_CONN_STATE_RESOLVING) &&
++ rh.command == RELAY_COMMAND_DATA) {
++ /* We're going to allow DATA cells to be delivered to an exit
++ * node in state EXIT_CONN_STATE_CONNECTING or
++ * EXIT_CONN_STATE_RESOLVING. This speeds up HTTP, for example. */
++ log_warn(domain, "Optimistic data received.");
++ optimistic_data = 1;
++ } else {
++ return connection_edge_process_relay_cell_not_open(
++ &rh, cell, circ, conn, layer_hint);
++ }
++ }
+
+ switch (rh.command) {
+ case RELAY_COMMAND_DROP:
+@@ -1090,7 +1104,9 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
+ log_debug(domain,"circ deliver_window now %d.", layer_hint ?
+ layer_hint->deliver_window : circ->deliver_window);
+
+- circuit_consider_sending_sendme(circ, layer_hint);
++ if (!optimistic_data) {
++ circuit_consider_sending_sendme(circ, layer_hint);
++ }
+
+ if (!conn) {
+ log_info(domain,"data cell dropped, unknown stream (streamid %d).",
+@@ -1107,7 +1123,9 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
+ stats_n_data_bytes_received += rh.length;
+ connection_write_to_buf(cell->payload + RELAY_HEADER_SIZE,
+ rh.length, TO_CONN(conn));
+- connection_edge_consider_sending_sendme(conn);
++ if (!optimistic_data) {
++ connection_edge_consider_sending_sendme(conn);
++ }
+ return 0;
+ case RELAY_COMMAND_END:
+ reason = rh.length > 0 ?
+
+Performance and scalability notes:
+
+There may be more RAM used at Exit nodes, as mentioned above, but it is
+transient.
diff --git a/doc/spec/proposals/ideas/xxx-bwrate-algs.txt b/doc/spec/proposals/ideas/xxx-bwrate-algs.txt
new file mode 100644
index 0000000000..757f5bc55e
--- /dev/null
+++ b/doc/spec/proposals/ideas/xxx-bwrate-algs.txt
@@ -0,0 +1,106 @@
+# The following two algorithms
+
+
+# Algorithm 1
+# TODO: Burst and Relay/Regular differentiation
+
+BwRate = Bandwidth Rate in Bytes Per Second
+GlobalWriteBucket = 0
+GlobalReadBucket = 0
+Epoch = Token Fill Rate in seconds: suggest 50ms=.050
+SecondCounter = 0
+MinWriteBytes = Minimum amount bytes per write
+
+Every Epoch Seconds:
+ UseMinWriteBytes = MinWriteBytes
+ WriteCnt = 0
+ ReadCnt = 0
+ BytesRead = 0
+
+ For Each Open OR Conn with pending write data:
+ WriteCnt++
+ For Each Open OR Conn:
+ ReadCnt++
+
+ BytesToRead = (BwRate*Epoch + GlobalReadBucket)/ReadCnt
+ BytesToWrite = (BwRate*Epoch + GlobalWriteBucket)/WriteCnt
+
+ if BwRate/WriteCnt < MinWriteBytes:
+ # If we aren't likely to accumulate enough bytes in a second to
+ # send a whole cell for our connections, send partials
+ Log(NOTICE, "Too many ORCons to write full blocks. Sending short packets.")
+ UseMinWriteBytes = 1
+ # Other option: We could switch to plan 2 here
+
+ # Service each writable ORConn. If there are any partial writes,
+ # return remaining bytes from this epoch to the global pool
+ For Each Open OR Conn with pending write data:
+ ORConn->write_bucket += BytesToWrite
+ if ORConn->write_bucket > UseMinWriteBytes:
+ w = write(ORConn, MIN(len(ORConn->write_data), ORConn->write_bucket))
+ # possible that w < ORConn->write_data here due to TCP pushback.
+ # We should restore the rest of the write_bucket to the global
+ # buffer
+ GlobalWriteBucket += (ORConn->write_bucket - w)
+ ORConn->write_bucket = 0
+
+ For Each Open OR Conn:
+ r = read_nonblock(ORConn, BytesToRead)
+ BytesRead += r
+
+ SecondCounter += Epoch
+ if SecondCounter < 1:
+ # Save unused bytes from this epoch to be used later in the second
+ GlobalReadBucket += (BwRate*Epoch - BytesRead)
+ else:
+ SecondCounter = 0
+ GlobalReadBucket = 0
+ GlobalWriteBucket = 0
+ For Each ORConn:
+ ORConn->write_bucket = 0
+
+
+
+# Alternate plan for Writing fairly. Reads would still be covered
+# by plan 1 as there is no additional network overhead for short reads,
+# so we don't need to try to avoid them.
+#
+# I think this is actually pretty similar to what we do now, but
+# with the addition that the bytes accumulate up to the second mark
+# and we try to keep track of our position in the write list here
+# (unless libevent is doing that for us already and I just don't see it)
+#
+# TODO: Burst and Relay/Regular differentiation
+
+# XXX: The inability to send single cells will cause us to block
+# on EXTEND cells for low-bandwidth node pairs..
+BwRate = Bandwidth Rate in Bytes Per Second
+WriteBytes = Bytes per write
+Epoch = MAX(MIN(WriteBytes/BwRate, .333s), .050s)
+
+SecondCounter = 0
+GlobalWriteBucket = 0
+
+# New connections are inserted at Head-1 (the 'tail' of this circular list)
+# This is not 100% fifo for all node data, but it is the best we can do
+# without insane amounts of additional queueing complexity.
+WriteConnList = List of Open OR Conns with pending write data > WriteBytes
+WriteConnHead = 0
+
+Every Epoch Seconds:
+ GlobalWriteBucket += BwRate*Epoch
+ WriteListEnd = WriteConnHead
+
+ do
+ ORCONN = WriteConnList[WriteConnHead]
+ w = write(ORConn, WriteBytes)
+ GlobalWriteBucket -= w
+ WriteConnHead += 1
+ while GlobalWriteBucket > 0 and WriteConnHead != WriteListEnd
+
+ SecondCounter += Epoch
+ if SecondCounter >= 1:
+ SecondCounter = 0
+ GlobalWriteBucket = 0
+
+
diff --git a/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt b/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt
new file mode 100644
index 0000000000..e8489570f7
--- /dev/null
+++ b/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt
@@ -0,0 +1,138 @@
+Filename: xxx-choosing-crypto-in-tor-protocol.txt
+Title: Picking cryptographic standards in the Tor wire protocol
+Author: Marian
+Created: 2009-05-16
+Status: Draft
+
+Motivation:
+
+ SHA-1 is horribly outdated and not suited for security critical
+ purposes. SHA-2, RIPEMD-160, Whirlpool and Tigerare good options
+ for a short-term replacement, but in the long run, we will
+ probably want to upgrade to the winner or a semi-finalist of the
+ SHA-3 competition.
+
+ For a 2006 comparison of different hash algorithms, read:
+ http://www.sane.nl/sane2006/program/final-papers/R10.pdf
+
+ Other reading about SHA-1:
+ http://www.schneier.com/blog/archives/2005/02/sha1_broken.html
+ http://www.schneier.com/blog/archives/2005/08/new_cryptanalyt.html
+ http://www.schneier.com/paper-preimages.html
+
+ Additionally, AES has been theoretically broken for years. While
+ the attack is still not efficient enough that the public sector
+ has been able to prove that it works, we should probably consider
+ the time between a theoretical attack and a practical attack as an
+ opportunity to figure out how to upgrade to a better algorithm,
+ such as Twofish.
+
+ See:
+ http://schneier.com/crypto-gram-0209.html#1
+
+Design:
+
+ I suggest that nodes should publish in directories which
+ cryptographic standards, such as hash algorithms and ciphers,
+ they support. Clients communicating with nodes will then
+ pick whichever of those cryptographic standards they prefer
+ the most. In the case that the node does not publish which
+ cryptographic standards it supports, the client should assume
+ that the server supports the older standards, such as SHA-1
+ and AES, until such time as we choose to desupport those
+ standards.
+
+ Node to node communications could work similarly. However, in
+ case they both support a set of algorithms but have different
+ preferences, the disagreement would have to be resolved
+ somehow. Two possibilities include:
+ * the node requesting communications presents which
+ cryptographic standards it supports in the request. The
+ other node picks.
+ * both nodes send each other lists of what they support and
+ what version of Tor they are using. The newer node picks,
+ based on the assumption that the newer node has the most up
+ to date information about which hash algorithm is the best.
+ Of course, the node could lie about its version, but then
+ again, it could also maliciously choose only to support older
+ algorithms.
+
+ Using this method, we could potentially add server side support
+ to hash algorithms and ciphers before we instruct clients to
+ begin preferring those hash algorithms and ciphers. In this way,
+ the clients could upgrade and the servers would already support
+ the newly preferred hash algorithms and ciphers, even if the
+ servers were still using older versions of Tor, so long as the
+ older versions of Tor were at least new enough to have server
+ side support.
+
+ This would make quickly upgrading to new hash algorithms and
+ ciphers easier. This could be very useful when new attacks
+ are published.
+
+ One concern is that client preferences could expose the client
+ to segmentation attacks. To mitigate this, we suggest hardcoding
+ preferences in the client, to prevent the client from choosing
+ to use a new hash algorithm or cipher that no one else is using
+ yet. While offering a preference might be useful in case a client
+ with an older version of Tor wants to start using the newer hash
+ algorithm or cipher that everyone else is using, if the client
+ cares enough, he or she can just upgrade Tor.
+
+ We may also have to worry about nodes which, through laziness or
+ maliciousness, refuse to start supporting new hash algorithms or
+ ciphers. This must be balanced with the need to maintain
+ backward compatibility so the client will have a large selection
+ of nodes to pick from. Adding new hash algorithms and ciphers
+ long before we suggest nodes start using them can help mitigate
+ this. However, eventually, once sufficient nodes support new
+ standards, client side support for older standards should be
+ disabled, particularly if there are practical rather than merely
+ theoretical attacks.
+
+ Server side support for older standards can be kept much longer
+ than client side support, since clients using older hashes and
+ ciphers are really only hurting theirselvse.
+
+ If server side support for a hash algorithm or cipher is added
+ but never preferred before we decide we don't really want it,
+ support can be removed without having to worry about backward
+ compatibility.
+
+Security implications:
+ Improving cryptography will improve Tor's security. However, if
+ clients pick different cryptographic standards, they could be
+ partitioned based on their cryptographic preferences. We also
+ need to worry about nodes refusing to support new standards.
+ These issues are detailed above.
+
+Specification:
+
+ Todo. Need better understanding of how Tor currently works or
+ help from someone who does.
+
+Compatibility:
+
+ This idea is intended to allow easier upgrading of cryptographic
+ hash algorithms and ciphers while maintaining backwards
+ compatibility. However, at some point, backwards compatibility
+ with very old hashes and ciphers should be dropped for security
+ reasons.
+
+Implementation:
+
+ Todo.
+
+Performance and scalability nodes:
+
+ Better hashes and cipher are someimes a little more CPU intensive
+ than weaker ones. For instance, on most computers AES is a little
+ faster than Twofish. However, in that example, I consider Twofish's
+ additional security worth the tradeoff.
+
+Acknowledgements:
+
+ Discussed this on IRC with a few people, mostly Nick Mathewson.
+ Nick was particularly helpful in explaining how Tor works,
+ explaining goals, and providing various links to Tor
+ specifications.
diff --git a/doc/spec/proposals/ideas/xxx-encrypted-services.txt b/doc/spec/proposals/ideas/xxx-encrypted-services.txt
new file mode 100644
index 0000000000..3414f3c4fb
--- /dev/null
+++ b/doc/spec/proposals/ideas/xxx-encrypted-services.txt
@@ -0,0 +1,18 @@
+
+the basic idea might be to generate a keypair, and sign little statements
+like "this key corresponds to this relay id", and publish them on karsten's
+hs dht.
+
+so if you want to talk to it, you look it up, then go to that exit.
+and by 'go to' i mean 'build a tor circuit like normal except you're sure
+where to exit'
+
+connecting to it is slower than usual, but once you're connected, it's no
+slower than normal tor.
+and you get what wikileaks wants from its hidden service, which is really
+just the UI piece.
+indymedia also wants this.
+
+might be interesting to let an encrypted service list more than one relay,
+too.
+
diff --git a/doc/spec/proposals/ideas/xxx-hide-platform.txt b/doc/spec/proposals/ideas/xxx-hide-platform.txt
index 3fed5cfbd4..ad19fb1fd4 100644
--- a/doc/spec/proposals/ideas/xxx-hide-platform.txt
+++ b/doc/spec/proposals/ideas/xxx-hide-platform.txt
@@ -1,7 +1,5 @@
Filename: xxx-hide-platform.txt
Title: Hide Tor Platform Information
-Version: $Revision$
-Last-Modified: $Date$
Author: Jacob Appelbaum
Created: 24-July-2008
Status: Draft
diff --git a/doc/spec/proposals/ideas/xxx-port-knocking.txt b/doc/spec/proposals/ideas/xxx-port-knocking.txt
index 9fbcdf3545..85c27ec52d 100644
--- a/doc/spec/proposals/ideas/xxx-port-knocking.txt
+++ b/doc/spec/proposals/ideas/xxx-port-knocking.txt
@@ -1,7 +1,5 @@
Filename: xxx-port-knocking.txt
Title: Port knocking for bridge scanning resistance
-Version: $Revision$
-Last-Modified: $Date$
Author: Jacob Appelbaum
Created: 19-April-2009
Status: Draft
diff --git a/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt b/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt
index cebde65a9b..f26c1e580f 100644
--- a/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt
+++ b/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt
@@ -1,7 +1,5 @@
Filename: xxx-separate-streams-by-port.txt
Title: Separate streams across circuits by destination port
-Version: $Revision$
-Last-Modified: $Date$
Author: Robert Hogan
Created: 21-Oct-2008
Status: Draft
diff --git a/doc/spec/proposals/ideas/xxx-using-spdy.txt b/doc/spec/proposals/ideas/xxx-using-spdy.txt
new file mode 100644
index 0000000000..d733a84b69
--- /dev/null
+++ b/doc/spec/proposals/ideas/xxx-using-spdy.txt
@@ -0,0 +1,143 @@
+Filename: xxx-using-spdy.txt
+Title: Using the SPDY protocol to improve Tor performance
+Author: Steven J. Murdoch
+Created: 03-Feb-2010
+Status: Draft
+Target:
+
+1. Overview
+
+ The SPDY protocol [1] is an alternative method for transferring
+ web content over TCP, designed to improve efficiency and
+ performance. A SPDY-aware browser can already communicate with
+ a SPDY-aware web server over Tor, because this only requires a TCP
+ stream to be set up. However, a SPDY-aware browser cannot
+ communicate with a non-SPDY-aware web server. This proposal
+ outlines how Tor could support this latter case, and why it
+ may be good for performance.
+
+2. Motivation
+
+ About 90% of Tor traffic, by connection, is HTTP [2], but
+ users report subjective performance to be poor. It would
+ therefore be desirable to improve this situation. SPDY was
+ designed to offer better performance than HTTP, in
+ high-latency and/or low-bandwidth situations, and is therefore
+ an option worth examining.
+
+ If a user wishes to access a SPDY-enabled web server over Tor,
+ all they need to do is to configure their SPDY-enabled browser
+ (e.g. Google Chrome) to use Tor. However, there are few
+ SPDY-enabled web servers, and even if there was high demand
+ from Tor users, there would be little motivation for server
+ operators to upgrade, for the benefit of only a small
+ proportion of their users.
+
+ The motivation of this proposal is to allow only the user to
+ install a SPDY-enabled browser, and permit web servers to
+ remain unmodified. Essentially, Tor would incorporate a proxy
+ on the exit node, which communicates SPDY to the web browser
+ and normal HTTP to the web server. This proxy would translate
+ between the two transport protocols, and possibly perform
+ other optimizations.
+
+ SPDY currently offers five optimizations:
+
+ 1) Multiplexed streams:
+ An unlimited number of resources can be transferred
+ concurrently, over a single TCP connection.
+
+ 2) Request prioritization:
+ The client can set a priority on each resource, to assist
+ the server in re-ordering responses.
+
+ 3) Compression:
+ Both HTTP header and resource content can be compressed.
+
+ 4) Server push:
+ The server can offer the client resources which have not
+ been requested, but which the server believes will be.
+
+ 5) Server hint:
+ The server can suggest that the client request further
+ resources, before the main content is transferred.
+
+ Tor currently effectively implements (1), by being able to put
+ multiple streams on one circuit. SPDY however requires fewer
+ round-trips to do the same. The other features are not
+ implemented by Tor. Therefore it is reasonable to expect that
+ a HTTP <-> SPDY proxy may improve Tor performance, by some
+ amount.
+
+ The consequences on caching need to be considered carefully.
+ Most of the optimizations SPDY offers have no effect because
+ the existing HTTP cache control headers are transmitted without
+ modification. Server push is more problematic, because here
+ the server may push a resource that the client already has.
+
+3. Design outline
+
+ One way to implement the SPDY proxy is for Tor exit nodes to
+ advertise this capability in their descriptor. The OP would
+ then preferentially select these nodes when routing streams
+ destined for port 80.
+
+ Then, rather than sending the usual RELAY_BEGIN cell, the OP
+ would send a RELAY_BEGIN_TRANSFORMED cell, with a parameter to
+ indicate that the exit node should translate between SPDY and
+ HTTP. The rest of the connection process would operate as
+ usual.
+
+ There would need to be some way of elegantly handling non-HTTP
+ traffic which goes over port 80.
+
+4. Implementation status
+
+ SPDY is under active development and both the specification
+ and implementations are in a state of flux. Initial
+ experiments with Google Chrome in SPDY-mode and server
+ libraries indicate that more work is needed before they are
+ production-ready. There is no indication that browsers other
+ than Google Chrome will support SPDY (and no official
+ statement as to whether Google Chrome will eventually enable
+ SPDY by default).
+
+ Implementing a full SPDY proxy would be non-trivial. Stream
+ multiplexing and compression are supported by existing
+ libraries and would be fairly simple to implement. Request
+ prioritization would require some form of caching on the
+ proxy-side. Server push and server hint would require content
+ parsing to identify resources which should be treated
+ specially.
+
+5. Security and policy implications
+
+ A SPDY proxy would be a significant amount of code, and may
+ pull in external libraries. This code will process potentially
+ malicious data, both at the SPDY and HTTP sides. This proposal
+ therefore increases the risk that exit nodes will be
+ compromised by exploiting a bug in the proxy.
+
+ This proposal would also be the first way in which Tor is
+ modifying TCP stream data. Arguably this is still meta-data
+ (HTTP headers), but there may be some concern that Tor should
+ not be doing this.
+
+ Torbutton only works with Firefox, but SPDY only works with
+ Google Chrome. We should be careful not to recommend that
+ users adopt a browser which harms their privacy in other ways.
+
+6. Open questions:
+
+ - How difficult would this be to implement?
+
+ - How much performance improvement would it actually result in?
+
+ - Is there some way to rapidly develop a prototype which would
+ answer the previous question?
+
+[1] SPDY: An experimental protocol for a faster web
+ http://dev.chromium.org/spdy/spdy-whitepaper
+[2] Shining Light in Dark Places: Understanding the Tor Network Damon McCoy,
+ Kevin Bauer, Dirk Grunwald, Tadayoshi Kohno, Douglas Sicker
+ http://www.cs.washington.edu/homes/yoshi/papers/Tor/PETS2008_37.pdf
diff --git a/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt b/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt
index 9b6e20c586..b3ca3eea5a 100644
--- a/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt
+++ b/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt
@@ -1,8 +1,6 @@
Filename: xxx-what-uses-sha1.txt
Title: Where does Tor use SHA-1 today?
-Version: $Revision$
-Last-Modified: $Date$
-Author: Nick Mathewson
+Authors: Nick Mathewson, Marian
Created: 30-Dec-2008
Status: Meta
@@ -15,9 +13,15 @@ Introduction:
too long.
According to smart crypto people, the SHA-2 functions (SHA-256, etc)
- share too much of SHA-1's structure to be very good. Some people
- like other hash functions; most of these have not seen enough
- analysis to be widely regarded as an extra-good idea.
+ share too much of SHA-1's structure to be very good. RIPEMD-160 is
+ also based on flawed past hashes. Some people think other hash
+ functions (e.g. Whirlpool and Tiger) are not as bad; most of these
+ have not seen enough analysis to be used yet.
+
+ Here is a 2006 paper about hash algorithms.
+ http://www.sane.nl/sane2006/program/final-papers/R10.pdf
+
+ (Todo: Ask smart crypto people.)
By 2012, the NIST SHA-3 competition will be done, and with luck we'll
have something good to switch too. But it's probably a bad idea to
@@ -54,50 +58,138 @@ Why now?
one look silly.
+Triage
+
+ How severe are these problems? Let's divide them into these
+ categories, where H(x) is the SHA-1 hash of x:
+ PREIMAGE -- find any x such that a H(x) has a chosen value
+ -- A SHA-1 usage that only depends on preimage
+ resistance
+ * Also SECOND PREIMAGE. Given x, find a y not equal to
+ x such that H(x) = H(y)
+ COLLISION<role> -- A SHA-1 usage that depends on collision
+ resistance, but the only party who could mount a
+ collision-based attack is already in a trusted role
+ (like a distribution signer or a directory authority).
+ COLLISION -- find any x and y such that H(x) = H(y) -- A
+ SHA-1 usage that depends on collision resistance
+ and doesn't need the attacker to have any special keys.
+
+ There is no need to put much effort into fixing PREIMAGE and SECOND
+ PREIMAGE usages in the near-term: while there have been some
+ theoretical results doing these attacks against SHA-1, they don't
+ seem to be close to practical yet. To fix COLLISION<code-signing>
+ usages is not too important either, since anyone who has the key to
+ sign the code can mount far worse attacks. It would be good to fix
+ COLLISION<authority> usages, since we try to resist bad authorities
+ to a limited extent. The COLLISION usages are the most important
+ to fix.
+
+ Kelsey and Schneier published a theoretical second preimage attack
+ against SHA-1 in 2005, so it would be a good idea to fix PREIMAGE
+ and SECOND PREIMAGE usages after fixing COLLISION usages or where fixes
+ require minimal effort.
+
+ http://www.schneier.com/paper-preimages.html
+
+ Additionally, we need to consider the impact of a successful attack
+ in each of these cases. SHA-1 collisions are still expensive even
+ if recent results are verified, and anybody with the resources to
+ compute one also has the resources to mount a decent Sybil attack.
+
+ Let's be pessimistic, and not assume that producing collisions of
+ a given format is actually any harder than producing collisions at
+ all.
+
What Tor uses hashes for today:
1. Infrastructure.
A. Our X.509 certificates are signed with SHA-1.
+ COLLSION
B. TLS uses SHA-1 (and MD5) internally to generate keys.
+ PREIMAGE?
+ * At least breaking SHA-1 and MD5 simultaneously is
+ much more difficult than breaking either
+ independently.
C. Some of the TLS ciphersuites we allow use SHA-1.
+ PREIMAGE?
D. When we sign our code with GPG, it might be using SHA-1.
+ COLLISION<code-signing>
+ * GPG 1.4 and up have writing support for SHA-2 hashes.
+ This blog has help for converting:
+ http://www.schwer.us/journal/2005/02/19/sha-1-broken-and-gnupg-gpg/
E. Our GPG keys might be authenticated with SHA-1.
+ COLLISION<code-signing-key-signing>
F. OpenSSL's random number generator uses SHA-1, I believe.
+ PREIMAGE
2. The Tor protocol
A. Everything we sign, we sign using SHA-1-based OAEP-MGF1.
+ PREIMAGE?
B. Our CREATE cell format uses SHA-1 for: OAEP padding.
+ PREIMAGE?
C. Our EXTEND cells use SHA-1 to hash the identity key of the
target server.
+ COLLISION
D. Our CREATED cells use SHA-1 to hash the derived key data.
+ ??
E. The data we use in CREATE_FAST cells to generate a key is the
length of a SHA-1.
+ NONE
F. The data we send back in a CREATED/CREATED_FAST cell is the length
of a SHA-1.
- G. We use SHA-1 to derive our circuit keys from the negotiated g^xy value.
+ NONE
+ G. We use SHA-1 to derive our circuit keys from the negotiated g^xy
+ value.
+ NONE
H. We use SHA-1 to derive the digest field of each RELAY cell, but that's
used more as a checksum than as a strong digest.
+ NONE
3. Directory services
+ [All are COLLISION or COLLISION<authority> ]
+
A. All signatures are generated on the SHA-1 of their corresponding
documents, using PKCS1 padding.
+ * In dir-spec.txt, section 1.3, it states,
+ "SIGNATURE" Object contains a signature (using the signing key)
+ of the PKCS1-padded digest of the entire document, taken from
+ the beginning of the Initial item, through the newline after
+ the Signature Item's keyword and its arguments."
+ So our attacker, Malcom, could generate a collision for the hash
+ that is signed. Thus, a second pre-image attack is possible.
+ Vulnerable to regular collision attack only if key is stolen.
+ If the key is stolen, Malcom could distribute two different
+ copies of the document which have the same hash. Maybe useful
+ for a partitioning attack?
B. Router descriptors identify their corresponding extra-info documents
by their SHA-1 digest.
+ * A third party might use a second pre-image attack to generate a
+ false extra-info document that has the same hash. The router
+ itself might use a regular collision attack to generate multiple
+ extra-info documents with the same hash, which might be useful
+ for a partitioning attack.
C. Fingerprints in router descriptors are taken using SHA-1.
- D. Fingerprints in authority certs are taken using SHA-1.
- E. Fingerprints in dir-source lines of votes and consensuses are taken
+ * The fingerprint must match the public key. Not sure what would
+ happen if two routers had different public keys but the same
+ fingerprint. There could perhaps be unpredictable behaviour.
+ D. In router descriptors, routers in the same "Family" may be listed
+ by server nicknames or hexdigests.
+ * Does not seem critical.
+ E. Fingerprints in authority certs are taken using SHA-1.
+ F. Fingerprints in dir-source lines of votes and consensuses are taken
using SHA-1.
- F. Networkstatuses refer to routers identity keys and descriptors by their
+ G. Networkstatuses refer to routers identity keys and descriptors by their
SHA-1 digests.
- G. Directory-signature lines identify which key is doing the signing by
+ H. Directory-signature lines identify which key is doing the signing by
the SHA-1 digests of the authority's signing key and its identity key.
- H. The following items are downloaded by the SHA-1 of their contents:
+ I. The following items are downloaded by the SHA-1 of their contents:
XXXX list them
- I. The following items are downloaded by the SHA-1 of an identity key:
+ J. The following items are downloaded by the SHA-1 of an identity key:
XXXX list them too.
4. The rendezvous protocol
@@ -107,6 +199,12 @@ What Tor uses hashes for today:
establishment requests.
B. Hidden servers use SHA-1 in multiple places when generating hidden
service descriptors.
+ * The permanent-id is the first 80 bits of the SHA-1 hash of the
+ public key
+ ** time-period performs caclulations using the permanent-id
+ * The secret-id-part is the SHA-1 has of the time period, the
+ descriptor-cookie, and replica.
+ * Hash of introduction point's identity key.
C. Hidden servers performing basic-type client authorization for their
services use SHA-1 when encrypting introduction points contained in
hidden service descriptors.
@@ -115,26 +213,35 @@ What Tor uses hashes for today:
identifier or not.
E. Hidden servers use SHA-1 to derive .onion addresses of their
services.
+ * What's worse, it only uses the first 80 bits of the SHA-1 hash.
+ However, the rend-spec.txt says we aren't worried about arbitrary
+ collisons?
F. Clients use SHA-1 to generate the current hidden service descriptor
identifiers for a given .onion address.
G. Hidden servers use SHA-1 to remember digests of the first parts of
Diffie-Hellman handshakes contained in introduction requests in order
- to detect replays.
+ to detect replays. See the RELAY_ESTABLISH_INTRO cell. We seem to be
+ taking a hash of a hash here.
H. Hidden servers use SHA-1 during the Diffie-Hellman key exchange with
a connecting client.
5. The bridge protocol
XXXX write me
+
+ A. Client may attempt to query for bridges where he knows a digest
+ (probably SHA-1) before a direct query.
6. The Tor user interface
A. We log information about servers based on SHA-1 hashes of their
identity keys.
+ COLLISION
B. The controller identifies servers based on SHA-1 hashes of their
identity keys.
+ COLLISION
C. Nearly all of our configuration options that list servers allow SHA-1
hashes of their identity keys.
+ COLLISION
E. The deprecated .exit notation uses SHA-1 hashes of identity keys
-
-
+ COLLISION
diff --git a/doc/spec/proposals/reindex.py b/doc/spec/proposals/reindex.py
index 2b4c02516b..980bc0659f 100755
--- a/doc/spec/proposals/reindex.py
+++ b/doc/spec/proposals/reindex.py
@@ -4,7 +4,7 @@ import re, os
class Error(Exception): pass
STATUSES = """DRAFT NEEDS-REVISION NEEDS-RESEARCH OPEN ACCEPTED META FINISHED
- CLOSED SUPERSEDED DEAD""".split()
+ CLOSED SUPERSEDED DEAD REJECTED""".split()
REQUIRED_FIELDS = [ "Filename", "Status", "Title" ]
CONDITIONAL_FIELDS = { "OPEN" : [ "Target" ],
"ACCEPTED" : [ "Target "],
diff --git a/doc/spec/rend-spec.txt b/doc/spec/rend-spec.txt
index e3fbe2253b..3c14ebc662 100644
--- a/doc/spec/rend-spec.txt
+++ b/doc/spec/rend-spec.txt
@@ -1,11 +1,15 @@
-$Id$
Tor Rendezvous Specification
0. Overview and preliminaries
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ RFC 2119.
+
Read
- https://www.torproject.org/doc/design-paper/tor-design.html#sec:rendezvous
+ https://svn.torproject.org/svn/projects/design-paper/tor-design.html#sec:rendezvous
before you read this specification. It will make more sense.
Rendezvous points provide location-hidden services (server
@@ -16,11 +20,10 @@ $Id$
Bob does this by anonymously advertising a public key for his
service, along with a list of onion routers to act as "Introduction
Points" for his service. He creates forward circuits to those
- introduction points, and tells them about his public key. To
+ introduction points, and tells them about his service. To
connect to Bob, Alice first builds a circuit to an OR to act as
her "Rendezvous Point." She then connects to one of Bob's chosen
- introduction points, optionally provides authentication or
- authorization information, and asks it to tell him about her Rendezvous
+ introduction points, and asks it to tell him about her Rendezvous
Point (RP). If Bob chooses to answer, he builds a circuit to her
RP, and tells it to connect him to Alice. The RP joins their
circuits together, and begins relaying cells. Alice's 'BEGIN'
@@ -60,23 +63,21 @@ $Id$
0.2. Protocol outline
- 1. Bob->Bob's OP: "Offer IP:Port as
- public-key-name:Port". [configuration]
+ 1. Bob->Bob's OP: "Offer IP:Port as public-key-name:Port". [configuration]
(We do not specify this step; it is left to the implementor of
Bob's OP.)
- 2. Bob's OP generates keypair and rendezvous service descriptor:
- "Meet public-key X at introduction point A, B, or C." (signed)
+ 2. Bob's OP generates a long-term keypair.
3. Bob's OP->Introduction point via Tor: [introduction setup]
- "This pk is me."
+ "This public key is (currently) associated to me."
- 4. Bob's OP->directory service via Tor: publishes Bob's service
- descriptor [advertisement]
+ 4. Bob's OP->directory service via Tor: publishes Bob's service descriptor
+ [advertisement]
+ "Meet public-key X at introduction point A, B, or C." (signed)
- 5. Out of band, Alice receives a [x.y.]z.onion:port address.
- She opens a SOCKS connection to her OP, and requests
- x.y.z.onion:port.
+ 5. Out of band, Alice receives a z.onion:port address.
+ She opens a SOCKS connection to her OP, and requests z.onion:port.
6. Alice's OP retrieves Bob's descriptor via Tor. [descriptor lookup.]
@@ -85,29 +86,31 @@ $Id$
setup.]
8. Alice connects to the Introduction point via Tor, and tells it about
- her rendezvous point and optional authentication/authorization
- information. (Encrypted to Bob.) [Introduction 1]
+ her rendezvous point. (Encrypted to Bob.) [Introduction 1]
9. The Introduction point passes this on to Bob's OP via Tor, along the
introduction circuit. [Introduction 2]
10. Bob's OP decides whether to connect to Alice, and if so, creates a
circuit to Alice's RP via Tor. Establishes a shared circuit.
- [Rendezvous.]
+ [Rendezvous 1]
- 11. Alice's OP sends begin cells to Bob's OP. [Connection]
+ 11. The Rendezvous point forwards Bob's confirmation to Alice's OP.
+ [Rendezvous 2]
+
+ 12. Alice's OP sends begin cells to Bob's OP. [Connection]
0.3. Constants and new cell types
Relay cell types
- 32 -- RELAY_ESTABLISH_INTRO
- 33 -- RELAY_ESTABLISH_RENDEZVOUS
- 34 -- RELAY_INTRODUCE1
- 35 -- RELAY_INTRODUCE2
- 36 -- RELAY_RENDEZVOUS1
- 37 -- RELAY_RENDEZVOUS2
- 38 -- RELAY_INTRO_ESTABLISHED
- 39 -- RELAY_RENDEZVOUS_ESTABLISHED
+ 32 -- RELAY_COMMAND_ESTABLISH_INTRO
+ 33 -- RELAY_COMMAND_ESTABLISH_RENDEZVOUS
+ 34 -- RELAY_COMMAND_INTRODUCE1
+ 35 -- RELAY_COMMAND_INTRODUCE2
+ 36 -- RELAY_COMMAND_RENDEZVOUS1
+ 37 -- RELAY_COMMAND_RENDEZVOUS2
+ 38 -- RELAY_COMMAND_INTRO_ESTABLISHED
+ 39 -- RELAY_COMMAND_RENDEZVOUS_ESTABLISHED
40 -- RELAY_COMMAND_INTRODUCE_ACK
0.4. Version overview
@@ -117,14 +120,14 @@ $Id$
other parts remained the same. The following list of potentially
versioned protocol parts should help reduce some confusion:
- - Hidden service descriptor: the binary-based v0 was the default for
- a long time, and an ascii-based v2 has been added by proposal
- 114. See 1.2.
+ - Hidden service descriptor: the binary-based v0 was the default for a
+ long time, and an ASCII-based v2 has been added by proposal 114. The
+ v0 descriptor format has been deprecated in 0.2.2.1-alpha. See 1.3.
- Hidden service descriptor propagation mechanism: currently related to
the hidden service descriptor version -- v0 publishes to the original
hs directory authorities, whereas v2 publishes to a rotating subset
- of relays with the "hsdir" flag; see 1.4 and 1.6.
+ of relays with the "HSDir" flag; see 1.4 and 1.6.
- Introduction protocol for how to generate an introduction cell:
v0 specified a nickname for the rendezvous point and assumed the
@@ -142,11 +145,56 @@ $Id$
service. Bob provides a mapping from each of these virtual ports
to a local IP:Port pair.
-1.2. Bob's OP generates service descriptors.
+1.2. Bob's OP establishes his introduction points.
The first time the OP provides an advertised service, it generates
- a public/private keypair (stored locally). Periodically, the OP
- generates and publishes a descriptor of type "V0".
+ a public/private keypair (stored locally).
+
+ The OP chooses a small number of Tor servers as introduction points.
+ The OP establishes a new introduction circuit to each introduction
+ point. These circuits MUST NOT be used for anything but hidden service
+ introduction. To establish the introduction, Bob sends a
+ RELAY_COMMAND_ESTABLISH_INTRO cell, containing:
+
+ KL Key length [2 octets]
+ PK Bob's public key or service key [KL octets]
+ HS Hash of session info [20 octets]
+ SIG Signature of above information [variable]
+
+ KL is the length of PK, in octets.
+
+ To prevent replay attacks, the HS field contains a SHA-1 hash based on the
+ shared secret KH between Bob's OP and the introduction point, as
+ follows:
+ HS = H(KH | "INTRODUCE")
+ That is:
+ HS = H(KH | [49 4E 54 52 4F 44 55 43 45])
+ (KH, as specified in tor-spec.txt, is H(g^xy | [00]) .)
+
+ Upon receiving such a cell, the OR first checks that the signature is
+ correct with the included public key. If so, it checks whether HS is
+ correct given the shared state between Bob's OP and the OR. If either
+ check fails, the OP discards the cell; otherwise, it associates the
+ circuit with Bob's public key, and dissociates any other circuits
+ currently associated with PK. On success, the OR sends Bob a
+ RELAY_COMMAND_INTRO_ESTABLISHED cell with an empty payload.
+
+ Bob's OP uses either Bob's public key or a freshly generated, single-use
+ service key in the RELAY_COMMAND_ESTABLISH_INTRO cell, depending on the
+ configured hidden service descriptor version. The public key is used for
+ v0 descriptors, the service key for v2 descriptors. In the latter case, the
+ service keys of all introduction points are included in the v2 hidden
+ service descriptor together with the other introduction point information.
+ The reason is that the introduction point does not need to and therefore
+ should not know for which hidden service it works, so as to prevent it from
+ tracking the hidden service's activity. If the hidden service is configured
+ to publish both v0 and v2 descriptors, two separate sets of introduction
+ points are established.
+
+1.3. Bob's OP generates service descriptors.
+
+ For versions before 0.2.2.1-alpha, Bob's OP periodically generates and
+ publishes a descriptor of type "V0".
The "V0" descriptor contains:
@@ -157,7 +205,6 @@ $Id$
Ipt A list of NUL-terminated ORs [variable]
SIG Signature of above fields [variable]
- KL is the length of PK, in octets.
TS is the number of seconds elapsed since Jan 1, 1970.
The members of Ipt may be either (a) nicknames, or (b) identity key
@@ -170,8 +217,8 @@ $Id$
and now he doesn't have any. -RD]
Beginning with 0.2.0.10-alpha, Bob's OP encodes "V2" descriptors in
- addition to "V0" descriptors. The format of a "V2" descriptor is as
- follows:
+ addition to (or instead of) "V0" descriptors. The format of a "V2"
+ descriptor is as follows:
"rendezvous-service-descriptor" descriptor-id NL
@@ -179,11 +226,7 @@ $Id$
Indicates the beginning of the descriptor. "descriptor-id" is a
periodically changing identifier of 160 bits formatted as 32 base32
- chars that is calculated by the hidden service and its clients. If
- the optional "descriptor-cookie" is used, this "descriptor-id"
- cannot be computed by anyone else. (Everyone can verify that this
- "descriptor-id" belongs to the rest of the descriptor, even without
- knowing the optional "descriptor-cookie", as described below.) The
+ chars that is calculated by the hidden service and its clients. The
"descriptor-id" is calculated by performing the following operation:
descriptor-id =
@@ -195,29 +238,20 @@ $Id$
permanent-id = H(public-key)[:10]
- "H(time-period | descriptor-cookie | replica)" is the (possibly
- secret) id part that is
- necessary to verify that the hidden service is the true originator
- of this descriptor. It can only be created by the hidden service
- and its clients, but the "signature" below can only be created by
- the service.
+ Note: If Bob's OP has "stealth" authorization enabled (see Section 2.2),
+ it uses the client key in place of the public hidden service key.
- "descriptor-cookie" is an optional secret password of 128 bits that
- is shared between the hidden service provider and its clients.
-
- "replica" denotes the number of the non-consecutive replica.
+ "H(time-period | descriptor-cookie | replica)" is the (possibly
+ secret) id part that is necessary to verify that the hidden service is
+ the true originator of this descriptor and that is therefore contained
+ in the descriptor, too. The descriptor ID can only be created by the
+ hidden service and its clients, but the "signature" below can only be
+ created by the service.
- (Each descriptor is replicated on a number of _consecutive_ nodes
- in the identifier ring by making every storing node responsible
- for the identifier intervals starting from its 3rd predecessor's
- ID to its own ID. In addition to that, every service publishes
- multiple descriptors with different descriptor IDs in order to
- distribute them to different places on the ring. Therefore,
- "replica" chooses one of the _non-consecutive_ replicas. -KL)
+ "time-period" changes periodically as a function of time and
- The "time-period" changes periodically depending on the global time and
- as a function of "permanent-id". The current value for "time-period" can
- be calculated using the following formula:
+ "permanent-id". The current value for "time-period" can be calculated
+ using the following formula:
time-period = (current-time + permanent-id-byte * 86400 / 256)
/ 86400
@@ -231,6 +265,15 @@ $Id$
of the overall operation is a (network-ordered) 32-bit integer, e.g.
13753 or 0x000035B9 with the example values given above.
+ "descriptor-cookie" is an optional secret password of 128 bits that
+ is shared between the hidden service provider and its clients. If the
+ descriptor-cookie is left out, the input to the hash function is 128
+ bits shorter.
+
+ "replica" denotes the number of the replica. A service publishes
+ multiple descriptors with different descriptor IDs in order to
+ distribute them to different places on the ring.
+
"version" version-number NL
[Exactly once]
@@ -284,13 +327,16 @@ $Id$
The unencrypted string may begin with:
- ["service-authentication" auth-type NL auth-data ... reserved]
+ "service-authentication" auth-type auth-data NL
- [At start, any number]
+ [Any number]
The service-specific authentication data can be used to perform
client authentication. This data is independent of the selected
- introduction point as opposed to "intro-authentication" below.
+ introduction point as opposed to "intro-authentication" below. The
+ format of auth-data (base64-encoded or PEM format) depends on
+ auth-type. See section 2 of this document for details on auth
+ mechanisms.
Subsequently, an arbitrary number of introduction point entries may
follow, each containing the following data:
@@ -329,17 +375,23 @@ $Id$
The public key that can be used to encrypt messages to the hidden
service.
- ["intro-authentication" auth-type NL auth-data ... reserved]
+ "intro-authentication" auth-type auth-data NL
[Any number]
The introduction-point-specific authentication data can be used
to perform client authentication. This data depends on the
selected introduction point as opposed to "service-authentication"
- above.
+ above. The format of auth-data (base64-encoded or PEM format)
+ depends on auth-type. See section 2 of this document for details
+ on auth mechanisms.
(This ends the fields in the encrypted portion of the descriptor.)
+ [It's ok for Bob to advertise 0 introduction points. He might want
+ to do that if he previously advertised some introduction points,
+ and now he doesn't have any. -RD]
+
"signature" NL signature-string
[At end, exactly once]
@@ -347,7 +399,22 @@ $Id$
A signature of all fields above with the private key of the hidden
service.
-1.2.1. Other descriptor formats we don't use.
+1.3.1. Other descriptor formats we don't use.
+
+ Support for the V0 descriptor format was dropped in 0.2.2.0-alpha-dev:
+
+ KL Key length [2 octets]
+ PK Bob's public key [KL octets]
+ TS A timestamp [4 octets]
+ NI Number of introduction points [2 octets]
+ Ipt A list of NUL-terminated ORs [variable]
+ SIG Signature of above fields [variable]
+
+ KL is the length of PK, in octets.
+ TS is the number of seconds elapsed since Jan 1, 1970.
+
+ The members of Ipt may be either (a) nicknames, or (b) identity key
+ digests, encoded in hex, and prefixed with a '$'.
The V1 descriptor format was understood and accepted from
0.1.1.5-alpha-cvs to 0.2.0.6-alpha-dev, but no Tors generated it and
@@ -401,56 +468,17 @@ $Id$
Currently only AUTHT of [00 00] is supported, with an AUTHL of 0.
See section 2 of this document for details on auth mechanisms.
-1.3. Bob's OP establishes his introduction points.
-
- The OP establishes a new introduction circuit to each introduction
- point. These circuits MUST NOT be used for anything but hidden service
- introduction. To establish the introduction, Bob sends a
- RELAY_ESTABLISH_INTRO cell, containing:
-
- KL Key length [2 octets]
- PK Bob's public key [KL octets]
- HS Hash of session info [20 octets]
- SIG Signature of above information [variable]
-
- [XXX011, need to add auth information here. -RD]
-
- To prevent replay attacks, the HS field contains a SHA-1 hash based on the
- shared secret KH between Bob's OP and the introduction point, as
- follows:
- HS = H(KH | "INTRODUCE")
- That is:
- HS = H(KH | [49 4E 54 52 4F 44 55 43 45])
- (KH, as specified in tor-spec.txt, is H(g^xy | [00]) .)
-
- Upon receiving such a cell, the OR first checks that the signature is
- correct with the included public key. If so, it checks whether HS is
- correct given the shared state between Bob's OP and the OR. If either
- check fails, the OP discards the cell; otherwise, it associates the
- circuit with Bob's public key, and dissociates any other circuits
- currently associated with PK. On success, the OR sends Bob a
- RELAY_INTRO_ESTABLISHED cell with an empty payload.
-
- If a hidden service is configured to publish only v2 hidden service
- descriptors, Bob's OP does not include its own public key in the
- RELAY_ESTABLISH_INTRO cell, but the public key of a freshly generated
- key pair. The OP also includes these fresh public keys in the v2 hidden
- service descriptor together with the other introduction point
- information. The reason is that the introduction point does not need to
- and therefore should not know for which hidden service it works, so as
- to prevent it from tracking the hidden service's activity. If the hidden
- service is configured to publish both, v0 and v2 descriptors, two
- separate sets of introduction points are established.
-
1.4. Bob's OP advertises his service descriptor(s).
- Bob's OP opens a stream to each directory server's directory port via Tor.
- (He may re-use old circuits for this.) Over this stream, Bob's OP makes
- an HTTP 'POST' request, to a URL "/tor/rendezvous/publish" relative to the
- directory server's root, containing as its body Bob's service descriptor.
+ Bob's OP advertises his service descriptor to a fixed set of v0 hidden
+ service directory servers and/or a changing subset of all v2 hidden service
+ directories.
- Bob should upload a service descriptor for each version format that
- is supported in the current Tor network.
+ For versions before 0.2.2.1-alpha, Bob's OP opens a stream to each v0
+ directory server's directory port via Tor. (He may re-use old circuits for
+ this.) Over this stream, Bob's OP makes an HTTP 'POST' request, to a URL
+ "/tor/rendezvous/publish" relative to the directory server's root,
+ containing as its body Bob's service descriptor.
Upon receiving a descriptor, the directory server checks the signature,
and discards the descriptor if the signature does not match the enclosed
@@ -464,13 +492,12 @@ $Id$
after its timestamp. At least every 18 hours, Bob's OP uploads a
fresh descriptor.
- If Bob's OP is configured to publish v2 descriptors instead of or in
- addition to v0 descriptors, it does so to a changing subset of all v2
- hidden service directories instead of the authoritative directory
- servers. Therefore, Bob's OP opens a stream via Tor to each
- responsible hidden service directory. (He may re-use old circuits
- for this.) Over this stream, Bob's OP makes an HTTP 'POST' request to a
- URL "/tor/rendezvous2/publish" relative to the hidden service
+ If Bob's OP is configured to publish v2 descriptors, it does so to a
+ changing subset of all v2 hidden service directories instead of the
+ authoritative directory servers. Therefore, Bob's OP opens a stream via
+ Tor to each responsible hidden service directory. (He may re-use old
+ circuits for this.) Over this stream, Bob's OP makes an HTTP 'POST'
+ request to a URL "/tor/rendezvous2/publish" relative to the hidden service
directory's root, containing as its body Bob's service descriptor.
At any time, there are 6 hidden service directories responsible for
@@ -487,45 +514,41 @@ $Id$
Bob's OP publishes a new v2 descriptor once an hour or whenever its
content changes. V2 descriptors can be found by clients within a given
time period of 24 hours, after which they change their ID as described
- under 1.2. If a published descriptor would be valid for less than 60
+ under 1.3. If a published descriptor would be valid for less than 60
minutes (= 2 x 30 minutes to allow the server to be 30 minutes behind
and the client 30 minutes ahead), Bob's OP publishes the descriptor
under the ID of both, the current and the next publication period.
-1.5. Alice receives a x.y.z.onion address.
+1.5. Alice receives a z.onion address.
When Alice receives a pointer to a location-hidden service, it is as a
- hostname of the form "z.onion" or "y.z.onion" or "x.y.z.onion", where
- z is a base-32 encoding of a 10-octet hash of Bob's service's public
- key, computed as follows:
+ hostname of the form "z.onion", where z is a base-32 encoding of a
+ 10-octet hash of Bob's service's public key, computed as follows:
1. Let H = H(PK).
2. Let H' = the first 80 bits of H, considering each octet from
most significant bit to least significant bit.
- 2. Generate a 16-character encoding of H', using base32 as defined
+ 3. Generate a 16-character encoding of H', using base32 as defined
in RFC 3548.
(We only use 80 bits instead of the 160 bits from SHA1 because we
don't need to worry about arbitrary collisions, and because it will
make handling the url's more convenient.)
- The string "x", if present, is the base-32 encoding of the
- authentication/authorization required by the introduction point.
- The string "y", if present, is the base-32 encoding of the
- authentication/authorization required by the hidden service.
- Omitting a string is taken to mean auth type [00 00].
- See section 2 of this document for details on auth mechanisms.
-
[Yes, numbers are allowed at the beginning. See RFC 1123. -NM]
1.6. Alice's OP retrieves a service descriptor.
- Alice opens a stream to a directory server via Tor, and makes an HTTP GET
- request for the document '/tor/rendezvous/<z>', where '<z>' is replaced
- with the encoding of Bob's public key as described above. (She may re-use
- old circuits for this.) The directory replies with a 404 HTTP response if
- it does not recognize <z>, and otherwise returns Bob's most recently
- uploaded service descriptor.
+ Alice's OP fetches the service descriptor from the fixed set of v0 hidden
+ service directory servers and/or a changing subset of all v2 hidden service
+ directories.
+
+ For versions before 0.2.2.1-alpha, Alice's OP opens a stream to a directory
+ server via Tor, and makes an HTTP GET request for the document
+ '/tor/rendezvous/<z>', where '<z>' is replaced with the encoding of Bob's
+ public key as described above. (She may re-use old circuits for this.) The
+ directory replies with a 404 HTTP response if it does not recognize <z>,
+ and otherwise returns Bob's most recently uploaded service descriptor.
If Alice's OP receives a 404 response, it tries the other directory
servers, and only fails the lookup if none recognize the public key hash.
@@ -541,13 +564,15 @@ $Id$
[Caching may make her partitionable, but she fetched it anonymously,
and we can't very well *not* cache it. -RD]
- Alice's OP fetches v2 descriptors in parallel to v0 descriptors. Similarly
- to the description in section 1.4, the OP fetches a v2 descriptor from a
- randomly chosen hidden service directory out of the changing subset of
- 6 nodes. If the request is unsuccessful, Alice retries the other
- remaining responsible hidden service directories in a random order.
- Alice relies on Bob to care about a potential clock skew between the two
- by possibly storing two sets of descriptors (see end of section 1.4).
+ If Alice's OP is running 0.2.1.10-alpha or higher, it fetches v2 hidden
+ service descriptors. Versions before 0.2.2.1-alpha are fetching both v0 and
+ v2 descriptors in parallel. Similar to the description in section 1.4,
+ Alice's OP fetches a v2 descriptor from a randomly chosen hidden service
+ directory out of the changing subset of 6 nodes. If the request is
+ unsuccessful, Alice retries the other remaining responsible hidden service
+ directories in a random order. Alice relies on Bob to care about a potential
+ clock skew between the two by possibly storing two sets of descriptors (see
+ end of section 1.4).
Alice's OP opens a stream via Tor to the chosen v2 hidden service
directory. (She may re-use old circuits for this.) Over this stream,
@@ -563,19 +588,18 @@ $Id$
and Alice's OP does not have an established circuit to that service,
the OP builds a rendezvous circuit. It does this by establishing
a circuit to a randomly chosen OR, and sending a
- RELAY_ESTABLISH_RENDEZVOUS cell to that OR. The body of that cell
+ RELAY_COMMAND_ESTABLISH_RENDEZVOUS cell to that OR. The body of that cell
contains:
RC Rendezvous cookie [20 octets]
- [XXX011 this looks like an auth mechanism. should we generalize here? -RD]
-
The rendezvous cookie is an arbitrary 20-byte value, chosen randomly by
- Alice's OP.
+ Alice's OP. Alice SHOULD choose a new rendezvous cookie for each new
+ connection attempt.
- Upon receiving a RELAY_ESTABLISH_RENDEZVOUS cell, the OR associates the
- RC with the circuit that sent it. It replies to Alice with an empty
- RELAY_RENDEZVOUS_ESTABLISHED cell to indicate success.
+ Upon receiving a RELAY_COMMAND_ESTABLISH_RENDEZVOUS cell, the OR associates
+ the RC with the circuit that sent it. It replies to Alice with an empty
+ RELAY_COMMAND_RENDEZVOUS_ESTABLISHED cell to indicate success.
Alice's OP MUST NOT use the circuit which sent the cell for any purpose
other than rendezvous with the given location-hidden service.
@@ -583,7 +607,7 @@ $Id$
1.8. Introduction: from Alice's OP to Introduction Point
Alice builds a separate circuit to one of Bob's chosen introduction
- points, and sends it a RELAY_INTRODUCE1 cell containing:
+ points, and sends it a RELAY_COMMAND_INTRODUCE1 cell containing:
Cleartext
PK_ID Identifier for Bob's PK [20 octets]
@@ -605,15 +629,32 @@ $Id$
KEY Rendezvous point onion key [KLEN octets]
RC Rendezvous cookie [20 octets]
g^x Diffie-Hellman data, part 1 [128 octets]
+ OR (in the v3 intro protocol)
+ VER Version byte: set to 3. [1 octet]
+ AUTHT The auth type that is used [1 octet]
+ AUTHL Length of auth data [2 octets]
+ AUTHD Auth data [variable]
+ TS A timestamp [4 octets]
+ IP Rendezvous point's address [4 octets]
+ PORT Rendezvous point's OR port [2 octets]
+ ID Rendezvous point identity ID [20 octets]
+ KLEN Length of onion key [2 octets]
+ KEY Rendezvous point onion key [KLEN octets]
+ RC Rendezvous cookie [20 octets]
+ g^x Diffie-Hellman data, part 1 [128 octets]
- PK_ID is the hash of Bob's public key. RP is NUL-padded and
- terminated. In version 0, it must contain a nickname. In version 1,
- it must contain EITHER a nickname or an identity key digest that is
- encoded in hex and prefixed with a '$'.
+ PK_ID is the hash of Bob's public key or the service key, depending on the
+ hidden service descriptor version. In case of a v0 descriptor, Alice's OP
+ uses Bob's public key. If Alice has downloaded a v2 descriptor, she uses
+ the contained public key ("service-key").
+
+ RP is NUL-padded and terminated. In version 0 of the intro protocol, RP
+ must contain a nickname. In version 1, it must contain EITHER a nickname or
+ an identity key digest that is encoded in hex and prefixed with a '$'.
The hybrid encryption to Bob's PK works just like the hybrid
encryption in CREATE cells (see tor-spec). Thus the payload of the
- version 0 RELAY_INTRODUCE1 cell on the wire will contain
+ version 0 RELAY_COMMAND_INTRODUCE1 cell on the wire will contain
20+42+16+20+20+128=246 bytes, and the version 1 and version 2
introduction formats have other sizes.
@@ -622,51 +663,31 @@ $Id$
v1, and v2 since 0.1.1.x. As of Tor 0.2.0.7-alpha and 0.1.2.18,
clients switched to using the v2 intro format.
- If Alice has downloaded a v2 descriptor, she uses the contained public
- key ("service-key") instead of Bob's public key to create the
- RELAY_INTRODUCE1 cell as described above.
-
-1.8.1. Other introduction formats we don't use.
-
- We briefly speculated about using the following format for the
- "encrypted to Bob's PK" part of the introduction, but no Tors have
- ever generated these.
-
- VER Version byte: set to 3. [1 octet]
- ATYPE An address type (typically 4) [1 octet]
- ADDR Rendezvous point's IP address [4 or 16 octets]
- PORT Rendezvous point's OR port [2 octets]
- AUTHT The auth type that is supported [2 octets]
- AUTHL Length of auth data [1 octet]
- AUTHD Auth data [variable]
- ID Rendezvous point identity ID [20 octets]
- KLEN Length of onion key [2 octets]
- KEY Rendezvous point onion key [KLEN octets]
- RC Rendezvous cookie [20 octets]
- g^x Diffie-Hellman data, part 1 [128 octets]
-
1.9. Introduction: From the Introduction Point to Bob's OP
If the Introduction Point recognizes PK_ID as a public key which has
- established a circuit for introductions as in 1.3 above, it sends the body
- of the cell in a new RELAY_INTRODUCE2 cell down the corresponding circuit.
- (If the PK_ID is unrecognized, the RELAY_INTRODUCE1 cell is discarded.)
-
- After sending the RELAY_INTRODUCE2 cell, the OR replies to Alice with an
- empty RELAY_COMMAND_INTRODUCE_ACK cell. If no RELAY_INTRODUCE2 cell can
- be sent, the OR replies to Alice with a non-empty cell to indicate an
- error. (The semantics of the cell body may be determined later; the
- current implementation sends a single '1' byte on failure.)
-
- When Bob's OP receives the RELAY_INTRODUCE2 cell, it decrypts it with
- the private key for the corresponding hidden service, and extracts the
+ established a circuit for introductions as in 1.2 above, it sends the body
+ of the cell in a new RELAY_COMMAND_INTRODUCE2 cell down the corresponding
+ circuit. (If the PK_ID is unrecognized, the RELAY_COMMAND_INTRODUCE1 cell is
+ discarded.)
+
+ After sending the RELAY_COMMAND_INTRODUCE2 cell to Bob, the OR replies to
+ Alice with an empty RELAY_COMMAND_INTRODUCE_ACK cell. If no
+ RELAY_COMMAND_INTRODUCE2 cell can be sent, the OR replies to Alice with a
+ non-empty cell to indicate an error. (The semantics of the cell body may be
+ determined later; the current implementation sends a single '1' byte on
+ failure.)
+
+ When Bob's OP receives the RELAY_COMMAND_INTRODUCE2 cell, it decrypts it
+ with the private key for the corresponding hidden service, and extracts the
rendezvous point's nickname, the rendezvous cookie, and the value of g^x
chosen by Alice.
1.10. Rendezvous
Bob's OP builds a new Tor circuit ending at Alice's chosen rendezvous
- point, and sends a RELAY_RENDEZVOUS1 cell along this circuit, containing:
+ point, and sends a RELAY_COMMAND_RENDEZVOUS1 cell along this circuit,
+ containing:
RC Rendezvous cookie [20 octets]
g^y Diffie-Hellman [128 octets]
KH Handshake digest [20 octets]
@@ -674,7 +695,7 @@ $Id$
(Bob's OP MUST NOT use this circuit for any other purpose.)
If the RP recognizes RC, it relays the rest of the cell down the
- corresponding circuit in a RELAY_RENDEZVOUS2 cell, containing:
+ corresponding circuit in a RELAY_COMMAND_RENDEZVOUS2 cell, containing:
g^y Diffie-Hellman [128 octets]
KH Handshake digest [20 octets]
@@ -682,10 +703,10 @@ $Id$
(If the RP does not recognize the RC, it discards the cell and
tears down the circuit.)
- When Alice's OP receives a RELAY_RENDEZVOUS2 cell on a circuit which
- has sent a RELAY_ESTABLISH_RENDEZVOUS cell but which has not yet received
- a reply, it uses g^y and H(g^xy) to complete the handshake as in the Tor
- circuit extend process: they establish a 60-octet string as
+ When Alice's OP receives a RELAY_COMMAND_RENDEZVOUS2 cell on a circuit which
+ has sent a RELAY_COMMAND_ESTABLISH_RENDEZVOUS cell but which has not yet
+ received a reply, it uses g^y and H(g^xy) to complete the handshake as in
+ the Tor circuit extend process: they establish a 60-octet string as
K = SHA1(g^xy | [00]) | SHA1(g^xy | [01]) | SHA1(g^xy | [02])
and generate
KH = K[0..15]
@@ -704,7 +725,7 @@ $Id$
1.11. Creating streams
To open TCP connections to Bob's location-hidden service, Alice's OP sends
- a RELAY_BEGIN cell along the established circuit, using the special
+ a RELAY_COMMAND_BEGIN cell along the established circuit, using the special
address "", and a chosen port. Bob's OP chooses a destination IP and
port, based on the configuration of the service connected to the circuit,
and opens a TCP stream. From then on, Bob's OP treats the stream as an
@@ -712,13 +733,190 @@ $Id$
[ Except he doesn't include addr in the connected cell or the end
cell. -RD]
- Alice MAY send multiple RELAY_BEGIN cells along the circuit, to open
- multiple streams to Bob. Alice SHOULD NOT send RELAY_BEGIN cells for any
- other address along her circuit to Bob; if she does, Bob MUST reject them.
+ Alice MAY send multiple RELAY_COMMAND_BEGIN cells along the circuit, to open
+ multiple streams to Bob. Alice SHOULD NOT send RELAY_COMMAND_BEGIN cells
+ for any other address along her circuit to Bob; if she does, Bob MUST reject
+ them.
2. Authentication and authorization.
-Foo.
+ The rendezvous protocol as described in Section 1 provides a few options
+ for implementing client-side authorization. There are two steps in the
+ rendezvous protocol that can be used for performing client authorization:
+ when downloading and decrypting parts of the hidden service descriptor and
+ at Bob's Tor client before contacting the rendezvous point. A service
+ provider can restrict access to his service at these two points to
+ authorized clients only.
+
+ There are currently two authorization protocols specified that are
+ described in more detail below:
+
+ 1. The first protocol allows a service provider to restrict access
+ to clients with a previously received secret key only, but does not
+ attempt to hide service activity from others.
+
+ 2. The second protocol, albeit being feasible for a limited set of about
+ 16 clients, performs client authorization and hides service activity
+ from everyone but the authorized clients.
+
+2.1. Service with large-scale client authorization
+
+ The first client authorization protocol aims at performing access control
+ while consuming as few additional resources as possible. This is the "basic"
+ authorization protocol. A service provider should be able to permit access
+ to a large number of clients while denying access for everyone else.
+ However, the price for scalability is that the service won't be able to hide
+ its activity from unauthorized or formerly authorized clients.
+
+ The main idea of this protocol is to encrypt the introduction-point part
+ in hidden service descriptors to authorized clients using symmetric keys.
+ This ensures that nobody else but authorized clients can learn which
+ introduction points a service currently uses, nor can someone send a
+ valid INTRODUCE1 message without knowing the introduction key. Therefore,
+ a subsequent authorization at the introduction point is not required.
+
+ A service provider generates symmetric "descriptor cookies" for his
+ clients and distributes them outside of Tor. The suggested key size is
+ 128 bits, so that descriptor cookies can be encoded in 22 base64 chars
+ (which can hold up to 22 * 5 = 132 bits, leaving 4 bits to encode the
+ authorization type (here: "0") and allow a client to distinguish this
+ authorization protocol from others like the one proposed below).
+ Typically, the contact information for a hidden service using this
+ authorization protocol looks like this:
+
+ v2cbb2l4lsnpio4q.onion Ll3X7Xgz9eHGKCCnlFH0uz
+
+ When generating a hidden service descriptor, the service encrypts the
+ introduction-point part with a single randomly generated symmetric
+ 128-bit session key using AES-CTR as described for v2 hidden service
+ descriptors in rend-spec. Afterwards, the service encrypts the session
+ key to all descriptor cookies using AES. Authorized client should be able
+ to efficiently find the session key that is encrypted for him/her, so
+ that 4 octet long client ID are generated consisting of descriptor cookie
+ and initialization vector. Descriptors always contain a number of
+ encrypted session keys that is a multiple of 16 by adding fake entries.
+ Encrypted session keys are ordered by client IDs in order to conceal
+ addition or removal of authorized clients by the service provider.
+
+ ATYPE Authorization type: set to 1. [1 octet]
+ ALEN Number of clients := 1 + ((clients - 1) div 16) [1 octet]
+ for each symmetric descriptor cookie:
+ ID Client ID: H(descriptor cookie | IV)[:4] [4 octets]
+ SKEY Session key encrypted with descriptor cookie [16 octets]
+ (end of client-specific part)
+ RND Random data [(15 - ((clients - 1) mod 16)) * 20 octets]
+ IV AES initialization vector [16 octets]
+ IPOS Intro points, encrypted with session key [remaining octets]
+
+ An authorized client needs to configure Tor to use the descriptor cookie
+ when accessing the hidden service. Therefore, a user adds the contact
+ information that she received from the service provider to her torrc
+ file. Upon downloading a hidden service descriptor, Tor finds the
+ encrypted introduction-point part and attempts to decrypt it using the
+ configured descriptor cookie. (In the rare event of two or more client
+ IDs being equal a client tries to decrypt all of them.)
+
+ Upon sending the introduction, the client includes her descriptor cookie
+ as auth type "1" in the INTRODUCE2 cell that she sends to the service.
+ The hidden service checks whether the included descriptor cookie is
+ authorized to access the service and either responds to the introduction
+ request, or not.
+
+2.2. Authorization for limited number of clients
+
+ A second, more sophisticated client authorization protocol goes the extra
+ mile of hiding service activity from unauthorized clients. This is the
+ "stealth" authorization protocol. With all else being equal to the preceding
+ authorization protocol, the second protocol publishes hidden service
+ descriptors for each user separately and gets along with encrypting the
+ introduction-point part of descriptors to a single client. This allows the
+ service to stop publishing descriptors for removed clients. As long as a
+ removed client cannot link descriptors issued for other clients to the
+ service, it cannot derive service activity any more. The downside of this
+ approach is limited scalability. Even though the distributed storage of
+ descriptors (cf. proposal 114) tackles the problem of limited scalability to
+ a certain extent, this protocol should not be used for services with more
+ than 16 clients. (In fact, Tor should refuse to advertise services for more
+ than this number of clients.)
+
+ A hidden service generates an asymmetric "client key" and a symmetric
+ "descriptor cookie" for each client. The client key is used as
+ replacement for the service's permanent key, so that the service uses a
+ different identity for each of his clients. The descriptor cookie is used
+ to store descriptors at changing directory nodes that are unpredictable
+ for anyone but service and client, to encrypt the introduction-point
+ part, and to be included in INTRODUCE2 cells. Once the service has
+ created client key and descriptor cookie, he tells them to the client
+ outside of Tor. The contact information string looks similar to the one
+ used by the preceding authorization protocol (with the only difference
+ that it has "1" encoded as auth-type in the remaining 4 of 132 bits
+ instead of "0" as before).
+
+ When creating a hidden service descriptor for an authorized client, the
+ hidden service uses the client key and descriptor cookie to compute
+ secret ID part and descriptor ID:
+
+ secret-id-part = H(time-period | descriptor-cookie | replica)
+
+ descriptor-id = H(client-key[:10] | secret-id-part)
+
+ The hidden service also replaces permanent-key in the descriptor with
+ client-key and encrypts introduction-points with the descriptor cookie.
+
+ ATYPE Authorization type: set to 2. [1 octet]
+ IV AES initialization vector [16 octets]
+ IPOS Intro points, encr. with descriptor cookie [remaining octets]
+
+ When uploading descriptors, the hidden service needs to make sure that
+ descriptors for different clients are not uploaded at the same time (cf.
+ Section 1.1) which is also a limiting factor for the number of clients.
+
+ When a client is requested to establish a connection to a hidden service
+ it looks up whether it has any authorization data configured for that
+ service. If the user has configured authorization data for authorization
+ protocol "2", the descriptor ID is determined as described in the last
+ paragraph. Upon receiving a descriptor, the client decrypts the
+ introduction-point part using its descriptor cookie. Further, the client
+ includes its descriptor cookie as auth-type "2" in INTRODUCE2 cells that
+ it sends to the service.
+
+2.3. Hidden service configuration
+
+ A hidden service that is meant to perform client authorization adds a
+ new option HiddenServiceAuthorizeClient to its hidden service
+ configuration. This option contains the authorization type which is
+ either "basic" for the protocol described in 2.1 or "stealth" for the
+ protocol in 2.2 and a comma-separated list of human-readable client
+ names, so that Tor can create authorization data for these clients:
+
+ HiddenServiceAuthorizeClient auth-type client-name,client-name,...
+
+ If this option is configured, HiddenServiceVersion is automatically
+ reconfigured to contain only version numbers of 2 or higher. There is
+ a maximum of 512 client names for basic auth and a maximum of 16 for
+ stealth auth.
+
+ Tor stores all generated authorization data for the authorization
+ protocols described in Sections 2.1 and 2.2 in a new file using the
+ following file format:
+
+ "client-name" human-readable client identifier NL
+ "descriptor-cookie" 128-bit key ^= 22 base64 chars NL
+
+ If the authorization protocol of Section 2.2 is used, Tor also generates
+ and stores the following data:
+
+ "client-key" NL a public key in PEM format
+
+2.4. Client configuration
+
+ Clients need to make their authorization data known to Tor using another
+ configuration option that contains a service name (mainly for the sake of
+ convenience), the service address, and the descriptor cookie that is
+ required to access a hidden service (the authorization protocol number is
+ encoded in the descriptor cookie):
+
+ HidServAuth service-name service-address descriptor-cookie
3. Hidden service directory operation
diff --git a/doc/spec/socks-extensions.txt b/doc/spec/socks-extensions.txt
index 8d58987f35..62d86acd9f 100644
--- a/doc/spec/socks-extensions.txt
+++ b/doc/spec/socks-extensions.txt
@@ -1,4 +1,3 @@
-$Id$
Tor's extensions to the SOCKS protocol
1. Overview
diff --git a/doc/spec/tor-spec.txt b/doc/spec/tor-spec.txt
index a321aa8694..91ad561b8d 100644
--- a/doc/spec/tor-spec.txt
+++ b/doc/spec/tor-spec.txt
@@ -1,4 +1,3 @@
-$Id$
Tor Protocol Specification
@@ -17,11 +16,16 @@ see tor-design.pdf.
0. Preliminaries
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ RFC 2119.
+
0.1. Notation and encoding
PK -- a public key.
SK -- a private key.
- K -- a key for a symmetric cypher.
+ K -- a key for a symmetric cipher.
a|b -- concatenation of 'a' and 'b'.
@@ -172,8 +176,8 @@ see tor-design.pdf.
In "renegotiation", the connection initiator sends no certificates, and
the responder sends a single connection certificate. Once the TLS
handshake is complete, the initiator renegotiates the handshake, with each
- parties sending a two-certificate chain as in "certificates up-front".
- The initiator's ClientHello MUST include at least once ciphersuite not in
+ party sending a two-certificate chain as in "certificates up-front".
+ The initiator's ClientHello MUST include at least one ciphersuite not in
the list above. The responder SHOULD NOT select any ciphersuite besides
those in the list above.
[The above "should not" is because some of the ciphers that
@@ -201,9 +205,9 @@ see tor-design.pdf.
to decide which to use.
In all of the above handshake variants, certificates sent in the clear
- SHOULD NOT include any strings to identify the host as a Tor server. In
- the "renegotation" and "backwards-compatible renegotiation", the
- initiator SHOULD chose a list of ciphersuites and TLS extensions chosen
+ SHOULD NOT include any strings to identify the host as a Tor server. In
+ the "renegotiation" and "backwards-compatible renegotiation" steps, the
+ initiator SHOULD choose a list of ciphersuites and TLS extensions
to mimic one used by a popular web browser.
Responders MUST NOT select any TLS ciphersuite that lacks ephemeral keys,
@@ -289,7 +293,7 @@ see tor-design.pdf.
6 -- CREATED_FAST (Circuit created, no PK) (See Sec 5.1)
7 -- VERSIONS (Negotiate proto version) (See Sec 4)
8 -- NETINFO (Time and address info) (See Sec 4)
- 9 -- RELAY_EARLY (End-to-end data; limited) (See sec 5.6)
+ 9 -- RELAY_EARLY (End-to-end data; limited)(See Sec 5.6)
The interpretation of 'Payload' depends on the type of the cell.
PADDING: Payload is unused.
@@ -357,7 +361,7 @@ see tor-design.pdf.
The address format is a type/length/value sequence as given in section
6.4 below. The timestamp is a big-endian unsigned integer number of
- seconds since the unix epoch.
+ seconds since the Unix epoch.
Implementations MAY use the timestamp value to help decide if their
clocks are skewed. Initiators MAY use "other OR's address" to help
@@ -399,7 +403,7 @@ see tor-design.pdf.
Onion skin [DH_LEN+KEY_LEN+PK_PAD_LEN bytes]
Identity fingerprint [HASH_LEN bytes]
- The port and address field denote the IPV4 address and port of the next
+ The port and address field denote the IPv4 address and port of the next
onion router in the circuit; the public key hash is the hash of the PKCS#1
ASN1 encoding of the next onion router's identity (signing) key. (See 0.3
above.) Including this hash allows the extending OR verify that it is
@@ -593,6 +597,14 @@ see tor-design.pdf.
cell to the next node in the circuit, and replies to the OP with a
RELAY_TRUNCATED cell.
+ [Note: If an OR receives a TRUNCATE cell and it has any RELAY cells
+ still queued on the circuit for the next node it will drop them
+ without sending them. This is not considered conformant behavior,
+ but it probably won't get fixed until a later version of Tor. Thus,
+ clients SHOULD NOT send a TRUNCATE cell to a node running any current
+ version of Tor if a) they have sent relay cells through that node,
+ and b) they aren't sure whether those cells have been sent on yes.]
+
When an unrecoverable error occurs along one connection in a
circuit, the nodes on either side of the connection should, if they
are able, act as follows: the node closer to the OP should send a
@@ -831,7 +843,8 @@ see tor-design.pdf.
6 -- REASON_DONE (Anonymized TCP connection was closed)
7 -- REASON_TIMEOUT (Connection timed out, or OR timed out
while connecting)
- 8 -- (unallocated) [**]
+ 8 -- REASON_NOROUTE (Routing error while attempting to
+ contact destination)
9 -- REASON_HIBERNATING (OR is temporarily hibernating)
10 -- REASON_INTERNAL (Internal error at the OR)
11 -- REASON_RESOURCELIMIT (OR has no resources to fulfill request)
@@ -853,8 +866,6 @@ see tor-design.pdf.
[*] Older versions of Tor also send this reason when connections are
reset.
- [**] Due to a bug in versions of Tor through 0095, error reason 8 must
- remain allocated until that version is obsolete.
--- [The rest of this section describes unimplemented functionality.]
@@ -886,7 +897,7 @@ see tor-design.pdf.
6.4. Remote hostname lookup
To find the address associated with a hostname, the OP sends a
- RELAY_RESOLVE cell containing the hostname to be resolved with a nul
+ RELAY_RESOLVE cell containing the hostname to be resolved with a NUL
terminating byte. (For a reverse lookup, the OP sends a RELAY_RESOLVE
cell containing an in-addr.arpa address.) The OR replies with a
RELAY_RESOLVED cell containing a status byte, and any number of
diff --git a/doc/spec/version-spec.txt b/doc/spec/version-spec.txt
index 842271ae19..265717f409 100644
--- a/doc/spec/version-spec.txt
+++ b/doc/spec/version-spec.txt
@@ -1,4 +1,3 @@
-$Id$
HOW TOR VERSION NUMBERS WORK
diff --git a/doc/tor-gencert.1 b/doc/tor-gencert.1
deleted file mode 100644
index 5bcb5f0c30..0000000000
--- a/doc/tor-gencert.1
+++ /dev/null
@@ -1,86 +0,0 @@
-.TH tor-gencert 1 "" Jan-2008 ""
-.\" manual page by Nick Mathewson
-.SH NAME
-.LP
-tor-gencert \- Generate certs and keys for Tor directory authorities
-
-.SH SYNOPSIS
-\fBtor-gencert\fP\ [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i \fIid_file\fP] [-c \fIcert_file\fP] [-m \fInum\fP] [-a \fIaddress\fP:\fIport\fP]
-
-.SH DESCRIPTION
-\fBtor-gencert\fR generates certificates and private keys for use by Tor
-directory authorities running the v3 Tor directory protocol, as used by Tor
-0.2.0 and later. If you are not running a directory authority, you don't
-need to use tor-gencert.
-.PP
-Every directory authority has a long term authority \fIidentity key\fP (which
-is distinct from the identity key it uses as a Tor server); this key should
-be kept offline in a secure location. It is used to certify shorter-lived
-\fIsigning keys\fP, which are kept online and used by the directory authority
-to sign votes and consensus documents.
-.PP
-After you use this program to generate a signing key and a certificate, copy
-those files to the keys subdirectory of your Tor process, and send Tor a
-SIGHUP signal. DO NOT COPY THE IDENTITY KEY.
-
-.SH OPTIONS
-\fB-v\fP
-Display verbose output.
-.LP
-.TP
-\fB-h\fP or \fB--help\fP
-Display help text and exit.
-.LP
-.TP
-\fB-r\fP or \fB--reuse\fP
-Generate a new certificate, but not a new signing key. This can be
-used to change the address or lifetime associated with a given key.
-.LP
-.TP
-\fB--create-identity-key\fP
-Generate a new identity key. You should only use this option the first
-time you run tor-gencert; in the future, you should use the identity
-key that's already there.
-.LP
-.TP
-\fB-i \fR\fIFILENAME\fP
-Read the identity key from the specified file. If the file is not present
-and --create-identity-key is provided, create the identity key in the
-specified file. Default: "./authority_identity_key"
-.LP
-.TP
-\fB-s \fR\fIFILENAME\fP
-Write the signing key to the specified file. Default:
-"./authority_signing_key"
-.LP
-.TP
-\fB-c \fR\fIFILENAME\fP
-Write the certificate to the specified file.
-Default: "./authority_certificate"
-.LP
-.TP
-\fB-m \fR\fINUM\fP
-Number of months that the certificate should be valid. Default: 12.
-.LP
-.TP
-\fB--passphrase-fd \fR\fIFILEDES\fP
-Filedescriptor to read the file descriptor from. Ends at the first
-NUL or newline. Default: read from the terminal.
-.LP
-.TP
-\fB-a \fR\fIaddress\fR:\fIport\fP
-If provided, advertise the address:port combination as this authority's
-preferred directory port in its certificate. If the address is a hostname,
-the hostname is resolved to an IP before it's published.
-
-.SH BUGS
-This probably doesn't run on Windows. That's not a big issue, since we
-don't really want authorities to be running on Windows anyway.
-
-.SH SEE ALSO
-.BR tor (1)
-.PP
-See also the "dir-spec.txt" file, distributed with Tor.
-
-.SH AUTHORS
-Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>.
diff --git a/doc/tor-gencert.1.txt b/doc/tor-gencert.1.txt
new file mode 100644
index 0000000000..2a2d1179c5
--- /dev/null
+++ b/doc/tor-gencert.1.txt
@@ -0,0 +1,90 @@
+// Copyright (c) The Tor Project, Inc.
+// See LICENSE for licensing information
+// This is an asciidoc file used to generate the manpage/html reference.
+// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html
+tor-gencert(1)
+==============
+Nick Mathewson
+
+NAME
+----
+tor-gencert - Generate certs and keys for Tor directory authorities
+
+SYNOPSIS
+--------
+**tor-gencert** [-h|--help] [-v] [-r|--reuse] [--create-identity-key] [-i __id_file__] [-c
+__cert_file__] [-m __num__] [-a __address__:__port__]
+
+DESCRIPTION
+-----------
+**tor-gencert** generates certificates and private keys for use by Tor
+directory authorities running the v3 Tor directory protocol, as used by
+Tor 0.2.0 and later. If you are not running a directory authority, you
+don't need to use tor-gencert. +
+
+Every directory authority has a long term authority __identity__ __key__ (which
+is distinct from the identity key it uses as a Tor server); this key
+should be kept offline in a secure location. It is used to certify
+shorter-lived __signing__ __keys__, which are kept online and used by the
+directory authority to sign votes and consensus documents. +
+
+After you use this program to generate a signing key and a certificate,
+copy those files to the keys subdirectory of your Tor process, and send
+Tor a SIGHUP signal. DO NOT COPY THE IDENTITY KEY.
+
+OPTIONS
+-------
+**-v**::
+ Display verbose output.
+
+**-h** or **--help**::
+ Display help text and exit.
+
+**-r** or **--reuse**::
+ Generate a new certificate, but not a new signing key. This can be used to
+ change the address or lifetime associated with a given key.
+
+**--create-identity-key**::
+ Generate a new identity key. You should only use this option the first time
+ you run tor-gencert; in the future, you should use the identity key that's
+ already there.
+
+**-i** __FILENAME__::
+ Read the identity key from the specified file. If the file is not present
+ and --create-identity-key is provided, create the identity key in the
+ specified file. Default: "./authority_identity_key"
+
+**-s** __FILENAME__::
+ Write the signing key to the specified file. Default:
+ "./authority_signing_key"
+
+**-c** __FILENAME__::
+ Write the certificate to the specified file. Default:
+ "./authority_certificate"
+
+**-m** __NUM__::
+ Number of months that the certificate should be valid. Default: 12.
+
+**--passphrase-fd** __FILEDES__::
+ Filedescriptor to read the file descriptor from. Ends at the first NUL or
+ newline. Default: read from the terminal.
+
+**-a** __address__:__port__::
+ If provided, advertise the address:port combination as this authority's
+ preferred directory port in its certificate. If the address is a hostname,
+ the hostname is resolved to an IP before it's published.
+
+BUGS
+----
+This probably doesn't run on Windows. That's not a big issue, since we don't
+really want authorities to be running on Windows anyway.
+
+SEE ALSO
+--------
+**tor**(1) +
+
+See also the "dir-spec.txt" file, distributed with Tor.
+
+AUTHORS
+-------
+ Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>.
diff --git a/doc/tor-osx-dmg-creation.txt b/doc/tor-osx-dmg-creation.txt
deleted file mode 100644
index 9a89e98759..0000000000
--- a/doc/tor-osx-dmg-creation.txt
+++ /dev/null
@@ -1,145 +0,0 @@
-## Instructions for building the official dmgs for OSX.
-##
-## The loose table of contents:
-## Summary
-## Single Architecture Binaries for PPC or X86, not both.
-## Backwards compatible single-architecture binaries for OSX x86 10.4 from newer versions of OS X.
-## Universal Binaries for OSX PPC and X86
-## Each section is delineated by ###.
-
-The following steps are the exact steps used to produce the "official"
-OSX builds of tor.
-
-### Summary:
-1) Compile and install a static version of the latest release of
-libevent.
-2) Acquire and install your preferred version of tor. Extract.
-3) "make dist-osx"
-4) You now have a dmg from which you can install Tor.
-
-### Single Architecture Binaries for PPC or X86, not both.
-### This method works in all versions of OSX 10.3 through 10.6
-
-## Compiling libevent ##
-
-1) Download the latest stable libevent from
-http://www.monkey.org/~provos/libevent/
-
-2) The first step of compiling libevent is to configure it as
-follows:
- ./configure --enable-static --disable-shared
-
-3) Complete the "make" and "make install". You will need to be root,
-or sudo -s, to complete the "make install".
-
-## Compiling Tor ##
-
-4) Get your preferred version of the tor source from https://www.torproject.org. Extract the
-tarball.
-
-5) In the top level, this means /path/to/tor/, not tor/contrib/osx,
-do a configure with these parameters:
- CONFDIR=/Library/Tor ./configure --prefix=/Library/Tor \
- --bindir=/Library/Tor --sysconfdir=/Library
-
-6) In same top level dir, do a "make dist-osx". There now exists a
-.dmg file in the same directory. Install from this dmg.
-
-### Backwards compatible single-architecture binaries for OSX x86 10.4 from newer versions of OS X.
-
-1) Install the latest XCode updates available from http://developer.apple.com.
-
-## Compiling libevent ##
-
-2) Download latest stable libevent from
-http://www.monkey.org/~provos/libevent/
-
-3) The first step of compiling libevent is to configure it as
-follows:
-CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386" \
-LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \
-./configure --enable-static --disable-shared --disable-dependency-tracking
-
-4) Complete the "make" and "make install". You will need to be root,
-or sudo -s, to complete the "make install".
-
-5) Check for a successful universal binary of libevent.a in, by default,
-/usr/local/lib by using the following command:
- "file /usr/local/lib/libevent.a"
-
- Your output should be:
-/usr/local/lib/libevent.a (for architecture i386): current ar archive random library
-
-6) Get your preferred version of the tor source from https://www.torproject.org/download.
-Extract the tarball.
-
-7) In the top level, this means /path/to/tor/, not tor/contrib/osx,
-do a configure with these parameters:
-CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386" \
-LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \
-CONFDIR=/Library/Tor \
-./configure --prefix=/Library/Tor --bindir=/Library/Tor \
---sysconfdir=/Library --disable-dependency-tracking
-
-8) "make dist-osx"
-
-9) Confirm you have created a universal binary by issuing the follow command:
-"file src/or/tor". Its output should be as follows:
-src/or/tor (for architecture i386): Mach-O executable i386
-
-10) There should exist in the top-level directory a
-Tor-$VERSION-universal-Bundle.dmg
-
-11) Congrats. You have a backwards-compatible binary. You are now ready to install Tor.
-
-### Universal Binaries for OSX PPC and X86
-### This method works in OSX 10.4 (Tiger) and newer OSX versions.
-
-1) Install the latest XCode updates available from http://developer.apple.com.
-
-## Compiling libevent ##
-
-2) Download latest stable libevent from
-http://www.monkey.org/~provos/libevent/
-
-3) The first step of compiling libevent is to configure it as
-follows:
-CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
-LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \
-./configure --enable-static --disable-shared --disable-dependency-tracking
-
-4) Complete the "make" and "make install". You will need to be root,
-or sudo -s, to complete the "make install".
-
-5) Check for a successful universal binary of libevent.a in, by default,
-/usr/local/lib by using the following command:
- "file /usr/local/lib/libevent.a"
-
- Your output should be:
-/usr/local/lib/libevent.a: Mach-O fat file with 2 architectures
-/usr/local/lib/libevent.a (for architecture i386): current ar archive random library
-/usr/local/lib/libevent.a (for architecture ppc): current ar archive
-
-6) Get your preferred version of the tor source from https://www.torproject.org/download.
-Extract the tarball.
-
-7) In the top level, this means /path/to/tor/, not tor/contrib/osx,
-do a configure with these parameters:
-CFLAGS="-O -g -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
-LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" \
-CONFDIR=/Library/Tor \
-./configure --prefix=/Library/Tor --bindir=/Library/Tor \
---sysconfdir=/Library --disable-dependency-tracking
-
-8) "make dist-osx"
-
-9) Confirm you have created a universal binary by issuing the follow command:
-"file src/or/tor". Its output should be as follows:
-src/or/tor: Mach-O fat file with 2 architectures
-src/or/tor (for architecture i386): Mach-O executable i386
-src/or/tor (for architecture ppc): Mach-O executable ppc
-
-10) There should exist in the top-level directory a
-Tor-$VERSION-universal-Bundle.dmg
-
-11) Congrats. You have a universal binary. You are now ready to install Tor.
diff --git a/doc/tor-resolve.1 b/doc/tor-resolve.1
deleted file mode 100644
index 3987095dbb..0000000000
--- a/doc/tor-resolve.1
+++ /dev/null
@@ -1,38 +0,0 @@
-.TH tor-resolve 1 "" Aug-2004 ""
-.\" manual page by Peter Palfrader
-.SH NAME
-.LP
-tor-resolve \- resolve a hostname to an IP address via tor
-
-.SH SYNOPSIS
-\fBtor-resolve\fP\ [-4|-5] [-v] [-x] \fIhostname\fP\ [\fIsockshost\fP[:\fIsocksport]\fP]
-
-.SH DESCRIPTION
-\fBtor-resolve\fR is a simple script to connect to a SOCKS proxy that
-knows about the SOCKS RESOLVE command, hand it a hostname, and return
-an IP address.
-.SH OPTIONS
-\fB-v \fP
-Display verbose output.
-.LP
-.TP
-\fB-x\fP
-Perform a reverse lookup: get the PTR record for an IPv4 address.
-.LP
-.TP
-\fB-5\fP
-Use the SOCKS5 protocol. (Default)
-.LP
-.TP
-\fB-4\fP
-Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't
-support reverse DNS.
-
-.SH SEE ALSO
-.BR tor (1),
-.BR torify (1).
-.PP
-See doc/socks-extensions.txt in the Tor package for protocol details.
-
-.SH AUTHORS
-Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>.
diff --git a/doc/tor-resolve.1.txt b/doc/tor-resolve.1.txt
new file mode 100644
index 0000000000..eb519667b7
--- /dev/null
+++ b/doc/tor-resolve.1.txt
@@ -0,0 +1,45 @@
+// Copyright (c) The Tor Project, Inc.
+// See LICENSE for licensing information
+// This is an asciidoc file used to generate the manpage/html reference.
+// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html
+tor-resolve(1)
+==============
+Peter Palfrader
+
+NAME
+----
+tor-resolve - resolve a hostname to an IP address via tor
+
+SYNOPSIS
+--------
+**tor-resolve** [-4|-5] [-v] [-x] __hostname__ [__sockshost__[:__socksport__]]
+
+DESCRIPTION
+-----------
+**tor-resolve** is a simple script to connect to a SOCKS proxy that knows about
+the SOCKS RESOLVE command, hand it a hostname, and return an IP address.
+
+OPTIONS
+-------
+**-v**::
+ Display verbose output.
+
+**-x**::
+ Perform a reverse lookup: get the PTR record for an IPv4 address.
+
+**-5**::
+ Use the SOCKS5 protocol. (Default)
+
+**-4**::
+ Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't
+ support reverse DNS.
+
+SEE ALSO
+--------
+**tor**(1), **torify**(1). +
+
+See doc/socks-extensions.txt in the Tor package for protocol details.
+
+AUTHORS
+-------
+Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>. \ No newline at end of file
diff --git a/doc/tor-win32-mingw-creation.txt b/doc/tor-win32-mingw-creation.txt
index f31d2741c4..4a25e47a85 100644
--- a/doc/tor-win32-mingw-creation.txt
+++ b/doc/tor-win32-mingw-creation.txt
@@ -1,3 +1,4 @@
+##
## Instructions for building Tor with MinGW (http://www.mingw.org/)
##
@@ -5,21 +6,21 @@ Stage One: Download and Install MinGW.
---------------------------------------
Download mingw:
-http://prdownloads.sf.net/mingw/MinGW-5.1.4.exe?download
+http://prdownloads.sf.net/mingw/MinGW-5.1.6.exe?download
Download msys:
-http://prdownloads.sf.net/mingw/MSYS-1.0.10.exe?download
+http://prdownloads.sf.net/ming/MSYS-1.0.11.exe?download
+
+Download msysDTK:
+http://sourceforge.net/projects/mingw/files/MSYS%20Supplementary%20Tools/msysDTK-1.0.1/msysDTK-1.0.1.exe/download
-Download the mingw developer tool kit:
-http://prdownloads.sf.net/mingw/msysDTK-1.0.1.exe?download
+Install MinGW, msysDTK, and MSYS in that order.
-Download the mingw autoconf-2.59 update:
-http://prdownloads.sf.net/mingw/msys-autoconf-2.59.tar.bz2?download
+Make sure your PATH includes C:\MinGW\bin. You can verify this by right
+clicking on "My Computer", choose "Properties", choose "Advanced",
+choose "Environment Variables", select PATH.
-Install mingw, msys and mingw-dtk. Extract msys-autoconf-2.59.tar.bz2 into
-your mingw install location. For example, if you installed mingw into
-/c/mingw/1.0/ you want to extract msys-autoconf-2.59.tar.bz2 into this
-directory.
+Start MSYS(rxvt).
Create a directory called "tor-mingw".
@@ -27,17 +28,17 @@ Stage Two: Download, extract, compile openssl
----------------------------------------------
Download openssl:
-http://www.openssl.org/source/openssl-0.9.8k.tar.gz
+http://www.openssl.org/source/openssl-0.9.8l.tar.gz
Extract openssl:
Copy the openssl tarball into the "tor-mingw" directory.
Type "cd tor-mingw/"
-Type "tar zxf openssl-0.9.8k.tar.gz"
+Type "tar zxf openssl-0.9.8l.tar.gz"
(Note: There are many symlink errors because Windows doesn't support
symlinks. You can ignore these errors.)
Make openssl libraries:
-Type "cd tor-mingw/openssl-0.9.8k/"
+Type "cd tor-mingw/openssl-0.9.8l/"
Type "./Configure -no-idea -no-rc5 -no-mdc2 mingw"
Edit Makefile and remove the "test:" and "tests:" sections.
Type "rm -rf ./test"
@@ -47,16 +48,11 @@ Type "cd ../ssl/"
Type "find ./ -name "*.h" -exec cp {} ../include/openssl/ \;"
Type "cd .."
Type "cp *.h include/openssl/"
-Type "cp fips/fips.h include/openssl/"
+Type "find ./fips -type f -name "*.h" -exec cp {} include/openssl/ \;"
# The next steps can take up to 30 minutes to complete.
Type "make"
Type "make install"
-Alternatively:
-Download the pre-compiled openssl for win32 from
-http://gnuwin32.sourceforge.net/packages/openssl.htm
-Install and proceed.
-
Stage Three: Download, extract, compile zlib
---------------------------------------------
@@ -77,13 +73,6 @@ Type "./configure"
Type "make"
Type "make install"
-OR
-
-Make zlib1.dll:
-Type "cd tor-mingw/zlib-1.2.3/"
-Type "./configure"
-Type "make -f win32/Makefile.gcc"
-
Done.
@@ -128,4 +117,3 @@ From the Tor build directory above, run:
"./contrib/package_nsis-mingw.sh"
The resulting Tor installer executable is in ./win_tmp/.
-
diff --git a/doc/tor.1.in b/doc/tor.1.in
deleted file mode 100644
index 1a72ebd09f..0000000000
--- a/doc/tor.1.in
+++ /dev/null
@@ -1,1519 +0,0 @@
-.TH TOR 1 "January 2009" "TOR"
-.SH NAME
-tor \- The second-generation onion router
-.SH SYNOPSIS
-.B tor
-[\fIOPTION value\fR]...
-.SH DESCRIPTION
-.I tor
-is a connection-oriented anonymizing communication
-service. Users choose a source-routed path through a set of nodes, and
-negotiate a "virtual circuit" through the network, in which each node
-knows its predecessor and successor, but no others. Traffic flowing down
-the circuit is unwrapped by a symmetric key at each node, which reveals
-the downstream node.
-.PP
-Basically \fItor\fR provides a distributed network of servers ("onion
-routers"). Users bounce their TCP streams -- web traffic, ftp, ssh, etc --
-around the routers, and recipients, observers, and even the routers
-themselves have difficulty tracking the source of the stream.
-.SH OPTIONS
-\fB-h, -help\fP
-Display a short help message and exit.
-.LP
-.TP
-\fB-f \fR\fIFILE\fP
-FILE contains further "option value" pairs. (Default: @CONFDIR@/torrc)
-.LP
-.TP
-\fB--hash-password\fP
-Generates a hashed password for control port access.
-.LP
-.TP
-\fB--list-fingerprint\fP
-Generate your keys and output your nickname and fingerprint.
-.LP
-.TP
-\fB--verify-config\fP
-Verify the configuration file is valid.
-.LP
-.TP
-\fB--nt-service\fP
-\fB--service [install|remove|start|stop]\fP
-Manage the Tor Windows NT/2000/XP service. Current instructions can
-be found at http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#WinNTService
-.LP
-.TP
-\fB--list-torrc-options\fP
-List all valid options.
-.LP
-.TP
-\fB--version\fP
-Display Tor version and exit.
-.LP
-.TP
-\fB--quiet\fP
-Do not start Tor with a console log unless explicitly requested to do
-so. (By default, Tor starts out logging messages at level "notice" or
-higher to the console, until it has parsed its configuration.)
-.LP
-.TP
-Other options can be specified either on the command-line (\fI--option
-value\fR), or in the configuration file (\fIoption value\fR or
-\fIoption "value"\fR). Options are case-insensitive. C-style escaped
-characters are allowed inside quoted values.
-.LP
-.TP
-\fBBandwidthRate \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP
-A token bucket limits the average incoming bandwidth usage on this node
-to the specified number of bytes per second, and the average outgoing
-bandwidth usage to that same value. (Default: 5 MB)
-.LP
-.TP
-\fBBandwidthBurst \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP
-Limit the maximum token bucket size (also known as the burst) to the
-given number of bytes in each direction. (Default: 10 MB)
-.LP
-.TP
-\fBMaxAdvertisedBandwidth \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP
-If set, we will not advertise more than this amount of bandwidth for our
-BandwidthRate. Server operators who want to reduce the number of clients
-who ask to build circuits through them (since this is proportional to
-advertised bandwidth rate) can thus reduce the CPU demands on their
-server without impacting network performance.
-.LP
-.TP
-\fBRelayBandwidthRate \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP
-If defined, a separate token bucket limits the average incoming bandwidth
-usage for _relayed traffic_ on this node to the specified number of
-bytes per second, and the average outgoing bandwidth usage to that same
-value. Relayed traffic currently is calculated to include answers to directory
-requests, but that may change in future versions. (Default: 0)
-.LP
-.TP
-\fBRelayBandwidthBurst \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP
-Limit the maximum token bucket size (also known as the burst) for
-_relayed traffic_ to the
-given number of bytes in each direction. (Default: 0)
-.LP
-.TP
-\fBConnLimit \fR\fINUM\fP
-The minimum number of file descriptors that must be available to
-the Tor process before it will start. Tor will ask the OS for as
-many file descriptors as the OS will allow (you can find this
-by "ulimit -H -n"). If this number is less than ConnLimit, then
-Tor will refuse to start.
-
-You probably don't need to adjust this. It has no effect on
-Windows since that platform lacks getrlimit(). (Default: 1000)
-.LP
-.TP
-\fBConstrainedSockets \fR\fB0\fR|\fB1\fR\fP
-If set, Tor will tell the kernel to attempt to shrink the buffers for all
-sockets to the size specified in \fBConstrainedSockSize\fP. This is useful
-for virtual servers and other environments where system level TCP
-buffers may be limited. If you're on a virtual server, and you
-encounter the "Error creating network
-socket: No buffer space available" message, you are likely experiencing
-this problem.
-
-The preferred solution is to have the admin increase the buffer pool for
-the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; this
-configuration option is a second-resort.
-
-The DirPort option should also not be used if TCP buffers are scarce. The
-cached directory requests consume additional sockets which exacerbates the
-problem.
-
-You should \fBnot\fP enable this feature unless you encounter the "no buffer
-space available" issue. Reducing the TCP buffers affects window size for
-the TCP stream and will reduce throughput in proportion to round trip
-time on long paths. (Default: 0.)
-.LP
-.TP
-\fBConstrainedSockSize \fR\fIN\fR \fBbytes\fR|\fBKB\fP
-When \fBConstrainedSockets\fP is enabled the receive and transmit buffers for
-all sockets will be set to this limit. Must be a value between 2048
-and 262144, in 1024 byte increments. Default of 8192 is recommended.
-.LP
-.TP
-\fBControlPort \fR\fIPort\fP
-If set, Tor will accept connections on this port and allow those
-connections to control the Tor process using the Tor Control Protocol
-(described in control-spec.txt). Note: unless you also specify one of
-\fBHashedControlPassword\fP or \fBCookieAuthentication\fP, setting
-this option will cause Tor to allow any process on the local host to
-control it. This option is required for many Tor controllers; most use
-the value of 9051.
-.LP
-.TP
-\fBControlListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind the controller listener to this address. If you specify a port,
-bind to this port rather than the one specified in ControlPort. We
-strongly recommend that you leave this alone unless you know what you're
-doing, since giving attackers access to your control listener is really
-dangerous. (Default: 127.0.0.1)
-This directive can be specified multiple times to bind to multiple
-addresses/ports.
-.LP
-.TP
-\fBControlSocket \fR\fIPath\fP
-Like ControlPort, but listens on a Unix domain socket, rather than a TCP
-socket. (Unix and Unix-like systems only.)
-.LP
-.TP
-\fBHashedControlPassword \fR\fIhashed_password\fP
-Don't allow any connections on the control port except when the other process
-knows the password whose one-way hash is \fIhashed_password\fP. You can
-compute the hash of a password by running "tor --hash-password
-\fIpassword\fP". You can provide several acceptable passwords by using
-more than HashedControlPassword line.
-.LP
-.TP
-\fBCookieAuthentication \fR\fB0\fR|\fB1\fP
-If this option is set to 1, don't allow any connections on the control port
-except when the connecting process knows the contents of a file named
-"control_auth_cookie", which Tor will create in its data directory. This
-authentication method should only be used on systems with good filesystem
-security. (Default: 0)
-.LP
-.TP
-\fBCookieAuthFile \fR\fIPath\fP
-If set, this option overrides the default location and file name for Tor's
-cookie file. (See CookieAuthentication above.)
-.LP
-.TP
-\fBCookieAuthFileGroupReadable \fR\fB0\fR|\fB1\fR|\fIGroupName\fP
-If this option is set to 0, don't allow the filesystem group to read
-the cookie file. If the option is set to 1, make the cookie file
-readable by the default GID. [Making the file readable by other
-groups is not yet implemented; let us know if you need this for some
-reason.] (Default: 0).
-.LP
-.TP
-\fBDataDirectory \fR\fIDIR\fP
-Store working data in DIR (Default: @LOCALSTATEDIR@/lib/tor)
-.LP
-.TP
-\fBDirServer \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP
-Use a nonstandard authoritative directory server at the provided
-address and port, with the specified key fingerprint. This option can
-be repeated many times, for multiple authoritative directory
-servers. Flags are separated by spaces, and determine what kind of an
-authority this directory is. By default, every authority is authoritative
-for current ("v2")-style directories, unless the "no-v2" flag is given. If the "v1" flags is provided, Tor will use this server as an
-authority for old-style (v1) directories as well. (Only directory mirrors
-care about this.) Tor will use this server as an authority for hidden
-service information if the "hs" flag is set, or if the "v1" flag is set and
-the "no-hs" flag is \fBnot\fP set. Tor will use this authority as a bridge
-authoritative directory if the "bridge" flag is set. If a flag
-"orport=\fBport\fR" is given, Tor will use the given port when opening
-encrypted tunnels to the dirserver. Lastly, if a flag "v3ident=\fBfp\fR" is
-given, the dirserver is a v3 directory authority whose v3 long-term
-signing key has the fingerprint \fBfp\fR.
-
-If no \fBdirserver\fP line is given, Tor will use the default
-directory servers. NOTE: this option is intended
-for setting up a private Tor network with its own directory authorities. If
-you use it, you will be distinguishable from other users, because you won't
-believe the same authorities they do.
-.LP
-.TP
-\fBAlternateDirAuthority \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP
-.LP
-.TP
-\fBAlternateHSAuthority \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP
-.LP
-.TP
-\fBAlternateBridgeAuthority \fR[\fInickname\fR] [\fBflags\fR] \fIaddress\fR\fB:\fIport fingerprint\fP
-As DirServer, but replaces less of the default directory authorities.
-Using AlternateDirAuthority replaces the default Tor directory
-authorities, but leaves the hidden service authorities and bridge
-authorities in place. Similarly, Using AlternateHSAuthority replaces
-the default hidden service authorities, but not the directory or
-bridge authorities.
-.LP
-.TP
-\fBFetchDirInfoEarly \fR\fB0\fR|\fB1\fR\fP
-If set to 1, Tor will always fetch directory information like other
-directory caches, even if you don't meet the normal criteria for
-fetching early. Normal users should leave it off.
-(Default: 0)
-.LP
-.TP
-\fBFetchHidServDescriptors \fR\fB0\fR|\fB1\fR\fP
-If set to 0, Tor will never fetch any hidden service descriptors from
-the rendezvous directories. This option is only useful if you're using
-a Tor controller that handles hidden service fetches for you.
-(Default: 1)
-.LP
-.TP
-\fBFetchServerDescriptors \fR\fB0\fR|\fB1\fR\fP
-If set to 0, Tor will never fetch any network status summaries or server
-descriptors from the directory servers. This option is only useful if
-you're using a Tor controller that handles directory fetches for you.
-(Default: 1)
-.LP
-.TP
-\fBFetchUselessDescriptors \fR\fB0\fR|\fB1\fR\fP
-If set to 1, Tor will fetch every non-obsolete descriptor from the
-authorities that it hears about. Otherwise, it will avoid fetching
-useless descriptors, for example for routers that are not running.
-This option is useful if you're using the contributed "exitlist"
-script to enumerate Tor nodes that exit to certain addresses.
-(Default: 0)
-.LP
-.TP
-\fBHTTPProxy\fR \fIhost\fR[:\fIport\fR]\fP
-Tor will make all its directory requests through this host:port
-(or host:80 if port is not specified),
-rather than connecting directly to any directory servers.
-.LP
-.TP
-\fBHTTPProxyAuthenticator\fR \fIusername:password\fP
-If defined, Tor will use this username:password for Basic HTTP proxy
-authentication, as in RFC 2617. This is currently the only form of
-HTTP proxy authentication that Tor supports; feel free to submit a
-patch if you want it to support others.
-.LP
-.TP
-\fBHTTPSProxy\fR \fIhost\fR[:\fIport\fR]\fP
-Tor will make all its OR (SSL) connections through this host:port
-(or host:443 if port is not specified), via HTTP CONNECT rather than
-connecting directly to servers. You may want to set \fBFascistFirewall\fR
-to restrict the set of ports you might try to connect to, if your HTTPS
-proxy only allows connecting to certain ports.
-.LP
-.TP
-\fBHTTPSProxyAuthenticator\fR \fIusername:password\fP
-If defined, Tor will use this username:password for Basic HTTPS proxy
-authentication, as in RFC 2617. This is currently the only form of
-HTTPS proxy authentication that Tor supports; feel free to submit a
-patch if you want it to support others.
-.LP
-.TP
-\fBKeepalivePeriod \fR\fINUM\fP
-To keep firewalls from expiring connections, send a padding keepalive
-cell every NUM seconds on open connections that are in use. If the
-connection has no open circuits, it will instead be closed after NUM
-seconds of idleness. (Default: 5 minutes)
-.LP
-.TP
-\fBLog \fR\fIminSeverity\fR[-\fImaxSeverity\fR] \fBstderr\fR|\fBstdout\fR|\fBsyslog\fR\fP
-Send all messages between \fIminSeverity\fR and \fImaxSeverity\fR to
-the standard output stream, the standard error stream, or to the system
-log. (The "syslog" value is only supported on Unix.) Recognized
-severity levels are debug, info, notice, warn, and err. We advise using
-"notice" in most cases, since anything more verbose may provide sensitive
-information to an attacker who obtains the logs. If only one
-severity level is given, all messages of that level or higher will be
-sent to the listed destination.
-.LP
-.TP
-\fBLog \fR\fIminSeverity\fR[-\fImaxSeverity\fR] \fBfile\fR \fIFILENAME\fP
-As above, but send log messages to the listed filename. The "Log"
-option may appear more than once in a configuration file. Messages
-are sent to all the logs that match their severity level.
-.LP
-.TP
-\fBOutboundBindAddress \fR\fIIP\fP
-Make all outbound connections originate from the IP address specified. This
-is only useful when you have multiple network interfaces, and you want all
-of Tor's outgoing connections to use a single one.
-.LP
-.TP
-\fBPidFile \fR\fIFILE\fP
-On startup, write our PID to FILE. On clean shutdown, remove FILE.
-.LP
-.TP
-\fBProtocolWarnings \fR\fB0\fR|\fB1\fR\fP
-If 1, Tor will log with severity 'warn' various cases of other parties
-not following the Tor specification. Otherwise, they are logged with
-severity 'info'. (Default: 0)
-.LP
-.TP
-\fBRunAsDaemon \fR\fB0\fR|\fB1\fR\fP
-If 1, Tor forks and daemonizes to the background. This option has
-no effect on Windows; instead you should use the --service command-line
-option. (Default: 0)
-.LP
-.TP
-\fBSafeLogging \fR\fB0\fR|\fB1\fP
-If 1, Tor replaces potentially sensitive strings in the logs
-(e.g. addresses) with the string [scrubbed]. This way logs can still be
-useful, but they don't leave behind personally identifying information
-about what sites a user might have visited. (Default: 1)
-.LP
-.TP
-\fBUser \fR\fIUID\fP
-On startup, setuid to this user and setgid to their primary group.
-.LP
-.TP
-\fBHardwareAccel \fR\fB0\fR|\fB1\fP
-If non-zero, try to use crypto hardware acceleration when
-available. This is untested and probably buggy. (Default: 0)
-.LP
-.TP
-\fBAvoidDiskWrites \fR\fB0\fR|\fB1\fP
-If non-zero, try to write to disk less frequently than we would otherwise.
-This is useful when running on flash memory or other media that support only
-a limited number of writes. (Default: 0)
-.LP
-.TP
-\fBTunnelDirConns \fR\fB0\fR|\fB1\fP
-If non-zero, when a directory server we contact supports it, we will
-build a one-hop circuit and make an encrypted connection via its
-ORPort. (Default: 1)
-.LP
-.TP
-\fBPreferTunneledDirConns \fR\fB0\fR|\fB1\fP
-If non-zero, we will avoid directory servers that don't support tunneled
-directory connections, when possible. (Default: 1)
-
-.SH CLIENT OPTIONS
-.PP
-The following options are useful only for clients (that is, if \fBSocksPort\fP is non-zero):
-.LP
-.TP
-\fBAllowInvalidNodes\fR \fBentry\fR|\fBexit\fR|\fBmiddle\fR|\fBintroduction\fR|\fBrendezvous\fR|...\fP
-If some Tor servers are obviously not working right, the directory
-authorities can manually mark them as invalid, meaning that it's not
-recommended you use them for entry or exit positions in your circuits. You
-can opt to use them in some circuit positions, though. The default is
-"middle,rendezvous", and other choices are not advised.
-.LP
-.TP
-\fBExcludeSingleHopRelays \fR\fB0\fR|\fB1\fR\fP
-This option controls whether circuits built by Tor will include relays with
-the AllowSingleHopExits flag set to true. If ExcludeSingleHopRelays is set to
-0, these relays will be included. Note that these relays might be at higher
-risk of being seized or observed, so they are not normally included.
-(Default: 1)
-.LP
-.TP
-\fBBridge \fR\fIIP:ORPort\fR [fingerprint]\fP
-When set along with UseBridges, instructs Tor to use the relay at
-"IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint"
-is provided (using the same format as for DirServer), we will verify that
-the relay running at that location has the right fingerprint. We also use
-fingerprint to look up the bridge descriptor at the bridge authority, if
-it's provided and if UpdateBridgesFromAuthority is set too.
-.LP
-.TP
-\fBCircuitBuildTimeout \fR\fINUM\fP
-Try for at most NUM seconds when building circuits. If the circuit
-isn't open in that time, give up on it.
-(Default: 1 minute.)
-.LP
-.TP
-\fBCircuitIdleTimeout \fR\fINUM\fP
-If we have kept a clean (never used) circuit around for NUM seconds,
-then close it. This way when the Tor client is entirely idle, it can
-expire all of its circuits, and then expire its TLS connections. Also,
-if we end up making a circuit that is not useful for exiting any of
-the requests we're receiving, it won't forever take up a slot in the
-circuit list.
-(Default: 1 hour.)
-.LP
-.TP
-\fBClientOnly \fR\fB0\fR|\fB1\fR\fP
-If set to 1, Tor will under no circumstances run as a server or serve
-directory requests. The default
-is to run as a client unless ORPort is configured. (Usually,
-you don't need to set this; Tor is pretty smart at figuring out whether
-you are reliable and high-bandwidth enough to be a useful server.)
-(Default: 0)
-.LP
-.TP
-\fBExcludeNodes \fR\fInode\fR,\fInode\fR,\fI...\fP
-A list of identity fingerprints, nicknames, country codes and address patterns
-of nodes to never use when building a circuit. (Example: ExcludeNodes
-SlowServer, $ABCDEFFFFFFFFFFFFFFF, {cc}, 255.254.0.0/8)
-.LP
-.TP
-\fBExcludeExitNodes \fR\fInode\fR,\fInode\fR,\fI...\fP
-A list of identity fingerprints, nicknames, country codes and address patterns
-of nodes to never use when picking an exit node. Note that any node
-listed in ExcludeNodes is automatically considered to be part of this
-list.
-.LP
-.TP
-\fBEntryNodes \fR\fInode\fR,\fInode\fR,\fI...\fP
-A list of identity fingerprints, nicknames, country codes and address patterns
-of nodes to use for the first hop in the circuit.
-These are treated only as preferences unless StrictEntryNodes (see
-below) is also set.
-.LP
-.TP
-\fBExitNodes \fR\fInode\fR,\fInode\fR,\fI...\fP
-A list of identity fingerprints, nicknames, country codes and address patterns
-of nodes to use for the last hop in the circuit.
-These are treated only as preferences unless StrictExitNodes (see
-below) is also set.
-.LP
-.TP
-\fBStrictEntryNodes \fR\fB0\fR|\fB1\fR\fP
-If 1, Tor will never use any nodes besides those listed in "EntryNodes" for
-the first hop of a circuit.
-.LP
-.TP
-\fBStrictExitNodes \fR\fB0\fR|\fB1\fR\fP
-If 1, Tor will never use any nodes besides those listed in "ExitNodes" for
-the last hop of a circuit.
-.LP
-.TP
-\fBFascistFirewall \fR\fB0\fR|\fB1\fR\fP
-If 1, Tor will only create outgoing connections to ORs running on ports that
-your firewall allows (defaults to 80 and 443; see \fBFirewallPorts\fR). This will
-allow you to run Tor as a client behind a firewall with restrictive policies,
-but will not allow you to run as a server behind such a firewall.
-If you prefer more fine-grained control, use ReachableAddresses instead.
-.LP
-.TP
-\fBFirewallPorts \fR\fIPORTS\fP
-A list of ports that your firewall allows you to connect to. Only
-used when \fBFascistFirewall\fR is set. This option is deprecated; use
-ReachableAddresses instead. (Default: 80, 443)
-.LP
-.TP
-\fBHidServAuth \fR\fIonion-address\fR \fIauth-cookie\fP [\fIservice-name\fR]
-Client authorization for a hidden service. Valid onion addresses contain 16
-characters in a-z2-7 plus ".onion", and valid auth cookies contain 22
-characters in A-Za-z0-9+/. The service name is only used for internal
-purposes, e.g., for Tor controllers. This option may be used multiple times
-for different hidden services. If a hidden service uses authorization and
-this option is not set, the hidden service is not accessible. Hidden
-services can be configured to require authorization using the
-\fBHiddenServiceAuthorizeClient\fR option.
-.LP
-.TP
-\fBReachableAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP
-A comma-separated list of IP addresses and ports that your firewall allows you
-to connect to. The format is as
-for the addresses in ExitPolicy, except that "accept" is understood
-unless "reject" is explicitly provided. For example, 'ReachableAddresses
-99.0.0.0/8, reject 18.0.0.0/8:80, accept *:80' means that your
-firewall allows connections to everything inside net 99, rejects port
-80 connections to net 18, and accepts connections to port 80 otherwise.
-(Default: 'accept *:*'.)
-.LP
-.TP
-\fBReachableDirAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP
-Like \fBReachableAddresses\fP, a list of addresses and ports. Tor will obey
-these restrictions when fetching directory information, using standard HTTP
-GET requests. If not set explicitly then the value of \fBReachableAddresses\fP
-is used. If \fBHTTPProxy\fR is set then these connections will go through that
-proxy.
-.LP
-.TP
-\fBReachableORAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP
-Like \fBReachableAddresses\fP, a list of addresses and ports. Tor will obey
-these restrictions when connecting to Onion Routers, using TLS/SSL. If not set
-explicitly then the value of \fBReachableAddresses\fP is used. If
-\fBHTTPSProxy\fR is set then these connections will go through that proxy.
-
-The separation between \fBReachableORAddresses\fP and
-\fBReachableDirAddresses\fP is only interesting when you are connecting through
-proxies (see \fBHTTPProxy\fR and \fBHTTPSProxy\fR). Most proxies limit TLS
-connections (which Tor uses to connect to Onion Routers) to port 443, and some
-limit HTTP GET requests (which Tor uses for fetching directory information) to
-port 80.
-.LP
-.TP
-\fBLongLivedPorts \fR\fIPORTS\fP
-A list of ports for services that tend to have long-running connections
-(e.g. chat and interactive shells). Circuits for streams that use these
-ports will contain only high-uptime nodes, to reduce the chance that a
-node will go down before the stream is finished.
-(Default: 21, 22, 706, 1863, 5050, 5190, 5222, 5223, 6667, 6697, 8300)
-.LP
-.TP
-\fBMapAddress\fR \fIaddress\fR \fInewaddress\fR
-When a request for address arrives to Tor, it will rewrite it to
-newaddress before processing it. For example, if you always want
-connections to www.indymedia.org to exit via \fItorserver\fR (where
-\fItorserver\fR is the nickname of the server),
-use "MapAddress www.indymedia.org www.indymedia.org.torserver.exit".
-.LP
-.TP
-\fBNewCircuitPeriod \fR\fINUM\fP
-Every NUM seconds consider whether to build a new circuit. (Default: 30 seconds)
-.LP
-.TP
-\fBMaxCircuitDirtiness \fR\fINUM\fP
-Feel free to reuse a circuit that was first used at most NUM seconds ago,
-but never attach a new stream to a circuit that is too old.
-(Default: 10 minutes)
-.LP
-.TP
-\fBNodeFamily \fR\fInode\fR,\fInode\fR,\fI...\fP
-The Tor servers, defined by their identity fingerprints or nicknames,
-constitute a "family" of similar or co-administered
-servers, so never use any two of them in the same circuit. Defining a
-NodeFamily is only needed when a server doesn't list the family itself
-(with MyFamily). This option can be used multiple times.
-.LP
-.TP
-\fBEnforceDistinctSubnets \fR\fB0\fR|\fB1\fR\fP
-If 1, Tor will not put two servers whose IP addresses are "too
-close" on the same circuit. Currently, two addresses are
-"too close" if they lie in the same /16 range. (Default: 1)
-
-.\" \fBPathlenCoinWeight \fR\fI0.0-1.0\fP
-.\" Paths are 3 hops plus a geometric distribution centered around this coinweight.
-.\" Must be >=0.0 and <1.0. (Default: 0.3) NOT USED CURRENTLY
-.\" .TP
-.LP
-.TP
-\fBSocksPort \fR\fIPORT\fP
-Advertise this port to listen for connections from Socks-speaking
-applications. Set this to 0 if you don't want to allow application
-connections. (Default: 9050)
-.LP
-.TP
-\fBSocksListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind to this address to listen for connections from Socks-speaking
-applications. (Default: 127.0.0.1) You can also specify a port
-(e.g. 192.168.0.1:9100).
-This directive can be specified multiple times to bind to multiple
-addresses/ports.
-.LP
-.TP
-\fBSocksPolicy \fR\fIpolicy\fR,\fIpolicy\fR,\fI...\fP
-Set an entrance policy for this server, to limit who can connect to the
-SocksPort and DNSPort ports.
-The policies have the same form as exit policies below.
-.LP
-.TP
-\fBSocksTimeout \fR\fINUM\fP
-Let a socks connection wait NUM seconds handshaking, and NUM seconds
-unattached waiting for an appropriate circuit, before we fail it.
-(Default: 2 minutes.)
-.LP
-.TP
-\fBTrackHostExits \fR\fIhost\fR,\fI.domain\fR,\fI...\fR\fP
-For each value in the comma separated list, Tor will track recent connections
-to hosts that match this value and attempt to
-reuse the same exit node for each. If the value is prepended with a '.', it is
-treated as matching an entire domain. If one of the values is just a '.', it
-means match everything. This option is useful if you frequently connect to
-sites that will expire all your authentication cookies (i.e. log you out) if
-your IP address changes. Note that this option does have the disadvantage of
-making it more clear that a given history is
-associated with a single user. However, most people who would wish to observe
-this will observe it through cookies or other protocol-specific means anyhow.
-.LP
-.TP
-\fBTrackHostExitsExpire \fR\fINUM\fP
-Since exit servers go up and down, it is desirable to expire the association
-between host and exit server after NUM seconds. The default
-is 1800 seconds (30 minutes).
-.LP
-.TP
-\fBUpdateBridgesFromAuthority \fR\fB0\fR|\fB1\fR\fP
-When set (along with UseBridges), Tor will try to fetch bridge descriptors
-from the configured bridge authorities when feasible. It will fall back
-to a direct request if the authority responds with a 404. (Default: 0)
-.LP
-.TP
-\fBUseBridges \fR\fB0\fR|\fB1\fR\fP
-When set, Tor will fetch descriptors for each bridge listed in the
-"Bridge" config lines, and use these relays as both entry guards and
-directory guards. (Default: 0)
-.LP
-.TP
-\fBUseEntryGuards \fR\fB0\fR|\fB1\fR\fP
-If this option is set to 1, we pick a few long-term entry servers, and
-try to stick with them. This is desirable because
-constantly changing servers increases the odds that an adversary who owns
-some servers will observe a fraction of your paths.
-(Defaults to 1.)
-.LP
-.TP
-\fBNumEntryGuards \fR\fINUM\fP
-If UseEntryGuards is set to 1, we will try to pick a total of NUM routers
-as long-term entries for our circuits.
-(Defaults to 3.)
-.LP
-.TP
-\fBSafeSocks \fR\fB0\fR|\fB1\fR\fP
-When this option is enabled, Tor will reject application connections that
-use unsafe variants of the socks protocol -- ones that only provide an
-IP address, meaning the application is doing a DNS resolve first.
-Specifically, these are socks4 and socks5 when not doing remote DNS.
-(Defaults to 0.)
-.LP
-.TP
-\fBTestSocks \fR\fB0\fR|\fB1\fR\fP
-When this option is enabled, Tor will make a notice-level log entry for
-each connection to the Socks port indicating whether the request used
-a safe socks protocol or an unsafe one (see above entry on SafeSocks).
-This helps to determine whether an application using Tor is possibly
-leaking DNS requests.
-(Default: 0)
-.LP
-.TP
-\fBVirtualAddrNetwork \fR\fIAddress\fB/\fIbits\fP
-When a controller asks for a virtual (unused) address with the
-MAPADDRESS command, Tor picks an unassigned address from this range.
-(Default: 127.192.0.0/10)
-
-When providing proxy server service to a network of computers using a tool like
-dns-proxy-tor,
-change this address to "10.192.0.0/10" or "172.16.0.0/12".
-The default \fBVirtualAddrNetwork\fP address range on a
-properly configured machine will route to the loopback interface.
-For local use, no change to the
-default \fBVirtualAddrNetwork\fP setting is needed.
-.LP
-.TP
-\fBAllowNonRFC953Hostnames \fR\fB0\fR|\fB1\fR\fP
-When this option is disabled, Tor blocks hostnames containing illegal
-characters (like @ and :) rather than sending them to an exit node to be
-resolved. This helps trap accidental attempts to resolve URLs and so on.
-(Default: 0)
-.LP
-.TP
-\fBFastFirstHopPK \fR\fB0\fR|\fB1\fR\fP
-When this option is disabled, Tor uses the public key step for the first
-hop of creating circuits. Skipping it is generally safe since we have
-already used TLS to authenticate the relay and to establish forward-secure
-keys. Turning this option off makes circuit building slower.
-
-Note that Tor will always use the public key step for the first hop if
-it's operating as a relay, and it will never use the public key step if
-it doesn't yet know the onion key of the first hop.
-(Default: 1)
-.LP
-.TP
-\fBTransPort\fP \fR\fIPORT\fP
-If non-zero, enables transparent proxy support on \fR\fIPORT\fP (by
-convention, 9040).
-.\" This is required to enable support for \fBdns-proxy-tor\fP.
-.\" ControlPort must be set when using \fBTransPort\fP.
-Requires OS support for transparent proxies, such as BSDs' pf or
-Linux's IPTables.
-If you're planning
-to use Tor as a transparent proxy for a network, you'll want to examine
-and change VirtualAddrNetwork from the default setting. You'll also want
-to set the TransListenAddress option for the network you'd like to proxy.
-(Default: 0).
-.LP
-.TP
-\fBTransListenAddress\fP \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind to this address to listen for transparent proxy connections.
-(Default: 127.0.0.1).
-This is useful for exporting a transparent proxy server
-to an entire network.
-.LP
-.TP
-\fBNATDPort\fP \fR\fIPORT\fP
-Allow old versions of ipfw (as included in old versions of FreeBSD,
-etc.) to send connections through Tor using the NATD protocol.
-This option is only for people who cannot
-use TransPort.
-.LP
-.TP
-\fBNATDListenAddress\fP \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind to this address to listen for NATD connections.
-(Default: 127.0.0.1).
-.LP
-.TP
-\fBAutomapHostsOnResolve\fP \fR\fB0\fR|\fB1\fR\fP
-When this option is enabled, and we get a request to resolve an
-address that ends with one of the suffixes in
-\fBAutomapHostsSuffixes\fP, we map an unused virtual address to that
-address, and return the new virtual address. This is handy for making
-".onion" addresses work with applications that resolve an address and
-then connect to it.
-(Default: 0).
-.LP
-.TP
-\fBAutomapHostsSuffixes\fP \fR\fISUFFIX\fR,\fISUFFIX\fR,...\fP
-A comma-separated list of suffixes to use with \fBAutomapHostsOnResolve\fP.
-The "." suffix is equivalent to "all addresses."
-(Default: .exit,.onion).
-.LP
-.TP
-\fBDNSPort\fP \fR\fIPORT\fP
-If non-zero, Tor listens for UDP DNS requests on this port and resolves them
-anonymously.
-(Default: 0).
-.LP
-.TP
-\fBDNSListenAddress\fP \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind to this address to listen for DNS connections.
-(Default: 127.0.0.1).
-.LP
-.TP
-\fBClientDNSRejectInternalAddresses\fP \fR\fB0\fR|\fB1\fR\fP
-If true, Tor does not believe any anonymously retrieved DNS answer that tells
-it that an address resolves to an internal address (like 127.0.0.1 or
-192.168.0.1). This option prevents certain browser-based attacks; don't turn
-it off unless you know what you're doing. (Default: 1).
-.LP
-.TP
-\fBDownloadExtraInfo\fP \fR\fB0\fR|\fB1\fR\fP
-If true, Tor downloads and caches "extra-info" documents. These
-documents contain information about servers other than the information
-in their regular router descriptors. Tor does not use this information for
-anything itself; to save bandwidth, leave this option turned off.
-(Default: 0).
-.LP
-.TP
-\fBFallbackNetworkstatusFile\fP \fIFILENAME\fP
-If Tor doesn't have a cached networkstatus file, it starts out using
-this one instead. Even if this file is out of date, Tor can still use
-it to learn about directory mirrors, so it doesn't need to put load on
-the authorities. (Default: None).
-.LP
-.TP
-\fBWarnPlaintextPorts\fP \fR\fIport\fR,\fIport\fR,\fI...\fP
-Tells Tor to issue a warnings whenever the user tries to make an
-anonymous connection to one of these ports. This option is designed
-to alert users to services that risk sending passwords in the clear.
-(Default: 23,109,110,143).
-.LP
-.TP
-\fBRejectPlaintextPorts\fP \fR\fIport\fR,\fIport\fR,\fI...\fP
-Like WarnPlaintextPorts, but instead of warning about risky port uses,
-Tor will instead refuse to make the connection.
-(Default: None).
-
-.SH SERVER OPTIONS
-.PP
-The following options are useful only for servers (that is, if \fBORPort\fP is non-zero):
-.LP
-.TP
-\fBAddress \fR\fIaddress\fP
-The IP address or fully qualified domain name of this server (e.g. moria.mit.edu). You can
-leave this unset, and Tor will guess your IP address.
-.LP
-.TP
-\fBAllowSingleHopExits \fR\fB0\fR|\fB1\fR\fP
-This option controls whether clients can use this server as a single hop
-proxy. If set to 1, clients can use this server as an exit even if it is
-the only hop in the circuit. (Default: 0)
-.LP
-.TP
-\fBAssumeReachable \fR\fB0\fR|\fB1\fR\fP
-This option is used when bootstrapping a new Tor network. If set to 1,
-don't do self-reachability testing; just upload your server descriptor
-immediately. If \fBAuthoritativeDirectory\fP is also set, this option
-instructs the dirserver to bypass remote reachability testing too and
-list all connected servers as running.
-.LP
-.TP
-\fBBridgeRelay \fR\fB0\fR|\fB1\fR\fP
-Sets the relay to act as a "bridge" with respect to relaying connections
-from bridge users to the Tor network. Mainly it influences how the relay
-will cache and serve directory information. Usually used in combination
-with PublishServerDescriptor.
-.LP
-.TP
-\fBContactInfo \fR\fIemail_address\fP
-Administrative contact information for server. This line might get
-picked up by spam harvesters, so you may want to obscure the fact
-that it's an email address.
-.LP
-.TP
-\fBExitPolicy \fR\fIpolicy\fR,\fIpolicy\fR,\fI...\fP
-Set an exit policy for this server. Each policy is of the form
-"\fBaccept\fP|\fBreject\fP \fIADDR\fP[\fB/\fP\fIMASK\fP]\fB[:\fP\fIPORT\fP]".
-If \fB/\fP\fIMASK\fP is omitted then this policy just applies to the host
-given. Instead of giving a host or network you can also use "\fB*\fP" to
-denote the universe (0.0.0.0/0). \fIPORT\fP can be a single port number,
-an interval of ports "\fIFROM_PORT\fP\fB-\fP\fITO_PORT\fP", or "\fB*\fP".
-If \fIPORT\fP is omitted, that means "\fB*\fP".
-
-For example, "accept 18.7.22.69:*,reject 18.0.0.0/8:*,accept *:*" would
-reject any traffic destined for MIT except for web.mit.edu, and
-accept anything else.
-
-To specify all internal and link-local networks (including 0.0.0.0/8,
-169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, and
-172.16.0.0/12), you can use the "private" alias instead of an address.
-These addresses are rejected by default (at the beginning of your
-exit policy), along with your public IP address, unless you set the
-ExitPolicyRejectPrivate config option
-to 0. For example, once you've done that, you could allow HTTP to
-127.0.0.1 and block all other connections to internal networks with
-"accept 127.0.0.1:80,reject private:*", though that may also allow
-connections to your own computer that are addressed to its public
-(external) IP address. See RFC 1918 and RFC 3330 for more
-details about internal and reserved IP address space.
-
-This directive can be specified multiple times so you don't have to put
-it all on one line.
-
-Policies are considered first to last, and the first match wins. If
-you want to _replace_ the default exit policy, end your exit policy with
-either a reject *:* or an accept *:*. Otherwise, you're _augmenting_
-(prepending to) the default exit policy. The default exit policy is:
-.PD 0
-.RS 12
-.IP "reject *:25"
-.IP "reject *:119"
-.IP "reject *:135-139"
-.IP "reject *:445"
-.IP "reject *:563"
-.IP "reject *:1214"
-.IP "reject *:4661-4666"
-.IP "reject *:6346-6429"
-.IP "reject *:6699"
-.IP "reject *:6881-6999"
-.IP "accept *:*"
-.RE
-.PD
-.LP
-.TP
-\fBExitPolicyRejectPrivate \fR\fB0\fR|\fB1\fR\fP
-Reject all private (local) networks, along with your own public IP
-address, at the beginning of your exit
-policy. See above entry on ExitPolicy. (Default: 1)
-.LP
-.TP
-\fBMaxOnionsPending \fR\fINUM\fP
-If you have more than this number of onionskins queued for decrypt, reject new ones. (Default: 100)
-.LP
-.TP
-\fBMyFamily \fR\fInode\fR,\fInode\fR,\fI...\fP
-Declare that this Tor server is controlled or administered by a group
-or organization identical or similar to that of the other servers, defined by their identity fingerprints or nicknames.
-When two servers both declare that they are in the same 'family', Tor clients
-will not use them in the same circuit. (Each server only needs to list the
-other servers in its family; it doesn't need to list itself, but it won't hurt.)
-.LP
-.TP
-\fBNickname \fR\fIname\fP
-Set the server's nickname to 'name'. Nicknames must be between 1
-and 19 characters inclusive, and must contain only the characters
-[a-zA-Z0-9].
-.LP
-.TP
-\fBNumCPUs \fR\fInum\fP
-How many processes to use at once for decrypting onionskins. (Default: 1)
-.LP
-.TP
-\fBORPort \fR\fIPORT\fP
-Advertise this port to listen for connections from Tor clients and servers.
-.LP
-.TP
-\fBORListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind to this IP address to listen for connections from Tor clients and
-servers. If you specify a port, bind to this port rather than the one
-specified in ORPort. (Default: 0.0.0.0)
-This directive can be specified multiple times to bind to multiple
-addresses/ports.
-.LP
-.TP
-\fBPublishServerDescriptor \fR\fB0\fR|\fB1\fR|\fBv1\fR|\fBv2\fR|\fBv3\fR|\fBbridge\fR|\fBhidserv\fR, ...\fP
-This option is only considered if you have an ORPort defined. You can
-choose multiple arguments, separated by commas.
-
-If set to 0, Tor will act as a server but it will not publish its
-descriptor to the directory authorities. (This is useful if you're
-testing out your server, or if you're using a Tor controller that handles
-directory publishing for you.) Otherwise, Tor will publish its descriptor
-to all directory authorities of the type(s) specified. The value "1" is
-the default, which means "publish to the appropriate authorities".
-.LP
-.TP
-\fBShutdownWaitLength\fR \fINUM\fP
-When we get a SIGINT and we're a server, we begin shutting down: we close
-listeners and start refusing new circuits. After \fBNUM\fP seconds,
-we exit. If we get a second SIGINT, we exit immediately. (Default:
-30 seconds)
-.LP
-.TP
-\fBAccountingMax \fR\fIN\fR \fBbytes\fR|\fBKB\fR|\fBMB\fR|\fBGB\fR|\fBTB\fP
-Never send more than the specified number of bytes in a given
-accounting period, or receive more than that number in the period.
-For example, with AccountingMax set to 1 GB, a server could send 900 MB
-and receive 800 MB and continue running. It will only hibernate once one
-of the two reaches 1 GB.
-When the number of bytes is exhausted, Tor will hibernate until some
-time in the next accounting period. To prevent all servers from
-waking at the same time, Tor will also wait until a random point in
-each period before waking up. If you have bandwidth cost issues,
-enabling hibernation is preferable to setting a low bandwidth, since it
-provides users with a collection of fast servers that are up some of
-the time, which is more useful than a set of slow servers that are
-always "available".
-.LP
-.TP
-\fBAccountingStart \fR\fBday\fR|\fBweek\fR|\fBmonth\fR [\fIday\fR] \fIHH:MM\fR\fP
-Specify how long accounting periods last. If \fBmonth\fP is given,
-each accounting period runs from the time \fIHH:MM\fR on the
-\fIday\fRth day of one month to the same day and time of the next.
-(The day must be between 1 and 28.) If \fBweek\fP is given, each
-accounting period runs from the time \fIHH:MM\fR of the \fIday\fRth
-day of one week to the same day and time of the next week, with Monday
-as day 1 and Sunday as day 7. If \fBday\fR is given, each accounting
-period runs from the time \fIHH:MM\fR each day to the same time on the
-next day. All times are local, and given in 24-hour time. (Defaults to
-"month 1 0:00".)
-.LP
-.TP
-\fBServerDNSResolvConfFile \fR\fIfilename\fP
-Overrides the default DNS configuration with the configuration in
-\fIfilename\fP. The file format is the same as the standard Unix
-"\fBresolv.conf\fP" file (7). This option, like all other
-ServerDNS options, only affects name lookups that your server does on
-behalf of clients. (Defaults to use the system DNS configuration.)
-.LP
-.TP
-\fBServerDNSAllowBrokenConfig \fR\fB0\fR|\fB1\fR\fP
-If this option is false, Tor exits immediately if there are problems
-parsing the system DNS configuration or connecting to nameservers.
-Otherwise, Tor continues to periodically retry the system nameservers
-until it eventually succeeds.
-(Defaults to "1".)
-.LP
-.TP
-\fBServerDNSSearchDomains \fR\fB0\fR|\fB1\fR\fP
-If set to \fB1\fP, then we will search for addresses in the local search
-domain. For example, if this system is configured to believe it is in
-"example.com", and a client tries to connect to "www", the client will be
-connected to "www.example.com".
-This option only affects name lookups that your server does on
-behalf of clients.
-(Defaults to "0".)
-.LP
-.TP
-\fBServerDNSDetectHijacking \fR\fB0\fR|\fB1\fR\fP
-When this option is set to 1, we will test periodically to determine whether
-our local nameservers have been configured to hijack failing DNS requests
-(usually to an advertising site). If they are, we will attempt to correct
-this.
-This option only affects name lookups that your server does on
-behalf of clients.
-(Defaults to "1".)
-.LP
-.TP
-\fBServerDNSTestAddresses \fR\fIaddress\fR,\fIaddress\fR,\fI...\fP
-When we're detecting DNS hijacking, make sure that these \fIvalid\fP
-addresses aren't getting redirected. If they are, then our DNS is
-completely useless, and we'll reset our exit policy to "reject *:*".
-This option only affects name lookups that your server does on
-behalf of clients.
-(Defaults to "www.google.com, www.mit.edu, www.yahoo.com,
-www.slashdot.org".)
-.LP
-.TP
-\fBServerDNSAllowNonRFC953Hostnames \fR\fB0\fR|\fB1\fR\fP
-When this option is disabled, Tor does not try to resolve hostnames
-containing illegal characters (like @ and :) rather than sending them to an
-exit node to be resolved. This helps trap accidental attempts to resolve
-URLs and so on.
-This option only affects name lookups that your server does on
-behalf of clients.
-(Default: 0)
-.LP
-.TP
-\fBBridgeRecordUsageByCountry \fR\fB0\fR|\fB1\fR\fP
-When this option is enabled and BridgeRelay is also enabled, and we
-have GeoIP data, Tor keeps a keep a per-country count of how many
-client addresses have contacted it so that it can help the bridge
-authority guess which countries have blocked access to it. (Default: 1)
-.LP
-.TP
-\fBServerDNSRandomizeCase \fR\fB0\fR|\fB1\fR\fP
-When this option is set, Tor sets the case of each character randomly in
-outgoing DNS requests, and makes sure that the case matches in DNS replies.
-This so-called "0x20 hack" helps resist some types of DNS poisoning attack.
-For more information, see "Increased DNS Forgery Resistance through 0x20-Bit
-Encoding".
-This option only affects name lookups that your server does on
-behalf of clients.
-(Default: 1)
-.LP
-.TP
-\fBGeoIPFile \fR\fIfilename\fP
-A filename containing GeoIP data, for use with BridgeRecordUsageByCountry.
-
-.SH DIRECTORY SERVER OPTIONS
-.PP
-The following options are useful only for directory servers (that is, if \fBDirPort\fP is non-zero):
-.LP
-.TP
-\fBAuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP
-When this option is set to 1, Tor operates as an authoritative
-directory server. Instead of caching the directory, it generates its
-own list of good servers, signs it, and sends that to the clients.
-Unless the clients already have you listed as a trusted directory, you
-probably do not want to set this option. Please coordinate with the other
-admins at tor-ops@freehaven.net if you think you should be a directory.
-.LP
-.TP
-\fBDirPortFrontPage \fIFILENAME\fP
-When this option is set, it takes an HTML file and publishes it as "/" on
-the DirPort. Now relay operators can provide a disclaimer without needing
-to set up a separate webserver. There's a sample disclaimer in
-contrib/tor-exit-notice.html.
-.LP
-.TP
-\fBV1AuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP
-When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor
-generates version 1 directory and running-routers documents (for legacy
-Tor clients up to 0.1.0.x).
-.LP
-.TP
-\fBV2AuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP
-When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor
-generates version 2 network statuses and serves descriptors, etc as
-described in doc/spec/dir-spec-v2.txt (for Tor clients and servers
-running 0.1.1.x and 0.1.2.x).
-.LP
-.TP
-\fBV3AuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP
-When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor
-generates version 3 network statuses and serves descriptors, etc as
-described in doc/spec/dir-spec.txt (for Tor clients and servers
-running at least 0.2.0.x).
-.LP
-.TP
-\fBVersioningAuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP
-When this option is set to 1, Tor adds information on
-which versions of Tor are still believed safe for use to
-the published directory. Each version 1 authority is
-automatically a versioning authority; version 2 authorities
-provide this service optionally. See \fBRecommendedVersions\fP,
-\fBRecommendedClientVersions\fP, and \fBRecommendedServerVersions\fP.
-.LP
-.TP
-\fBNamingAuthoritativeDirectory \fR\fB0\fR|\fB1\fR\fP
-When this option is set to 1, then the server advertises that it has
-opinions about nickname-to-fingerprint bindings. It will include these
-opinions in its published network-status pages, by listing servers with
-the flag "Named" if a correct binding between that nickname and
-fingerprint has been registered with the dirserver. Naming dirservers
-will refuse to accept or publish descriptors that contradict a
-registered binding. See \fBapproved-routers\fP in the \fBFILES\fP
-section below.
-.LP
-.TP
-\fBHSAuthoritativeDir \fR\fB0\fR|\fB1\fR\fP
-When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor also
-accepts and serves hidden service descriptors. (Default: 0)
-.LP
-.TP
-\fBHSAuthorityRecordStats \fR\fB0\fR|\fB1\fR\fP
-When this option is set in addition to \fBHSAuthoritativeDir\fP, Tor
-periodically (every 15 minutes) writes statistics about hidden service
-usage to a file \fBhsusage\fP in its data directory. (Default: 0)
-.LP
-.TP
-\fBHidServDirectoryV2 \fR\fB0\fR|\fB1\fR\fP
-When this option is set, Tor accepts and serves v2 hidden service
-descriptors. Setting DirPort is not required for this, because clients
-connect via the ORPort by default. (Default: 1)
-.LP
-.TP
-\fBBridgeAuthoritativeDir \fR\fB0\fR|\fB1\fR\fP
-When this option is set in addition to \fBAuthoritativeDirectory\fP, Tor
-accepts and serves router descriptors, but it caches and serves the main
-networkstatus documents rather than generating its own. (Default: 0)
-.LP
-.TP
-\fBMinUptimeHidServDirectoryV2 \fR\fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fP
-Minimum uptime of a v2 hidden service directory to be accepted as such by
-authoritative directories. (Default: 24 hours)
-.LP
-.TP
-\fBDirPort \fR\fIPORT\fP
-Advertise the directory service on this port.
-.LP
-.TP
-\fBDirListenAddress \fR\fIIP\fR[:\fIPORT\fR]\fP
-Bind the directory service to this address. If you specify a port, bind
-to this port rather than the one specified in DirPort. (Default: 0.0.0.0)
-This directive can be specified multiple times to bind to multiple
-addresses/ports.
-.LP
-.TP
-\fBDirPolicy \fR\fIpolicy\fR,\fIpolicy\fR,\fI...\fP
-Set an entrance policy for this server, to limit who can connect to the
-directory ports.
-The policies have the same form as exit policies above.
-
-.SH DIRECTORY AUTHORITY SERVER OPTIONS
-.PP
-.LP
-.TP
-\fBRecommendedVersions \fR\fISTRING\fP
-STRING is a comma-separated list of Tor versions currently believed
-to be safe. The list is included in each directory, and nodes which
-pull down the directory learn whether they need to upgrade. This
-option can appear multiple times: the values from multiple lines are
-spliced together.
-When this is set then
-\fBVersioningAuthoritativeDirectory\fP should be set too.
-.LP
-.TP
-\fBRecommendedClientVersions \fR\fISTRING\fP
-STRING is a comma-separated list of Tor versions currently believed
-to be safe for clients to use. This information is included in version 2
-directories. If this is not set then the value of \fBRecommendedVersions\fR
-is used.
-When this is set then
-\fBVersioningAuthoritativeDirectory\fP should be set too.
-.LP
-.TP
-\fBRecommendedServerVersions \fR\fISTRING\fP
-STRING is a comma-separated list of Tor versions currently believed
-to be safe for servers to use. This information is included in version 2
-directories. If this is not set then the value of \fBRecommendedVersions\fR
-is used.
-When this is set then
-\fBVersioningAuthoritativeDirectory\fP should be set too.
-.LP
-.TP
-\fBDirAllowPrivateAddresses \fR\fB0\fR|\fB1\fR\fP
-If set to 1, Tor will accept router descriptors with arbitrary "Address"
-elements. Otherwise, if the address is not an IP address or is a private
-IP address, it will reject the router descriptor. Defaults to 0.
-.LP
-.TP
-\fBAuthDirBadDir \fR\fIAddressPattern\fR...\fP
-Authoritative directories only. A set of address patterns for servers that
-will be listed as bad directories in any network status document this authority
-publishes, if \fBAuthDirListBadDirs\fR is set.
-.LP
-.TP
-\fBAuthDirBadExit \fR\fIAddressPattern\fR...\fP
-Authoritative directories only. A set of address patterns for servers that
-will be listed as bad exits in any network status document this authority
-publishes, if \fBAuthDirListBadExits\fR is set.
-.LP
-.TP
-\fBAuthDirInvalid \fR\fIAddressPattern\fR...\fP
-Authoritative directories only. A set of address patterns for servers that
-will never be listed as "valid" in any network status document that this
-authority publishes.
-.LP
-.TP
-\fBAuthDirReject \fR\fIAddressPattern\fR...\fP
-Authoritative directories only. A set of address patterns for servers that
-will never be listed at all in any network status document that this
-authority publishes, or accepted as an OR address in any descriptor submitted
-for publication by this authority.
-.LP
-.TP
-\fBAuthDirListBadDirs \fR\fB0\fR|\fB1\fR\fP
-Authoritative directories only. If set to 1, this directory has
-some opinion about which nodes are unsuitable as directory caches. (Do not
-set this to 1 unless you plan to list non-functioning directories as bad;
-otherwise, you are effectively voting in favor of every declared directory.)
-.LP
-.TP
-\fBAuthDirListBadExits \fR\fB0\fR|\fB1\fR\fP
-Authoritative directories only. If set to 1, this directory has
-some opinion about which nodes are unsuitable as exit nodes. (Do not
-set this to 1 unless you plan to list non-functioning exits as bad;
-otherwise, you are effectively voting in favor of every declared exit
-as an exit.)
-.LP
-.TP
-\fBAuthDirRejectUnlisted \fR\fB0\fR|\fB1\fR\fP
-Authoritative directories only. If set to 1, the directory server
-rejects all uploaded server descriptors that aren't explicitly listed
-in the fingerprints file. This acts as a "panic button" if we get
-hit with a Sybil attack. (Default: 0)
-.LP
-.TP
-\fBAuthDirMaxServersPerAddr\fR \fINUM\fP
-Authoritative directories only. The maximum number of servers that we
-will list as acceptable on a single IP address. Set this to "0" for
-"no limit". (Default: 2)
-.LP
-.TP
-\fBAuthDirMaxServersPerAuthAddr\fR \fINUM\fP
-Authoritative directories only. Like AuthDirMaxServersPerAddr, but
-applies to addresses shared with directory authorities. (Default: 5)
-.LP
-.TP
-\fBV3AuthVotingInterval\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-V3 authoritative directories only. Configures the server's preferred
-voting interval. Note that voting will \fIactually\fP happen at an
-interval chosen by consensus from all the authorities' preferred
-intervals. This time SHOULD divide evenly into a day. (Default: 1 hour)
-.LP
-.TP
-\fBV3AuthVoteDelay\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-V3 authoritative directories only. Configures the server's preferred
-delay between publishing its vote and assuming it has all the votes
-from all the other authorities. Note that the actual time used is not
-the server's preferred time, but the consensus of all preferences.
-(Default: 5 minutes.)
-.LP
-.TP
-\fBV3AuthDistDelay\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-V3 authoritative directories only. Configures the server's preferred
-delay between publishing its consensus and signature and assuming it
-has all the signatures from all the other authorities. Note that the
-actual time used is not the server's preferred time, but the consensus
-of all preferences. (Default: 5 minutes.)
-.LP
-.TP
-\fBV3AuthNIntervalsValid\fR \fINUM\fP
-V3 authoritative directories only. Configures the number of
-VotingIntervals for which each consensus should be valid for.
-Choosing high numbers increases network partitioning risks; choosing
-low numbers increases directory traffic. Note that the actual number
-of intervals used is not the server's preferred number, but the
-consensus of all preferences. Must be at least 2. (Default: 3.)
-
-
-.SH HIDDEN SERVICE OPTIONS
-.PP
-The following options are used to configure a hidden service.
-.LP
-.TP
-\fBHiddenServiceDir \fR\fIDIRECTORY\fP
-Store data files for a hidden service in DIRECTORY. Every hidden
-service must have a separate directory. You may use this option multiple
-times to specify multiple services.
-.LP
-.TP
-\fBHiddenServicePort \fR\fIVIRTPORT \fR[\fITARGET\fR]\fP
-Configure a virtual port VIRTPORT for a hidden service. You may use this
-option multiple times; each time applies to the service using the most recent
-hiddenservicedir. By default, this option maps the virtual port to the
-same port on 127.0.0.1. You may override the target port, address, or both
-by specifying a target of addr, port, or addr:port. You may also have
-multiple lines with the same VIRTPORT: when a user connects to that VIRTPORT,
-one of the TARGETs from those lines will be chosen at random.
-.LP
-.TP
-\fBPublishHidServDescriptors \fR\fB0\fR|\fB1\fR\fP
-If set to 0, Tor will run any hidden services you configure, but it won't
-advertise them to the rendezvous directory. This option is only useful
-if you're using a Tor controller that handles hidserv publishing for you.
-(Default: 1)
-.LP
-.TP
-\fBHiddenServiceVersion \fR\fIversion\fR,\fIversion\fR,\fI...\fP
-A list of rendezvous service descriptor versions to publish for the hidden
-service. Possible version numbers are 0 and 2. (Default: 0, 2)
-.LP
-.TP
-\fBHiddenServiceAuthorizeClient \fR\fIauth-type\fR \fR\fIclient-name\fR,\fIclient-name\fR,\fI...\fP
-If configured, the hidden service is accessible for authorized clients
-only. The auth-type can either be 'basic' for a general-purpose
-authorization protocol or 'stealth' for a less scalable protocol that also
-hides service activity from unauthorized clients. Only clients that are
-listed here are authorized to access the hidden service. Valid client names
-are 1 to 19 characters long and only use characters in A-Za-z0-9+-_
-(no spaces). If this option is set, the hidden service is not accessible
-for clients without authorization any more. Generated authorization data
-can be found in the hostname file. Clients need to put this authorization
-data in their configuration file using \fBHidServAuth\fR.
-.LP
-.TP
-\fBRendPostPeriod \fR\fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fP
-Every time the specified period elapses, Tor uploads any rendezvous
-service descriptors to the directory servers. This information is also
-uploaded whenever it changes. (Default: 20 minutes)
-
-.SH TESTING NETWORK OPTIONS
-.PP
-The following options are used for running a testing Tor network.
-.LP
-.TP
-\fBTestingTorNetwork \fR\fB0\fR|\fB1\fR\fP
-If set to 1, Tor adjusts default values of the configuration options below,
-so that it is easier to set up a testing Tor network. May only be set if
-non-default set of DirServers is set. Cannot be unset while Tor is running.
-(Default: 0)
-
-.PD 0
-.RS 12
-.IP "ServerDNSAllowBrokenConfig 1"
-.IP "DirAllowPrivateAddresses 1"
-.IP "EnforceDistinctSubnets 0"
-.IP "AssumeReachable 1"
-.IP "AuthDirMaxServersPerAddr 0"
-.IP "AuthDirMaxServersPerAuthAddr 0"
-.IP "ClientDNSRejectInternalAddresses 0"
-.IP "ExitPolicyRejectPrivate 0"
-.IP "V3AuthVotingInterval 5 minutes"
-.IP "V3AuthVoteDelay 20 seconds"
-.IP "V3AuthDistDelay 20 seconds"
-.IP "TestingV3AuthInitialVotingInterval 5 minutes"
-.IP "TestingV3AuthInitialVoteDelay 20 seconds"
-.IP "TestingV3AuthInitialDistDelay 20 seconds"
-.IP "TestingAuthDirTimeToLearnReachability 0 minutes"
-.IP "TestingEstimatedDescriptorPropagationTime 0 minutes"
-.RE
-.PD
-.LP
-.TP
-\fBTestingV3AuthInitialVotingInterval\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-Like \fBV3AuthVotingInterval\fR, but for initial voting interval before the
-first consensus has been created. Changing this requires that
-\fBTestingTorNetwork\fR is set. (Default: 30 minutes)
-.LP
-.TP
-\fBTestingV3AuthInitialVoteDelay\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-Like \fBTestingV3AuthInitialVoteDelay\fR, but for initial voting interval
-before the first consensus has been created. Changing this requires that
-\fBTestingTorNetwork\fR is set. (Default: 5 minutes)
-.LP
-.TP
-\fBTestingV3AuthInitialDistDelay\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-Like \fBTestingV3AuthInitialDistDelay\fR, but for initial voting interval
-before the first consensus has been created. Changing this requires that
-\fBTestingTorNetwork\fR is set. (Default: 5 minutes)
-.LP
-.TP
-\fBTestingAuthDirTimeToLearnReachability\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-After starting as an authority, do not make claims about whether routers are
-Running until this much time has passed.
-Changing this requires that\fBTestingTorNetwork\fR is set.
-(Default: 30 minutes)
-.LP
-.TP
-\fBTestingEstimatedDescriptorPropagationTime\fR \fR\fIN\fR \fBminutes\fR|\fBhours\fP
-Clients try downloading router descriptors from directory caches after this
-time. Changing this requires that \fBTestingTorNetwork\fR is set.
-(Default: 10 minutes)
-
-.\" UNDOCUMENTED
-.\" ignoreversion
-
-.SH SIGNALS
-Tor catches the following signals:
-.LP
-.TP
-\fBSIGTERM\fR
-Tor will catch this, clean up and sync to disk if necessary, and exit.
-.LP
-.TP
-\fBSIGINT\fR
-Tor clients behave as with SIGTERM; but Tor servers will do a controlled
-slow shutdown, closing listeners and waiting 30 seconds before exiting.
-(The delay can be configured with the ShutdownWaitLength config option.)
-.LP
-.TP
-\fBSIGHUP\fR
-The signal instructs Tor to reload its configuration (including closing
-and reopening logs), fetch a new directory, and kill and restart its
-helper processes if applicable.
-.LP
-.TP
-\fBSIGUSR1\fR
-Log statistics about current connections, past connections, and
-throughput.
-.LP
-.TP
-\fBSIGUSR2\fR
-Switch all logs to loglevel debug. You can go back to the old loglevels
-by sending a SIGHUP.
-.LP
-.TP
-\fBSIGCHLD\fR
-Tor receives this signal when one of its helper processes has exited,
-so it can clean up.
-.LP
-.TP
-\fBSIGPIPE\fR
-Tor catches this signal and ignores it.
-.LP
-.TP
-\fBSIGXFSZ\fR
-If this signal exists on your platform, Tor catches and ignores it.
-
-.SH FILES
-.LP
-.TP
-.B @CONFDIR@/torrc
-The configuration file, which contains "option value" pairs.
-.LP
-.TP
-.B @LOCALSTATEDIR@/lib/tor/
-The tor process stores keys and other data here.
-.LP
-.TP
-.B \fIDataDirectory\fP/cached-status/*
-The most recently downloaded network status document for each authority. Each file holds one such document; the filenames are the hexadecimal identity key fingerprints of the directory authorities.
-.LP
-.TP
-.B \fIDataDirectory\fB/cached-descriptors\fR and \fBcached-descriptors.new\fR
-These files hold downloaded router statuses. Some routers may appear more than once; if so, the most recently published descriptor is used. Lines beginning with @-signs are annotations that contain more information about a given router. The ".new" file is an append-only journal; when it gets too large, all entries are merged into a new cached-routers file.
-.LP
-.TP
-.B \fIDataDirectory\fB/cached-routers\fR and \fBcached-routers.new\fR
-Obsolete versions of cached-descriptors and cached-descriptors.new. When Tor can't find the newer files, it looks here instead.
-.LP
-.TP
-.B \fIDataDirectory\fP/state
-A set of persistent key-value mappings. These are documented in the file. These include:
-.PD 0
-.RS 5
-.IP "- The current entry guards and their status."
-.IP "- The current bandwidth accounting values (unused so far; see below)."
-.IP "- When the file was last written"
-.IP "- What version of Tor generated the state file"
-.IP "- A short history of bandwidth usage, as produced in the router descriptors."
-.RE
-.PD
-.LP
-.TP
-.B \fIDataDirectory\fP/bw_accounting
-Used to track bandwidth accounting values (when the current period starts and ends; how much has been read and written so far this period). This file is obsolete, and the data is now stored in the 'state' file as well. Only used when bandwidth accounting is enabled.
-.LP
-.TP
-.B \fIDataDirectory\fP/hsusage
-Used to track hidden service usage in terms of fetch and publish
-requests to this hidden service authoritative directory. Only used when
-recording of statistics is enabled.
-.LP
-.TP
-.B \fIDataDirectory\fP/control_auth_cookie
-Used for cookie authentication with the controller. Location can be
-overridden by the CookieAuthFile config option. Regenerated on startup.
-See control-spec.txt for details. Only used when cookie authentication
-is enabled.
-.LP
-.TP
-.B \fIDataDirectory\fP/keys/*
-Only used by servers. Holds identity keys and onion keys.
-.LP
-.TP
-.B \fIDataDirectory\fP/fingerprint
-Only used by servers. Holds the fingerprint of the server's identity key.
-.LP
-.TP
-.B \fIDataDirectory\fP/approved-routers
-Only for naming authoritative directory servers (see \fBNamingAuthoritativeDirectory\fP). This file lists nickname to identity bindings. Each line lists a nickname and a fingerprint separated by whitespace. See your \fBfingerprint\fP file in the \fIDataDirectory\fP for an example line. If the nickname is \fB!reject\fP then descriptors from the given identity (fingerprint) are rejected by this server. If it is \fB!invalid\fP then descriptors are accepted but marked in the directory as not valid, that is, not recommended.
-.LP
-.TP
-.B \fIDataDirectory\fP/router-stability
-Only used by authoritative directory servers. Tracks measurements for router mean-time-between-failures so that authorities have a good idea of how to set their Stable flags.
-.LP
-.TP
-.B \fIHiddenServiceDirectory\fP/hostname
-The <base32-encoded-fingerprint>.onion domain name for this hidden service.
-If the hidden service is restricted to authorized clients only, this file
-also contains authorization data for all clients.
-.LP
-.TP
-.B \fIHiddenServiceDirectory\fP/private_key
-The private key for this hidden service.
-.LP
-.TP
-.B \fIHiddenServiceDirectory\fP/client_keys
-Authorization data for a hidden service that is only accessible by authorized
-clients.
-.SH SEE ALSO
-.BR privoxy (1),
-.BR tsocks (1),
-.BR torify (1)
-
-.BR https://www.torproject.org/
-
-.SH BUGS
-Plenty, probably. Tor is still in development. Please report them.
-.SH AUTHORS
-Roger Dingledine <arma@mit.edu>, Nick Mathewson <nickm@alum.mit.edu>.
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
new file mode 100644
index 0000000000..c8608eb845
--- /dev/null
+++ b/doc/tor.1.txt
@@ -0,0 +1,1436 @@
+// Copyright (c) The Tor Project, Inc.
+// See LICENSE for licensing information
+// This is an asciidoc file used to generate the manpage/html reference.
+// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html
+TOR(1)
+======
+
+NAME
+----
+tor - The second-generation onion router
+
+
+SYNOPSIS
+--------
+**tor** [__OPTION__ __value__]...
+
+DESCRIPTION
+-----------
+__tor__ is a connection-oriented anonymizing communication
+service. Users choose a source-routed path through a set of nodes, and
+negotiate a "virtual circuit" through the network, in which each node
+knows its predecessor and successor, but no others. Traffic flowing down
+the circuit is unwrapped by a symmetric key at each node, which reveals
+the downstream node. +
+
+Basically __tor__ provides a distributed network of servers ("onion routers").
+Users bounce their TCP streams -- web traffic, ftp, ssh, etc -- around the
+routers, and recipients, observers, and even the routers themselves have
+difficulty tracking the source of the stream.
+
+OPTIONS
+-------
+**-h**, **-help**::
+ Display a short help message and exit.
+
+**-f** __FILE__::
+ FILE contains further "option value" paris. (Default: @CONFDIR@/torrc)
+
+**--hash-password**::
+ Generates a hashed password for control port access.
+
+**--list-fingerprint**::
+ Generate your keys and output your nickname and fingerprint.
+
+**--verify-config**::
+ Verify the configuration file is valid.
+
+**--nt-service**::
+ **--service [install|remove|start|stop]** Manage the Tor Windows
+ NT/2000/XP service. Current instructions can be found at
+ https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#WinNTService
+
+**--list-torrc-options**::
+ List all valid options.
+
+**--version**::
+ Display Tor version and exit.
+
+**--quiet**::
+ Do not start Tor with a console log unless explicitly requested to do so.
+ (By default, Tor starts out logging messages at level "notice" or higher to
+ the console, until it has parsed its configuration.)
+
+Other options can be specified either on the command-line (--option
+ value), or in the configuration file (option value or option "value").
+ Options are case-insensitive. C-style escaped characters are allowed inside
+ quoted values. Options on the command line take precedence over
+ options found in the configuration file, except indicated otherwise. To
+ split one configuration entry into multiple lines, use a single \ before
+ the end of the line. Comments can be used in such multiline entries, but
+ they must start at the beginning of a line.
+
+**BandwidthRate** __N__ **bytes**|**KB**|**MB**|**GB**::
+ A token bucket limits the average incoming bandwidth usage on this node to
+ the specified number of bytes per second, and the average outgoing
+ bandwidth usage to that same value. If you want to run a relay in the
+ public network, this needs to be _at the very least_ 20 KB (that is,
+ 20480 bytes). (Default: 5 MB)
+
+**BandwidthBurst** __N__ **bytes**|**KB**|**MB**|**GB**::
+ Limit the maximum token bucket size (also known as the burst) to the given
+ number of bytes in each direction. (Default: 10 MB)
+
+**MaxAdvertisedBandwidth** __N__ **bytes**|**KB**|**MB**|**GB**::
+ If set, we will not advertise more than this amount of bandwidth for our
+ BandwidthRate. Server operators who want to reduce the number of clients
+ who ask to build circuits through them (since this is proportional to
+ advertised bandwidth rate) can thus reduce the CPU demands on their server
+ without impacting network performance.
+
+**RelayBandwidthRate** __N__ **bytes**|**KB**|**MB**|**GB**::
+ If not 0, a separate token bucket limits the average incoming bandwidth
+ usage for \_relayed traffic_ on this node to the specified number of bytes
+ per second, and the average outgoing bandwidth usage to that same value.
+ Relayed traffic currently is calculated to include answers to directory
+ requests, but that may change in future versions. (Default: 0)
+
+**RelayBandwidthBurst** __N__ **bytes**|**KB**|**MB**|**GB**::
+ If not 0, limit the maximum token bucket size (also known as the burst) for
+ \_relayed traffic_ to the given number of bytes in each direction.
+ (Default: 0)
+
+**PerConnBWRate** __N__ **bytes**|**KB**|**MB**|**GB**::
+ If set, do separate rate limiting for each connection from a non-relay.
+ You should never need to change this value, since a network-wide value is
+ published in the consensus and your relay will use that value. (Default: 0)
+
+**PerConnBWBurst** __N__ **bytes**|**KB**|**MB**|**GB**::
+ If set, do separate rate limiting for each connection from a non-relay.
+ You should never need to change this value, since a network-wide value is
+ published in the consensus and your relay will use that value. (Default: 0)
+
+**ConnLimit** __NUM__::
+ The minimum number of file descriptors that must be available to the Tor
+ process before it will start. Tor will ask the OS for as many file
+ descriptors as the OS will allow (you can find this by "ulimit -H -n").
+ If this number is less than ConnLimit, then Tor will refuse to start. +
+ +
+ You probably don't need to adjust this. It has no effect on Windows
+ since that platform lacks getrlimit(). (Default: 1000)
+
+**ConstrainedSockets** **0**|**1**::
+ If set, Tor will tell the kernel to attempt to shrink the buffers for all
+ sockets to the size specified in **ConstrainedSockSize**. This is useful for
+ virtual servers and other environments where system level TCP buffers may
+ be limited. If you're on a virtual server, and you encounter the "Error
+ creating network socket: No buffer space available" message, you are
+ likely experiencing this problem. +
+ +
+ The preferred solution is to have the admin increase the buffer pool for
+ the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility;
+ this configuration option is a second-resort. +
+ +
+ The DirPort option should also not be used if TCP buffers are scarce. The
+ cached directory requests consume additional sockets which exacerbates
+ the problem. +
+ +
+ You should **not** enable this feature unless you encounter the "no buffer
+ space available" issue. Reducing the TCP buffers affects window size for
+ the TCP stream and will reduce throughput in proportion to round trip
+ time on long paths. (Default: 0.)
+
+**ConstrainedSockSize** __N__ **bytes**|**KB**::
+ When **ConstrainedSockets** is enabled the receive and transmit buffers for
+ all sockets will be set to this limit. Must be a value between 2048 and
+ 262144, in 1024 byte increments. Default of 8192 is recommended.
+
+**ControlPort** __Port__::
+ If set, Tor will accept connections on this port and allow those
+ connections to control the Tor process using the Tor Control Protocol
+ (described in control-spec.txt). Note: unless you also specify one of
+ **HashedControlPassword** or **CookieAuthentication**, setting this option will
+ cause Tor to allow any process on the local host to control it. This
+ option is required for many Tor controllers; most use the value of 9051.
+
+**ControlListenAddress** __IP__[:__PORT__]::
+ Bind the controller listener to this address. If you specify a port, bind
+ to this port rather than the one specified in ControlPort. We strongly
+ recommend that you leave this alone unless you know what you're doing,
+ since giving attackers access to your control listener is really
+ dangerous. (Default: 127.0.0.1) This directive can be specified multiple
+ times to bind to multiple addresses/ports.
+
+**ControlSocket** __Path__::
+ Like ControlPort, but listens on a Unix domain socket, rather than a TCP
+ socket. (Unix and Unix-like systems only.)
+
+**HashedControlPassword** __hashed_password__::
+ Don't allow any connections on the control port except when the other
+ process knows the password whose one-way hash is __hashed_password__. You
+ can compute the hash of a password by running "tor --hash-password
+ __password__". You can provide several acceptable passwords by using more
+ than one HashedControlPassword line.
+
+**CookieAuthentication** **0**|**1**::
+ If this option is set to 1, don't allow any connections on the control port
+ except when the connecting process knows the contents of a file named
+ "control_auth_cookie", which Tor will create in its data directory. This
+ authentication method should only be used on systems with good filesystem
+ security. (Default: 0)
+
+**CookieAuthFile** __Path__::
+ If set, this option overrides the default location and file name
+ for Tor's cookie file. (See CookieAuthentication above.)
+
+**CookieAuthFileGroupReadable** **0**|**1**|__Groupname__::
+ If this option is set to 0, don't allow the filesystem group to read the
+ cookie file. If the option is set to 1, make the cookie file readable by
+ the default GID. [Making the file readable by other groups is not yet
+ implemented; let us know if you need this for some reason.] (Default: 0).
+
+**DataDirectory** __DIR__::
+ Store working data in DIR (Default: @LOCALSTATEDIR@/lib/tor)
+
+**DirServer** [__nickname__] [**flags**] __address__:__port__ __fingerprint__::
+ Use a nonstandard authoritative directory server at the provided address
+ and port, with the specified key fingerprint. This option can be repeated
+ many times, for multiple authoritative directory servers. Flags are
+ separated by spaces, and determine what kind of an authority this directory
+ is. By default, every authority is authoritative for current ("v2")-style
+ directories, unless the "no-v2" flag is given. If the "v1" flags is
+ provided, Tor will use this server as an authority for old-style (v1)
+ directories as well. (Only directory mirrors care about this.) Tor will
+ use this server as an authority for hidden service information if the "hs"
+ flag is set, or if the "v1" flag is set and the "no-hs" flag is **not** set.
+ Tor will use this authority as a bridge authoritative directory if the
+ "bridge" flag is set. If a flag "orport=**port**" is given, Tor will use the
+ given port when opening encrypted tunnels to the dirserver. Lastly, if a
+ flag "v3ident=**fp**" is given, the dirserver is a v3 directory authority
+ whose v3 long-term signing key has the fingerprint **fp**. +
+ +
+ If no **dirserver** line is given, Tor will use the default directory
+ servers. NOTE: this option is intended for setting up a private Tor
+ network with its own directory authorities. If you use it, you will be
+ distinguishable from other users, because you won't believe the same
+ authorities they do.
+
+**AlternateDirAuthority** [__nickname__] [**flags**] __address__:__port__ __fingerprint__ +
+
+**AlternateHSAuthority** [__nickname__] [**flags**] __address__:__port__ __fingerprint__ +
+
+**AlternateBridgeAuthority** [__nickname__] [**flags**] __address__:__port__ __ fingerprint__::
+ As DirServer, but replaces less of the default directory authorities. Using
+ AlternateDirAuthority replaces the default Tor directory authorities, but
+ leaves the hidden service authorities and bridge authorities in place.
+ Similarly, Using AlternateHSAuthority replaces the default hidden service
+ authorities, but not the directory or bridge authorities.
+
+**DisableAllSwap** **0**|**1**::
+ If set to 1, Tor will attempt to lock all current and future memory pages,
+ so that memory cannot be paged out. Windows, OS X and Solaris are currently
+ not supported. We believe that this feature works on modern Gnu/Linux
+ distributions, and that it should work on *BSD systems (untested). This
+ option requires that you start your Tor as root, and you should use the
+ **User** option to properly reduce Tor's privileges. (Default: 0)
+
+**FetchDirInfoEarly** **0**|**1**::
+ If set to 1, Tor will always fetch directory information like other
+ directory caches, even if you don't meet the normal criteria for fetching
+ early. Normal users should leave it off. (Default: 0)
+
+**FetchDirInfoExtraEarly** **0**|**1**::
+ If set to 1, Tor will fetch directory information before other directory
+ caches. It will attempt to download directory information closer to the
+ start of the consensus period. Normal users should leave it off.
+ (Default: 0)
+
+**FetchHidServDescriptors** **0**|**1**::
+ If set to 0, Tor will never fetch any hidden service descriptors from the
+ rendezvous directories. This option is only useful if you're using a Tor
+ controller that handles hidden service fetches for you. (Default: 1)
+
+**FetchServerDescriptors** **0**|**1**::
+ If set to 0, Tor will never fetch any network status summaries or server
+ descriptors from the directory servers. This option is only useful if
+ you're using a Tor controller that handles directory fetches for you.
+ (Default: 1)
+
+**FetchUselessDescriptors** **0**|**1**::
+ If set to 1, Tor will fetch every non-obsolete descriptor from the
+ authorities that it hears about. Otherwise, it will avoid fetching useless
+ descriptors, for example for routers that are not running. This option is
+ useful if you're using the contributed "exitlist" script to enumerate Tor
+ nodes that exit to certain addresses. (Default: 0)
+
+**HTTPProxy** __host__[:__port__]::
+ Tor will make all its directory requests through this host:port (or host:80
+ if port is not specified), rather than connecting directly to any directory
+ servers.
+
+**HTTPProxyAuthenticator** __username:password__::
+ If defined, Tor will use this username:password for Basic HTTP proxy
+ authentication, as in RFC 2617. This is currently the only form of HTTP
+ proxy authentication that Tor supports; feel free to submit a patch if you
+ want it to support others.
+
+**HTTPSProxy** __host__[:__port__]::
+ Tor will make all its OR (SSL) connections through this host:port (or
+ host:443 if port is not specified), via HTTP CONNECT rather than connecting
+ directly to servers. You may want to set **FascistFirewall** to restrict
+ the set of ports you might try to connect to, if your HTTPS proxy only
+ allows connecting to certain ports.
+
+**HTTPSProxyAuthenticator** __username:password__::
+ If defined, Tor will use this username:password for Basic HTTPS proxy
+ authentication, as in RFC 2617. This is currently the only form of HTTPS
+ proxy authentication that Tor supports; feel free to submit a patch if you
+ want it to support others.
+
+**Socks4Proxy** __host__[:__port__]::
+ Tor will make all OR connections through the SOCKS 4 proxy at host:port
+ (or host:1080 if port is not specified).
+
+**Socks5Proxy** __host__[:__port__]::
+ Tor will make all OR connections through the SOCKS 5 proxy at host:port
+ (or host:1080 if port is not specified).
+
+**Socks5ProxyUsername** __username__ +
+
+**Socks5ProxyPassword** __password__::
+ If defined, authenticate to the SOCKS 5 server using username and password
+ in accordance to RFC 1929. Both username and password must be between 1 and
+ 255 characters.
+
+**KeepalivePeriod** __NUM__::
+ To keep firewalls from expiring connections, send a padding keepalive cell
+ every NUM seconds on open connections that are in use. If the connection
+ has no open circuits, it will instead be closed after NUM seconds of
+ idleness. (Default: 5 minutes)
+
+**Log** __minSeverity__[-__maxSeverity__] **stderr**|**stdout**|**syslog**::
+ Send all messages between __minSeverity__ and __maxSeverity__ to the standard
+ output stream, the standard error stream, or to the system log. (The
+ "syslog" value is only supported on Unix.) Recognized severity levels are
+ debug, info, notice, warn, and err. We advise using "notice" in most cases,
+ since anything more verbose may provide sensitive information to an
+ attacker who obtains the logs. If only one severity level is given, all
+ messages of that level or higher will be sent to the listed destination.
+
+**Log** __minSeverity__[-__maxSeverity__] **file** __FILENAME__::
+ As above, but send log messages to the listed filename. The
+ "Log" option may appear more than once in a configuration file.
+ Messages are sent to all the logs that match their severity
+ level.
+
+**OutboundBindAddress** __IP__::
+ Make all outbound connections originate from the IP address specified. This
+ is only useful when you have multiple network interfaces, and you want all
+ of Tor's outgoing connections to use a single one. This setting will be
+ ignored for connections to the loopback addresses (127.0.0.0/8 and ::1).
+
+**PidFile** __FILE__::
+ On startup, write our PID to FILE. On clean shutdown, remove
+ FILE.
+
+**ProtocolWarnings** **0**|**1**::
+ If 1, Tor will log with severity \'warn' various cases of other parties not
+ following the Tor specification. Otherwise, they are logged with severity
+ \'info'. (Default: 0)
+
+**RunAsDaemon** **0**|**1**::
+ If 1, Tor forks and daemonizes to the background. This option has no effect
+ on Windows; instead you should use the --service command-line option.
+ (Default: 0)
+
+
+**SafeLogging** **0**|**1**|**relay**::
+ Tor can scrub potentially sensitive strings from log messages (e.g.
+ addresses) by replacing them with the string [scrubbed]. This way logs can
+ still be useful, but they don't leave behind personally identifying
+ information about what sites a user might have visited. +
+ +
+ If this option is set to 0, Tor will not perform any scrubbing, if it is
+ set to 1, all potentially sensitive strings are replaced. If it is set to
+ relay, all log messages generated when acting as a relay are sanitized, but
+ all messages generated when acting as a client are not. (Default: 1)
+
+**User** __UID__::
+ On startup, setuid to this user and setgid to their primary group.
+
+**HardwareAccel** **0**|**1**::
+ If non-zero, try to use built-in (static) crypto hardware acceleration when
+ available. (Default: 0)
+
+**AccelName** __NAME__::
+ When using OpenSSL hardware crypto acceleration attempt to load the dynamic
+ engine of this name. This must be used for any dynamic hardware engine.
+ Names can be verified with the openssl engine command.
+
+**AccelDir** __DIR__::
+ Specify this option if using dynamic hardware acceleration and the engine
+ implementation library resides somewhere other than the OpenSSL default.
+
+**AvoidDiskWrites** **0**|**1**::
+ If non-zero, try to write to disk less frequently than we would otherwise.
+ This is useful when running on flash memory or other media that support
+ only a limited number of writes. (Default: 0)
+
+**TunnelDirConns** **0**|**1**::
+ If non-zero, when a directory server we contact supports it, we will build
+ a one-hop circuit and make an encrypted connection via its ORPort.
+ (Default: 1)
+
+**PreferTunneledDirConns** **0**|**1**::
+ If non-zero, we will avoid directory servers that don't support tunneled
+ directory connections, when possible. (Default: 1)
+
+**CircuitPriorityHalflife** __NUM1__::
+ If this value is set, we override the default algorithm for choosing which
+ circuit's cell to deliver or relay next. When the value is 0, we
+ round-robin between the active circuits on a connection, delivering one
+ cell from each in turn. When the value is positive, we prefer delivering
+ cells from whichever connection has the lowest weighted cell count, where
+ cells are weighted exponentially according to the supplied
+ CircuitPriorityHalflife value (in seconds). If this option is not set at
+ all, we use the behavior recommended in the current consensus
+ networkstatus. This is an advanced option; you generally shouldn't have
+ to mess with it. (Default: not set.)
+
+CLIENT OPTIONS
+--------------
+
+The following options are useful only for clients (that is, if
+**SocksPort** is non-zero):
+
+**AllowInvalidNodes** **entry**|**exit**|**middle**|**introduction**|**rendezvous**|**...**::
+ If some Tor servers are obviously not working right, the directory
+ authorities can manually mark them as invalid, meaning that it's not
+ recommended you use them for entry or exit positions in your circuits. You
+ can opt to use them in some circuit positions, though. The default is
+ "middle,rendezvous", and other choices are not advised.
+
+**ExcludeSingleHopRelays** **0**|**1**::
+ This option controls whether circuits built by Tor will include relays with
+ the AllowSingleHopExits flag set to true. If ExcludeSingleHopRelays is set
+ to 0, these relays will be included. Note that these relays might be at
+ higher risk of being seized or observed, so they are not normally
+ included. Also note that relatively few clients turn off this option,
+ so using these relays might make your client stand out.
+ (Default: 1)
+
+**Bridge** __IP__:__ORPort__ [fingerprint]::
+ When set along with UseBridges, instructs Tor to use the relay at
+ "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint"
+ is provided (using the same format as for DirServer), we will verify that
+ the relay running at that location has the right fingerprint. We also use
+ fingerprint to look up the bridge descriptor at the bridge authority, if
+ it's provided and if UpdateBridgesFromAuthority is set too.
+
+**LearnCircuitBuildTimeout** **0**|**1**::
+ If 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1)
+
+**CircuitBuildTimeout** __NUM__::
+
+ Try for at most NUM seconds when building circuits. If the circuit isn't
+ open in that time, give up on it. If LearnCircuitBuildTimeout is 1, this
+ value serves as the initial value to use before a timeout is learned. If
+ LearnCircuitBuildTimeout is 0, this value is the only value used.
+ (Default: 60 seconds.)
+
+**CircuitIdleTimeout** __NUM__::
+ If we have kept a clean (never used) circuit around for NUM seconds, then
+ close it. This way when the Tor client is entirely idle, it can expire all
+ of its circuits, and then expire its TLS connections. Also, if we end up
+ making a circuit that is not useful for exiting any of the requests we're
+ receiving, it won't forever take up a slot in the circuit list. (Default: 1
+ hour.)
+
+**CircuitStreamTimeout** __NUM__::
+ If non-zero, this option overrides our internal timeout schedule for how
+ many seconds until we detach a stream from a circuit and try a new circuit.
+ If your network is particularly slow, you might want to set this to a
+ number like 60. (Default: 0)
+
+**ClientOnly** **0**|**1**::
+ If set to 1, Tor will under no circumstances run as a server or serve
+ directory requests. The default is to run as a client unless ORPort is
+ configured. (Usually, you don't need to set this; Tor is pretty smart at
+ figuring out whether you are reliable and high-bandwidth enough to be a
+ useful server.) (Default: 0)
+
+**ExcludeNodes** __node__,__node__,__...__::
+ A list of identity fingerprints, nicknames, country codes and address
+ patterns of nodes to never use when building a circuit. (Example:
+ ExcludeNodes SlowServer, $ EFFFFFFFFFFFFFFF, \{cc}, 255.254.0.0/8)
+
+**ExcludeExitNodes** __node__,__node__,__...__::
+ A list of identity fingerprints, nicknames, country codes and address
+ patterns of nodes to never use when picking an exit node. Note that any
+ node listed in ExcludeNodes is automatically considered to be part of this
+ list.
+
+**EntryNodes** __node__,__node__,__...__::
+ A list of identity fingerprints, nicknames, country codes and address
+ patterns of nodes to use for the first hop in normal circuits. These are
+ treated only as preferences unless StrictNodes (see below) is also set.
+
+**ExitNodes** __node__,__node__,__...__::
+ A list of identity fingerprints, nicknames, country codes and address
+ patterns of nodes to use for the last hop in normal exit circuits. These
+ are treated only as preferences unless StrictNodes (see below) is also set.
+
+**StrictNodes** **0**|**1**::
+ If 1 and EntryNodes config option is set, Tor will never use any nodes
+ besides those listed in EntryNodes for the first hop of a normal circuit.
+ If 1 and ExitNodes config option is set, Tor will never use any nodes
+ besides those listed in ExitNodes for the last hop of a normal exit
+ circuit. Note that Tor might still use these nodes for non-exit circuits
+ such as one-hop directory fetches or hidden service support circuits.
+
+**FascistFirewall** **0**|**1**::
+ If 1, Tor will only create outgoing connections to ORs running on ports
+ that your firewall allows (defaults to 80 and 443; see **FirewallPorts**).
+ This will allow you to run Tor as a client behind a firewall with
+ restrictive policies, but will not allow you to run as a server behind such
+ a firewall. If you prefer more fine-grained control, use
+ ReachableAddresses instead.
+
+**FirewallPorts** __PORTS__::
+ A list of ports that your firewall allows you to connect to. Only used when
+ **FascistFirewall** is set. This option is deprecated; use ReachableAddresses
+ instead. (Default: 80, 443)
+
+**HidServAuth** __onion-address__ __auth-cookie__ [__service-name__]::
+ Client authorization for a hidden service. Valid onion addresses contain 16
+ characters in a-z2-7 plus ".onion", and valid auth cookies contain 22
+ characters in A-Za-z0-9+/. The service name is only used for internal
+ purposes, e.g., for Tor controllers. This option may be used multiple times
+ for different hidden services. If a hidden service uses authorization and
+ this option is not set, the hidden service is not accessible. Hidden
+ services can be configured to require authorization using the
+ **HiddenServiceAuthorizeClient** option.
+
+**ReachableAddresses** __ADDR__[/__MASK__][:__PORT__]...::
+ A comma-separated list of IP addresses and ports that your firewall allows
+ you to connect to. The format is as for the addresses in ExitPolicy, except
+ that "accept" is understood unless "reject" is explicitly provided. For
+ example, \'ReachableAddresses 99.0.0.0/8, reject 18.0.0.0/8:80, accept
+ \*:80' means that your firewall allows connections to everything inside net
+ 99, rejects port 80 connections to net 18, and accepts connections to port
+ 80 otherwise. (Default: \'accept \*:*'.)
+
+**ReachableDirAddresses** __ADDR__[/__MASK__][:__PORT__]...::
+ Like **ReachableAddresses**, a list of addresses and ports. Tor will obey
+ these restrictions when fetching directory information, using standard HTTP
+ GET requests. If not set explicitly then the value of
+ **ReachableAddresses** is used. If **HTTPProxy** is set then these
+ connections will go through that proxy.
+
+**ReachableORAddresses** __ADDR__[/__MASK__][:__PORT__]...::
+ Like **ReachableAddresses**, a list of addresses and ports. Tor will obey
+ these restrictions when connecting to Onion Routers, using TLS/SSL. If not
+ set explicitly then the value of **ReachableAddresses** is used. If
+ **HTTPSProxy** is set then these connections will go through that proxy. +
+ +
+ The separation between **ReachableORAddresses** and
+ **ReachableDirAddresses** is only interesting when you are connecting
+ through proxies (see **HTTPProxy** and **HTTPSProxy**). Most proxies limit
+ TLS connections (which Tor uses to connect to Onion Routers) to port 443,
+ and some limit HTTP GET requests (which Tor uses for fetching directory
+ information) to port 80.
+
+**LongLivedPorts** __PORTS__::
+ A list of ports for services that tend to have long-running connections
+ (e.g. chat and interactive shells). Circuits for streams that use these
+ ports will contain only high-uptime nodes, to reduce the chance that a node
+ will go down before the stream is finished. (Default: 21, 22, 706, 1863,
+ 5050, 5190, 5222, 5223, 6667, 6697, 8300)
+
+**MapAddress** __address__ __newaddress__::
+ When a request for address arrives to Tor, it will rewrite it to newaddress
+ before processing it. For example, if you always want connections to
+ www.indymedia.org to exit via __torserver__ (where __torserver__ is the
+ nickname of the server), use "MapAddress www.indymedia.org
+ www.indymedia.org.torserver.exit".
+
+**NewCircuitPeriod** __NUM__::
+ Every NUM seconds consider whether to build a new circuit. (Default: 30
+ seconds)
+
+**MaxCircuitDirtiness** __NUM__::
+ Feel free to reuse a circuit that was first used at most NUM seconds ago,
+ but never attach a new stream to a circuit that is too old. (Default: 10
+ minutes)
+
+**NodeFamily** __node__,__node__,__...__::
+ The Tor servers, defined by their identity fingerprints or nicknames,
+ constitute a "family" of similar or co-administered servers, so never use
+ any two of them in the same circuit. Defining a NodeFamily is only needed
+ when a server doesn't list the family itself (with MyFamily). This option
+ can be used multiple times.
+
+**EnforceDistinctSubnets** **0**|**1**::
+ If 1, Tor will not put two servers whose IP addresses are "too close" on
+ the same circuit. Currently, two addresses are "too close" if they lie in
+ the same /16 range. (Default: 1)
+
+**SocksPort** __PORT__::
+ Advertise this port to listen for connections from Socks-speaking
+ applications. Set this to 0 if you don't want to allow application
+ connections. (Default: 9050)
+
+**SocksListenAddress** __IP__[:__PORT__]::
+ Bind to this address to listen for connections from Socks-speaking
+ applications. (Default: 127.0.0.1) You can also specify a port (e.g.
+ 192.168.0.1:9100). This directive can be specified multiple times to bind
+ to multiple addresses/ports.
+
+**SocksPolicy** __policy__,__policy__,__...__::
+ Set an entrance policy for this server, to limit who can connect to the
+ SocksPort and DNSPort ports. The policies have the same form as exit
+ policies below.
+
+**SocksTimeout** __NUM__::
+ Let a socks connection wait NUM seconds handshaking, and NUM seconds
+ unattached waiting for an appropriate circuit, before we fail it. (Default:
+ 2 minutes.)
+
+**TrackHostExits** __host__,__.domain__,__...__::
+ For each value in the comma separated list, Tor will track recent
+ connections to hosts that match this value and attempt to reuse the same
+ exit node for each. If the value is prepended with a \'.\', it is treated as
+ matching an entire domain. If one of the values is just a \'.', it means
+ match everything. This option is useful if you frequently connect to sites
+ that will expire all your authentication cookies (i.e. log you out) if
+ your IP address changes. Note that this option does have the disadvantage
+ of making it more clear that a given history is associated with a single
+ user. However, most people who would wish to observe this will observe it
+ through cookies or other protocol-specific means anyhow.
+
+**TrackHostExitsExpire** __NUM__::
+ Since exit servers go up and down, it is desirable to expire the
+ association between host and exit server after NUM seconds. The default is
+ 1800 seconds (30 minutes).
+
+**UpdateBridgesFromAuthority** **0**|**1**::
+ When set (along with UseBridges), Tor will try to fetch bridge descriptors
+ from the configured bridge authorities when feasible. It will fall back to
+ a direct request if the authority responds with a 404. (Default: 0)
+
+**UseBridges** **0**|**1**::
+ When set, Tor will fetch descriptors for each bridge listed in the "Bridge"
+ config lines, and use these relays as both entry guards and directory
+ guards. (Default: 0)
+
+**UseEntryGuards** **0**|**1**::
+ If this option is set to 1, we pick a few long-term entry servers, and try
+ to stick with them. This is desirable because constantly changing servers
+ increases the odds that an adversary who owns some servers will observe a
+ fraction of your paths. (Defaults to 1.)
+
+**NumEntryGuards** __NUM__::
+ If UseEntryGuards is set to 1, we will try to pick a total of NUM routers
+ as long-term entries for our circuits. (Defaults to 3.)
+
+**SafeSocks** **0**|**1**::
+ When this option is enabled, Tor will reject application connections that
+ use unsafe variants of the socks protocol -- ones that only provide an IP
+ address, meaning the application is doing a DNS resolve first.
+ Specifically, these are socks4 and socks5 when not doing remote DNS.
+ (Defaults to 0.)
+
+**TestSocks** **0**|**1**::
+ When this option is enabled, Tor will make a notice-level log entry for
+ each connection to the Socks port indicating whether the request used a
+ safe socks protocol or an unsafe one (see above entry on SafeSocks). This
+ helps to determine whether an application using Tor is possibly leaking
+ DNS requests. (Default: 0)
+
+**WarnUnsafeSocks** **0**|**1**::
+ When this option is enabled, Tor will warn whenever a request is
+ received that only contains an IP address instead of a hostname. Allowing
+ applications to do DNS resolves themselves is usually a bad idea and
+ can leak your location to attackers. (Default: 1)
+
+**VirtualAddrNetwork** __Address__/__bits__::
+ When a controller asks for a virtual (unused) address with the MAPADDRESS
+ command, Tor picks an unassigned address from this range. (Default:
+ 127.192.0.0/10) +
+ +
+ When providing proxy server service to a network of computers using a tool
+ like dns-proxy-tor, change this address to "10.192.0.0/10" or
+ "172.16.0.0/12". The default **VirtualAddrNetwork** address range on a
+ properly configured machine will route to the loopback interface. For
+ local use, no change to the default VirtualAddrNetwork setting is needed.
+
+**AllowNonRFC953Hostnames** **0**|**1**::
+ When this option is disabled, Tor blocks hostnames containing illegal
+ characters (like @ and :) rather than sending them to an exit node to be
+ resolved. This helps trap accidental attempts to resolve URLs and so on.
+ (Default: 0)
+
+**AllowDotExit** **0**|**1**::
+ If enabled, we convert "www.google.com.foo.exit" addresses on the
+ SocksPort/TransPort/NATDPort into "www.google.com" addresses that exit from
+ the node "foo". Disabled by default since attacking websites and exit
+ relays can use it to manipulate your path selection. (Default: 0)
+
+**FastFirstHopPK** **0**|**1**::
+ When this option is disabled, Tor uses the public key step for the first
+ hop of creating circuits. Skipping it is generally safe since we have
+ already used TLS to authenticate the relay and to establish forward-secure
+ keys. Turning this option off makes circuit building slower. +
+ +
+ Note that Tor will always use the public key step for the first hop if it's
+ operating as a relay, and it will never use the public key step if it
+ doesn't yet know the onion key of the first hop. (Default: 1)
+
+**TransPort** __PORT__::
+ If non-zero, enables transparent proxy support on __PORT__ (by convention,
+ 9040). Requires OS support for transparent proxies, such as BSDs' pf or
+ Linux's IPTables. If you're planning to use Tor as a transparent proxy for
+ a network, you'll want to examine and change VirtualAddrNetwork from the
+ default setting. You'll also want to set the TransListenAddress option for
+ the network you'd like to proxy. (Default: 0).
+
+**TransListenAddress** __IP__[:__PORT__]::
+ Bind to this address to listen for transparent proxy connections. (Default:
+ 127.0.0.1). This is useful for exporting a transparent proxy server to an
+ entire network.
+
+**NATDPort** __PORT__::
+ Allow old versions of ipfw (as included in old versions of FreeBSD, etc.)
+ to send connections through Tor using the NATD protocol. This option is
+ only for people who cannot use TransPort.
+
+**NATDListenAddress** __IP__[:__PORT__]::
+ Bind to this address to listen for NATD connections. (Default: 127.0.0.1).
+
+**AutomapHostsOnResolve** **0**|**1**::
+ When this option is enabled, and we get a request to resolve an address
+ that ends with one of the suffixes in **AutomapHostsSuffixes**, we map an
+ unused virtual address to that address, and return the new virtual address.
+ This is handy for making ".onion" addresses work with applications that
+ resolve an address and then connect to it. (Default: 0).
+
+**AutomapHostsSuffixes** __SUFFIX__,__SUFFIX__,__...__::
+ A comma-separated list of suffixes to use with **AutomapHostsOnResolve**.
+ The "." suffix is equivalent to "all addresses." (Default: .exit,.onion).
+
+**DNSPort** __PORT__::
+ If non-zero, Tor listens for UDP DNS requests on this port and resolves
+ them anonymously. (Default: 0).
+
+**DNSListenAddress** __IP__[:__PORT__]::
+ Bind to this address to listen for DNS connections. (Default: 127.0.0.1).
+
+**ClientDNSRejectInternalAddresses** **0**|**1**::
+ If true, Tor does not believe any anonymously retrieved DNS answer that
+ tells it that an address resolves to an internal address (like 127.0.0.1 or
+ 192.168.0.1). This option prevents certain browser-based attacks; don't
+ turn it off unless you know what you're doing. (Default: 1).
+
+**DownloadExtraInfo** **0**|**1**::
+ If true, Tor downloads and caches "extra-info" documents. These documents
+ contain information about servers other than the information in their
+ regular router descriptors. Tor does not use this information for anything
+ itself; to save bandwidth, leave this option turned off. (Default: 0).
+
+**FallbackNetworkstatusFile** __FILENAME__::
+ If Tor doesn't have a cached networkstatus file, it starts out using this
+ one instead. Even if this file is out of date, Tor can still use it to
+ learn about directory mirrors, so it doesn't need to put load on the
+ authorities. (Default: None).
+
+**WarnPlaintextPorts** __port__,__port__,__...__::
+ Tells Tor to issue a warnings whenever the user tries to make an anonymous
+ connection to one of these ports. This option is designed to alert users
+ to services that risk sending passwords in the clear. (Default:
+ 23,109,110,143).
+
+**RejectPlaintextPorts** __port__,__port__,__...__::
+ Like WarnPlaintextPorts, but instead of warning about risky port uses, Tor
+ will instead refuse to make the connection. (Default: None).
+
+**AllowSingleHopCircuits** **0**|**1**::
+ When this option is set, the attached Tor controller can use relays
+ that have the **AllowSingleHopExits** option turned on to build
+ one-hop Tor connections. (Default: 0)
+
+SERVER OPTIONS
+--------------
+
+The following options are useful only for servers (that is, if ORPort
+is non-zero):
+
+**Address** __address__::
+ The IP address or fully qualified domain name of this server (e.g.
+ moria.mit.edu). You can leave this unset, and Tor will guess your IP
+ address. This IP address is the one used to tell clients and other
+ servers where to find your Tor server; it doesn't affect the IP that your
+ Tor client binds to. To bind to a different address, use the
+ *ListenAddress and OutboundBindAddress options.
+
+**AllowSingleHopExits** **0**|**1**::
+ This option controls whether clients can use this server as a single hop
+ proxy. If set to 1, clients can use this server as an exit even if it is
+ the only hop in the circuit. Note that most clients will refuse to use
+ servers that set this option, since most clients have
+ ExcludeSingleHopRelays set. (Default: 0)
+
+**AssumeReachable** **0**|**1**::
+ This option is used when bootstrapping a new Tor network. If set to 1,
+ don't do self-reachability testing; just upload your server descriptor
+ immediately. If **AuthoritativeDirectory** is also set, this option
+ instructs the dirserver to bypass remote reachability testing too and list
+ all connected servers as running.
+
+**BridgeRelay** **0**|**1**::
+ Sets the relay to act as a "bridge" with respect to relaying connections
+ from bridge users to the Tor network. It mainly causes Tor to publish a
+ server descriptor to the bridge database, rather than publishing a relay
+ descriptor to the public directory authorities.
+
+**ContactInfo** __email_address__::
+ Administrative contact information for server. This line might get picked
+ up by spam harvesters, so you may want to obscure the fact that it's an
+ email address.
+
+**ExitPolicy** __policy__,__policy__,__...__::
+ Set an exit policy for this server. Each policy is of the form
+ "**accept**|**reject** __ADDR__[/__MASK__][:__PORT__]". If /__MASK__ is
+ omitted then this policy just applies to the host given. Instead of giving
+ a host or network you can also use "\*" to denote the universe (0.0.0.0/0).
+ __PORT__ can be a single port number, an interval of ports
+ "__FROM_PORT__-__TO_PORT__", or "\*". If __PORT__ is omitted, that means
+ "\*". +
+ +
+ For example, "accept 18.7.22.69:\*,reject 18.0.0.0/8:\*,accept \*:\*" would
+ reject any traffic destined for MIT except for web.mit.edu, and accept
+ anything else. +
+ +
+ To specify all internal and link-local networks (including 0.0.0.0/8,
+ 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, and
+ 172.16.0.0/12), you can use the "private" alias instead of an address.
+ These addresses are rejected by default (at the beginning of your exit
+ policy), along with your public IP address, unless you set the
+ ExitPolicyRejectPrivate config option to 0. For example, once you've done
+ that, you could allow HTTP to 127.0.0.1 and block all other connections to
+ internal networks with "accept 127.0.0.1:80,reject private:\*", though that
+ may also allow connections to your own computer that are addressed to its
+ public (external) IP address. See RFC 1918 and RFC 3330 for more details
+ about internal and reserved IP address space. +
+ +
+ This directive can be specified multiple times so you don't have to put it
+ all on one line. +
+ +
+ Policies are considered first to last, and the first match wins. If you
+ want to \_replace_ the default exit policy, end your exit policy with
+ either a reject \*:* or an accept \*:*. Otherwise, you're \_augmenting_
+ (prepending to) the default exit policy. The default exit policy is: +
+
+ reject *:25
+ reject *:119
+ reject *:135-139
+ reject *:445
+ reject *:563
+ reject *:1214
+ reject *:4661-4666
+ reject *:6346-6429
+ reject *:6699
+ reject *:6881-6999
+ accept *:*
+
+**ExitPolicyRejectPrivate** **0**|**1**::
+ Reject all private (local) networks, along with your own public IP address,
+ at the beginning of your exit policy. See above entry on ExitPolicy.
+ (Default: 1)
+
+**MaxOnionsPending** __NUM__::
+ If you have more than this number of onionskins queued for decrypt, reject
+ new ones. (Default: 100)
+
+**MyFamily** __node__,__node__,__...__::
+ Declare that this Tor server is controlled or administered by a group or
+ organization identical or similar to that of the other servers, defined by
+ their identity fingerprints or nicknames. When two servers both declare
+ that they are in the same \'family', Tor clients will not use them in the
+ same circuit. (Each server only needs to list the other servers in its
+ family; it doesn't need to list itself, but it won't hurt.)
+
+**Nickname** __name__::
+ Set the server's nickname to \'name'. Nicknames must be between 1 and 19
+ characters inclusive, and must contain only the characters [a-zA-Z0-9].
+
+**NumCPUs** __num__::
+ How many processes to use at once for decrypting onionskins. (Default: 1)
+
+**ORPort** __PORT__::
+ Advertise this port to listen for connections from Tor clients and servers.
+
+**ORListenAddress** __IP__[:__PORT__]::
+ Bind to this IP address to listen for connections from Tor clients and
+ servers. If you specify a port, bind to this port rather than the one
+ specified in ORPort. (Default: 0.0.0.0) This directive can be specified
+ multiple times to bind to multiple addresses/ports.
+
+**PublishServerDescriptor** **0**|**1**|**v1**|**v2**|**v3**|**bridge**|**hidserv**,**...**::
+ This option specifies which descriptors Tor will publish when acting as
+ a relay or hidden service. You can
+ choose multiple arguments, separated by commas.
+ +
+ If this option is set to 0, Tor will not publish its
+ descriptors to any directories. (This is useful if you're testing
+ out your server, or if you're using a Tor controller that handles directory
+ publishing for you.) Otherwise, Tor will publish its descriptors of all
+ type(s) specified. The default is "1",
+ which means "if running as a server or a hidden service, publish the
+ appropriate descriptors to the authorities".
+
+**ShutdownWaitLength** __NUM__::
+ When we get a SIGINT and we're a server, we begin shutting down:
+ we close listeners and start refusing new circuits. After **NUM**
+ seconds, we exit. If we get a second SIGINT, we exit immedi-
+ ately. (Default: 30 seconds)
+
+
+**AccountingMax** __N__ **bytes**|**KB**|**MB**|**GB**|**TB**::
+ Never send more than the specified number of bytes in a given accounting
+ period, or receive more than that number in the period. For example, with
+ AccountingMax set to 1 GB, a server could send 900 MB and receive 800 MB
+ and continue running. It will only hibernate once one of the two reaches 1
+ GB. When the number of bytes is exhausted, Tor will hibernate until some
+ time in the next accounting period. To prevent all servers from waking at
+ the same time, Tor will also wait until a random point in each period
+ before waking up. If you have bandwidth cost issues, enabling hibernation
+ is preferable to setting a low bandwidth, since it provides users with a
+ collection of fast servers that are up some of the time, which is more
+ useful than a set of slow servers that are always "available".
+
+**AccountingStart** **day**|**week**|**month** [__day__] __HH:MM__::
+ Specify how long accounting periods last. If **month** is given, each
+ accounting period runs from the time __HH:MM__ on the __dayth__ day of one
+ month to the same day and time of the next. (The day must be between 1 and
+ 28.) If **week** is given, each accounting period runs from the time __HH:MM__
+ of the __dayth__ day of one week to the same day and time of the next week,
+ with Monday as day 1 and Sunday as day 7. If **day** is given, each
+ accounting period runs from the time __HH:MM__ each day to the same time on
+ the next day. All times are local, and given in 24-hour time. (Defaults to
+ "month 1 0:00".)
+
+**RefuseUnknownExits** **0**|**1**|**auto**::
+ Prevent nodes that don't appear in the consensus from exiting using this
+ relay. If the option is 1, we always block exit attempts from such
+ nodes; if it's 0, we never do, and if the option is "auto", then we do
+ whatever the authorities suggest in the consensus. (Defaults to auto.)
+
+**ServerDNSResolvConfFile** __filename__::
+ Overrides the default DNS configuration with the configuration in
+ __filename__. The file format is the same as the standard Unix
+ "**resolv.conf**" file (7). This option, like all other ServerDNS options,
+ only affects name lookups that your server does on behalf of clients.
+ (Defaults to use the system DNS configuration.)
+
+**ServerDNSAllowBrokenConfig** **0**|**1**::
+ If this option is false, Tor exits immediately if there are problems
+ parsing the system DNS configuration or connecting to nameservers.
+ Otherwise, Tor continues to periodically retry the system nameservers until
+ it eventually succeeds. (Defaults to "1".)
+
+**ServerDNSSearchDomains** **0**|**1**::
+ If set to 1, then we will search for addresses in the local search domain.
+ For example, if this system is configured to believe it is in
+ "example.com", and a client tries to connect to "www", the client will be
+ connected to "www.example.com". This option only affects name lookups that
+ your server does on behalf of clients. (Defaults to "0".)
+
+**ServerDNSDetectHijacking** **0**|**1**::
+ When this option is set to 1, we will test periodically to determine
+ whether our local nameservers have been configured to hijack failing DNS
+ requests (usually to an advertising site). If they are, we will attempt to
+ correct this. This option only affects name lookups that your server does
+ on behalf of clients. (Defaults to "1".)
+
+**ServerDNSTestAddresses** __address__,__address__,__...__::
+ When we're detecting DNS hijacking, make sure that these __valid__ addresses
+ aren't getting redirected. If they are, then our DNS is completely useless,
+ and we'll reset our exit policy to "reject *:*". This option only affects
+ name lookups that your server does on behalf of clients. (Defaults to
+ "www.google.com, www.mit.edu, www.yahoo.com, www.slashdot.org".)
+
+**ServerDNSAllowNonRFC953Hostnames** **0**|**1**::
+ When this option is disabled, Tor does not try to resolve hostnames
+ containing illegal characters (like @ and :) rather than sending them to an
+ exit node to be resolved. This helps trap accidental attempts to resolve
+ URLs and so on. This option only affects name lookups that your server does
+ on behalf of clients. (Default: 0)
+
+**BridgeRecordUsageByCountry** **0**|**1**::
+ When this option is enabled and BridgeRelay is also enabled, and we have
+ GeoIP data, Tor keeps a keep a per-country count of how many client
+ addresses have contacted it so that it can help the bridge authority guess
+ which countries have blocked access to it. (Default: 1)
+
+**ServerDNSRandomizeCase** **0**|**1**::
+ When this option is set, Tor sets the case of each character randomly in
+ outgoing DNS requests, and makes sure that the case matches in DNS replies.
+ This so-called "0x20 hack" helps resist some types of DNS poisoning attack.
+ For more information, see "Increased DNS Forgery Resistance through
+ 0x20-Bit Encoding". This option only affects name lookups that your server
+ does on behalf of clients. (Default: 1)
+
+**GeoIPFile** __filename__::
+ A filename containing GeoIP data, for use with BridgeRecordUsageByCountry.
+
+**CellStatistics** **0**|**1**::
+ When this option is enabled, Tor writes statistics on the mean time that
+ cells spend in circuit queues to disk every 24 hours. (Default: 0)
+
+**DirReqStatistics** **0**|**1**::
+ When this option is enabled, Tor writes statistics on the number and
+ response time of network status requests to disk every 24 hours.
+ (Default: 0)
+
+**EntryStatistics** **0**|**1**::
+ When this option is enabled, Tor writes statistics on the number of
+ directly connecting clients to disk every 24 hours. (Default: 0)
+
+**ExitPortStatistics** **0**|**1**::
+ When this option is enabled, Tor writes statistics on the number of relayed
+ bytes and opened stream per exit port to disk every 24 hours. (Default: 0)
+
+**ExtraInfoStatistics** **0**|**1**::
+ When this option is enabled, Tor includes previously gathered statistics in
+ its extra-info documents that it uploads to the directory authorities.
+ (Default: 0)
+
+DIRECTORY SERVER OPTIONS
+------------------------
+
+The following options are useful only for directory servers (that is,
+if DirPort is non-zero):
+
+**AuthoritativeDirectory** **0**|**1**::
+ When this option is set to 1, Tor operates as an authoritative directory
+ server. Instead of caching the directory, it generates its own list of
+ good servers, signs it, and sends that to the clients. Unless the clients
+ already have you listed as a trusted directory, you probably do not want
+ to set this option. Please coordinate with the other admins at
+ tor-ops@torproject.org if you think you should be a directory.
+
+**DirPortFrontPage** __FILENAME__::
+ When this option is set, it takes an HTML file and publishes it as "/" on
+ the DirPort. Now relay operators can provide a disclaimer without needing
+ to set up a separate webserver. There's a sample disclaimer in
+ contrib/tor-exit-notice.html.
+
+**V1AuthoritativeDirectory** **0**|**1**::
+ When this option is set in addition to **AuthoritativeDirectory**, Tor
+ generates version 1 directory and running-routers documents (for legacy
+ Tor clients up to 0.1.0.x).
+
+**V2AuthoritativeDirectory** **0**|**1**::
+ When this option is set in addition to **AuthoritativeDirectory**, Tor
+ generates version 2 network statuses and serves descriptors, etc as
+ described in doc/spec/dir-spec-v2.txt (for Tor clients and servers running
+ 0.1.1.x and 0.1.2.x).
+
+**V3AuthoritativeDirectory** **0**|**1**::
+ When this option is set in addition to **AuthoritativeDirectory**, Tor
+ generates version 3 network statuses and serves descriptors, etc as
+ described in doc/spec/dir-spec.txt (for Tor clients and servers running at
+ least 0.2.0.x).
+
+**VersioningAuthoritativeDirectory** **0**|**1**::
+ When this option is set to 1, Tor adds information on which versions of
+ Tor are still believed safe for use to the published directory. Each
+ version 1 authority is automatically a versioning authority; version 2
+ authorities provide this service optionally. See **RecommendedVersions**,
+ **RecommendedClientVersions**, and **RecommendedServerVersions**.
+
+**NamingAuthoritativeDirectory** **0**|**1**::
+ When this option is set to 1, then the server advertises that it has
+ opinions about nickname-to-fingerprint bindings. It will include these
+ opinions in its published network-status pages, by listing servers with
+ the flag "Named" if a correct binding between that nickname and fingerprint
+ has been registered with the dirserver. Naming dirservers will refuse to
+ accept or publish descriptors that contradict a registered binding. See
+ **approved-routers** in the **FILES** section below.
+
+**HSAuthoritativeDir** **0**|**1**::
+ When this option is set in addition to **AuthoritativeDirectory**, Tor also
+ accepts and serves hidden service descriptors. (Default: 0)
+
+**HidServDirectoryV2** **0**|**1**::
+ When this option is set, Tor accepts and serves v2 hidden service
+ descriptors. Setting DirPort is not required for this, because clients
+ connect via the ORPort by default. (Default: 1)
+
+**BridgeAuthoritativeDir** **0**|**1**::
+ When this option is set in addition to **AuthoritativeDirectory**, Tor
+ accepts and serves router descriptors, but it caches and serves the main
+ networkstatus documents rather than generating its own. (Default: 0)
+
+**MinUptimeHidServDirectoryV2** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**::
+ Minimum uptime of a v2 hidden service directory to be accepted as such by
+ authoritative directories. (Default: 24 hours)
+
+**DirPort** __PORT__::
+ Advertise the directory service on this port.
+
+**DirListenAddress** __IP__[:__PORT__]::
+ Bind the directory service to this address. If you specify a port, bind to
+ this port rather than the one specified in DirPort. (Default: 0.0.0.0)
+ This directive can be specified multiple times to bind to multiple
+ addresses/ports.
+
+**DirPolicy** __policy__,__policy__,__...__::
+ Set an entrance policy for this server, to limit who can connect to the
+ directory ports. The policies have the same form as exit policies above.
+
+DIRECTORY AUTHORITY SERVER OPTIONS
+----------------------------------
+
+**RecommendedVersions** __STRING__::
+ STRING is a comma-separated list of Tor versions currently believed to be
+ safe. The list is included in each directory, and nodes which pull down the
+ directory learn whether they need to upgrade. This option can appear
+ multiple times: the values from multiple lines are spliced together. When
+ this is set then **VersioningAuthoritativeDirectory** should be set too.
+
+**RecommendedClientVersions** __STRING__::
+ STRING is a comma-separated list of Tor versions currently believed to be
+ safe for clients to use. This information is included in version 2
+ directories. If this is not set then the value of **RecommendedVersions**
+ is used. When this is set then **VersioningAuthoritativeDirectory** should
+ be set too.
+
+**RecommendedServerVersions** __STRING__::
+ STRING is a comma-separated list of Tor versions currently believed to be
+ safe for servers to use. This information is included in version 2
+ directories. If this is not set then the value of **RecommendedVersions**
+ is used. When this is set then **VersioningAuthoritativeDirectory** should
+ be set too.
+
+**ConsensusParams** __STRING__::
+ STRING is a space-separated list of key=value pairs that Tor will include
+ in the "params" line of its networkstatus vote.
+
+**DirAllowPrivateAddresses** **0**|**1**::
+ If set to 1, Tor will accept router descriptors with arbitrary "Address"
+ elements. Otherwise, if the address is not an IP address or is a private IP
+ address, it will reject the router descriptor. Defaults to 0.
+
+**AuthDirBadDir** __AddressPattern...__::
+ Authoritative directories only. A set of address patterns for servers that
+ will be listed as bad directories in any network status document this
+ authority publishes, if **AuthDirListBadDirs** is set.
+
+**AuthDirBadExit** __AddressPattern...__::
+ Authoritative directories only. A set of address patterns for servers that
+ will be listed as bad exits in any network status document this authority
+ publishes, if **AuthDirListBadExits** is set.
+
+**AuthDirInvalid** __AddressPattern...__::
+ Authoritative directories only. A set of address patterns for servers that
+ will never be listed as "valid" in any network status document that this
+ authority publishes.
+
+**AuthDirReject** __AddressPattern__...::
+ Authoritative directories only. A set of address patterns for servers that
+ will never be listed at all in any network status document that this
+ authority publishes, or accepted as an OR address in any descriptor
+ submitted for publication by this authority.
+
+**AuthDirListBadDirs** **0**|**1**::
+ Authoritative directories only. If set to 1, this directory has some
+ opinion about which nodes are unsuitable as directory caches. (Do not set
+ this to 1 unless you plan to list non-functioning directories as bad;
+ otherwise, you are effectively voting in favor of every declared
+ directory.)
+
+**AuthDirListBadExits** **0**|**1**::
+ Authoritative directories only. If set to 1, this directory has some
+ opinion about which nodes are unsuitable as exit nodes. (Do not set this to
+ 1 unless you plan to list non-functioning exits as bad; otherwise, you are
+ effectively voting in favor of every declared exit as an exit.)
+
+**AuthDirRejectUnlisted** **0**|**1**::
+ Authoritative directories only. If set to 1, the directory server rejects
+ all uploaded server descriptors that aren't explicitly listed in the
+ fingerprints file. This acts as a "panic button" if we get hit with a Sybil
+ attack. (Default: 0)
+
+**AuthDirMaxServersPerAddr** __NUM__::
+ Authoritative directories only. The maximum number of servers that we will
+ list as acceptable on a single IP address. Set this to "0" for "no limit".
+ (Default: 2)
+
+**AuthDirMaxServersPerAuthAddr** __NUM__::
+ Authoritative directories only. Like AuthDirMaxServersPerAddr, but applies
+ to addresses shared with directory authorities. (Default: 5)
+
+**V3AuthVotingInterval** __N__ **minutes**|**hours**::
+ V3 authoritative directories only. Configures the server's preferred voting
+ interval. Note that voting will __actually__ happen at an interval chosen
+ by consensus from all the authorities' preferred intervals. This time
+ SHOULD divide evenly into a day. (Default: 1 hour)
+
+**V3AuthVoteDelay** __N__ **minutes**|**hours**::
+ V3 authoritative directories only. Configures the server's preferred delay
+ between publishing its vote and assuming it has all the votes from all the
+ other authorities. Note that the actual time used is not the server's
+ preferred time, but the consensus of all preferences. (Default: 5 minutes.)
+
+**V3AuthDistDelay** __N__ **minutes**|**hours**::
+ V3 authoritative directories only. Configures the server's preferred delay
+ between publishing its consensus and signature and assuming it has all the
+ signatures from all the other authorities. Note that the actual time used
+ is not the server's preferred time, but the consensus of all preferences.
+ (Default: 5 minutes.)
+
+**V3AuthNIntervalsValid** __NUM__::
+ V3 authoritative directories only. Configures the number of VotingIntervals
+ for which each consensus should be valid for. Choosing high numbers
+ increases network partitioning risks; choosing low numbers increases
+ directory traffic. Note that the actual number of intervals used is not the
+ server's preferred number, but the consensus of all preferences. Must be at
+ least 2. (Default: 3.)
+
+**V3BandwidthsFile** __FILENAME__::
+ V3 authoritative directories only. Configures the location of the
+ bandiwdth-authority generated file storing information on relays' measured
+ bandwidth capacities. (Default: unset.)
+
+HIDDEN SERVICE OPTIONS
+----------------------
+
+The following options are used to configure a hidden service.
+
+**HiddenServiceDir** __DIRECTORY__::
+ Store data files for a hidden service in DIRECTORY. Every hidden service
+ must have a separate directory. You may use this option multiple times to
+ specify multiple services.
+
+**HiddenServicePort** __VIRTPORT__ [__TARGET__]::
+ Configure a virtual port VIRTPORT for a hidden service. You may use this
+ option multiple times; each time applies to the service using the most
+ recent hiddenservicedir. By default, this option maps the virtual port to
+ the same port on 127.0.0.1. You may override the target port, address, or
+ both by specifying a target of addr, port, or addr:port. You may also have
+ multiple lines with the same VIRTPORT: when a user connects to that
+ VIRTPORT, one of the TARGETs from those lines will be chosen at random.
+
+**PublishHidServDescriptors** **0**|**1**::
+ If set to 0, Tor will run any hidden services you configure, but it won't
+ advertise them to the rendezvous directory. This option is only useful if
+ you're using a Tor controller that handles hidserv publishing for you.
+ (Default: 1)
+
+**HiddenServiceVersion** __version__,__version__,__...__::
+ A list of rendezvous service descriptor versions to publish for the hidden
+ service. Currently, only version 2 is supported. (Default: 2)
+
+**HiddenServiceAuthorizeClient** __auth-type__ __client-name__,__client-name__,__...__::
+ If configured, the hidden service is accessible for authorized clients
+ only. The auth-type can either be \'basic' for a general-purpose
+ authorization protocol or \'stealth' for a less scalable protocol that also
+ hides service activity from unauthorized clients. Only clients that are
+ listed here are authorized to access the hidden service. Valid client names
+ are 1 to 19 characters long and only use characters in A-Za-z0-9+-_ (no
+ spaces). If this option is set, the hidden service is not accessible for
+ clients without authorization any more. Generated authorization data can be
+ found in the hostname file. Clients need to put this authorization data in
+ their configuration file using **HidServAuth**.
+
+**RendPostPeriod** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**::
+ Every time the specified period elapses, Tor uploads any rendezvous
+ service descriptors to the directory servers. This information is also
+ uploaded whenever it changes. (Default: 1 hour)
+
+TESTING NETWORK OPTIONS
+-----------------------
+
+The following options are used for running a testing Tor network.
+
+**TestingTorNetwork** **0**|**1**::
+ If set to 1, Tor adjusts default values of the configuration options below,
+ so that it is easier to set up a testing Tor network. May only be set if
+ non-default set of DirServers is set. Cannot be unset while Tor is running.
+ (Default: 0) +
+
+ ServerDNSAllowBrokenConfig 1
+ DirAllowPrivateAddresses 1
+ EnforceDistinctSubnets 0
+ AssumeReachable 1
+ AuthDirMaxServersPerAddr 0
+ AuthDirMaxServersPerAuthAddr 0
+ ClientDNSRejectInternalAddresses 0
+ ExitPolicyRejectPrivate 0
+ V3AuthVotingInterval 5 minutes
+ V3AuthVoteDelay 20 seconds
+ V3AuthDistDelay 20 seconds
+ MinUptimeHidServDirectoryV2 0 seconds
+ TestingV3AuthInitialVotingInterval 5 minutes
+ TestingV3AuthInitialVoteDelay 20 seconds
+ TestingV3AuthInitialDistDelay 20 seconds
+ TestingAuthDirTimeToLearnReachability 0 minutes
+ TestingEstimatedDescriptorPropagationTime 0 minutes
+
+**TestingV3AuthInitialVotingInterval** __N__ **minutes**|**hours**::
+ Like V3AuthVotingInterval, but for initial voting interval before the first
+ consensus has been created. Changing this requires that
+ **TestingTorNetwork** is set. (Default: 30 minutes)
+
+**TestingV3AuthInitialVoteDelay** __N__ **minutes**|**hours**::
+ Like TestingV3AuthInitialVoteDelay, but for initial voting interval before
+ the first consensus has been created. Changing this requires that
+ **TestingTorNetwork** is set. (Default: 5 minutes)
+
+**TestingV3AuthInitialDistDelay** __N__ **minutes**|**hours**::
+ Like TestingV3AuthInitialDistDelay, but for initial voting interval before
+ the first consensus has been created. Changing this requires that
+ **TestingTorNetwork** is set. (Default: 5 minutes)
+
+**TestingAuthDirTimeToLearnReachability** __N__ **minutes**|**hours**::
+ After starting as an authority, do not make claims about whether routers
+ are Running until this much time has passed. Changing this requires
+ that **TestingTorNetwork** is set. (Default: 30 minutes)
+
+**TestingEstimatedDescriptorPropagationTime** __N__ **minutes**|**hours**::
+ Clients try downloading router descriptors from directory caches after this
+ time. Changing this requires that **TestingTorNetwork** is set. (Default:
+ 10 minutes)
+
+SIGNALS
+-------
+
+Tor catches the following signals:
+
+**SIGTERM**::
+ Tor will catch this, clean up and sync to disk if necessary, and exit.
+
+**SIGINT**::
+ Tor clients behave as with SIGTERM; but Tor servers will do a controlled
+ slow shutdown, closing listeners and waiting 30 seconds before exiting.
+ (The delay can be configured with the ShutdownWaitLength config option.)
+
+**SIGHUP**::
+ The signal instructs Tor to reload its configuration (including closing and
+ reopening logs), and kill and restart its helper processes if applicable.
+
+**SIGUSR1**::
+ Log statistics about current connections, past connections, and throughput.
+
+**SIGUSR2**::
+ Switch all logs to loglevel debug. You can go back to the old loglevels by
+ sending a SIGHUP.
+
+**SIGCHLD**::
+ Tor receives this signal when one of its helper processes has exited, so it
+ can clean up.
+
+**SIGPIPE**::
+ Tor catches this signal and ignores it.
+
+**SIGXFSZ**::
+ If this signal exists on your platform, Tor catches and ignores it.
+
+FILES
+-----
+
+**@CONFDIR@/torrc**::
+ The configuration file, which contains "option value" pairs.
+
+**@LOCALSTATEDIR@/lib/tor/**::
+ The tor process stores keys and other data here.
+
+__DataDirectory__**/cached-status/**::
+ The most recently downloaded network status document for each authority.
+ Each file holds one such document; the filenames are the hexadecimal
+ identity key fingerprints of the directory authorities.
+
+__DataDirectory__**/cached-descriptors** and **cached-descriptors.new**::
+ These files hold downloaded router statuses. Some routers may appear more
+ than once; if so, the most recently published descriptor is used. Lines
+ beginning with @-signs are annotations that contain more information about
+ a given router. The ".new" file is an append-only journal; when it gets
+ too large, all entries are merged into a new cached-descriptors file.
+
+__DataDirectory__**/cached-routers** and **cached-routers.new**::
+ Obsolete versions of cached-descriptors and cached-descriptors.new. When
+ Tor can't find the newer files, it looks here instead.
+
+__DataDirectory__**/state**::
+ A set of persistent key-value mappings. These are documented in
+ the file. These include:
+ - The current entry guards and their status.
+ - The current bandwidth accounting values (unused so far; see
+ below).
+ - When the file was last written
+ - What version of Tor generated the state file
+ - A short history of bandwidth usage, as produced in the router
+ descriptors.
+
+__DataDirectory__**/bw_accounting**::
+ Used to track bandwidth accounting values (when the current period starts
+ and ends; how much has been read and written so far this period). This file
+ is obsolete, and the data is now stored in the \'state' file as well. Only
+ used when bandwidth accounting is enabled.
+
+__DataDirectory__**/control_auth_cookie**::
+ Used for cookie authentication with the controller. Location can be
+ overridden by the CookieAuthFile config option. Regenerated on startup. See
+ control-spec.txt for details. Only used when cookie authentication is
+ enabled.
+
+__DataDirectory__**/keys/***::
+ Only used by servers. Holds identity keys and onion keys.
+
+__DataDirectory__**/fingerprint**::
+ Only used by servers. Holds the fingerprint of the server's identity key.
+
+__DataDirectory__**/approved-routers**::
+ Only for naming authoritative directory servers (see
+ **NamingAuthoritativeDirectory**). This file lists nickname to identity
+ bindings. Each line lists a nickname and a fingerprint separated by
+ whitespace. See your **fingerprint** file in the __DataDirectory__ for an
+ example line. If the nickname is **!reject** then descriptors from the
+ given identity (fingerprint) are rejected by this server. If it is
+ **!invalid** then descriptors are accepted but marked in the directory as
+ not valid, that is, not recommended.
+
+__DataDirectory__**/router-stability**::
+ Only used by authoritative directory servers. Tracks measurements for
+ router mean-time-between-failures so that authorities have a good idea of
+ how to set their Stable flags.
+
+__HiddenServiceDirectory__**/hostname**::
+ The <base32-encoded-fingerprint>.onion domain name for this hidden service.
+ If the hidden service is restricted to authorized clients only, this file
+ also contains authorization data for all clients.
+
+__HiddenServiceDirectory__**/private_key**::
+ The private key for this hidden service.
+
+__HiddenServiceDirectory__**/client_keys**::
+ Authorization data for a hidden service that is only accessible by
+ authorized clients.
+
+SEE ALSO
+--------
+**privoxy**(1), **tsocks**(1), **torify**(1) +
+
+**https://www.torproject.org/**
+
+
+BUGS
+----
+
+Plenty, probably. Tor is still in development. Please report them.
+
+AUTHORS
+-------
+Roger Dingledine [arma at mit.edu], Nick Mathewson [nickm at alum.mit.edu].
+
diff --git a/doc/torify.1.txt b/doc/torify.1.txt
new file mode 100644
index 0000000000..ca2c385c94
--- /dev/null
+++ b/doc/torify.1.txt
@@ -0,0 +1,50 @@
+// Copyright (c) The Tor Project, Inc.
+// See LICENSE for licensing information
+// This is an asciidoc file used to generate the manpage/html reference.
+// Learn asciidoc on http://www.methods.co.nz/asciidoc/userguide.html
+torify(1)
+=========
+Peter Palfrader
+Jacob Appelbaum
+
+NAME
+----
+torify - wrapper for torsocks or tsocks and tor
+
+SYNOPSIS
+--------
+**torify** __application__ [__application's__ __arguments__]
+
+DESCRIPTION
+-----------
+**torify** is a simple wrapper that attempts to find the best underlying Tor
+wrapper available on a system. It calls torsocks or tsocks with a tor specific
+configuration file. +
+
+torsocks is an improved wrapper that explictly rejects UDP, safely resolves DNS
+lookups and properly socksifies your TCP connections. +
+
+tsocks itself is a wrapper between the tsocks library and the application that
+you would like to run socksified. +
+
+Please note that since both method use LD_PRELOAD, torify cannot be applied to
+suid binaries.
+
+WARNING
+-------
+You should also be aware that the way tsocks currently works only TCP
+connections are socksified. Be aware that this will in most circumstances not
+include hostname lookups which would still be routed through your normal system
+resolver to your usual resolving nameservers. The **tor-resolve**(1) tool can be
+useful as a workaround in some cases. The Tor FAQ at
+https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ might have further
+information on this subject. +
+
+When used with torsocks, torify should not leak DNS requests or UDP data. +
+
+Both will leak ICMP data.
+
+SEE ALSO
+--------
+**tor**(1), **tor-resolve**(1), **torsocks**(1), **tsocks**(1),
+**tsocks.conf**(5).
diff --git a/doc/translations.txt b/doc/translations.txt
index 874abe1bc1..06d16f4462 100644
--- a/doc/translations.txt
+++ b/doc/translations.txt
@@ -31,7 +31,7 @@ The current pootle configuration is checked into subversion as well:
TorCheck uses our translation portal to accept translations. Users use
the portal to check in their changes. To make use of the translations
-that users have commited to the translations/ subversion module, you'll
+that users have committed to the translations/ subversion module, you'll
need to ensure that you have a current checked out copy of TorCheck:
cd check/trunk/i18n/
@@ -75,59 +75,32 @@ And finally check in the changes:
Torbutton uses our translation portal to accept translations. Users use
the portal to check in their changes.
-To make use of the translations that users have commited to the translations/
+To make use of the translations that users have committed to the translations/
subversion module, you'll need to ensure that you have a current checked out
-copy of Torbutton:
+copy of them in your torbutton git checkout:
- cd torbutton/trans_tools
- torbutton/trans_tools$ svn up
+ cd torbutton.git/trans_tools
+ torbutton.git/trans_tools$ svn co https://tor-svn.freehaven.net/svn/translation/trunk/projects/torbutton pootle
You should see something like the following:
- Fetching external item into 'pootle'
- External at revision 15300.
-
- At revision 15300.
-
-Now if you had changes, you need to convert from .po and move
-the newly updated mozilla files into the current stable locale
-directory. First convert them with the 'mkmoz.sh' script and then
-move the proper mozilla files from 'torbutton/trans_tools/moz/' into
-'torbutton/src/chrome/locale/' directory while properly naming the files
-for their respective locale.
-
-Here's an example of how to move all of the current pootle translations into
-the svn trunk area of Torbutton:
-
- cd torbutton/trans_tools
- ./mkmoz.sh
- for locale in `ls -1 moz/`;
- do
- mv -v moz/$locale/*.{dtd,properties} ../src/chrome/locale/$locale/;
- done
-
-Now check the differences (ensure the output looks reasonable):
+ Checked out revision 21092.
- svn diff
+If you made changes to strings in Torbutton, you need to rebuild the
+templates in torbutton.git/trans_tools/pootle/templates. This is done with
+the following command from within the torbutton.git checkout directory:
-And finally check in the changes:
-
- svn commit
-
-
-If you make changes to strings in Torbutton, you need to rebuild the
-templates in torbutton/trans_tools/pootle/templates. This is done via:
-
- moz2po -P -i torbutton/src/chrome/locale/en/ -o torbutton/trans_tools/templates/
+ moz2po -P -i src/chrome/locale/en/ -o trans_tools/pootle/templates/
You now have two options:
-Option 1 (The Pootle Web UI Way):
+Option 1 (The [shitty] Pootle Web UI Way):
View then commit the changes to the template with:
- svn diff torbutton/trans_tools/templates/
- svn commit torbutton/trans_tools/templates/
+ cd trans_tools/pootle
+ svn diff templates
+ svn commit templates
Then poke Jake to 'svn up' on the Pootle side. If you do this enough
times, he may give you a button to click to update templates in Pootle,
@@ -150,7 +123,7 @@ Option 2 (Use your own msgmerge: YMMV, may change .po flags and formatting):
Run msgmerge yourself for each language:
- cd torbutton/trans_tools
+ cd trans_tools
for i in `ls -1 pootle`
do
msgmerge -U ./pootle/$i/torbutton.dtd.po ./pootle/templates/torbutton.dtd.pot
@@ -171,6 +144,36 @@ breaks :)
After this process is done, you then need to regenerate the mozilla
.dtd and .properties files as specified above.
+
+Regardless of whether or not you had changes in the torbutton strings, if there
+were updated strings in pootle that you checked out from svn you now need to
+convert from .po and move the newly updated mozilla files into the current
+stable locale directory. First convert them with the 'mkmoz.sh' script and
+then move the proper mozilla files from 'torbutton.git/trans_tools/moz/' into
+'torbutton.git/src/chrome/locale/' directory while properly naming the files
+for their respective locale.
+
+Here's an example of how to move all of the current pootle translations into
+the svn trunk area of Torbutton:
+
+ cd trans_tools
+ ./mkmoz.sh
+ for locale in `ls -1 moz/`;
+ do
+ mv -v moz/$locale/*.{dtd,properties} ../src/chrome/locale/$locale/
+ done
+
+Now check the differences to your git branch to ensure the output looks
+reasonable:
+
+ cd ..
+ git diff
+
+And finally check in the changes:
+
+ cd src/chrome/locale
+ git commit .
+
---------------------------- Vidalia -------------------------------
Vidalia uses our translation portal to accept translations. Users use the