tor_relay_crypto/pk.rs
1//! This module is where all relay related keys are declared along their key specifier for the
2//! KeyMgr so some of them can be stored on disk.
3
4use tor_key_forge::{define_curve25519_keypair, define_ed25519_keypair, define_rsa_keypair};
5
6define_ed25519_keypair!(
7 /// [KP_relayid_ed] Long-term identity keypair. Never rotates.
8 pub RelayIdentity
9);
10
11define_rsa_keypair!(
12 /// [KP_relayid_rsa] Legacy RSA long-term identity keypair. Never rotates.
13 pub RelayIdentityRsa
14);
15
16define_ed25519_keypair!(
17 /// [KP_relaysign_ed] Medium-term signing keypair. Rotated periodically.
18 pub RelaySigning
19);
20
21define_ed25519_keypair!(
22 /// [KP_link_ed] Short-term signing keypair for link authentication. Rotated frequently.
23 pub RelayLinkSigning
24);
25
26define_curve25519_keypair!(
27 /// [KP_ntor] Medium-term keypair for the circuit extension handshake. Rotated periodically.
28 #[derive(Clone)]
29 pub RelayNtor
30);
31
32/// The relay’s ntor key set contains both the current key and the previous one, allowing it to
33/// handle clients or relays that may be using different consensus views.
34#[derive(Clone)]
35pub struct RelayNtorKeys {
36 /// The latest Ntor key.
37 latest: RelayNtorKeypair,
38 /// The previous Ntor key. First run, not previous key or if expired.
39 previous: Option<RelayNtorKeypair>,
40}
41
42impl RelayNtorKeys {
43 /// Constructor.
44 pub fn new(latest: RelayNtorKeypair) -> Self {
45 Self {
46 latest,
47 previous: None,
48 }
49 }
50
51 /// Set the previous Ntor key.
52 pub fn with_previous(mut self, previous: RelayNtorKeypair) -> Self {
53 self.previous = Some(previous);
54 self
55 }
56
57 /// Return the latest.
58 pub fn latest(&self) -> &RelayNtorKeypair {
59 &self.latest
60 }
61
62 /// Return the previous key, if any.
63 pub fn previous(&self) -> Option<&RelayNtorKeypair> {
64 self.previous.as_ref()
65 }
66}