Skip to main content

rustls/server/
tls12.rs

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