rustls/server/
tls12.rs

1use crate::check::inappropriate_message;
2use crate::common_state::{CommonState, Side, State};
3use crate::conn::ConnectionRandoms;
4use crate::enums::ProtocolVersion;
5use crate::enums::{AlertDescription, ContentType, HandshakeType};
6use crate::error::{Error, PeerIncompatible, PeerMisbehaved};
7use crate::hash_hs::HandshakeHash;
8use crate::key::Certificate;
9#[cfg(feature = "logging")]
10use crate::log::{debug, trace};
11use crate::msgs::base::Payload;
12use crate::msgs::ccs::ChangeCipherSpecPayload;
13use crate::msgs::codec::Codec;
14use crate::msgs::handshake::{ClientECDHParams, HandshakeMessagePayload, HandshakePayload};
15use crate::msgs::handshake::{NewSessionTicketPayload, SessionId};
16use crate::msgs::message::{Message, MessagePayload};
17use crate::msgs::persist;
18#[cfg(feature = "secret_extraction")]
19use crate::suites::PartiallyExtractedSecrets;
20use crate::tls12::{self, ConnectionSecrets, Tls12CipherSuite};
21use crate::{kx, ticketer, verify};
22
23use super::common::ActiveCertifiedKey;
24use super::hs::{self, ServerContext};
25use super::server_conn::{ProducesTickets, ServerConfig, ServerConnectionData};
26
27use ring::constant_time;
28
29use std::sync::Arc;
30
31pub(super) use client_hello::CompleteClientHelloHandling;
32
33mod client_hello {
34    use crate::enums::SignatureScheme;
35    use crate::msgs::enums::ECPointFormat;
36    use crate::msgs::enums::{ClientCertificateType, Compression};
37    use crate::msgs::handshake::ClientExtension;
38    use crate::msgs::handshake::ServerECDHParams;
39    use crate::msgs::handshake::{CertificateRequestPayload, ClientSessionTicket, Random};
40    use crate::msgs::handshake::{CertificateStatus, ECDHEServerKeyExchange};
41    use crate::msgs::handshake::{ClientHelloPayload, ServerHelloPayload};
42    use crate::msgs::handshake::{ServerExtension, ServerKeyExchangePayload};
43    use crate::sign;
44    use crate::verify::DigitallySignedStruct;
45
46    use super::*;
47
48    pub(in crate::server) struct CompleteClientHelloHandling {
49        pub(in crate::server) config: Arc<ServerConfig>,
50        pub(in crate::server) transcript: HandshakeHash,
51        pub(in crate::server) session_id: SessionId,
52        pub(in crate::server) suite: &'static Tls12CipherSuite,
53        pub(in crate::server) using_ems: bool,
54        pub(in crate::server) randoms: ConnectionRandoms,
55        pub(in crate::server) send_ticket: bool,
56        pub(in crate::server) extra_exts: Vec<ServerExtension>,
57    }
58
59    impl CompleteClientHelloHandling {
60        pub(in crate::server) fn handle_client_hello(
61            mut self,
62            cx: &mut ServerContext<'_>,
63            server_key: ActiveCertifiedKey,
64            chm: &Message,
65            client_hello: &ClientHelloPayload,
66            sigschemes_ext: Vec<SignatureScheme>,
67            tls13_enabled: bool,
68        ) -> hs::NextStateOrError {
69            // -- TLS1.2 only from hereon in --
70            self.transcript.add_message(chm);
71
72            if client_hello.ems_support_offered() {
73                self.using_ems = true;
74            }
75
76            let groups_ext = client_hello
77                .get_namedgroups_extension()
78                .ok_or_else(|| {
79                    cx.common.send_fatal_alert(
80                        AlertDescription::HandshakeFailure,
81                        PeerIncompatible::NamedGroupsExtensionRequired,
82                    )
83                })?;
84            let ecpoints_ext = client_hello
85                .get_ecpoints_extension()
86                .ok_or_else(|| {
87                    cx.common.send_fatal_alert(
88                        AlertDescription::HandshakeFailure,
89                        PeerIncompatible::EcPointsExtensionRequired,
90                    )
91                })?;
92
93            trace!("namedgroups {:?}", groups_ext);
94            trace!("ecpoints {:?}", ecpoints_ext);
95
96            if !ecpoints_ext.contains(&ECPointFormat::Uncompressed) {
97                return Err(cx.common.send_fatal_alert(
98                    AlertDescription::IllegalParameter,
99                    PeerIncompatible::UncompressedEcPointsRequired,
100                ));
101            }
102
103            // -- If TLS1.3 is enabled, signal the downgrade in the server random
104            if tls13_enabled {
105                self.randoms.server[24..].copy_from_slice(&tls12::DOWNGRADE_SENTINEL);
106            }
107
108            // -- Check for resumption --
109            // We can do this either by (in order of preference):
110            // 1. receiving a ticket that decrypts
111            // 2. receiving a sessionid that is in our cache
112            //
113            // If we receive a ticket, the sessionid won't be in our
114            // cache, so don't check.
115            //
116            // If either works, we end up with a ServerConnectionValue
117            // which is passed to start_resumption and concludes
118            // our handling of the ClientHello.
119            //
120            let mut ticket_received = false;
121            let resume_data = client_hello
122                .get_ticket_extension()
123                .and_then(|ticket_ext| match ticket_ext {
124                    ClientExtension::SessionTicket(ClientSessionTicket::Offer(ticket)) => {
125                        Some(ticket)
126                    }
127                    _ => None,
128                })
129                .and_then(|ticket| {
130                    ticket_received = true;
131                    debug!("Ticket received");
132                    let data = self.config.ticketer.decrypt(&ticket.0);
133                    if data.is_none() {
134                        debug!("Ticket didn't decrypt");
135                    }
136                    data
137                })
138                .or_else(|| {
139                    // Perhaps resume?  If we received a ticket, the sessionid
140                    // does not correspond to a real session.
141                    if client_hello.session_id.is_empty() || ticket_received {
142                        return None;
143                    }
144
145                    self.config
146                        .session_storage
147                        .get(&client_hello.session_id.get_encoding())
148                })
149                .and_then(|x| persist::ServerSessionValue::read_bytes(&x).ok())
150                .filter(|resumedata| {
151                    hs::can_resume(self.suite.into(), &cx.data.sni, self.using_ems, resumedata)
152                });
153
154            if let Some(data) = resume_data {
155                return self.start_resumption(cx, client_hello, &client_hello.session_id, data);
156            }
157
158            // Now we have chosen a ciphersuite, we can make kx decisions.
159            let sigschemes = self
160                .suite
161                .resolve_sig_schemes(&sigschemes_ext);
162
163            if sigschemes.is_empty() {
164                return Err(cx.common.send_fatal_alert(
165                    AlertDescription::HandshakeFailure,
166                    PeerIncompatible::NoSignatureSchemesInCommon,
167                ));
168            }
169
170            let group = self
171                .config
172                .kx_groups
173                .iter()
174                .find(|skxg| groups_ext.contains(&skxg.name))
175                .cloned()
176                .ok_or_else(|| {
177                    cx.common.send_fatal_alert(
178                        AlertDescription::HandshakeFailure,
179                        PeerIncompatible::NoKxGroupsInCommon,
180                    )
181                })?;
182
183            let ecpoint = ECPointFormat::SUPPORTED
184                .iter()
185                .find(|format| ecpoints_ext.contains(format))
186                .cloned()
187                .ok_or_else(|| {
188                    cx.common.send_fatal_alert(
189                        AlertDescription::HandshakeFailure,
190                        PeerIncompatible::NoEcPointFormatsInCommon,
191                    )
192                })?;
193
194            debug_assert_eq!(ecpoint, ECPointFormat::Uncompressed);
195
196            let (mut ocsp_response, mut sct_list) =
197                (server_key.get_ocsp(), server_key.get_sct_list());
198
199            // If we're not offered a ticket or a potential session ID, allocate a session ID.
200            if !self.config.session_storage.can_cache() {
201                self.session_id = SessionId::empty();
202            } else if self.session_id.is_empty() && !ticket_received {
203                self.session_id = SessionId::random()?;
204            }
205
206            self.send_ticket = emit_server_hello(
207                &self.config,
208                &mut self.transcript,
209                cx,
210                self.session_id,
211                self.suite,
212                self.using_ems,
213                &mut ocsp_response,
214                &mut sct_list,
215                client_hello,
216                None,
217                &self.randoms,
218                self.extra_exts,
219            )?;
220            emit_certificate(&mut self.transcript, cx.common, server_key.get_cert());
221            if let Some(ocsp_response) = ocsp_response {
222                emit_cert_status(&mut self.transcript, cx.common, ocsp_response);
223            }
224            let server_kx = emit_server_kx(
225                &mut self.transcript,
226                cx.common,
227                sigschemes,
228                group,
229                server_key.get_key(),
230                &self.randoms,
231            )?;
232            let doing_client_auth = emit_certificate_req(&self.config, &mut self.transcript, cx)?;
233            emit_server_hello_done(&mut self.transcript, cx.common);
234
235            if doing_client_auth {
236                Ok(Box::new(ExpectCertificate {
237                    config: self.config,
238                    transcript: self.transcript,
239                    randoms: self.randoms,
240                    session_id: self.session_id,
241                    suite: self.suite,
242                    using_ems: self.using_ems,
243                    server_kx,
244                    send_ticket: self.send_ticket,
245                }))
246            } else {
247                Ok(Box::new(ExpectClientKx {
248                    config: self.config,
249                    transcript: self.transcript,
250                    randoms: self.randoms,
251                    session_id: self.session_id,
252                    suite: self.suite,
253                    using_ems: self.using_ems,
254                    server_kx,
255                    client_cert: None,
256                    send_ticket: self.send_ticket,
257                }))
258            }
259        }
260
261        fn start_resumption(
262            mut self,
263            cx: &mut ServerContext<'_>,
264            client_hello: &ClientHelloPayload,
265            id: &SessionId,
266            resumedata: persist::ServerSessionValue,
267        ) -> hs::NextStateOrError {
268            debug!("Resuming connection");
269
270            if resumedata.extended_ms && !self.using_ems {
271                return Err(cx.common.send_fatal_alert(
272                    AlertDescription::IllegalParameter,
273                    PeerMisbehaved::ResumptionAttemptedWithVariedEms,
274                ));
275            }
276
277            self.session_id = *id;
278            self.send_ticket = emit_server_hello(
279                &self.config,
280                &mut self.transcript,
281                cx,
282                self.session_id,
283                self.suite,
284                self.using_ems,
285                &mut None,
286                &mut None,
287                client_hello,
288                Some(&resumedata),
289                &self.randoms,
290                self.extra_exts,
291            )?;
292
293            let secrets = ConnectionSecrets::new_resume(
294                self.randoms,
295                self.suite,
296                &resumedata.master_secret.0,
297            );
298            self.config.key_log.log(
299                "CLIENT_RANDOM",
300                &secrets.randoms.client,
301                &secrets.master_secret,
302            );
303            cx.common
304                .start_encryption_tls12(&secrets, Side::Server);
305            cx.common.peer_certificates = resumedata.client_cert_chain;
306
307            if self.send_ticket {
308                emit_ticket(
309                    &secrets,
310                    &mut self.transcript,
311                    self.using_ems,
312                    cx,
313                    &*self.config.ticketer,
314                )?;
315            }
316            emit_ccs(cx.common);
317            cx.common
318                .record_layer
319                .start_encrypting();
320            emit_finished(&secrets, &mut self.transcript, cx.common);
321
322            Ok(Box::new(ExpectCcs {
323                config: self.config,
324                secrets,
325                transcript: self.transcript,
326                session_id: self.session_id,
327                using_ems: self.using_ems,
328                resuming: true,
329                send_ticket: self.send_ticket,
330            }))
331        }
332    }
333
334    fn emit_server_hello(
335        config: &ServerConfig,
336        transcript: &mut HandshakeHash,
337        cx: &mut ServerContext<'_>,
338        session_id: SessionId,
339        suite: &'static Tls12CipherSuite,
340        using_ems: bool,
341        ocsp_response: &mut Option<&[u8]>,
342        sct_list: &mut Option<&[u8]>,
343        hello: &ClientHelloPayload,
344        resumedata: Option<&persist::ServerSessionValue>,
345        randoms: &ConnectionRandoms,
346        extra_exts: Vec<ServerExtension>,
347    ) -> Result<bool, Error> {
348        let mut ep = hs::ExtensionProcessing::new();
349        ep.process_common(
350            config,
351            cx,
352            ocsp_response,
353            sct_list,
354            hello,
355            resumedata,
356            extra_exts,
357        )?;
358        ep.process_tls12(config, hello, using_ems);
359
360        let sh = Message {
361            version: ProtocolVersion::TLSv1_2,
362            payload: MessagePayload::handshake(HandshakeMessagePayload {
363                typ: HandshakeType::ServerHello,
364                payload: HandshakePayload::ServerHello(ServerHelloPayload {
365                    legacy_version: ProtocolVersion::TLSv1_2,
366                    random: Random::from(randoms.server),
367                    session_id,
368                    cipher_suite: suite.common.suite,
369                    compression_method: Compression::Null,
370                    extensions: ep.exts,
371                }),
372            }),
373        };
374
375        trace!("sending server hello {:?}", sh);
376        transcript.add_message(&sh);
377        cx.common.send_msg(sh, false);
378        Ok(ep.send_ticket)
379    }
380
381    fn emit_certificate(
382        transcript: &mut HandshakeHash,
383        common: &mut CommonState,
384        cert_chain: &[Certificate],
385    ) {
386        let c = Message {
387            version: ProtocolVersion::TLSv1_2,
388            payload: MessagePayload::handshake(HandshakeMessagePayload {
389                typ: HandshakeType::Certificate,
390                payload: HandshakePayload::Certificate(cert_chain.to_owned()),
391            }),
392        };
393
394        transcript.add_message(&c);
395        common.send_msg(c, false);
396    }
397
398    fn emit_cert_status(transcript: &mut HandshakeHash, common: &mut CommonState, ocsp: &[u8]) {
399        let st = CertificateStatus::new(ocsp.to_owned());
400
401        let c = Message {
402            version: ProtocolVersion::TLSv1_2,
403            payload: MessagePayload::handshake(HandshakeMessagePayload {
404                typ: HandshakeType::CertificateStatus,
405                payload: HandshakePayload::CertificateStatus(st),
406            }),
407        };
408
409        transcript.add_message(&c);
410        common.send_msg(c, false);
411    }
412
413    fn emit_server_kx(
414        transcript: &mut HandshakeHash,
415        common: &mut CommonState,
416        sigschemes: Vec<SignatureScheme>,
417        skxg: &'static kx::SupportedKxGroup,
418        signing_key: &dyn sign::SigningKey,
419        randoms: &ConnectionRandoms,
420    ) -> Result<kx::KeyExchange, Error> {
421        let kx = kx::KeyExchange::start(skxg).ok_or(Error::FailedToGetRandomBytes)?;
422        let secdh = ServerECDHParams::new(skxg.name, kx.pubkey.as_ref());
423
424        let mut msg = Vec::new();
425        msg.extend(randoms.client);
426        msg.extend(randoms.server);
427        secdh.encode(&mut msg);
428
429        let signer = signing_key
430            .choose_scheme(&sigschemes)
431            .ok_or_else(|| Error::General("incompatible signing key".to_string()))?;
432        let sigscheme = signer.scheme();
433        let sig = signer.sign(&msg)?;
434
435        let skx = ServerKeyExchangePayload::ECDHE(ECDHEServerKeyExchange {
436            params: secdh,
437            dss: DigitallySignedStruct::new(sigscheme, sig),
438        });
439
440        let m = Message {
441            version: ProtocolVersion::TLSv1_2,
442            payload: MessagePayload::handshake(HandshakeMessagePayload {
443                typ: HandshakeType::ServerKeyExchange,
444                payload: HandshakePayload::ServerKeyExchange(skx),
445            }),
446        };
447
448        transcript.add_message(&m);
449        common.send_msg(m, false);
450        Ok(kx)
451    }
452
453    fn emit_certificate_req(
454        config: &ServerConfig,
455        transcript: &mut HandshakeHash,
456        cx: &mut ServerContext<'_>,
457    ) -> Result<bool, Error> {
458        let client_auth = &config.verifier;
459
460        if !client_auth.offer_client_auth() {
461            return Ok(false);
462        }
463
464        let verify_schemes = client_auth.supported_verify_schemes();
465
466        let names = config
467            .verifier
468            .client_auth_root_subjects()
469            .to_vec();
470
471        let cr = CertificateRequestPayload {
472            certtypes: vec![
473                ClientCertificateType::RSASign,
474                ClientCertificateType::ECDSASign,
475            ],
476            sigschemes: verify_schemes,
477            canames: names,
478        };
479
480        let m = Message {
481            version: ProtocolVersion::TLSv1_2,
482            payload: MessagePayload::handshake(HandshakeMessagePayload {
483                typ: HandshakeType::CertificateRequest,
484                payload: HandshakePayload::CertificateRequest(cr),
485            }),
486        };
487
488        trace!("Sending CertificateRequest {:?}", m);
489        transcript.add_message(&m);
490        cx.common.send_msg(m, false);
491        Ok(true)
492    }
493
494    fn emit_server_hello_done(transcript: &mut HandshakeHash, common: &mut CommonState) {
495        let m = Message {
496            version: ProtocolVersion::TLSv1_2,
497            payload: MessagePayload::handshake(HandshakeMessagePayload {
498                typ: HandshakeType::ServerHelloDone,
499                payload: HandshakePayload::ServerHelloDone,
500            }),
501        };
502
503        transcript.add_message(&m);
504        common.send_msg(m, false);
505    }
506}
507
508// --- Process client's Certificate for client auth ---
509struct ExpectCertificate {
510    config: Arc<ServerConfig>,
511    transcript: HandshakeHash,
512    randoms: ConnectionRandoms,
513    session_id: SessionId,
514    suite: &'static Tls12CipherSuite,
515    using_ems: bool,
516    server_kx: kx::KeyExchange,
517    send_ticket: bool,
518}
519
520impl State<ServerConnectionData> for ExpectCertificate {
521    fn handle(mut self: Box<Self>, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError {
522        self.transcript.add_message(&m);
523        let cert_chain = require_handshake_msg_move!(
524            m,
525            HandshakeType::Certificate,
526            HandshakePayload::Certificate
527        )?;
528
529        // If we can't determine if the auth is mandatory, abort
530        let mandatory = self
531            .config
532            .verifier
533            .client_auth_mandatory();
534
535        trace!("certs {:?}", cert_chain);
536
537        let client_cert = match cert_chain.split_first() {
538            None if mandatory => {
539                return Err(cx.common.send_fatal_alert(
540                    AlertDescription::CertificateRequired,
541                    Error::NoCertificatesPresented,
542                ));
543            }
544            None => {
545                debug!("client auth requested but no certificate supplied");
546                self.transcript.abandon_client_auth();
547                None
548            }
549            Some((end_entity, intermediates)) => {
550                let now = std::time::SystemTime::now();
551                self.config
552                    .verifier
553                    .verify_client_cert(end_entity, intermediates, now)
554                    .map_err(|err| {
555                        cx.common
556                            .send_cert_verify_error_alert(err)
557                    })?;
558
559                Some(cert_chain)
560            }
561        };
562
563        Ok(Box::new(ExpectClientKx {
564            config: self.config,
565            transcript: self.transcript,
566            randoms: self.randoms,
567            session_id: self.session_id,
568            suite: self.suite,
569            using_ems: self.using_ems,
570            server_kx: self.server_kx,
571            client_cert,
572            send_ticket: self.send_ticket,
573        }))
574    }
575}
576
577// --- Process client's KeyExchange ---
578struct ExpectClientKx {
579    config: Arc<ServerConfig>,
580    transcript: HandshakeHash,
581    randoms: ConnectionRandoms,
582    session_id: SessionId,
583    suite: &'static Tls12CipherSuite,
584    using_ems: bool,
585    server_kx: kx::KeyExchange,
586    client_cert: Option<Vec<Certificate>>,
587    send_ticket: bool,
588}
589
590impl State<ServerConnectionData> for ExpectClientKx {
591    fn handle(mut self: Box<Self>, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError {
592        let client_kx = require_handshake_msg!(
593            m,
594            HandshakeType::ClientKeyExchange,
595            HandshakePayload::ClientKeyExchange
596        )?;
597        self.transcript.add_message(&m);
598        let ems_seed = self
599            .using_ems
600            .then(|| self.transcript.get_current_hash());
601
602        // Complete key agreement, and set up encryption with the
603        // resulting premaster secret.
604        let peer_kx_params =
605            tls12::decode_ecdh_params::<ClientECDHParams>(cx.common, &client_kx.0)?;
606        let secrets = ConnectionSecrets::from_key_exchange(
607            self.server_kx,
608            &peer_kx_params.public.0,
609            ems_seed,
610            self.randoms,
611            self.suite,
612        )?;
613
614        self.config.key_log.log(
615            "CLIENT_RANDOM",
616            &secrets.randoms.client,
617            &secrets.master_secret,
618        );
619        cx.common
620            .start_encryption_tls12(&secrets, Side::Server);
621
622        if let Some(client_cert) = self.client_cert {
623            Ok(Box::new(ExpectCertificateVerify {
624                config: self.config,
625                secrets,
626                transcript: self.transcript,
627                session_id: self.session_id,
628                using_ems: self.using_ems,
629                client_cert,
630                send_ticket: self.send_ticket,
631            }))
632        } else {
633            Ok(Box::new(ExpectCcs {
634                config: self.config,
635                secrets,
636                transcript: self.transcript,
637                session_id: self.session_id,
638                using_ems: self.using_ems,
639                resuming: false,
640                send_ticket: self.send_ticket,
641            }))
642        }
643    }
644}
645
646// --- Process client's certificate proof ---
647struct ExpectCertificateVerify {
648    config: Arc<ServerConfig>,
649    secrets: ConnectionSecrets,
650    transcript: HandshakeHash,
651    session_id: SessionId,
652    using_ems: bool,
653    client_cert: Vec<Certificate>,
654    send_ticket: bool,
655}
656
657impl State<ServerConnectionData> for ExpectCertificateVerify {
658    fn handle(mut self: Box<Self>, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError {
659        let rc = {
660            let sig = require_handshake_msg!(
661                m,
662                HandshakeType::CertificateVerify,
663                HandshakePayload::CertificateVerify
664            )?;
665
666            match self.transcript.take_handshake_buf() {
667                Some(msgs) => {
668                    let certs = &self.client_cert;
669                    self.config
670                        .verifier
671                        .verify_tls12_signature(&msgs, &certs[0], sig)
672                }
673                None => {
674                    // This should be unreachable; the handshake buffer was initialized with
675                    // client authentication if the verifier wants to offer it.
676                    // `transcript.abandon_client_auth()` can extract it, but its only caller in
677                    // this flow will also set `ExpectClientKx::client_cert` to `None`, making it
678                    // impossible to reach this state.
679                    return Err(cx.common.send_fatal_alert(
680                        AlertDescription::AccessDenied,
681                        Error::General("client authentication not set up".into()),
682                    ));
683                }
684            }
685        };
686
687        if let Err(e) = rc {
688            return Err(cx
689                .common
690                .send_cert_verify_error_alert(e));
691        }
692
693        trace!("client CertificateVerify OK");
694        cx.common.peer_certificates = Some(self.client_cert);
695
696        self.transcript.add_message(&m);
697        Ok(Box::new(ExpectCcs {
698            config: self.config,
699            secrets: self.secrets,
700            transcript: self.transcript,
701            session_id: self.session_id,
702            using_ems: self.using_ems,
703            resuming: false,
704            send_ticket: self.send_ticket,
705        }))
706    }
707}
708
709// --- Process client's ChangeCipherSpec ---
710struct ExpectCcs {
711    config: Arc<ServerConfig>,
712    secrets: ConnectionSecrets,
713    transcript: HandshakeHash,
714    session_id: SessionId,
715    using_ems: bool,
716    resuming: bool,
717    send_ticket: bool,
718}
719
720impl State<ServerConnectionData> for ExpectCcs {
721    fn handle(self: Box<Self>, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError {
722        match m.payload {
723            MessagePayload::ChangeCipherSpec(..) => {}
724            payload => {
725                return Err(inappropriate_message(
726                    &payload,
727                    &[ContentType::ChangeCipherSpec],
728                ))
729            }
730        }
731
732        // CCS should not be received interleaved with fragmented handshake-level
733        // message.
734        cx.common.check_aligned_handshake()?;
735
736        cx.common
737            .record_layer
738            .start_decrypting();
739        Ok(Box::new(ExpectFinished {
740            config: self.config,
741            secrets: self.secrets,
742            transcript: self.transcript,
743            session_id: self.session_id,
744            using_ems: self.using_ems,
745            resuming: self.resuming,
746            send_ticket: self.send_ticket,
747        }))
748    }
749}
750
751// --- Process client's Finished ---
752fn get_server_connection_value_tls12(
753    secrets: &ConnectionSecrets,
754    using_ems: bool,
755    cx: &ServerContext<'_>,
756    time_now: ticketer::TimeBase,
757) -> persist::ServerSessionValue {
758    let version = ProtocolVersion::TLSv1_2;
759    let secret = secrets.get_master_secret();
760
761    let mut v = persist::ServerSessionValue::new(
762        cx.data.sni.as_ref(),
763        version,
764        secrets.suite().common.suite,
765        secret,
766        cx.common.peer_certificates.clone(),
767        cx.common.alpn_protocol.clone(),
768        cx.data.resumption_data.clone(),
769        time_now,
770        0,
771    );
772
773    if using_ems {
774        v.set_extended_ms_used();
775    }
776
777    v
778}
779
780fn emit_ticket(
781    secrets: &ConnectionSecrets,
782    transcript: &mut HandshakeHash,
783    using_ems: bool,
784    cx: &mut ServerContext<'_>,
785    ticketer: &dyn ProducesTickets,
786) -> Result<(), Error> {
787    let time_now = ticketer::TimeBase::now()?;
788    let plain = get_server_connection_value_tls12(secrets, using_ems, cx, time_now).get_encoding();
789
790    // If we can't produce a ticket for some reason, we can't
791    // report an error. Send an empty one.
792    let ticket = ticketer
793        .encrypt(&plain)
794        .unwrap_or_default();
795    let ticket_lifetime = ticketer.lifetime();
796
797    let m = Message {
798        version: ProtocolVersion::TLSv1_2,
799        payload: MessagePayload::handshake(HandshakeMessagePayload {
800            typ: HandshakeType::NewSessionTicket,
801            payload: HandshakePayload::NewSessionTicket(NewSessionTicketPayload::new(
802                ticket_lifetime,
803                ticket,
804            )),
805        }),
806    };
807
808    transcript.add_message(&m);
809    cx.common.send_msg(m, false);
810    Ok(())
811}
812
813fn emit_ccs(common: &mut CommonState) {
814    let m = Message {
815        version: ProtocolVersion::TLSv1_2,
816        payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
817    };
818
819    common.send_msg(m, false);
820}
821
822fn emit_finished(
823    secrets: &ConnectionSecrets,
824    transcript: &mut HandshakeHash,
825    common: &mut CommonState,
826) {
827    let vh = transcript.get_current_hash();
828    let verify_data = secrets.server_verify_data(&vh);
829    let verify_data_payload = Payload::new(verify_data);
830
831    let f = Message {
832        version: ProtocolVersion::TLSv1_2,
833        payload: MessagePayload::handshake(HandshakeMessagePayload {
834            typ: HandshakeType::Finished,
835            payload: HandshakePayload::Finished(verify_data_payload),
836        }),
837    };
838
839    transcript.add_message(&f);
840    common.send_msg(f, true);
841}
842
843struct ExpectFinished {
844    config: Arc<ServerConfig>,
845    secrets: ConnectionSecrets,
846    transcript: HandshakeHash,
847    session_id: SessionId,
848    using_ems: bool,
849    resuming: bool,
850    send_ticket: bool,
851}
852
853impl State<ServerConnectionData> for ExpectFinished {
854    fn handle(mut self: Box<Self>, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError {
855        let finished =
856            require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
857
858        cx.common.check_aligned_handshake()?;
859
860        let vh = self.transcript.get_current_hash();
861        let expect_verify_data = self.secrets.client_verify_data(&vh);
862
863        let _fin_verified =
864            constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0)
865                .map_err(|_| {
866                    cx.common
867                        .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError)
868                })
869                .map(|_| verify::FinishedMessageVerified::assertion())?;
870
871        // Save connection, perhaps
872        if !self.resuming && !self.session_id.is_empty() {
873            let time_now = ticketer::TimeBase::now()?;
874            let value =
875                get_server_connection_value_tls12(&self.secrets, self.using_ems, cx, time_now);
876
877            let worked = self
878                .config
879                .session_storage
880                .put(self.session_id.get_encoding(), value.get_encoding());
881            if worked {
882                debug!("Session saved");
883            } else {
884                debug!("Session not saved");
885            }
886        }
887
888        // Send our CCS and Finished.
889        self.transcript.add_message(&m);
890        if !self.resuming {
891            if self.send_ticket {
892                emit_ticket(
893                    &self.secrets,
894                    &mut self.transcript,
895                    self.using_ems,
896                    cx,
897                    &*self.config.ticketer,
898                )?;
899            }
900            emit_ccs(cx.common);
901            cx.common
902                .record_layer
903                .start_encrypting();
904            emit_finished(&self.secrets, &mut self.transcript, cx.common);
905        }
906
907        cx.common.start_traffic();
908        Ok(Box::new(ExpectTraffic {
909            secrets: self.secrets,
910            _fin_verified,
911        }))
912    }
913}
914
915// --- Process traffic ---
916struct ExpectTraffic {
917    secrets: ConnectionSecrets,
918    _fin_verified: verify::FinishedMessageVerified,
919}
920
921impl ExpectTraffic {}
922
923impl State<ServerConnectionData> for ExpectTraffic {
924    fn handle(self: Box<Self>, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError {
925        match m.payload {
926            MessagePayload::ApplicationData(payload) => cx
927                .common
928                .take_received_plaintext(payload),
929            payload => {
930                return Err(inappropriate_message(
931                    &payload,
932                    &[ContentType::ApplicationData],
933                ));
934            }
935        }
936        Ok(self)
937    }
938
939    fn export_keying_material(
940        &self,
941        output: &mut [u8],
942        label: &[u8],
943        context: Option<&[u8]>,
944    ) -> Result<(), Error> {
945        self.secrets
946            .export_keying_material(output, label, context);
947        Ok(())
948    }
949
950    #[cfg(feature = "secret_extraction")]
951    fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
952        self.secrets
953            .extract_secrets(Side::Server)
954    }
955}