use super::*;
pub fn build_server_tls_config(
tls: &TlsConfig,
alpn: &[u8],
versions: &[&'static SupportedProtocolVersion],
) -> Result<Arc<TlsServerConfig>, Box<ServerError>> {
let certificate_chain: Vec<CertificateDer<'static>> =
CertificateDer::pem_file_iter(tls.get_certificate_path())
.map_err(|error: pem::Error| ServerError::Tls(tls_error_string(&error)))?
.collect::<Result<Vec<CertificateDer<'static>>, pem::Error>>()
.map_err(|error: pem::Error| ServerError::Tls(tls_error_string(&error)))?;
let private_key: PrivateKeyDer<'static> =
PrivateKeyDer::from_pem_file(tls.get_private_key_path())
.map_err(|error: pem::Error| ServerError::Tls(tls_error_string(&error)))?;
let mut server_config: TlsServerConfig =
TlsServerConfig::builder_with_provider(Arc::new(rustls::crypto::ring::default_provider()))
.with_protocol_versions(versions)
.map_err(|error: TlsError| Box::new(ServerError::Tls(error.to_string())))?
.with_no_client_auth()
.with_single_cert(certificate_chain, private_key)
.map_err(|error: TlsError| Box::new(ServerError::Tls(error.to_string())))?;
server_config.alpn_protocols = vec![alpn.to_vec()];
Ok(Arc::new(server_config))
}
pub fn build_stream_tls_config(
tls: &TlsConfig,
protocol: &ServerProtocol,
) -> Result<Arc<TlsServerConfig>, Box<ServerError>> {
let versions: &[&'static SupportedProtocolVersion] =
&[&rustls::version::TLS13, &rustls::version::TLS12];
build_server_tls_config(tls, protocol.get_alpn_protocol(), versions)
}
pub fn build_quic_tls_config(tls: &TlsConfig) -> Result<Arc<TlsServerConfig>, Box<ServerError>> {
let versions: &[&'static SupportedProtocolVersion] = &[&rustls::version::TLS13];
build_server_tls_config(tls, ServerProtocol::Http3.get_alpn_protocol(), versions)
}
fn tls_error_string(error: &pem::Error) -> String {
format!("{error}")
}