31 releases (20 breaking)

0.20.0 Jun 27, 2024
0.18.0 Apr 30, 2024
0.16.1 Mar 4, 2024
0.14.0 Dec 4, 2023
0.0.0 Jun 24, 2021

#1063 in Network programming

Download history 883/week @ 2024-03-14 1525/week @ 2024-03-21 1030/week @ 2024-03-28 1151/week @ 2024-04-04 974/week @ 2024-04-11 248/week @ 2024-04-18 529/week @ 2024-04-25 352/week @ 2024-05-02 414/week @ 2024-05-09 293/week @ 2024-05-16 845/week @ 2024-05-23 669/week @ 2024-05-30 498/week @ 2024-06-06 1284/week @ 2024-06-13 1285/week @ 2024-06-20 1595/week @ 2024-06-27

4,821 downloads per month
Used in 28 crates (8 directly)


13K SLoC


Coding and decoding for the cell types that make up Tor's protocol


Tor's primary network protocol is oriented around a set of messages called "Cells". They exist at two primary layers of the protocol: the channel-cell layer, and the relay-cell layer.

Channel cells are sent between relays, or between a client and a relay, over a TLS connection. Each of them encodes a single Channel Message. Channel messages can affect the channel itself (such as those used to negotiate and authenticate the channel), but more frequently are used with respect to a given multi-hop circuit.

Channel message that refer to a circuit do so with a channel-local identifier called a Circuit ID. These messages include CREATE2 (used to extend a circuit to a first hop) and DESTROY (used to tear down a circuit). But the most frequently used channel message is RELAY, which is used to send a message to a given hop along a circuit.

Each RELAY cell is encrypted and decrypted (according to protocols not implemented in this crate) until it reaches its target. When it does, it is decoded into a single Relay Message. Some of these relay messages are used to manipulate circuits (e.g., by extending the circuit to a new hop); others are used to manipulate anonymous data-streams (by creating them, ending them, or sending data); and still others are used for protocol-specific purposes (like negotiating with an onion service.)

For a list of most of the cell types used in Tor, see tor-spec.txt. Other cell types are defined in rend-spec-v3.txt (for onion services) and padding-spec.txt (for padding negotiation).

This crate is part of Arti, a project to implement Tor in Rust.

License: MIT OR Apache-2.0


~481K SLoC