rustls/server/
connection.rs1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::fmt;
4
5use pki_types::{DnsName, FipsStatus};
6
7use super::config::ServerConfig;
8use crate::common_state::{CommonState, Event, Side};
9use crate::conn::private::SideOutput;
10use crate::conn::split::SplitConnection;
11use crate::conn::{
12 Accepted, Connection, NeedsInput, ServerNext, SideData, Tcp, Transport, VerifyPeerIdentity,
13};
14#[cfg(doc)]
15use crate::crypto;
16use crate::error::Error;
17use crate::msgs::ServerExtensionsInput;
18use crate::quic::ServerHandshake as QuicServerHandshake;
19use crate::server::hs::{ExpectClientHello, ReadClientHello, ServerState};
20use crate::sync::Arc;
21use crate::verify::ClientIdentity;
22
23impl Connection<ServerSide, Tcp> {
24 pub fn new(config: Arc<ServerConfig>) -> Result<Self, Error> {
28 Self::for_server(config, ServerExtensionsInput::default(), Tcp)
29 }
30}
31
32impl<T: Transport> Connection<ServerSide, T> {
33 pub(crate) fn for_server(
34 config: Arc<ServerConfig>,
35 extra_exts: ServerExtensionsInput,
36 transport: T,
37 ) -> Result<Self, Error> {
38 let mut common = CommonState::new(Side::Server, config.fips());
39 common
40 .send
41 .set_max_fragment_size(config.max_fragment_size)?;
42 let protocol = transport.protocol();
43 Ok(Self {
44 state: Ok(Box::new(ExpectClientHello::new(
45 config,
46 extra_exts,
47 Vec::new(),
48 protocol,
49 ))
50 .into()),
51 side: ServerSide::default(),
52 transport,
53 common,
54 })
55 }
56
57 pub(crate) fn for_acceptor(transport: T) -> Self {
58 Self {
59 state: Ok(ReadClientHello::new(transport.protocol()).into()),
60 side: ServerSide::default(),
61 transport,
62 common: CommonState::new(Side::Server, FipsStatus::Unvalidated),
63 }
64 }
65}
66
67#[non_exhaustive]
69#[derive(Debug)]
70pub enum ServerHandshake {
71 NeedsInput(NeedsInput<ServerSide>),
73
74 Accepted(Accepted<Tcp>),
79
80 VerifyClientIdentity(VerifyPeerIdentity<ServerSide, Tcp>),
84
85 Complete(SplitConnection<ServerSide>),
89}
90
91impl ServerHandshake {
92 pub fn start() -> NeedsInput<ServerSide> {
102 NeedsInput::new(Connection::for_acceptor(Tcp))
103 }
104}
105
106impl TryFrom<Connection<ServerSide, Tcp>> for ServerHandshake {
107 type Error = Error;
108
109 fn try_from(conn: Connection<ServerSide, Tcp>) -> Result<Self, Error> {
110 Ok(match ServerNext::try_from(conn)? {
111 ServerNext::NeedsInput(conn) => Self::NeedsInput(NeedsInput(conn)),
112
113 ServerNext::ChooseConfig(accepted) => Self::Accepted(accepted),
114
115 ServerNext::VerifyClientIdentity(verify) => Self::VerifyClientIdentity(verify),
116
117 ServerNext::Complete(conn) => Self::Complete(SplitConnection::try_from(conn)?),
118 })
119 }
120}
121
122#[derive(Default)]
124pub struct ServerSide {
125 sni: Option<DnsName<'static>>,
126 received_resumption_data: Option<Vec<u8>>,
127}
128
129impl ServerSide {
130 pub fn received_resumption_data(&self) -> Option<&[u8]> {
134 self.received_resumption_data.as_deref()
135 }
136
137 pub fn server_name(&self) -> Option<&DnsName<'static>> {
152 self.sni.as_ref()
153 }
154}
155
156impl SideData for ServerSide {
157 type Handshake = ServerHandshake;
158 type QuicHandshake = QuicServerHandshake;
159
160 type PeerIdentity<'a> = ClientIdentity<'static, 'a>;
161}
162
163impl SideOutput for ServerSide {
164 fn emit(&mut self, ev: Event) {
165 match ev {
166 Event::ReceivedServerName(sni) => self.sni = sni,
167 Event::ResumptionData(data) => self.received_resumption_data = Some(data),
168 _ => unreachable!(),
169 }
170 }
171}
172
173impl crate::conn::private::Side for ServerSide {
174 type State = ServerState;
175}
176
177impl fmt::Debug for ServerSide {
178 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
179 f.debug_struct("ServerSide")
180 .field("sni", &self.sni)
181 .finish_non_exhaustive()
182 }
183}