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

            
4
use tor_key_forge::{define_curve25519_keypair, define_ed25519_keypair, define_rsa_keypair};
5

            
6
define_ed25519_keypair!(
7
    /// [KP_relayid_ed] Long-term identity keypair. Never rotates.
8
    pub RelayIdentity
9
);
10

            
11
define_rsa_keypair!(
12
    /// [KP_relayid_rsa] Legacy RSA long-term identity keypair. Never rotates.
13
    pub RelayIdentityRsa
14
);
15

            
16
define_ed25519_keypair!(
17
    /// [KP_relaysign_ed] Medium-term signing keypair. Rotated periodically.
18
    pub RelaySigning
19
);
20

            
21
define_ed25519_keypair!(
22
    /// [KP_link_ed] Short-term signing keypair for link authentication. Rotated frequently.
23
    pub RelayLinkSigning
24
);
25

            
26
define_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)]
35
pub 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

            
42
impl RelayNtorKeys {
43
    /// Constructor.
44
572
    pub fn new(latest: RelayNtorKeypair) -> Self {
45
572
        Self {
46
572
            latest,
47
572
            previous: None,
48
572
        }
49
572
    }
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
}