use crate::anchors;
use crate::builder::{ConfigBuilder, WantsVerifier};
use crate::client::handy;
use crate::client::{ClientConfig, ResolvesClientCert};
use crate::error::Error;
use crate::key;
use crate::keylog::NoKeyLog;
use crate::kx::SupportedKxGroup;
use crate::suites::SupportedCipherSuite;
use crate::verify;
use crate::versions;
use std::marker::PhantomData;
use std::sync::Arc;
impl ConfigBuilder<ClientConfig, WantsVerifier> {
pub fn with_root_certificates(
self,
root_store: anchors::RootCertStore,
ct_logs: &'static [&'static sct::Log],
) -> ConfigBuilder<ClientConfig, WantsClientCert> {
let verifier = Arc::new(verify::WebPkiVerifier::new(root_store, ct_logs));
ConfigBuilder {
state: WantsClientCert {
cipher_suites: self.state.cipher_suites,
kx_groups: self.state.kx_groups,
versions: self.state.versions,
verifier,
},
side: PhantomData::default(),
}
}
#[cfg(feature = "dangerous_configuration")]
pub fn with_custom_certificate_verifier(
self,
verifier: Arc<dyn verify::ServerCertVerifier>,
) -> ConfigBuilder<ClientConfig, WantsClientCert> {
ConfigBuilder {
state: WantsClientCert {
cipher_suites: self.state.cipher_suites,
kx_groups: self.state.kx_groups,
versions: self.state.versions,
verifier,
},
side: PhantomData::default(),
}
}
}
pub struct WantsClientCert {
cipher_suites: Vec<SupportedCipherSuite>,
kx_groups: Vec<&'static SupportedKxGroup>,
versions: versions::EnabledVersions,
verifier: Arc<dyn verify::ServerCertVerifier>,
}
impl ConfigBuilder<ClientConfig, WantsClientCert> {
pub fn with_single_cert(
self,
cert_chain: Vec<key::Certificate>,
key_der: key::PrivateKey,
) -> Result<ClientConfig, Error> {
let resolver = handy::AlwaysResolvesClientCert::new(cert_chain, &key_der)?;
Ok(self.with_client_cert_resolver(Arc::new(resolver)))
}
pub fn with_no_client_auth(self) -> ClientConfig {
self.with_client_cert_resolver(Arc::new(handy::FailResolveClientCert {}))
}
pub fn with_client_cert_resolver(
self,
client_auth_cert_resolver: Arc<dyn ResolvesClientCert>,
) -> ClientConfig {
ClientConfig {
cipher_suites: self.state.cipher_suites,
kx_groups: self.state.kx_groups,
alpn_protocols: Vec::new(),
session_storage: handy::ClientSessionMemoryCache::new(256),
max_fragment_size: None,
client_auth_cert_resolver,
enable_tickets: true,
versions: self.state.versions,
enable_sni: true,
verifier: self.state.verifier,
key_log: Arc::new(NoKeyLog {}),
enable_early_data: false,
}
}
}