#tor #arti


Implementation for Tor's subprotocol versioning

17 unstable releases (5 breaking)

0.5.4 Sep 5, 2023
0.5.2 Jun 30, 2023
0.4.2 Mar 31, 2023
0.4.0 Nov 30, 2022
0.0.0 Jun 24, 2021

#1719 in Network programming

Download history 136/week @ 2023-06-08 407/week @ 2023-06-15 288/week @ 2023-06-22 424/week @ 2023-06-29 540/week @ 2023-07-06 217/week @ 2023-07-13 288/week @ 2023-07-20 327/week @ 2023-07-27 255/week @ 2023-08-03 252/week @ 2023-08-10 246/week @ 2023-08-17 261/week @ 2023-08-24 323/week @ 2023-08-31 295/week @ 2023-09-07 249/week @ 2023-09-14 133/week @ 2023-09-21

1,038 downloads per month
Used in 25 crates (5 directly)


470 lines


Implementation of Tor's "subprotocol versioning" feature.


The Tor system is built out of numerous "subprotocols" that are versioned more or less independently. The tor-protover crate implements parsing and handling for these subprotocol versions, so that different Tor instances know which parts of the protocol they support.

Subprotocol versions are also used to determine which versions of the protocol are required to connect to the network (or just recommended).

For more details, see tor-spec.txt section 9.

This crate is part of Arti, a project to implement Tor in Rust. It's unlikely to be of general interest unless you are writing a Tor implementation, or a program that needs to examine fine-grained details of the Tor network.

Design notes

We're giving tor-protover its own crate within arti because it needs to be used to multiple higher level crates that do not themselves depend on one another. (For example, tor-proto needs to know which variant of a subprotocol can be used with a given relay, whereas tor-netdoc needs to parse lists of subprotocol versions from directory documents. Eventually, arti-client will need to check its own list of supported protocols against the required list in the consensus.)

License: MIT OR Apache-2.0


~21K SLoC