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 verify_schemes = client_auth.supported_verify_schemes();
411
412        let names = config
413            .verifier
414            .root_hint_subjects()
415            .to_vec();
416
417        let cr = CertificateRequestPayload {
418            certtypes: vec![
419                ClientCertificateType::RSASign,
420                ClientCertificateType::ECDSASign,
421            ],
422            sigschemes: verify_schemes,
423            canames: names,
424        };
425
426        let creq = HandshakeMessagePayload(HandshakePayload::CertificateRequest(cr));
427
428        trace!("Sending CertificateRequest {creq:?}");
429        flight.add(creq);
430        Ok(true)
431    }
432
433    fn emit_server_hello_done(flight: &mut HandshakeFlightTls12<'_>) {
434        flight.add(HandshakeMessagePayload(HandshakePayload::ServerHelloDone));
435    }
436}
437
438// --- Process client's Certificate for client auth ---
439struct ExpectCertificate {
440    config: Arc<ServerConfig>,
441    transcript: HandshakeHash,
442    randoms: ConnectionRandoms,
443    session_id: SessionId,
444    suite: &'static Tls12CipherSuite,
445    using_ems: bool,
446    server_kx: Box<dyn ActiveKeyExchange>,
447    send_ticket: bool,
448}
449
450impl State<ServerConnectionData> for ExpectCertificate {
451    fn handle<'m>(
452        mut self: Box<Self>,
453        cx: &mut ServerContext<'_>,
454        m: Message<'m>,
455    ) -> hs::NextStateOrError<'m>
456    where
457        Self: 'm,
458    {
459        self.transcript.add_message(&m);
460        let cert_chain = require_handshake_msg_move!(
461            m,
462            HandshakeType::Certificate,
463            HandshakePayload::Certificate
464        )?;
465
466        // If we can't determine if the auth is mandatory, abort
467        let mandatory = self
468            .config
469            .verifier
470            .client_auth_mandatory();
471
472        trace!("certs {cert_chain:?}");
473
474        let client_cert = match cert_chain.split_first() {
475            None if mandatory => {
476                return Err(cx.common.send_fatal_alert(
477                    AlertDescription::CertificateRequired,
478                    Error::NoCertificatesPresented,
479                ));
480            }
481            None => {
482                debug!("client auth requested but no certificate supplied");
483                self.transcript.abandon_client_auth();
484                None
485            }
486            Some((end_entity, intermediates)) => {
487                let now = self.config.current_time()?;
488
489                self.config
490                    .verifier
491                    .verify_client_cert(end_entity, intermediates, now)
492                    .map_err(|err| {
493                        cx.common
494                            .send_cert_verify_error_alert(err)
495                    })?;
496
497                Some(cert_chain)
498            }
499        };
500
501        Ok(Box::new(ExpectClientKx {
502            config: self.config,
503            transcript: self.transcript,
504            randoms: self.randoms,
505            session_id: self.session_id,
506            suite: self.suite,
507            using_ems: self.using_ems,
508            server_kx: self.server_kx,
509            client_cert,
510            send_ticket: self.send_ticket,
511        }))
512    }
513
514    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
515        self
516    }
517}
518
519// --- Process client's KeyExchange ---
520struct ExpectClientKx<'a> {
521    config: Arc<ServerConfig>,
522    transcript: HandshakeHash,
523    randoms: ConnectionRandoms,
524    session_id: SessionId,
525    suite: &'static Tls12CipherSuite,
526    using_ems: bool,
527    server_kx: Box<dyn ActiveKeyExchange>,
528    client_cert: Option<CertificateChain<'a>>,
529    send_ticket: bool,
530}
531
532impl State<ServerConnectionData> for ExpectClientKx<'_> {
533    fn handle<'m>(
534        mut self: Box<Self>,
535        cx: &mut ServerContext<'_>,
536        m: Message<'m>,
537    ) -> hs::NextStateOrError<'m>
538    where
539        Self: 'm,
540    {
541        let client_kx = require_handshake_msg!(
542            m,
543            HandshakeType::ClientKeyExchange,
544            HandshakePayload::ClientKeyExchange
545        )?;
546        self.transcript.add_message(&m);
547        let ems_seed = self
548            .using_ems
549            .then(|| self.transcript.current_hash());
550
551        // Complete key agreement, and set up encryption with the
552        // resulting premaster secret.
553        let peer_kx_params = tls12::decode_kx_params::<ClientKeyExchangeParams>(
554            self.suite.kx,
555            cx.common,
556            client_kx.bytes(),
557        )?;
558        let secrets = ConnectionSecrets::from_key_exchange(
559            self.server_kx,
560            peer_kx_params.pub_key(),
561            ems_seed,
562            self.randoms,
563            self.suite,
564        )
565        .map_err(|err| {
566            cx.common
567                .send_fatal_alert(AlertDescription::IllegalParameter, err)
568        })?;
569        cx.common.kx_state.complete();
570
571        self.config.key_log.log(
572            "CLIENT_RANDOM",
573            &secrets.randoms.client,
574            &secrets.master_secret,
575        );
576        cx.common
577            .start_encryption_tls12(&secrets, Side::Server);
578
579        match self.client_cert {
580            Some(client_cert) => Ok(Box::new(ExpectCertificateVerify {
581                config: self.config,
582                secrets,
583                transcript: self.transcript,
584                session_id: self.session_id,
585                using_ems: self.using_ems,
586                client_cert,
587                send_ticket: self.send_ticket,
588            })),
589            _ => Ok(Box::new(ExpectCcs {
590                config: self.config,
591                secrets,
592                transcript: self.transcript,
593                session_id: self.session_id,
594                using_ems: self.using_ems,
595                resuming: false,
596                send_ticket: self.send_ticket,
597            })),
598        }
599    }
600
601    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
602        Box::new(ExpectClientKx {
603            config: self.config,
604            transcript: self.transcript,
605            randoms: self.randoms,
606            session_id: self.session_id,
607            suite: self.suite,
608            using_ems: self.using_ems,
609            server_kx: self.server_kx,
610            client_cert: self
611                .client_cert
612                .map(|cert| cert.into_owned()),
613            send_ticket: self.send_ticket,
614        })
615    }
616}
617
618// --- Process client's certificate proof ---
619struct ExpectCertificateVerify<'a> {
620    config: Arc<ServerConfig>,
621    secrets: ConnectionSecrets,
622    transcript: HandshakeHash,
623    session_id: SessionId,
624    using_ems: bool,
625    client_cert: CertificateChain<'a>,
626    send_ticket: bool,
627}
628
629impl State<ServerConnectionData> for ExpectCertificateVerify<'_> {
630    fn handle<'m>(
631        mut self: Box<Self>,
632        cx: &mut ServerContext<'_>,
633        m: Message<'m>,
634    ) -> hs::NextStateOrError<'m>
635    where
636        Self: 'm,
637    {
638        let rc = {
639            let sig = require_handshake_msg!(
640                m,
641                HandshakeType::CertificateVerify,
642                HandshakePayload::CertificateVerify
643            )?;
644
645            match self.transcript.take_handshake_buf() {
646                Some(msgs) => {
647                    let certs = &self.client_cert;
648                    self.config
649                        .verifier
650                        .verify_tls12_signature(&msgs, &certs[0], sig)
651                }
652                None => {
653                    // This should be unreachable; the handshake buffer was initialized with
654                    // client authentication if the verifier wants to offer it.
655                    // `transcript.abandon_client_auth()` can extract it, but its only caller in
656                    // this flow will also set `ExpectClientKx::client_cert` to `None`, making it
657                    // impossible to reach this state.
658                    return Err(cx.common.send_fatal_alert(
659                        AlertDescription::AccessDenied,
660                        Error::General("client authentication not set up".into()),
661                    ));
662                }
663            }
664        };
665
666        if let Err(e) = rc {
667            return Err(cx
668                .common
669                .send_cert_verify_error_alert(e));
670        }
671
672        trace!("client CertificateVerify OK");
673        cx.common.peer_certificates = Some(self.client_cert.into_owned());
674
675        self.transcript.add_message(&m);
676        Ok(Box::new(ExpectCcs {
677            config: self.config,
678            secrets: self.secrets,
679            transcript: self.transcript,
680            session_id: self.session_id,
681            using_ems: self.using_ems,
682            resuming: false,
683            send_ticket: self.send_ticket,
684        }))
685    }
686
687    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
688        Box::new(ExpectCertificateVerify {
689            config: self.config,
690            secrets: self.secrets,
691            transcript: self.transcript,
692            session_id: self.session_id,
693            using_ems: self.using_ems,
694            client_cert: self.client_cert.into_owned(),
695            send_ticket: self.send_ticket,
696        })
697    }
698}
699
700// --- Process client's ChangeCipherSpec ---
701struct ExpectCcs {
702    config: Arc<ServerConfig>,
703    secrets: ConnectionSecrets,
704    transcript: HandshakeHash,
705    session_id: SessionId,
706    using_ems: bool,
707    resuming: bool,
708    send_ticket: bool,
709}
710
711impl State<ServerConnectionData> for ExpectCcs {
712    fn handle<'m>(
713        self: Box<Self>,
714        cx: &mut ServerContext<'_>,
715        m: Message<'m>,
716    ) -> hs::NextStateOrError<'m>
717    where
718        Self: 'm,
719    {
720        match m.payload {
721            MessagePayload::ChangeCipherSpec(..) => {}
722            payload => {
723                return Err(inappropriate_message(
724                    &payload,
725                    &[ContentType::ChangeCipherSpec],
726                ));
727            }
728        }
729
730        // CCS should not be received interleaved with fragmented handshake-level
731        // message.
732        cx.common.check_aligned_handshake()?;
733
734        cx.common
735            .record_layer
736            .start_decrypting();
737        Ok(Box::new(ExpectFinished {
738            config: self.config,
739            secrets: self.secrets,
740            transcript: self.transcript,
741            session_id: self.session_id,
742            using_ems: self.using_ems,
743            resuming: self.resuming,
744            send_ticket: self.send_ticket,
745        }))
746    }
747
748    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
749        self
750    }
751}
752
753// --- Process client's Finished ---
754fn get_server_connection_value_tls12(
755    secrets: &ConnectionSecrets,
756    using_ems: bool,
757    cx: &ServerContext<'_>,
758    time_now: UnixTime,
759) -> persist::ServerSessionValue {
760    let version = ProtocolVersion::TLSv1_2;
761
762    let mut v = persist::ServerSessionValue::new(
763        cx.data.sni.as_ref(),
764        version,
765        secrets.suite().common.suite,
766        secrets.master_secret(),
767        cx.common.peer_certificates.clone(),
768        cx.common.alpn_protocol.clone(),
769        cx.data.resumption_data.clone(),
770        time_now,
771        0,
772    );
773
774    if using_ems {
775        v.set_extended_ms_used();
776    }
777
778    v
779}
780
781fn emit_ticket(
782    secrets: &ConnectionSecrets,
783    transcript: &mut HandshakeHash,
784    using_ems: bool,
785    cx: &mut ServerContext<'_>,
786    ticketer: &dyn ProducesTickets,
787    now: UnixTime,
788) -> Result<(), Error> {
789    let plain = get_server_connection_value_tls12(secrets, using_ems, cx, now).get_encoding();
790
791    // If we can't produce a ticket for some reason, we can't
792    // report an error. Send an empty one.
793    let ticket = ticketer
794        .encrypt(&plain)
795        .unwrap_or_default();
796    let ticket_lifetime = ticketer.lifetime();
797
798    let m = Message {
799        version: ProtocolVersion::TLSv1_2,
800        payload: MessagePayload::handshake(HandshakeMessagePayload(
801            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.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(HandshakePayload::Finished(
834            verify_data_payload,
835        ))),
836    };
837
838    transcript.add_message(&f);
839    common.send_msg(f, true);
840}
841
842struct ExpectFinished {
843    config: Arc<ServerConfig>,
844    secrets: ConnectionSecrets,
845    transcript: HandshakeHash,
846    session_id: SessionId,
847    using_ems: bool,
848    resuming: bool,
849    send_ticket: bool,
850}
851
852impl State<ServerConnectionData> for ExpectFinished {
853    fn handle<'m>(
854        mut self: Box<Self>,
855        cx: &mut ServerContext<'_>,
856        m: Message<'m>,
857    ) -> hs::NextStateOrError<'m>
858    where
859        Self: 'm,
860    {
861        let finished =
862            require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
863
864        cx.common.check_aligned_handshake()?;
865
866        let vh = self.transcript.current_hash();
867        let expect_verify_data = self.secrets.client_verify_data(&vh);
868
869        let _fin_verified =
870            match ConstantTimeEq::ct_eq(&expect_verify_data[..], finished.bytes()).into() {
871                true => verify::FinishedMessageVerified::assertion(),
872                false => {
873                    return Err(cx
874                        .common
875                        .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
876                }
877            };
878
879        // Save connection, perhaps
880        if !self.resuming && !self.session_id.is_empty() {
881            let now = self.config.current_time()?;
882
883            let value = get_server_connection_value_tls12(&self.secrets, self.using_ems, cx, now);
884
885            let worked = self
886                .config
887                .session_storage
888                .put(self.session_id.as_ref().to_vec(), value.get_encoding());
889            #[cfg_attr(not(feature = "logging"), allow(clippy::if_same_then_else))]
890            if worked {
891                debug!("Session saved");
892            } else {
893                debug!("Session not saved");
894            }
895        }
896
897        // Send our CCS and Finished.
898        self.transcript.add_message(&m);
899        if !self.resuming {
900            if self.send_ticket {
901                let now = self.config.current_time()?;
902                emit_ticket(
903                    &self.secrets,
904                    &mut self.transcript,
905                    self.using_ems,
906                    cx,
907                    &*self.config.ticketer,
908                    now,
909                )?;
910            }
911            emit_ccs(cx.common);
912            cx.common
913                .record_layer
914                .start_encrypting();
915            emit_finished(&self.secrets, &mut self.transcript, cx.common);
916        }
917
918        cx.common
919            .start_traffic(&mut cx.sendable_plaintext);
920        Ok(Box::new(ExpectTraffic {
921            secrets: self.secrets,
922            _fin_verified,
923        }))
924    }
925
926    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
927        self
928    }
929}
930
931// --- Process traffic ---
932struct ExpectTraffic {
933    secrets: ConnectionSecrets,
934    _fin_verified: verify::FinishedMessageVerified,
935}
936
937impl ExpectTraffic {}
938
939impl State<ServerConnectionData> for ExpectTraffic {
940    fn handle<'m>(
941        self: Box<Self>,
942        cx: &mut ServerContext<'_>,
943        m: Message<'m>,
944    ) -> hs::NextStateOrError<'m>
945    where
946        Self: 'm,
947    {
948        match m.payload {
949            MessagePayload::ApplicationData(payload) => cx
950                .common
951                .take_received_plaintext(payload),
952            payload => {
953                return Err(inappropriate_message(
954                    &payload,
955                    &[ContentType::ApplicationData],
956                ));
957            }
958        }
959        Ok(self)
960    }
961
962    fn export_keying_material(
963        &self,
964        output: &mut [u8],
965        label: &[u8],
966        context: Option<&[u8]>,
967    ) -> Result<(), Error> {
968        self.secrets
969            .export_keying_material(output, label, context);
970        Ok(())
971    }
972
973    fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
974        self.secrets
975            .extract_secrets(Side::Server)
976    }
977
978    fn into_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
979        Ok(self)
980    }
981
982    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
983        self
984    }
985}
986
987impl KernelState for ExpectTraffic {
988    fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
989        Err(Error::General(
990            "TLS 1.2 connections do not support traffic secret updates".into(),
991        ))
992    }
993
994    fn handle_new_session_ticket(
995        &mut self,
996        _cx: &mut KernelContext<'_>,
997        _message: &NewSessionTicketPayloadTls13,
998    ) -> Result<(), Error> {
999        unreachable!(
1000            "server connections should never have handle_new_session_ticket called on them"
1001        )
1002    }
1003}