nodedb_cluster/transport/
auth_context.rs1use crate::rpc_codec::{MacKey, PeerSeqSender, PeerSeqWindow};
12
13use super::credentials::TransportCredentials;
14
15#[derive(Debug)]
17pub struct AuthContext {
18 pub local_node_id: u64,
20 pub mac_key: MacKey,
24 pub peer_seq_out: PeerSeqSender,
28 pub peer_seq_in: PeerSeqWindow,
31}
32
33impl AuthContext {
34 pub fn from_credentials(local_node_id: u64, creds: &TransportCredentials) -> Self {
37 let mac_key = match creds {
38 TransportCredentials::Mtls(tls) => MacKey::from_bytes(tls.cluster_secret),
39 TransportCredentials::Insecure => MacKey::zero(),
40 };
41 Self {
42 local_node_id,
43 mac_key,
44 peer_seq_out: PeerSeqSender::new(),
45 peer_seq_in: PeerSeqWindow::new(),
46 }
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53 use crate::transport::config::TlsCredentials;
54 use rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer};
55
56 fn dummy_tls(secret: [u8; 32]) -> TlsCredentials {
57 TlsCredentials {
58 cert: CertificateDer::from(vec![1, 2, 3]),
59 key: PrivateKeyDer::from(PrivatePkcs8KeyDer::from(vec![4, 5, 6])),
60 ca_cert: CertificateDer::from(vec![7, 8, 9]),
61 additional_ca_certs: Vec::new(),
62 crls: Vec::new(),
63 cluster_secret: secret,
64 spki_pin: [0u8; 32],
65 }
66 }
67
68 #[test]
69 fn insecure_yields_zero_mac_key() {
70 let ctx = AuthContext::from_credentials(1, &TransportCredentials::Insecure);
71 assert!(ctx.mac_key.is_zero());
72 assert_eq!(ctx.local_node_id, 1);
73 }
74
75 #[test]
76 fn mtls_yields_cluster_secret() {
77 let secret = [0xABu8; 32];
78 let ctx = AuthContext::from_credentials(42, &TransportCredentials::Mtls(dummy_tls(secret)));
79 assert!(!ctx.mac_key.is_zero());
80 assert_eq!(ctx.mac_key.as_bytes(), &secret);
81 }
82}