#[derive(Debug, PartialEq)]
pub struct TlsClientConfiguration
{
pub common: TlsCommonConfiguration,
pub tls_maximum_sessions_to_store_in_memory: usize,
pub root_store: Vec<PathBuf>,
pub certificate_chain_and_private_key: Option<CertificateChainAndPrivateKey>,
pub enable_server_name_indication: bool,
pub enable_certificate_transparency_logs: bool,
}
impl TlsClientConfiguration
{
#[inline(always)]
pub fn new(root_store: Vec<PathBuf>, certificate_chain_and_private_key: Option<CertificateChainAndPrivateKey>) -> Self
{
Self
{
common: TlsCommonConfiguration::default(),
tls_maximum_sessions_to_store_in_memory: Self::default_tls_maximum_sessions_to_store_in_memory(),
root_store,
certificate_chain_and_private_key,
enable_server_name_indication: Self::default_enable_server_name_indication(),
enable_certificate_transparency_logs: Self::default_enable_certificate_transparency_logs(),
}
}
#[inline(always)]
pub fn client_configuration(&self) -> Result<Arc<ClientConfig>, TlsClientConfigurationError>
{
let mut client_configuration = ClientConfig::new();
client_configuration.set_protocols(&(self.common.application_layer_protocol_negotiation_protocols.to_rustls_form())[..]);
client_configuration.ciphersuites = self.common.cipher_suites();
client_configuration.set_mtu(&self.common.tls_mtu);
client_configuration.versions = self.common.supported_tls_versions.versions();
client_configuration.root_store = RootCertificateStoreLoadError::root_certificate_store(&self.root_store)?;
if let Some(ref certificate_chain_and_private_key) = self.certificate_chain_and_private_key
{
let (certificate_chain, private_key) = certificate_chain_and_private_key.load_certificate_chain_and_private_key()?;
client_configuration.set_single_client_cert(certificate_chain, private_key);
}
if self.tls_maximum_sessions_to_store_in_memory == 0
{
client_configuration.enable_tickets = false;
client_configuration.set_persistence(Arc::new(NoClientSessionStorage {}));
}
else
{
client_configuration.enable_tickets = true;
client_configuration.set_persistence(ClientSessionMemoryCache::new(self.tls_maximum_sessions_to_store_in_memory));
}
client_configuration.ct_logs = if self.enable_certificate_transparency_logs
{
Some(&GooglesKnownListOfCertificateTransparencyLogs)
}
else
{
None
};
client_configuration.enable_sni = self.enable_server_name_indication;
client_configuration.enable_early_data = false;
Ok(Arc::new(client_configuration))
}
#[inline(always)]
pub(crate) const fn default_tls_maximum_sessions_to_store_in_memory() -> usize
{
32
}
#[inline(always)]
pub(crate) fn default_enable_server_name_indication() -> bool
{
false
}
#[inline(always)]
pub(crate) fn default_enable_certificate_transparency_logs() -> bool
{
true
}
}