#![allow(dead_code)]
#[cfg(feature = "db-fdb")]
pub mod database;
pub mod network;
#[cfg(any(
feature = "stm-udp-receiver",
feature = "stm-udp-sender",
feature = "stm-webrtc-sender"
))]
pub mod stream;
#[cfg(any(feature = "rt-may", feature = "net-h1-server"))]
pub fn init_global_poller(num_of_workers: usize, stack_size: usize) {
may::config()
.set_workers(num_of_workers)
.set_stack_size(stack_size);
#[cfg(feature = "net-h1-server")]
crate::network::http::date::start_date_ticker();
}
#[cfg(feature = "mtls")]
static INIT: std::sync::Once = std::sync::Once::new();
#[cfg(feature = "mtls")]
#[derive(Debug, Clone)]
pub struct MtlsIdentity {
pub ca_cert_pem: String,
pub server_cert_pem: String,
pub server_key_pem: String,
pub client_cert_pem: Option<String>,
pub client_key_pem: Option<String>,
}
#[cfg(feature = "mtls")]
impl MtlsIdentity {
pub fn generate(
extra_dns_sans: &[&str],
extra_ip_sans: &[&str],
issue_client_cert: bool,
) -> Self {
use rcgen::{
BasicConstraints, CertificateParams, DistinguishedName, DnType,
ExtendedKeyUsagePurpose, IsCa, Issuer, KeyPair, KeyUsagePurpose, SanType,
};
INIT.call_once(|| {
rustls::crypto::CryptoProvider::install_default(
rustls::crypto::aws_lc_rs::default_provider(),
)
.expect("install aws-lc-rs");
});
let mut ca_dn = DistinguishedName::new();
ca_dn.push(DnType::CountryName, "AE");
ca_dn.push(DnType::OrganizationName, "Sib");
ca_dn.push(DnType::CommonName, "Sib Local Root CA");
let mut ca_params = CertificateParams::new(Vec::<String>::new()).expect("create CA params");
ca_params.distinguished_name = ca_dn;
ca_params.is_ca = IsCa::Ca(BasicConstraints::Unconstrained);
ca_params.key_usages = vec![
KeyUsagePurpose::KeyCertSign,
KeyUsagePurpose::CrlSign,
KeyUsagePurpose::DigitalSignature,
];
let ca_key = KeyPair::generate().expect("generate CA keypair");
let ca_cert = ca_params.self_signed(&ca_key).expect("self-sign CA");
let ca_cert_pem = ca_cert.pem();
let ca_issuer = Issuer::new(ca_params, ca_key);
let mut server_dn = DistinguishedName::new();
server_dn.push(DnType::CountryName, "AE");
server_dn.push(DnType::OrganizationName, "Sib");
server_dn.push(DnType::CommonName, "sib-server");
let mut server_params =
CertificateParams::new(Vec::<String>::new()).expect("create server params");
server_params.distinguished_name = server_dn;
let mut sans: Vec<SanType> = Vec::new();
sans.push(SanType::DnsName("localhost".try_into().unwrap()));
sans.push(SanType::IpAddress("127.0.0.1".parse().unwrap()));
sans.push(SanType::IpAddress("::1".parse().unwrap()));
for d in extra_dns_sans {
if !d.is_empty() {
sans.push(SanType::DnsName((*d).try_into().unwrap()));
}
}
for ip in extra_ip_sans {
if !ip.is_empty() {
sans.push(SanType::IpAddress(ip.parse().expect("invalid IP SAN")));
}
}
server_params.subject_alt_names = sans;
server_params.extended_key_usages = vec![ExtendedKeyUsagePurpose::ServerAuth];
server_params.key_usages = vec![
KeyUsagePurpose::DigitalSignature,
KeyUsagePurpose::KeyEncipherment,
];
server_params.is_ca = IsCa::NoCa;
let server_key = KeyPair::generate().expect("generate server keypair");
let server_cert = server_params
.signed_by(&server_key, &ca_issuer)
.expect("sign server cert");
let server_cert_pem = server_cert.pem();
let server_key_pem = server_key.serialize_pem();
let (client_cert_pem, client_key_pem) = if issue_client_cert {
let mut client_dn = DistinguishedName::new();
client_dn.push(DnType::CountryName, "AE");
client_dn.push(DnType::OrganizationName, "Sib");
client_dn.push(DnType::CommonName, "sib-client");
let mut client_params =
CertificateParams::new(Vec::<String>::new()).expect("create client params");
client_params.distinguished_name = client_dn;
client_params.subject_alt_names =
vec![SanType::DnsName("sib-client".try_into().unwrap())];
client_params.extended_key_usages = vec![ExtendedKeyUsagePurpose::ClientAuth];
client_params.key_usages = vec![
KeyUsagePurpose::DigitalSignature,
KeyUsagePurpose::KeyEncipherment,
];
client_params.is_ca = IsCa::NoCa;
let client_key = KeyPair::generate().expect("generate client keypair");
let client_cert = client_params
.signed_by(&client_key, &ca_issuer)
.expect("sign client cert");
(Some(client_cert.pem()), Some(client_key.serialize_pem()))
} else {
(None, None)
};
Self {
ca_cert_pem,
server_cert_pem,
server_key_pem,
client_cert_pem,
client_key_pem,
}
}
}