|
@@ -222,7 +222,7 @@ which reveals the downstream node.
|
|
|
|
|
|
3. Cell Packet format
|
|
|
|
|
|
- The basic unit of communication between onion routers and onion
|
|
|
+ The basic unit of communication for onion routers and onion
|
|
|
proxies is a fixed-width "Cell." Each Cell contains the following
|
|
|
fields:
|
|
|
|
|
@@ -242,10 +242,10 @@ which reveals the downstream node.
|
|
|
|
|
|
The interpretation of 'Length' and 'Payload' depend on the type of
|
|
|
the cell.
|
|
|
- PADDING: Length is 0; Payload is 128 bytes of 0's.
|
|
|
+ PADDING: Length is 0; Payload is 120 bytes of 0's.
|
|
|
CREATE: Length is a value between 1 and 120; the first 'length'
|
|
|
- bytes or payload contain a portion of an onion.
|
|
|
- DATA: Length is a value between 4 [5?] and 120; the first 'length'
|
|
|
+ bytes of payload contain a portion of an onion.
|
|
|
+ DATA: Length is a value between 4 and 120; the first 'length'
|
|
|
bytes of payload contain useful data.
|
|
|
DESTROY: Neither field is used.
|
|
|
SENDME: Length encodes a window size, payload is unused.
|
|
@@ -281,10 +281,12 @@ which reveals the downstream node.
|
|
|
Key seed material [16 bytes]
|
|
|
[Total: 28 bytes]
|
|
|
|
|
|
+ The value of Version is currently 2.
|
|
|
+
|
|
|
The forward and backward ciphers fields can take the following values:
|
|
|
0: Identity
|
|
|
1: Single DES in OFB
|
|
|
- 2: RC4
|
|
|
+ 2: RC4
|
|
|
|
|
|
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
|
|
@@ -294,8 +296,6 @@ which reveals the downstream node.
|
|
|
Jan 1970); by default, it is set to the current time plus one
|
|
|
day.
|
|
|
|
|
|
- The value of OR_VERSION is currently 2.
|
|
|
-
|
|
|
When constructing an onion to create a circuit from OR_1,
|
|
|
OR_2... OR_N, the onion creator performs the following steps:
|
|
|
|
|
@@ -305,7 +305,7 @@ which reveals the downstream node.
|
|
|
|
|
|
A. Create an onion layer L, setting Version=2,
|
|
|
BackCipher=DES/OFB(1), ForwardCipher=DES/OFB(2),
|
|
|
- ExpirationTime=now + 1 day, and Seed=16 random bytes.
|
|
|
+ ExpirationTime=now + 1 day, and Seed=16 random bytes.
|
|
|
|
|
|
If I=N, set Port=Address=0. Else, set Port and Address to
|
|
|
the IPV4 port and address of OR_{I+1}.
|
|
@@ -330,7 +330,8 @@ which reveals the downstream node.
|
|
|
|
|
|
2. Choose an ACI not already in use on the connection with the
|
|
|
first router in the chain. If our address/port pair is
|
|
|
- numerically higher than the
|
|
|
+ numerically higher than the address/port pair of the other
|
|
|
+ side, then let the high bit of the ACI be 1, else 0.
|
|
|
|
|
|
3. To send M over the wire, prepend a 4-byte integer containing
|
|
|
Len(M). Call the result M'. Let N=ceil(Len(M')/120).
|
|
@@ -350,9 +351,9 @@ which reveals the downstream node.
|
|
|
with this ACI, drop the cell.
|
|
|
|
|
|
Otherwise, if we have no circuit along this connection with
|
|
|
- this ACI, let L = the integer value of the first 4 bytes of
|
|
|
+ this ACI, let L = the integer value of the first 4 bytes of
|
|
|
the payload. Create a half-open circuit with this ACI, and
|
|
|
- begin queueing CREATE cells for this circuit.
|
|
|
+ begin queueing CREATE cells for this circuit.
|
|
|
|
|
|
Otherwise, we have a half-open circuit. If the total
|
|
|
payload length of the CREATE cells for this circuit is at
|
|
@@ -362,15 +363,14 @@ which reveals the downstream node.
|
|
|
2. Once we have a complete onion, decrypt the first 128 bytes
|
|
|
of the onion with this OR's RSA private key, and extract
|
|
|
the outmost onion layer. If the version, back cipher, or
|
|
|
- forward cipher is unrecognized, drop the onion [XXXX then
|
|
|
- what? -NM]. If the expiration time is in the past, then
|
|
|
- drop the onion [XXXX then what? -NM].
|
|
|
+ forward cipher is unrecognized, or the expiration time is
|
|
|
+ in the past, then tear down the circuit (see section 4.2).
|
|
|
|
|
|
Compute K1 through K3 as above. Use K1 to decrypt the rest
|
|
|
of the onion using DES/OFB.
|
|
|
|
|
|
If we are not the exit node, remove the first layer from the
|
|
|
- decrypted onion, and send it the remainder to the next OR
|
|
|
+ decrypted onion, and send the remainder to the next OR
|
|
|
on the circuit, as specified above. (Note that we'll
|
|
|
choose a different ACI for this circuit on the connection
|
|
|
with the next OR.)
|
|
@@ -382,16 +382,17 @@ which reveals the downstream node.
|
|
|
4.2. Tearing down circuits
|
|
|
|
|
|
Circuits are torn down when an unrecoverable error occurs along
|
|
|
- the circuit, when all topics on a circuit are closed and the
|
|
|
- circuit's intended lifetime is over, or when (.... ?).
|
|
|
+ the circuit, or when all topics on a circuit are closed and the
|
|
|
+ circuit's intended lifetime is over.
|
|
|
|
|
|
To tear down a circuit, an OR or OP sends a DESTROY cell with that
|
|
|
- circuit's ACI to every adjacent node on that circuit.
|
|
|
+ direction's ACI to the adjacent nodes on that circuit.
|
|
|
|
|
|
Upon receiving a DESTROY cell, an OR frees resources associated
|
|
|
- with the corresponding circuit, and (if not the start or end of the
|
|
|
- circuit) sends a DESTROY cell for that circuit to the next OR in
|
|
|
- the circuit.
|
|
|
+ with the corresponding circuit. If it's not the start or end of the
|
|
|
+ circuit, it sends a DESTROY cell for that circuit to the next OR in
|
|
|
+ the circuit. If the node is the start or end of the circuit, then
|
|
|
+ it tears down any associated edge connections (see section 5.1).
|
|
|
|
|
|
After a DESTROY cell has been processed, an OR ignores all data or
|
|
|
destroy cells for the corresponding circuit.
|
|
@@ -402,24 +403,24 @@ which reveals the downstream node.
|
|
|
determines whether it has a corresponding circuit along that
|
|
|
connection. If not, the OR drops the DATA cell.
|
|
|
|
|
|
- Otherwise, if the OR is not at the edge of the circuit, it
|
|
|
- de/encrypts the length field and the payload with DES/OFB, as
|
|
|
- follows:
|
|
|
+ Otherwise, if the OR is not at the OP edge of the circuit (that is,
|
|
|
+ either an 'exit node' or a non-edge node), it de/encrypts the length
|
|
|
+ field and the payload with DES/OFB, as follows:
|
|
|
'Forward' data cell (same direction as onion):
|
|
|
Use K2 as key; encrypt.
|
|
|
'Back' data cell (opposite direction from onion):
|
|
|
Use K3 as key; decrypt.
|
|
|
|
|
|
- Otherwise, the OR is at the edge of the circuit, and it generates
|
|
|
- and processes the length and payload fields of DATA cells as
|
|
|
- described in section 5 below. (To encrypt or decrypt DATA cells,
|
|
|
- the OP node de/encrypts the length and payload fields with DES/OFB as
|
|
|
+ Otherwise, if the data cell has arrived to the OP edge of the circuit,
|
|
|
+ the OP de/encrypts the length and payload fields with DES/OFB as
|
|
|
follows:
|
|
|
OP sends data cell:
|
|
|
- For I=1...N, decrypt with K2_I.
|
|
|
+ For I=1...N, decrypt with K2_I.
|
|
|
OP receives data cell:
|
|
|
- For I=N...1, encrypt with K3_I
|
|
|
- )
|
|
|
+ For I=N...1, encrypt with K3_I.
|
|
|
+
|
|
|
+ Edge nodes process the length and payload fields of DATA cells as
|
|
|
+ described in section 5 below.
|
|
|
|
|
|
5. Application connections and topic management
|
|
|
|
|
@@ -432,14 +433,14 @@ which reveals the downstream node.
|
|
|
The first 4 bytes of each data cell are reserved as follows:
|
|
|
Topic command [1 byte]
|
|
|
Unused, set to 0. [1 byte]
|
|
|
- Topic ID [2 bytes]
|
|
|
+ Topic ID [2 bytes]
|
|
|
|
|
|
The recognized topic commands are:
|
|
|
1 -- TOPIC_BEGIN
|
|
|
- 2 -- TOPIC_DATA
|
|
|
- 3 -- TOPIC_END
|
|
|
- 4 -- TOPIC_CONNECTED
|
|
|
- 5 -- TOPIC_SENDME
|
|
|
+ 2 -- TOPIC_DATA
|
|
|
+ 3 -- TOPIC_END
|
|
|
+ 4 -- TOPIC_CONNECTED
|
|
|
+ 5 -- TOPIC_SENDME
|
|
|
|
|
|
All DATA cells pertaining to the same tunneled connection have the
|
|
|
same topic ID.
|
|
@@ -447,7 +448,7 @@ which reveals the downstream node.
|
|
|
To create a new anonymized TCP connection, the OP sends a
|
|
|
TOPIC_BEGIN data cell with a payload encoding the address and port
|
|
|
of the destination host. The payload format is:
|
|
|
- ADDRESS ',' PORT '\000'
|
|
|
+ ADDRESS | ',' | PORT | '\000'
|
|
|
where ADDRESS may be a DNS hostname, or an IPv4 address in
|
|
|
dotted-quad format; and where PORT is encoded in decimal.
|
|
|
|
|
@@ -502,7 +503,7 @@ which reveals the downstream node.
|
|
|
how many cells it is allowed to send to the next hop in the circuit
|
|
|
before queueing cells. This 'window' value is initially set to
|
|
|
1000 cells in each direction. Each edge node on a circuit sends a
|
|
|
- SENDME cell (with length=100) every time it has receives 100 cells
|
|
|
+ SENDME cell (with length=100) every time it has received 100 cells
|
|
|
on the circuit. When a node receives a SENDME cell for a circuit,
|
|
|
it increases the circuit's window in the corresponding by the value
|
|
|
of the cell's length field, and (if not an edge node) passes an
|