aboutsummaryrefslogtreecommitdiff
path: root/doc/tor-spec.txt
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2003-05-28 06:36:26 +0000
committerRoger Dingledine <arma@torproject.org>2003-05-28 06:36:26 +0000
commit5e05079890f62c7d8c1ccb74ef4dc0347ec70385 (patch)
tree7dc37f8bbb8fef3d699bceb933ad3f4a84bc214d /doc/tor-spec.txt
parent8e242d9b8735d07bb34f36597e8856d864a49831 (diff)
downloadtor-5e05079890f62c7d8c1ccb74ef4dc0347ec70385.tar
tor-5e05079890f62c7d8c1ccb74ef4dc0347ec70385.tar.gz
partial update of the spec
still wrong in plenty of places svn:r301
Diffstat (limited to 'doc/tor-spec.txt')
-rw-r--r--doc/tor-spec.txt109
1 files changed, 56 insertions, 53 deletions
diff --git a/doc/tor-spec.txt b/doc/tor-spec.txt
index 807d2d931..a3e1f688f 100644
--- a/doc/tor-spec.txt
+++ b/doc/tor-spec.txt
@@ -1,9 +1,9 @@
$Id$
-TOR (The Onion Router) Spec
+TOR Spec
Note: This is an attempt to specify TOR as it exists as implemented in
-early March, 2003. It is not recommended that others implement this
+early June, 2003. It is not recommended that others implement this
design as it stands; future versions of TOR will implement improved
protocols.
@@ -18,22 +18,23 @@ protocols.
All numeric values are encoded in network (big-endian) order.
- Unless otherwise specified, all symmetric ciphers are DES in OFB
- mode, with an IV of all 0 bytes. All asymmetric ciphers are RSA
- with 1024-bit keys, and exponents of 65537.
+ Unless otherwise specified, all symmetric ciphers are 3DES in OFB
+ mode, with an IV of all 0 bytes. Asymmetric ciphers are either RSA
+ with 1024-bit keys and exponents of 65537, or DH with the safe prime
+ from rfc2409, section 6.2, whose hex representation is:
+
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
+ "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
+ "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
+ "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
+ "49286651ECE65381FFFFFFFFFFFFFFFF"
[We will move to AES once we can assume everybody will have it. -RD]
1. System overview
-[Something to start with here. Do feel free to change/expand. -RD]
-
-Tor is an implementation of version 2 of Onion Routing.
-
-Onion Routing is a connection-oriented anonymizing communication
-service. Users build a layered block of asymmetric encryptions
-(an "onion") which describes a source-routed path through a set of
-nodes. Those nodes build a "virtual circuit" through the network, in which
+Tor is a connection-oriented anonymizing communication service. Users
+build a path known as 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.
@@ -42,11 +43,12 @@ which reveals the downstream node.
2. Connections
-2.1. Establishing OR-to-OR connections
+2.1. Establishing OR connections
When one onion router opens a connection to another, the initiating
OR (called the 'client') and the listening OR (called the 'server')
perform the following handshake.
+[or when an op wants to connect to or]
Before the handshake begins, the client and server know one
another's (1024-bit) public keys, IPV4 addresses, and ports.
@@ -59,6 +61,7 @@ which reveals the downstream node.
The client then generates a 'Client authentication' message [M]
containing:
+ The number 2 to signify OR handshake [2 bytes]
The client's published IPV4 address [4 bytes]
The client's published port [2 bytes]
The server's published IPV4 address [4 bytes]
@@ -66,19 +69,11 @@ which reveals the downstream node.
The forward key (K_f) [16 bytes]
The backward key (K_f) [16 bytes]
The maximum bandwidth (bytes/s) [4 bytes]
- [Total: 48 bytes]
-
- The client then RSA-encrypts the message with the server's
- public key, and PKCS1 padding to given an encrypted message
-
- [Commentary: 1024 bytes is probably too short, and this protocol can't
- support IPv6. -NM]
- [1024 is too short for a high-latency remailer; but perhaps it's
- fine for us, given our need for speed and also given our greater
- vulnerability to other attacks? Onions are infrequent enough now
- that maybe we could handle it; but I worry it will impact
- scalability, and handling more users is important.-RD]
-
+ [Total: 50 bytes]
+
+ The client then RSA-encrypts [M] with the server's public key
+ and PKCS1 padding to give an encrypted message.
+
The client then opens a TCP connection to the server, sends
the 128-byte RSA-encrypted data to the server, and waits for a
reply.
@@ -88,7 +83,7 @@ which reveals the downstream node.
Upon receiving a TCP connection, the server waits to receive
128 bytes from the client. It decrypts the message with its
private key, and checks the PKCS1 padding. If the padding is
- incorrect, or if the message's length is other than 32 bytes,
+ incorrect, or if the message's length is other than 50 bytes,
the server closes the TCP connection and stops handshaking.
The server then checks the list of known ORs for one with the
@@ -119,7 +114,7 @@ which reveals the downstream node.
Once the client has received 128 bytes, it decrypts them with
its public key, and checks the PKCS1 padding. If the padding
- is invalid, or the decrypted message's length is other than 40
+ is invalid, or the decrypted message's length is other than 56
bytes, the client closes the TCP connection.
The client checks that the addresses and keys in the reply
@@ -155,6 +150,7 @@ which reveals the downstream node.
2.2. Establishing OP-to-OR connections
+[wrap this with the above]
When an Onion Proxy (OP) needs to establish a connection to an OR,
the handshake is simpler because the OR does not need to verify the
OP's identity. The OP and OR establish the following steps:
@@ -166,10 +162,11 @@ which reveals the downstream node.
[K_b] for the 'backward' stream from OR to OP).
The OP generates a message [M] in the following format:
- Maximum bandwidth (bytes/s) [4 bytes]
- Forward key [K_f] [16 bytes]
- Backward key [K_b] [16 bytes]
- [Total: 32 bytes]
+ The number 1 to signify OP handshake [2 bytes]
+ Maximum bandwidth (bytes/s) [4 bytes]
+ Forward key [K_f] [16 bytes]
+ Backward key [K_b] [16 bytes]
+ [Total: 38 bytes]
The OP encrypts M with the OR's public key and PKCS1 padding,
opens a TCP connection to the OR's TCP port, and sends the
@@ -183,10 +180,10 @@ which reveals the downstream node.
and the op_port variable specified the OP port. -RD]
it waits for 128 bytes of data, and decrypts the resulting
data with its private key, checking the PKCS1 padding. If the
- padding is invalid, or the message is not 20 bytes long, the
+ padding is invalid, or the message is not 38 bytes long, the
OR closes the connection.
- Otherwise, the connection is established, and the O is ready
+ Otherwise, the connection is established, and the OR is ready
to receive cells.
The server sets its keys for this connection, setting K_f to
@@ -236,19 +233,20 @@ which reveals the downstream node.
The 'Command' field holds one of the following values:
0 -- PADDING (Padding) (See Sec 6.2)
1 -- CREATE (Create a circuit) (See Sec 4)
- 2 -- DATA (End-to-end data) (See Sec 5)
- 3 -- DESTROY (Stop using a circuit) (See Sec 4)
- 4 -- SENDME (For flow control) (See Sec 6.1)
+ 2 -- CREATED (Acknowledge create) (See Sec 4)
+ 3 -- RELAY (End-to-end data) (See Sec 5)
+ 4 -- DESTROY (Stop using a circuit) (See Sec 4)
The interpretation of 'Length' and 'Payload' depend on the type of
the cell.
- PADDING: Length is 0; Payload is 248 bytes of 0's.
- CREATE: Length is a value between 1 and 248; the first 'length'
- bytes of payload contain a portion of an onion.
- DATA: Length is a value between 4 and 248; the first 'length'
+ PADDING: Neither field is used.
+ CREATE: Length is 144; the payload contains the first phase of the
+ DH handshake.
+ CREATED: Length is 128; the payload contains the second phase of
+ the DH handshake.
+ RELAY: Length is a value between 8 and 248; the first 'length'
bytes of payload contain useful data.
DESTROY: Neither field is used.
- SENDME: Length encodes a window size, payload is unused.
Unused fields are filled with 0 bytes. The payload is padded with
0 bytes.
@@ -260,17 +258,24 @@ which reveals the downstream node.
CREATE and DESTROY cells are used to manage circuits; see section
4 below.
- DATA cells are used to send commands and data along a circuit; see
+ RELAY cells are used to send commands and data along a circuit; see
section 5 below.
- SENDME cells are used for flow control; see section 6 below.
-
-4. Onions and circuit management
+4. Circuit management
4.1. Setting up circuits
- An onion is a multi-layered structure, with one layer for each node
- in a circuit. Each (unencrypted) layer has the following fields:
+ Users set up circuits incrementally, one hop at a time. To create
+ a new circuit, users send a CREATE cell to the first node, with the
+ first half of the DH handshake; that node responds with a CREATED cell
+ with the second half of the DH handshake. To extend a circuit past
+ the first hop, the user sends an EXTEND relay cell (see section 5)
+ which instructs the last node in the circuit to send a CREATE cell
+ to extend the circuit.
+
+ CREATE cells contain the following:
+
+ [this stuff now wrong; haven't fixed the rest of the file either.]
Version [1 byte]
Port [2 bytes]
@@ -279,8 +284,6 @@ which reveals the downstream node.
Key seed material [16 bytes]
[Total: 27 bytes]
- The value of Version is currently 2.
-
The port and address field denote the IPV4 address and port of
the next onion router in the circuit, or are set to 0 for the
last hop.
@@ -414,9 +417,9 @@ which reveals the downstream node.
Edge nodes process the length and payload fields of DATA cells as
described in section 5 below.
-5. Application connections and topic management
+5. Application connections and stream management
-5.1. Topics and TCP streams
+5.1. Streams
Within a circuit, the OP and the exit node use the contents of DATA
packets to tunnel TCP connections ("Topics") across circuits.