41 lines
1.2 KiB
Rust
41 lines
1.2 KiB
Rust
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: Option<&[&[u8]]>,
|
|
) -> Result<ClientConfig, Box<dyn Error + Send + Sync + 'static>> {
|
|
if let Some(server_certs) = server_certs {
|
|
let mut certs = rustls::RootCertStore::empty();
|
|
for cert in server_certs {
|
|
certs.add(CertificateDer::from(*cert))?;
|
|
}
|
|
|
|
Ok(ClientConfig::with_root_certificates(Arc::new(certs))?)
|
|
} else {
|
|
Ok(ClientConfig::with_platform_verifier())
|
|
}
|
|
}
|
|
|
|
/// 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: Option<&[&[u8]]>,
|
|
) -> Result<Endpoint, Box<dyn Error + Send + Sync + 'static>> {
|
|
let client_cfg = configure_client(server_certs)?;
|
|
let mut endpoint = Endpoint::client(bind_addr)?;
|
|
endpoint.set_default_client_config(client_cfg);
|
|
Ok(endpoint)
|
|
} |