1use alloc::sync::Arc;
2use alloc::vec::Vec;
3use core::marker::PhantomData;
4
5use pki_types::{CertificateDer, PrivateKeyDer};
6
7use crate::builder::{ConfigBuilder, WantsVerifier};
8use crate::error::Error;
9use crate::server::{handy, ResolvesServerCert, ServerConfig};
10use crate::sign::CertifiedKey;
11use crate::verify::{ClientCertVerifier, NoClientAuth};
12use crate::{compress, versions, InconsistentKeys, NoKeyLog};
13
14impl ConfigBuilder<ServerConfig, WantsVerifier> {
15 pub fn with_client_cert_verifier(
17 self,
18 client_cert_verifier: Arc<dyn ClientCertVerifier>,
19 ) -> ConfigBuilder<ServerConfig, WantsServerCert> {
20 ConfigBuilder {
21 state: WantsServerCert {
22 versions: self.state.versions,
23 verifier: client_cert_verifier,
24 },
25 provider: self.provider,
26 time_provider: self.time_provider,
27 side: PhantomData,
28 }
29 }
30
31 pub fn with_no_client_auth(self) -> ConfigBuilder<ServerConfig, WantsServerCert> {
33 self.with_client_cert_verifier(Arc::new(NoClientAuth))
34 }
35}
36
37#[derive(Clone, Debug)]
42pub struct WantsServerCert {
43 versions: versions::EnabledVersions,
44 verifier: Arc<dyn ClientCertVerifier>,
45}
46
47impl ConfigBuilder<ServerConfig, WantsServerCert> {
48 pub fn with_single_cert(
66 self,
67 cert_chain: Vec<CertificateDer<'static>>,
68 key_der: PrivateKeyDer<'static>,
69 ) -> Result<ServerConfig, Error> {
70 let private_key = self
71 .provider
72 .key_provider
73 .load_private_key(key_der)?;
74
75 let certified_key = CertifiedKey::new(cert_chain, private_key);
76 match certified_key.keys_match() {
77 Ok(()) | Err(Error::InconsistentKeys(InconsistentKeys::Unknown)) => (),
79 Err(err) => return Err(err),
80 }
81
82 let resolver = handy::AlwaysResolvesChain::new(certified_key);
83 Ok(self.with_cert_resolver(Arc::new(resolver)))
84 }
85
86 pub fn with_single_cert_with_ocsp(
100 self,
101 cert_chain: Vec<CertificateDer<'static>>,
102 key_der: PrivateKeyDer<'static>,
103 ocsp: Vec<u8>,
104 ) -> Result<ServerConfig, Error> {
105 let private_key = self
106 .provider
107 .key_provider
108 .load_private_key(key_der)?;
109
110 let certified_key = CertifiedKey::new(cert_chain, private_key);
111 match certified_key.keys_match() {
112 Ok(()) | Err(Error::InconsistentKeys(InconsistentKeys::Unknown)) => (),
114 Err(err) => return Err(err),
115 }
116
117 let resolver = handy::AlwaysResolvesChain::new_with_extras(certified_key, ocsp);
118 Ok(self.with_cert_resolver(Arc::new(resolver)))
119 }
120
121 pub fn with_cert_resolver(self, cert_resolver: Arc<dyn ResolvesServerCert>) -> ServerConfig {
123 ServerConfig {
124 provider: self.provider,
125 verifier: self.state.verifier,
126 cert_resolver,
127 ignore_client_order: false,
128 max_fragment_size: None,
129 #[cfg(feature = "std")]
130 session_storage: handy::ServerSessionMemoryCache::new(256),
131 #[cfg(not(feature = "std"))]
132 session_storage: Arc::new(handy::NoServerSessionStorage {}),
133 ticketer: Arc::new(handy::NeverProducesTickets {}),
134 alpn_protocols: Vec::new(),
135 versions: self.state.versions,
136 key_log: Arc::new(NoKeyLog {}),
137 enable_secret_extraction: false,
138 max_early_data_size: 0,
139 send_half_rtt_data: false,
140 send_tls13_tickets: 2,
141 #[cfg(feature = "tls12")]
142 require_ems: cfg!(feature = "fips"),
143 time_provider: self.time_provider,
144 cert_compressors: compress::default_cert_compressors().to_vec(),
145 cert_compression_cache: Arc::new(compress::CompressionCache::default()),
146 cert_decompressors: compress::default_cert_decompressors().to_vec(),
147 }
148 }
149}