52 releases (breaking)

Uses new Rust 2024

0.42.0 May 7, 2026
0.41.0 Mar 30, 2026
0.40.0 Mar 3, 2026
0.37.0 Dec 2, 2025
0.0.0 Jun 24, 2021

#182 in Cryptography

Download history 3331/week @ 2026-01-24 3886/week @ 2026-01-31 3357/week @ 2026-02-07 3694/week @ 2026-02-14 4246/week @ 2026-02-21 4547/week @ 2026-02-28 7541/week @ 2026-03-07 7853/week @ 2026-03-14 8255/week @ 2026-03-21 5198/week @ 2026-03-28 6729/week @ 2026-04-04 7720/week @ 2026-04-11 10233/week @ 2026-04-18 16271/week @ 2026-04-25 48977/week @ 2026-05-02 26404/week @ 2026-05-09

102,980 downloads per month
Used in 87 crates (8 directly)

MIT/Apache

375KB
5.5K SLoC

tor-cert

Implementation for Tor certificates

Overview

The tor-cert crate implements the binary certificate types documented in Tor's cert-spec.txt, which are used when authenticating Tor channels. (Eventually, support for onion service certificate support will get added too.)

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

There are other types of certificate used by Tor as well, and they are implemented in other places. In particular, see tor-netdoc::doc::authcert for the certificate types used by authorities in the directory protocol.

Design notes

The tor-cert code is in its own separate crate because it is required by several other higher-level crates that do not depend upon each other. For example, tor-netdoc parses encoded certificates from router descriptors, while tor-proto uses certificates when authenticating relays.

Examples

Parsing, validating, and inspecting a certificate:

use base64ct::{Base64, Encoding as _};
use tor_cert::*;
use tor_checkable::*;
// Taken from a random relay on the Tor network.
let cert_base64 =
 "AQQABrntAThPWJ4nFH1L77Ar+emd4GPXZTPUYzIwmR2H6Zod5TvXAQAgBAC+vzqh
  VFO1SGATubxcrZzrsNr+8hrsdZtyGg/Dde/TqaY1FNbeMqtAPMziWOd6txzShER4
  qc/haDk5V45Qfk6kjcKw+k7cPwyJeu+UF/azdoqcszHRnUHRXpiPzudPoA4=";
// Remove the whitespace, so base64 doesn't choke on it.
let cert_base64: String = cert_base64.split_whitespace().collect();
// Decode the base64.
let cert_bin = Base64::decode_vec(&cert_base64).unwrap();

// Decode the cert and check its signature.
let cert = Ed25519Cert::decode(&cert_bin).unwrap()
    .check_key(None).unwrap()
    .check_signature().unwrap()
    .dangerously_assume_timely();
let signed_key = cert.subject_key();

License: MIT OR Apache-2.0

Dependencies

~14–20MB
~373K SLoC