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 std::sync::Arc;
5

            
6
use tor_key_forge::{define_curve25519_keypair, define_ed25519_keypair, define_rsa_keypair};
7

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

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

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

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

            
28
define_curve25519_keypair!(
29
    /// [KP_ntor] Medium-term keypair for the circuit extension handshake. Rotated periodically.
30
    #[derive(Clone)]
31
    pub RelayNtor
32
);
33

            
34
/// The relay’s ntor key set contains both the current key and the previous one, allowing it to
35
/// handle clients or relays that may be using different consensus views.
36
#[derive(Clone)]
37
pub struct RelayNtorKeys {
38
    /// The latest Ntor key.
39
    latest: Arc<RelayNtorKeypair>,
40
    /// The previous Ntor key. First run, not previous key or if expired.
41
    previous: Option<Arc<RelayNtorKeypair>>,
42
}
43

            
44
impl RelayNtorKeys {
45
    /// Constructor.
46
2295
    pub fn new(latest: Arc<RelayNtorKeypair>) -> Self {
47
2295
        Self {
48
2295
            latest,
49
2295
            previous: None,
50
2295
        }
51
2295
    }
52

            
53
    /// Set the previous Ntor key.
54
    pub fn with_previous(mut self, previous: Arc<RelayNtorKeypair>) -> Self {
55
        self.previous = Some(previous);
56
        self
57
    }
58

            
59
    /// Return the latest.
60
969
    pub fn latest(&self) -> &Arc<RelayNtorKeypair> {
61
969
        &self.latest
62
969
    }
63

            
64
    /// Return the previous key, if any.
65
561
    pub fn previous(&self) -> Option<&Arc<RelayNtorKeypair>> {
66
561
        self.previous.as_ref()
67
561
    }
68
}