use crate::rpc_codec::{MacKey, PeerSeqSender, PeerSeqWindow};
use super::credentials::TransportCredentials;
#[derive(Debug)]
pub struct AuthContext {
pub local_node_id: u64,
pub mac_key: MacKey,
pub peer_seq_out: PeerSeqSender,
pub peer_seq_in: PeerSeqWindow,
}
impl AuthContext {
pub fn from_credentials(local_node_id: u64, creds: &TransportCredentials) -> Self {
let mac_key = match creds {
TransportCredentials::Mtls(tls) => MacKey::from_bytes(tls.cluster_secret),
TransportCredentials::Insecure => MacKey::zero(),
};
Self {
local_node_id,
mac_key,
peer_seq_out: PeerSeqSender::new(),
peer_seq_in: PeerSeqWindow::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::transport::config::TlsCredentials;
use rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer};
fn dummy_tls(secret: [u8; 32]) -> TlsCredentials {
TlsCredentials {
cert: CertificateDer::from(vec![1, 2, 3]),
key: PrivateKeyDer::from(PrivatePkcs8KeyDer::from(vec![4, 5, 6])),
ca_cert: CertificateDer::from(vec![7, 8, 9]),
additional_ca_certs: Vec::new(),
crls: Vec::new(),
cluster_secret: secret,
}
}
#[test]
fn insecure_yields_zero_mac_key() {
let ctx = AuthContext::from_credentials(1, &TransportCredentials::Insecure);
assert!(ctx.mac_key.is_zero());
assert_eq!(ctx.local_node_id, 1);
}
#[test]
fn mtls_yields_cluster_secret() {
let secret = [0xABu8; 32];
let ctx = AuthContext::from_credentials(42, &TransportCredentials::Mtls(dummy_tls(secret)));
assert!(!ctx.mac_key.is_zero());
assert_eq!(ctx.mac_key.as_bytes(), &secret);
}
}