1use alloc::vec::Vec;
2use core::marker::PhantomData;
3
4use pki_types::PrivateKeyDer;
5
6use super::server_conn::InvalidSniPolicy;
7use super::{ServerConfig, ServerCredentialResolver, handy};
8use crate::builder::{ConfigBuilder, WantsVerifier};
9use crate::crypto::{Credentials, Identity, SingleCredential};
10use crate::error::Error;
11use crate::sync::Arc;
12use crate::verify::{ClientVerifier, NoClientAuth};
13use crate::{NoKeyLog, compress};
14
15impl ConfigBuilder<ServerConfig, WantsVerifier> {
16 pub fn with_client_cert_verifier(
18 self,
19 client_cert_verifier: Arc<dyn ClientVerifier>,
20 ) -> ConfigBuilder<ServerConfig, WantsServerCert> {
21 ConfigBuilder {
22 state: WantsServerCert {
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 verifier: Arc<dyn ClientVerifier>,
44}
45
46impl ConfigBuilder<ServerConfig, WantsServerCert> {
47 pub fn with_single_cert(
65 self,
66 identity: Arc<Identity<'static>>,
67 key_der: PrivateKeyDer<'static>,
68 ) -> Result<ServerConfig, Error> {
69 let credentials = Credentials::from_der(identity, key_der, self.crypto_provider())?;
70 self.with_server_credential_resolver(Arc::new(SingleCredential::from(credentials)))
71 }
72
73 pub fn with_single_cert_with_ocsp(
87 self,
88 identity: Arc<Identity<'static>>,
89 key_der: PrivateKeyDer<'static>,
90 ocsp: Arc<[u8]>,
91 ) -> Result<ServerConfig, Error> {
92 let mut credentials = Credentials::from_der(identity, key_der, self.crypto_provider())?;
93 credentials.ocsp = Some(ocsp);
94 self.with_server_credential_resolver(Arc::new(SingleCredential::from(credentials)))
95 }
96
97 pub fn with_server_credential_resolver(
99 self,
100 cert_resolver: Arc<dyn ServerCredentialResolver>,
101 ) -> Result<ServerConfig, Error> {
102 self.provider.consistency_check()?;
103 Ok(ServerConfig {
104 provider: self.provider,
105 verifier: self.state.verifier,
106 cert_resolver,
107 ignore_client_order: false,
108 max_fragment_size: None,
109 #[cfg(feature = "std")]
110 session_storage: handy::ServerSessionMemoryCache::new(256),
111 #[cfg(not(feature = "std"))]
112 session_storage: Arc::new(handy::NoServerSessionStorage {}),
113 ticketer: Arc::new(handy::NeverProducesTickets {}),
114 alpn_protocols: Vec::new(),
115 key_log: Arc::new(NoKeyLog {}),
116 enable_secret_extraction: false,
117 max_early_data_size: 0,
118 send_half_rtt_data: false,
119 send_tls13_tickets: 2,
120 require_ems: cfg!(feature = "fips"),
121 time_provider: self.time_provider,
122 cert_compressors: compress::default_cert_compressors().to_vec(),
123 cert_compression_cache: Arc::new(compress::CompressionCache::default()),
124 cert_decompressors: compress::default_cert_decompressors().to_vec(),
125 invalid_sni_policy: InvalidSniPolicy::default(),
126 })
127 }
128}