rustls/server/
builder.rs
1use crate::builder::{ConfigBuilder, WantsVerifier};
2use crate::error::Error;
3use crate::key;
4use crate::kx::SupportedKxGroup;
5use crate::server::handy;
6use crate::server::{ResolvesServerCert, ServerConfig};
7use crate::suites::SupportedCipherSuite;
8use crate::verify;
9use crate::versions;
10use crate::NoKeyLog;
11
12use std::marker::PhantomData;
13use std::sync::Arc;
14
15impl ConfigBuilder<ServerConfig, WantsVerifier> {
16 pub fn with_client_cert_verifier(
18 self,
19 client_cert_verifier: Arc<dyn verify::ClientCertVerifier>,
20 ) -> ConfigBuilder<ServerConfig, WantsServerCert> {
21 ConfigBuilder {
22 state: WantsServerCert {
23 cipher_suites: self.state.cipher_suites,
24 kx_groups: self.state.kx_groups,
25 versions: self.state.versions,
26 verifier: client_cert_verifier,
27 },
28 side: PhantomData,
29 }
30 }
31
32 pub fn with_no_client_auth(self) -> ConfigBuilder<ServerConfig, WantsServerCert> {
34 self.with_client_cert_verifier(verify::NoClientAuth::boxed())
35 }
36}
37
38#[derive(Clone, Debug)]
43pub struct WantsServerCert {
44 cipher_suites: Vec<SupportedCipherSuite>,
45 kx_groups: Vec<&'static SupportedKxGroup>,
46 versions: versions::EnabledVersions,
47 verifier: Arc<dyn verify::ClientCertVerifier>,
48}
49
50impl ConfigBuilder<ServerConfig, WantsServerCert> {
51 pub fn with_single_cert(
65 self,
66 cert_chain: Vec<key::Certificate>,
67 key_der: key::PrivateKey,
68 ) -> Result<ServerConfig, Error> {
69 let resolver = handy::AlwaysResolvesChain::new(cert_chain, &key_der)?;
70 Ok(self.with_cert_resolver(Arc::new(resolver)))
71 }
72
73 pub fn with_single_cert_with_ocsp_and_sct(
85 self,
86 cert_chain: Vec<key::Certificate>,
87 key_der: key::PrivateKey,
88 ocsp: Vec<u8>,
89 scts: Vec<u8>,
90 ) -> Result<ServerConfig, Error> {
91 let resolver =
92 handy::AlwaysResolvesChain::new_with_extras(cert_chain, &key_der, ocsp, scts)?;
93 Ok(self.with_cert_resolver(Arc::new(resolver)))
94 }
95
96 pub fn with_cert_resolver(self, cert_resolver: Arc<dyn ResolvesServerCert>) -> ServerConfig {
98 ServerConfig {
99 cipher_suites: self.state.cipher_suites,
100 kx_groups: self.state.kx_groups,
101 verifier: self.state.verifier,
102 cert_resolver,
103 ignore_client_order: false,
104 max_fragment_size: None,
105 session_storage: handy::ServerSessionMemoryCache::new(256),
106 ticketer: Arc::new(handy::NeverProducesTickets {}),
107 alpn_protocols: Vec::new(),
108 versions: self.state.versions,
109 key_log: Arc::new(NoKeyLog {}),
110 #[cfg(feature = "secret_extraction")]
111 enable_secret_extraction: false,
112 max_early_data_size: 0,
113 send_half_rtt_data: false,
114 send_tls13_tickets: 4,
115 }
116 }
117}