rustls/server/
tls12.rs

1use crate::check::check_message;
2use crate::error::TLSError;
3#[cfg(feature = "logging")]
4use crate::log::{debug, trace};
5use crate::msgs::base::Payload;
6use crate::msgs::ccs::ChangeCipherSpecPayload;
7use crate::msgs::codec::Codec;
8use crate::msgs::enums::AlertDescription;
9use crate::msgs::enums::{ContentType, HandshakeType, ProtocolVersion};
10use crate::msgs::handshake::HandshakeMessagePayload;
11use crate::msgs::handshake::HandshakePayload;
12use crate::msgs::handshake::NewSessionTicketPayload;
13use crate::msgs::message::{Message, MessagePayload};
14use crate::msgs::persist;
15use crate::server::ServerSessionImpl;
16use crate::session::SessionSecrets;
17use crate::verify;
18
19use crate::server::common::{ClientCertDetails, HandshakeDetails, ServerKXDetails};
20use crate::server::hs;
21
22use ring::constant_time;
23
24// --- Process client's Certificate for client auth ---
25pub struct ExpectCertificate {
26    pub handshake: HandshakeDetails,
27    pub server_kx: ServerKXDetails,
28    pub send_ticket: bool,
29}
30
31impl ExpectCertificate {
32    fn into_expect_tls12_client_kx(self, cert: Option<ClientCertDetails>) -> hs::NextState {
33        Box::new(ExpectClientKX {
34            handshake: self.handshake,
35            server_kx: self.server_kx,
36            client_cert: cert,
37            send_ticket: self.send_ticket,
38        })
39    }
40}
41
42impl hs::State for ExpectCertificate {
43    fn handle(
44        mut self: Box<Self>,
45        sess: &mut ServerSessionImpl,
46        m: Message,
47    ) -> hs::NextStateOrError {
48        let cert_chain =
49            require_handshake_msg!(m, HandshakeType::Certificate, HandshakePayload::Certificate)?;
50        self.handshake
51            .transcript
52            .add_message(&m);
53
54        // If we can't determine if the auth is mandatory, abort
55        let mandatory = sess
56            .config
57            .verifier
58            .client_auth_mandatory(sess.get_sni())
59            .ok_or_else(|| {
60                debug!("could not determine if client auth is mandatory based on SNI");
61                sess.common
62                    .send_fatal_alert(AlertDescription::AccessDenied);
63                TLSError::General("client rejected by client_auth_mandatory".into())
64            })?;
65
66        if cert_chain.is_empty() {
67            if !mandatory {
68                debug!("client auth requested but no certificate supplied");
69                self.handshake
70                    .transcript
71                    .abandon_client_auth();
72                return Ok(self.into_expect_tls12_client_kx(None));
73            }
74            sess.common
75                .send_fatal_alert(AlertDescription::CertificateRequired);
76            return Err(TLSError::NoCertificatesPresented);
77        }
78
79        trace!("certs {:?}", cert_chain);
80
81        sess.config
82            .verifier
83            .verify_client_cert(cert_chain, sess.get_sni())
84            .or_else(|err| {
85                hs::incompatible(sess, "certificate invalid");
86                Err(err)
87            })?;
88
89        let cert = ClientCertDetails::new(cert_chain.clone());
90        Ok(self.into_expect_tls12_client_kx(Some(cert)))
91    }
92}
93
94// --- Process client's KeyExchange ---
95pub struct ExpectClientKX {
96    pub handshake: HandshakeDetails,
97    pub server_kx: ServerKXDetails,
98    pub client_cert: Option<ClientCertDetails>,
99    pub send_ticket: bool,
100}
101
102impl ExpectClientKX {
103    fn into_expect_tls12_certificate_verify(self, secrets: SessionSecrets) -> hs::NextState {
104        Box::new(ExpectCertificateVerify {
105            secrets,
106            handshake: self.handshake,
107            client_cert: self.client_cert.unwrap(),
108            send_ticket: self.send_ticket,
109        })
110    }
111
112    fn into_expect_tls12_ccs(self, secrets: SessionSecrets) -> hs::NextState {
113        Box::new(ExpectCCS {
114            secrets,
115            handshake: self.handshake,
116            resuming: false,
117            send_ticket: self.send_ticket,
118        })
119    }
120}
121
122impl hs::State for ExpectClientKX {
123    fn handle(
124        mut self: Box<Self>,
125        sess: &mut ServerSessionImpl,
126        m: Message,
127    ) -> hs::NextStateOrError {
128        let client_kx = require_handshake_msg!(
129            m,
130            HandshakeType::ClientKeyExchange,
131            HandshakePayload::ClientKeyExchange
132        )?;
133        self.handshake
134            .transcript
135            .add_message(&m);
136
137        // Complete key agreement, and set up encryption with the
138        // resulting premaster secret.
139        let kx = self.server_kx.take_kx();
140        if !kx.check_client_params(&client_kx.0) {
141            sess.common
142                .send_fatal_alert(AlertDescription::DecodeError);
143            return Err(TLSError::CorruptMessagePayload(ContentType::Handshake));
144        }
145
146        let kxd = kx
147            .server_complete(&client_kx.0)
148            .ok_or_else(|| {
149                TLSError::PeerMisbehavedError("key exchange completion failed".to_string())
150            })?;
151
152        let hashalg = sess
153            .common
154            .get_suite_assert()
155            .get_hash();
156        let secrets = if self.handshake.using_ems {
157            let handshake_hash = self
158                .handshake
159                .transcript
160                .get_current_hash();
161            SessionSecrets::new_ems(
162                &self.handshake.randoms,
163                &handshake_hash,
164                hashalg,
165                &kxd.shared_secret,
166            )
167        } else {
168            SessionSecrets::new(&self.handshake.randoms, hashalg, &kxd.shared_secret)
169        };
170        sess.config.key_log.log(
171            "CLIENT_RANDOM",
172            &secrets.randoms.client,
173            &secrets.master_secret,
174        );
175        sess.common
176            .start_encryption_tls12(&secrets);
177
178        if self.client_cert.is_some() {
179            Ok(self.into_expect_tls12_certificate_verify(secrets))
180        } else {
181            Ok(self.into_expect_tls12_ccs(secrets))
182        }
183    }
184}
185
186// --- Process client's certificate proof ---
187pub struct ExpectCertificateVerify {
188    secrets: SessionSecrets,
189    handshake: HandshakeDetails,
190    client_cert: ClientCertDetails,
191    send_ticket: bool,
192}
193
194impl ExpectCertificateVerify {
195    fn into_expect_tls12_ccs(self) -> hs::NextState {
196        Box::new(ExpectCCS {
197            secrets: self.secrets,
198            handshake: self.handshake,
199            resuming: false,
200            send_ticket: self.send_ticket,
201        })
202    }
203}
204
205impl hs::State for ExpectCertificateVerify {
206    fn handle(
207        mut self: Box<Self>,
208        sess: &mut ServerSessionImpl,
209        m: Message,
210    ) -> hs::NextStateOrError {
211        let rc = {
212            let sig = require_handshake_msg!(
213                m,
214                HandshakeType::CertificateVerify,
215                HandshakePayload::CertificateVerify
216            )?;
217            let handshake_msgs = self
218                .handshake
219                .transcript
220                .take_handshake_buf();
221            let certs = &self.client_cert.cert_chain;
222
223            sess.config
224                .get_verifier()
225                .verify_tls12_signature(&handshake_msgs, &certs[0], sig)
226        };
227
228        if let Err(e) = rc {
229            sess.common
230                .send_fatal_alert(AlertDescription::AccessDenied);
231            return Err(e);
232        }
233
234        trace!("client CertificateVerify OK");
235        sess.client_cert_chain = Some(self.client_cert.take_chain());
236
237        self.handshake
238            .transcript
239            .add_message(&m);
240        Ok(self.into_expect_tls12_ccs())
241    }
242}
243
244// --- Process client's ChangeCipherSpec ---
245pub struct ExpectCCS {
246    pub secrets: SessionSecrets,
247    pub handshake: HandshakeDetails,
248    pub resuming: bool,
249    pub send_ticket: bool,
250}
251
252impl ExpectCCS {
253    fn into_expect_tls12_finished(self) -> hs::NextState {
254        Box::new(ExpectFinished {
255            secrets: self.secrets,
256            handshake: self.handshake,
257            resuming: self.resuming,
258            send_ticket: self.send_ticket,
259        })
260    }
261}
262
263impl hs::State for ExpectCCS {
264    fn handle(self: Box<Self>, sess: &mut ServerSessionImpl, m: Message) -> hs::NextStateOrError {
265        check_message(&m, &[ContentType::ChangeCipherSpec], &[])?;
266
267        // CCS should not be received interleaved with fragmented handshake-level
268        // message.
269        hs::check_aligned_handshake(sess)?;
270
271        sess.common
272            .record_layer
273            .start_decrypting();
274        Ok(self.into_expect_tls12_finished())
275    }
276}
277
278// --- Process client's Finished ---
279fn get_server_session_value_tls12(
280    secrets: &SessionSecrets,
281    handshake: &HandshakeDetails,
282    sess: &ServerSessionImpl,
283) -> persist::ServerSessionValue {
284    let scs = sess.common.get_suite_assert();
285    let version = ProtocolVersion::TLSv1_2;
286    let secret = secrets.get_master_secret();
287
288    let mut v = persist::ServerSessionValue::new(
289        sess.get_sni(),
290        version,
291        scs.suite,
292        secret,
293        &sess.client_cert_chain,
294        sess.alpn_protocol.clone(),
295        sess.resumption_data.clone(),
296    );
297
298    if handshake.using_ems {
299        v.set_extended_ms_used();
300    }
301
302    v
303}
304
305pub fn emit_ticket(
306    secrets: &SessionSecrets,
307    handshake: &mut HandshakeDetails,
308    sess: &mut ServerSessionImpl,
309) {
310    // If we can't produce a ticket for some reason, we can't
311    // report an error. Send an empty one.
312    let plain = get_server_session_value_tls12(secrets, handshake, sess).get_encoding();
313    let ticket = sess
314        .config
315        .ticketer
316        .encrypt(&plain)
317        .unwrap_or_else(Vec::new);
318    let ticket_lifetime = sess.config.ticketer.get_lifetime();
319
320    let m = Message {
321        typ: ContentType::Handshake,
322        version: ProtocolVersion::TLSv1_2,
323        payload: MessagePayload::Handshake(HandshakeMessagePayload {
324            typ: HandshakeType::NewSessionTicket,
325            payload: HandshakePayload::NewSessionTicket(NewSessionTicketPayload::new(
326                ticket_lifetime,
327                ticket,
328            )),
329        }),
330    };
331
332    handshake.transcript.add_message(&m);
333    sess.common.send_msg(m, false);
334}
335
336pub fn emit_ccs(sess: &mut ServerSessionImpl) {
337    let m = Message {
338        typ: ContentType::ChangeCipherSpec,
339        version: ProtocolVersion::TLSv1_2,
340        payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
341    };
342
343    sess.common.send_msg(m, false);
344}
345
346pub fn emit_finished(
347    secrets: &SessionSecrets,
348    handshake: &mut HandshakeDetails,
349    sess: &mut ServerSessionImpl,
350) {
351    let vh = handshake.transcript.get_current_hash();
352    let verify_data = secrets.server_verify_data(&vh);
353    let verify_data_payload = Payload::new(verify_data);
354
355    let f = Message {
356        typ: ContentType::Handshake,
357        version: ProtocolVersion::TLSv1_2,
358        payload: MessagePayload::Handshake(HandshakeMessagePayload {
359            typ: HandshakeType::Finished,
360            payload: HandshakePayload::Finished(verify_data_payload),
361        }),
362    };
363
364    handshake.transcript.add_message(&f);
365    sess.common.send_msg(f, true);
366}
367
368pub struct ExpectFinished {
369    secrets: SessionSecrets,
370    handshake: HandshakeDetails,
371    resuming: bool,
372    send_ticket: bool,
373}
374
375impl ExpectFinished {
376    fn into_expect_tls12_traffic(self, fin: verify::FinishedMessageVerified) -> hs::NextState {
377        Box::new(ExpectTraffic {
378            secrets: self.secrets,
379            _fin_verified: fin,
380        })
381    }
382}
383
384impl hs::State for ExpectFinished {
385    fn handle(
386        mut self: Box<Self>,
387        sess: &mut ServerSessionImpl,
388        m: Message,
389    ) -> hs::NextStateOrError {
390        let finished =
391            require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
392
393        hs::check_aligned_handshake(sess)?;
394
395        let vh = self
396            .handshake
397            .transcript
398            .get_current_hash();
399        let expect_verify_data = self.secrets.client_verify_data(&vh);
400
401        let fin = constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0)
402            .map_err(|_| {
403                sess.common
404                    .send_fatal_alert(AlertDescription::DecryptError);
405                TLSError::DecryptError
406            })
407            .map(|_| verify::FinishedMessageVerified::assertion())?;
408
409        // Save session, perhaps
410        if !self.resuming && !self.handshake.session_id.is_empty() {
411            let value = get_server_session_value_tls12(&self.secrets, &self.handshake, sess);
412
413            let worked = sess.config.session_storage.put(
414                self.handshake.session_id.get_encoding(),
415                value.get_encoding(),
416            );
417            if worked {
418                debug!("Session saved");
419            } else {
420                debug!("Session not saved");
421            }
422        }
423
424        // Send our CCS and Finished.
425        self.handshake
426            .transcript
427            .add_message(&m);
428        if !self.resuming {
429            if self.send_ticket {
430                emit_ticket(&self.secrets, &mut self.handshake, sess);
431            }
432            emit_ccs(sess);
433            sess.common
434                .record_layer
435                .start_encrypting();
436            emit_finished(&self.secrets, &mut self.handshake, sess);
437        }
438
439        sess.common.start_traffic();
440        Ok(self.into_expect_tls12_traffic(fin))
441    }
442}
443
444// --- Process traffic ---
445pub struct ExpectTraffic {
446    secrets: SessionSecrets,
447    _fin_verified: verify::FinishedMessageVerified,
448}
449
450impl ExpectTraffic {}
451
452impl hs::State for ExpectTraffic {
453    fn handle(
454        self: Box<Self>,
455        sess: &mut ServerSessionImpl,
456        mut m: Message,
457    ) -> hs::NextStateOrError {
458        check_message(&m, &[ContentType::ApplicationData], &[])?;
459        sess.common
460            .take_received_plaintext(m.take_opaque_payload().unwrap());
461        Ok(self)
462    }
463
464    fn export_keying_material(
465        &self,
466        output: &mut [u8],
467        label: &[u8],
468        context: Option<&[u8]>,
469    ) -> Result<(), TLSError> {
470        self.secrets
471            .export_keying_material(output, label, context);
472        Ok(())
473    }
474}