use std::{sync::Arc, time::Duration};
use quinn::{ClientConfig, IdleTimeout, ServerConfig, TransportConfig, VarInt};
use rcgen::RcgenError;
use rustls::{Certificate, ClientConfig as CryptoClientConfig};
use crate::error::SetupError;
use crate::network::cert_verifier::PassThroughCertVerifier;
#[cfg(not(test))]
const MAX_IDLE_TIMEOUT: u32 = 10_000; #[cfg(test)]
const MAX_IDLE_TIMEOUT: u32 = 0; const KEEP_ALIVE_INTERVAL: u64 = 3_000; pub(crate) const SERVER_NAME: &str = "otter.cash";
pub fn build_configs() -> Result<(ClientConfig, ServerConfig), SetupError> {
let mut transport_config = TransportConfig::default();
transport_config.max_idle_timeout(Some(IdleTimeout::from(VarInt::from_u32(MAX_IDLE_TIMEOUT))));
transport_config.keep_alive_interval(Some(Duration::from_millis(KEEP_ALIVE_INTERVAL)));
let transport: Arc<TransportConfig> = Arc::new(transport_config);
let (cert, key) = generate_cert().map_err(|_| SetupError::KeygenError)?;
let mut roots = rustls::RootCertStore::empty();
roots.add(&cert).map_err(|_| SetupError::ServerSetupError)?;
let mut client_crypto_config = CryptoClientConfig::builder()
.with_safe_defaults()
.with_root_certificates(roots)
.with_no_client_auth();
client_crypto_config
.dangerous()
.set_certificate_verifier(Arc::new(PassThroughCertVerifier::new()));
let mut client_config = ClientConfig::new(Arc::new(client_crypto_config));
client_config.transport_config(transport.clone());
let mut server_config = ServerConfig::with_single_cert(vec![cert], key)
.map_err(|_| SetupError::ServerSetupError)?;
server_config.transport = transport;
Ok((client_config, server_config))
}
fn generate_cert() -> Result<(Certificate, rustls::PrivateKey), RcgenError> {
let cert = rcgen::generate_simple_self_signed(vec![SERVER_NAME.to_string()])?;
let key = cert.serialize_private_key_der();
let cert = cert.serialize_der().unwrap();
let key = rustls::PrivateKey(key);
let cert = Certificate(cert);
Ok((cert, key))
}