use std::sync::OnceLock;
use rustls::pki_types::CertificateDer;
const SEED1_PEM: &[u8] = include_bytes!("seed_certs/seed1.pem");
const SEED2_PEM: &[u8] = include_bytes!("seed_certs/seed2.pem");
const SEED3_PEM: &[u8] = include_bytes!("seed_certs/seed3.pem");
const SEED_HOSTS: &[&str] = &[
"seed1.getsession.org",
"seed2.getsession.org",
"seed3.getsession.org",
];
pub fn is_seed_host(host: &str) -> bool {
let h = host.trim().to_ascii_lowercase();
SEED_HOSTS.iter().any(|s| *s == h)
}
pub fn pinned_certs() -> &'static [CertificateDer<'static>] {
static CELL: OnceLock<Vec<CertificateDer<'static>>> = OnceLock::new();
CELL.get_or_init(|| {
let mut out = Vec::with_capacity(3);
for pem in [SEED1_PEM, SEED2_PEM, SEED3_PEM] {
let mut cursor = std::io::Cursor::new(pem);
for item in rustls_pemfile::certs(&mut cursor) {
let der = item.expect("bundled seed PEM must be valid");
out.push(der);
}
}
assert_eq!(
out.len(),
3,
"expected exactly 3 bundled seed certs, got {}",
out.len()
);
out
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_three_pems_parse() {
let certs = pinned_certs();
assert_eq!(certs.len(), 3);
for c in certs {
assert!(!c.as_ref().is_empty());
assert!(c.as_ref().len() > 200);
}
assert_ne!(certs[0].as_ref(), certs[1].as_ref());
assert_ne!(certs[1].as_ref(), certs[2].as_ref());
assert_ne!(certs[0].as_ref(), certs[2].as_ref());
}
#[test]
fn test_is_seed_host_matches_exact() {
assert!(is_seed_host("seed1.getsession.org"));
assert!(is_seed_host("seed2.getsession.org"));
assert!(is_seed_host("seed3.getsession.org"));
}
#[test]
fn test_is_seed_host_is_case_insensitive() {
assert!(is_seed_host("SEED1.GetSession.org"));
assert!(is_seed_host("Seed2.getsession.ORG"));
}
#[test]
fn test_is_seed_host_rejects_other_hosts() {
assert!(!is_seed_host("getsession.org"));
assert!(!is_seed_host("seed4.getsession.org"));
assert!(!is_seed_host("seed1.getsession.org.evil.example"));
assert!(!is_seed_host("evil.example"));
assert!(!is_seed_host(""));
}
#[test]
fn test_is_seed_host_trims_whitespace() {
assert!(is_seed_host(" seed1.getsession.org "));
}
}