rustls/server/
tls12.rs

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