diff --git a/src/quic/client.rs b/src/quic/client.rs new file mode 100644 index 0000000..eeb6f12 --- /dev/null +++ b/src/quic/client.rs @@ -0,0 +1,37 @@ +use std::error::Error; +use std::net::SocketAddr; +use std::sync::Arc; +use quinn::{ClientConfig, Endpoint}; +use rustls::pki_types::CertificateDer; + +/// Builds default quinn client config and trusts given certificates. +/// +/// ## Args +/// +/// - server_certs: a list of trusted certificates in DER format. +fn configure_client( + server_certs: &[&[u8]], +) -> Result> { + let mut certs = rustls::RootCertStore::empty(); + for cert in server_certs { + certs.add(CertificateDer::from(*cert))?; + } + + Ok(ClientConfig::with_root_certificates(Arc::new(certs))?) +} + +/// Constructs a QUIC endpoint configured for use a client only. +/// +/// ## Args +/// +/// - server_certs: list of trusted certificates. +#[allow(unused)] +pub fn make_client_endpoint( + bind_addr: SocketAddr, + server_certs: &[&[u8]], +) -> Result> { + let client_cfg = configure_client(server_certs)?; + let mut endpoint = Endpoint::client(bind_addr)?; + endpoint.set_default_client_config(client_cfg); + Ok(endpoint) +} \ No newline at end of file diff --git a/src/quic/mod.rs b/src/quic/mod.rs index 9310323..76c4929 100644 --- a/src/quic/mod.rs +++ b/src/quic/mod.rs @@ -1 +1,2 @@ -mod server; \ No newline at end of file +mod server; +mod client; \ No newline at end of file diff --git a/src/quic/server.rs b/src/quic/server.rs index c825182..4e1a77d 100644 --- a/src/quic/server.rs +++ b/src/quic/server.rs @@ -2,7 +2,6 @@ use std::error::Error; use std::net::SocketAddr; use std::sync::Arc; use quinn::{Endpoint, ServerConfig}; -use rcgen::Certificate; use rustls::pki_types::{CertificateDer, PrivatePkcs8KeyDer}; use rustls::pki_types::pem::PemObject;