rustls_jls/client/
builder.rs1use alloc::vec::Vec;
2use core::marker::PhantomData;
3
4use pki_types::{CertificateDer, PrivateKeyDer};
5
6use super::client_conn::Resumption;
7use crate::builder::{ConfigBuilder, WantsVerifier};
8use crate::client::{ClientConfig, EchMode, ResolvesClientCert, handy};
9use crate::error::Error;
10use crate::key_log::NoKeyLog;
11use crate::sign::{CertifiedKey, SingleCertAndKey};
12use crate::sync::Arc;
13use crate::versions::TLS13;
14use crate::webpki::{self, WebPkiServerVerifier};
15use crate::{WantsVersions, compress, verify, versions};
16
17use crate::jls::JlsConfig;
18
19impl ConfigBuilder<ClientConfig, WantsVersions> {
20 pub fn with_ech(
30 self,
31 mode: EchMode,
32 ) -> Result<ConfigBuilder<ClientConfig, WantsVerifier>, Error> {
33 let mut res = self.with_protocol_versions(&[&TLS13][..])?;
34 res.state.client_ech_mode = Some(mode);
35 Ok(res)
36 }
37}
38
39impl ConfigBuilder<ClientConfig, WantsVerifier> {
40 pub fn with_root_certificates(
54 self,
55 root_store: impl Into<Arc<webpki::RootCertStore>>,
56 ) -> ConfigBuilder<ClientConfig, WantsClientCert> {
57 let algorithms = self
58 .provider
59 .signature_verification_algorithms;
60 self.with_webpki_verifier(
61 WebPkiServerVerifier::new_without_revocation(root_store, algorithms).into(),
62 )
63 }
64
65 pub fn with_webpki_verifier(
70 self,
71 verifier: Arc<WebPkiServerVerifier>,
72 ) -> ConfigBuilder<ClientConfig, WantsClientCert> {
73 ConfigBuilder {
74 state: WantsClientCert {
75 versions: self.state.versions,
76 verifier,
77 client_ech_mode: self.state.client_ech_mode,
78 },
79 provider: self.provider,
80 time_provider: self.time_provider,
81 side: PhantomData,
82 }
83 }
84
85 pub fn dangerous(self) -> danger::DangerousClientConfigBuilder {
88 danger::DangerousClientConfigBuilder { cfg: self }
89 }
90}
91
92pub(super) mod danger {
94 use core::marker::PhantomData;
95
96 use crate::client::WantsClientCert;
97 use crate::sync::Arc;
98 use crate::{ClientConfig, ConfigBuilder, WantsVerifier, verify};
99
100 #[derive(Debug)]
102 pub struct DangerousClientConfigBuilder {
103 pub cfg: ConfigBuilder<ClientConfig, WantsVerifier>,
105 }
106
107 impl DangerousClientConfigBuilder {
108 pub fn with_custom_certificate_verifier(
110 self,
111 verifier: Arc<dyn verify::ServerCertVerifier>,
112 ) -> ConfigBuilder<ClientConfig, WantsClientCert> {
113 ConfigBuilder {
114 state: WantsClientCert {
115 versions: self.cfg.state.versions,
116 verifier,
117 client_ech_mode: self.cfg.state.client_ech_mode,
118 },
119 provider: self.cfg.provider,
120 time_provider: self.cfg.time_provider,
121 side: PhantomData,
122 }
123 }
124 }
125}
126
127#[derive(Clone)]
132pub struct WantsClientCert {
133 versions: versions::EnabledVersions,
134 verifier: Arc<dyn verify::ServerCertVerifier>,
135 client_ech_mode: Option<EchMode>,
136}
137
138impl ConfigBuilder<ClientConfig, WantsClientCert> {
139 pub fn with_client_auth_cert(
149 self,
150 cert_chain: Vec<CertificateDer<'static>>,
151 key_der: PrivateKeyDer<'static>,
152 ) -> Result<ClientConfig, Error> {
153 let certified_key = CertifiedKey::from_der(cert_chain, key_der, &self.provider)?;
154 Ok(self.with_client_cert_resolver(Arc::new(SingleCertAndKey::from(certified_key))))
155 }
156
157 pub fn with_no_client_auth(self) -> ClientConfig {
159 self.with_client_cert_resolver(Arc::new(handy::FailResolveClientCert {}))
160 }
161
162 pub fn with_client_cert_resolver(
164 self,
165 client_auth_cert_resolver: Arc<dyn ResolvesClientCert>,
166 ) -> ClientConfig {
167 ClientConfig {
168 provider: self.provider,
169 alpn_protocols: Vec::new(),
170 resumption: Resumption::default(),
171 max_fragment_size: None,
172 client_auth_cert_resolver,
173 versions: self.state.versions,
174 enable_sni: true,
175 verifier: self.state.verifier,
176 key_log: Arc::new(NoKeyLog {}),
177 enable_secret_extraction: false,
178 enable_early_data: false,
179 jls_config: JlsConfig::default(),
180 #[cfg(feature = "tls12")]
181 require_ems: cfg!(feature = "fips"),
182 time_provider: self.time_provider,
183 cert_compressors: compress::default_cert_compressors().to_vec(),
184 cert_compression_cache: Arc::new(compress::CompressionCache::default()),
185 cert_decompressors: compress::default_cert_decompressors().to_vec(),
186 ech_mode: self.state.client_ech_mode,
187 }
188 }
189}