#[derive(Debug, PartialEq)]
pub struct TlsServerConfiguration
{
pub common: TlsCommonConfiguration,
pub tls_maximum_sessions_to_store_in_memory: usize,
pub certificate_chain_and_private_key: CertificateChainAndPrivateKey,
pub client_authentication_configuration: ClientAuthenticationConfiguration,
pub online_certificate_status_protocol_file: Option<PathBuf>,
pub signed_certificate_timestamp_list_file: Option<PathBuf>,
}
impl TlsServerConfiguration
{
#[inline(always)]
pub fn new(certificate_chain_and_private_key: CertificateChainAndPrivateKey, client_authentication_configuration: ClientAuthenticationConfiguration) -> Self
{
Self
{
common: TlsCommonConfiguration::default(),
tls_maximum_sessions_to_store_in_memory: Self::default_tls_maximum_sessions_to_store_in_memory(),
certificate_chain_and_private_key,
client_authentication_configuration,
online_certificate_status_protocol_file: Self::default_online_certificate_status_protocol_file(),
signed_certificate_timestamp_list_file: Self::default_signed_certificate_timestamp_list_file(),
}
}
#[inline(always)]
pub fn server_configuration(&self) -> Result<Arc<ServerConfig>, TlsServerConfigurationError>
{
let mut server_configuration = ServerConfig::new(self.client_authentication_configuration.client_certificate_verifier()?);
server_configuration.set_protocols(&(self.common.application_layer_protocol_negotiation_protocols.to_rustls_form())[..]);
server_configuration.ciphersuites = self.common.cipher_suites();
server_configuration.mtu = self.common.tls_mtu;
server_configuration.versions = self.common.supported_tls_versions.versions();
{
let (certificate_chain, private_key) = self.certificate_chain_and_private_key.load_certificate_chain_and_private_key()?;
let online_certificate_status_protocol = self.load_online_certificate_status_protocol_file()?;
let signed_certificate_timestamp_list = self.load_signed_certificate_timestamp_list_file()?;
server_configuration.set_single_cert_with_ocsp_and_sct(certificate_chain, private_key, online_certificate_status_protocol, signed_certificate_timestamp_list)?;
}
server_configuration.session_storage = if self.tls_maximum_sessions_to_store_in_memory == 0
{
Arc::new(NoServerSessionStorage {})
}
else
{
server_configuration.ticketer = Ticketer::new();
ServerSessionMemoryCache::new(self.tls_maximum_sessions_to_store_in_memory)
};
server_configuration.ignore_client_order = true;
Ok(Arc::new(server_configuration))
}
#[inline(always)]
pub const fn default_tls_maximum_sessions_to_store_in_memory() -> usize
{
256
}
#[inline(always)]
pub fn default_online_certificate_status_protocol_file() -> Option<PathBuf>
{
None
}
#[inline(always)]
pub fn default_signed_certificate_timestamp_list_file() -> Option<PathBuf>
{
None
}
#[inline(always)]
fn load_online_certificate_status_protocol_file(&self) -> Result<Vec<u8>, TlsServerConfigurationError>
{
Self::load_optional_file(&self.online_certificate_status_protocol_file, TlsServerConfigurationError::CouldNotOpenOnlineCertificateStatusProtocolFile, TlsServerConfigurationError::CouldNotReadOnlineCertificateStatusProtocolFile)
}
#[inline(always)]
fn load_signed_certificate_timestamp_list_file(&self) -> Result<Vec<u8>, TlsServerConfigurationError>
{
Self::load_optional_file(&self.signed_certificate_timestamp_list_file, TlsServerConfigurationError::CouldNotOpenSignedCertificateTimestampStatusFile, TlsServerConfigurationError::CouldNotReadSignedCertificateTimestampStatusFile)
}
#[inline(always)]
fn load_optional_file(file_path: &Option<PathBuf>, open_error: impl FnOnce(io::Error) -> TlsServerConfigurationError, read_error: impl FnOnce(io::Error) -> TlsServerConfigurationError) -> Result<Vec<u8>, TlsServerConfigurationError>
{
let mut data = Vec::new();
if let Some(file_path) = file_path.as_ref()
{
let mut file = File::open(file_path).map_err(open_error)?;
file.read_to_end(&mut data).map_err(read_error)?;
}
Ok(data)
}
}