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, ECPointFormat};
44    use crate::msgs::handshake::{
45        CertificateRequestPayload, CertificateStatus, ClientExtension, ClientHelloPayload,
46        ClientSessionTicket, Random, ServerExtension, 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: Vec<ServerExtension>,
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.ems_support_offered() {
78                self.using_ems = true;
79            } else if self.config.require_ems {
80                return Err(cx.common.send_fatal_alert(
81                    AlertDescription::HandshakeFailure,
82                    PeerIncompatible::ExtendedMasterSecretExtensionRequired,
83                ));
84            }
85
86            // "RFC 4492 specified that if this extension is missing,
87            // it means that only the uncompressed point format is
88            // supported"
89            // - <https://datatracker.ietf.org/doc/html/rfc8422#section-5.1.2>
90            let ecpoints_ext = client_hello
91                .ecpoints_extension()
92                .unwrap_or(&[ECPointFormat::Uncompressed]);
93
94            trace!("ecpoints {:?}", ecpoints_ext);
95
96            if !ecpoints_ext.contains(&ECPointFormat::Uncompressed) {
97                return Err(cx.common.send_fatal_alert(
98                    AlertDescription::IllegalParameter,
99                    PeerIncompatible::UncompressedEcPointsRequired,
100                ));
101            }
102
103            // -- If TLS1.3 is enabled, signal the downgrade in the server random
104            if tls13_enabled {
105                self.randoms.server[24..].copy_from_slice(&tls12::DOWNGRADE_SENTINEL);
106            }
107
108            // -- Check for resumption --
109            // We can do this either by (in order of preference):
110            // 1. receiving a ticket that decrypts
111            // 2. receiving a sessionid that is in our cache
112            //
113            // If we receive a ticket, the sessionid won't be in our
114            // cache, so don't check.
115            //
116            // If either works, we end up with a ServerConnectionValue
117            // which is passed to start_resumption and concludes
118            // our handling of the ClientHello.
119            //
120            let mut ticket_received = false;
121            let resume_data = client_hello
122                .ticket_extension()
123                .and_then(|ticket_ext| match ticket_ext {
124                    ClientExtension::SessionTicket(ClientSessionTicket::Offer(ticket)) => {
125                        Some(ticket)
126                    }
127                    _ => None,
128                })
129                .and_then(|ticket| {
130                    ticket_received = true;
131                    debug!("Ticket received");
132                    let data = self
133                        .config
134                        .ticketer
135                        .decrypt(ticket.bytes());
136                    if data.is_none() {
137                        debug!("Ticket didn't decrypt");
138                    }
139                    data
140                })
141                .or_else(|| {
142                    // Perhaps resume?  If we received a ticket, the sessionid
143                    // does not correspond to a real session.
144                    if client_hello.session_id.is_empty() || ticket_received {
145                        return None;
146                    }
147
148                    self.config
149                        .session_storage
150                        .get(client_hello.session_id.as_ref())
151                })
152                .and_then(|x| persist::ServerSessionValue::read_bytes(&x).ok())
153                .filter(|resumedata| {
154                    hs::can_resume(self.suite.into(), &cx.data.sni, self.using_ems, resumedata)
155                });
156
157            if let Some(data) = resume_data {
158                return self.start_resumption(cx, client_hello, &client_hello.session_id, data);
159            }
160
161            // Now we have chosen a ciphersuite, we can make kx decisions.
162            let sigschemes = self
163                .suite
164                .resolve_sig_schemes(&sigschemes_ext);
165
166            if sigschemes.is_empty() {
167                return Err(cx.common.send_fatal_alert(
168                    AlertDescription::HandshakeFailure,
169                    PeerIncompatible::NoSignatureSchemesInCommon,
170                ));
171            }
172
173            let ecpoint = ECPointFormat::SUPPORTED
174                .iter()
175                .find(|format| ecpoints_ext.contains(format))
176                .cloned()
177                .ok_or_else(|| {
178                    cx.common.send_fatal_alert(
179                        AlertDescription::HandshakeFailure,
180                        PeerIncompatible::NoEcPointFormatsInCommon,
181                    )
182                })?;
183
184            debug_assert_eq!(ecpoint, ECPointFormat::Uncompressed);
185
186            let mut ocsp_response = server_key.get_ocsp();
187
188            // If we're not offered a ticket or a potential session ID, allocate a session ID.
189            if !self.config.session_storage.can_cache() {
190                self.session_id = SessionId::empty();
191            } else if self.session_id.is_empty() && !ticket_received {
192                self.session_id = SessionId::random(self.config.provider.secure_random)?;
193            }
194
195            cx.common.kx_state = KxState::Start(selected_kxg);
196            cx.common.handshake_kind = Some(HandshakeKind::Full);
197
198            let mut flight = HandshakeFlightTls12::new(&mut self.transcript);
199
200            self.send_ticket = emit_server_hello(
201                &mut flight,
202                &self.config,
203                cx,
204                self.session_id,
205                self.suite,
206                self.using_ems,
207                &mut ocsp_response,
208                client_hello,
209                None,
210                &self.randoms,
211                self.extra_exts,
212            )?;
213            emit_certificate(&mut flight, server_key.get_cert());
214            if let Some(ocsp_response) = ocsp_response {
215                emit_cert_status(&mut flight, ocsp_response);
216            }
217            let server_kx = emit_server_kx(
218                &mut flight,
219                sigschemes,
220                selected_kxg,
221                server_key.get_key(),
222                &self.randoms,
223            )?;
224            let doing_client_auth = emit_certificate_req(&mut flight, &self.config)?;
225            emit_server_hello_done(&mut flight);
226
227            flight.finish(cx.common);
228
229            if doing_client_auth {
230                Ok(Box::new(ExpectCertificate {
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                    send_ticket: self.send_ticket,
239                }))
240            } else {
241                Ok(Box::new(ExpectClientKx {
242                    config: self.config,
243                    transcript: self.transcript,
244                    randoms: self.randoms,
245                    session_id: self.session_id,
246                    suite: self.suite,
247                    using_ems: self.using_ems,
248                    server_kx,
249                    client_cert: None,
250                    send_ticket: self.send_ticket,
251                }))
252            }
253        }
254
255        fn start_resumption(
256            mut self,
257            cx: &mut ServerContext<'_>,
258            client_hello: &ClientHelloPayload,
259            id: &SessionId,
260            resumedata: persist::ServerSessionValue,
261        ) -> hs::NextStateOrError<'static> {
262            debug!("Resuming connection");
263
264            if resumedata.extended_ms && !self.using_ems {
265                return Err(cx.common.send_fatal_alert(
266                    AlertDescription::IllegalParameter,
267                    PeerMisbehaved::ResumptionAttemptedWithVariedEms,
268                ));
269            }
270
271            self.session_id = *id;
272            let mut flight = HandshakeFlightTls12::new(&mut self.transcript);
273            self.send_ticket = emit_server_hello(
274                &mut flight,
275                &self.config,
276                cx,
277                self.session_id,
278                self.suite,
279                self.using_ems,
280                &mut None,
281                client_hello,
282                Some(&resumedata),
283                &self.randoms,
284                self.extra_exts,
285            )?;
286            flight.finish(cx.common);
287
288            let secrets = ConnectionSecrets::new_resume(
289                self.randoms,
290                self.suite,
291                &resumedata.master_secret.0,
292            );
293            self.config.key_log.log(
294                "CLIENT_RANDOM",
295                &secrets.randoms.client,
296                &secrets.master_secret,
297            );
298            cx.common
299                .start_encryption_tls12(&secrets, Side::Server);
300            cx.common.peer_certificates = resumedata.client_cert_chain;
301            cx.common.handshake_kind = Some(HandshakeKind::Resumed);
302
303            if self.send_ticket {
304                let now = self.config.current_time()?;
305
306                emit_ticket(
307                    &secrets,
308                    &mut self.transcript,
309                    self.using_ems,
310                    cx,
311                    &*self.config.ticketer,
312                    now,
313                )?;
314            }
315            emit_ccs(cx.common);
316            cx.common
317                .record_layer
318                .start_encrypting();
319            emit_finished(&secrets, &mut self.transcript, cx.common);
320
321            Ok(Box::new(ExpectCcs {
322                config: self.config,
323                secrets,
324                transcript: self.transcript,
325                session_id: self.session_id,
326                using_ems: self.using_ems,
327                resuming: true,
328                send_ticket: self.send_ticket,
329            }))
330        }
331    }
332
333    fn emit_server_hello(
334        flight: &mut HandshakeFlightTls12<'_>,
335        config: &ServerConfig,
336        cx: &mut ServerContext<'_>,
337        session_id: SessionId,
338        suite: &'static Tls12CipherSuite,
339        using_ems: bool,
340        ocsp_response: &mut Option<&[u8]>,
341        hello: &ClientHelloPayload,
342        resumedata: Option<&persist::ServerSessionValue>,
343        randoms: &ConnectionRandoms,
344        extra_exts: Vec<ServerExtension>,
345    ) -> Result<bool, Error> {
346        let mut ep = hs::ExtensionProcessing::new();
347        ep.process_common(config, cx, ocsp_response, hello, resumedata, extra_exts)?;
348        ep.process_tls12(config, hello, using_ems);
349
350        let sh = HandshakeMessagePayload {
351            typ: HandshakeType::ServerHello,
352            payload: HandshakePayload::ServerHello(ServerHelloPayload {
353                legacy_version: ProtocolVersion::TLSv1_2,
354                random: Random::from(randoms.server),
355                session_id,
356                cipher_suite: suite.common.suite,
357                compression_method: Compression::Null,
358                extensions: ep.exts,
359            }),
360        };
361        trace!("sending server hello {:?}", sh);
362        flight.add(sh);
363
364        Ok(ep.send_ticket)
365    }
366
367    fn emit_certificate(
368        flight: &mut HandshakeFlightTls12<'_>,
369        cert_chain: &[CertificateDer<'static>],
370    ) {
371        flight.add(HandshakeMessagePayload {
372            typ: HandshakeType::Certificate,
373            payload: HandshakePayload::Certificate(CertificateChain(cert_chain.to_vec())),
374        });
375    }
376
377    fn emit_cert_status(flight: &mut HandshakeFlightTls12<'_>, ocsp: &[u8]) {
378        flight.add(HandshakeMessagePayload {
379            typ: HandshakeType::CertificateStatus,
380            payload: HandshakePayload::CertificateStatus(CertificateStatus::new(ocsp)),
381        });
382    }
383
384    fn emit_server_kx(
385        flight: &mut HandshakeFlightTls12<'_>,
386        sigschemes: Vec<SignatureScheme>,
387        selected_group: &'static dyn SupportedKxGroup,
388        signing_key: &dyn sign::SigningKey,
389        randoms: &ConnectionRandoms,
390    ) -> Result<Box<dyn ActiveKeyExchange>, Error> {
391        let kx = selected_group.start()?;
392        let kx_params = ServerKeyExchangeParams::new(&*kx);
393
394        let mut msg = Vec::new();
395        msg.extend(randoms.client);
396        msg.extend(randoms.server);
397        kx_params.encode(&mut msg);
398
399        let signer = signing_key
400            .choose_scheme(&sigschemes)
401            .ok_or_else(|| Error::General("incompatible signing key".to_string()))?;
402        let sigscheme = signer.scheme();
403        let sig = signer.sign(&msg)?;
404
405        let skx = ServerKeyExchangePayload::from(ServerKeyExchange {
406            params: kx_params,
407            dss: DigitallySignedStruct::new(sigscheme, sig),
408        });
409
410        flight.add(HandshakeMessagePayload {
411            typ: HandshakeType::ServerKeyExchange,
412            payload: HandshakePayload::ServerKeyExchange(skx),
413        });
414        Ok(kx)
415    }
416
417    fn emit_certificate_req(
418        flight: &mut HandshakeFlightTls12<'_>,
419        config: &ServerConfig,
420    ) -> Result<bool, Error> {
421        let client_auth = &config.verifier;
422
423        if !client_auth.offer_client_auth() {
424            return Ok(false);
425        }
426
427        let verify_schemes = client_auth.supported_verify_schemes();
428
429        let names = config
430            .verifier
431            .root_hint_subjects()
432            .to_vec();
433
434        let cr = CertificateRequestPayload {
435            certtypes: vec![
436                ClientCertificateType::RSASign,
437                ClientCertificateType::ECDSASign,
438            ],
439            sigschemes: verify_schemes,
440            canames: names,
441        };
442
443        let creq = HandshakeMessagePayload {
444            typ: HandshakeType::CertificateRequest,
445            payload: HandshakePayload::CertificateRequest(cr),
446        };
447
448        trace!("Sending CertificateRequest {:?}", creq);
449        flight.add(creq);
450        Ok(true)
451    }
452
453    fn emit_server_hello_done(flight: &mut HandshakeFlightTls12<'_>) {
454        flight.add(HandshakeMessagePayload {
455            typ: HandshakeType::ServerHelloDone,
456            payload: HandshakePayload::ServerHelloDone,
457        });
458    }
459}
460
461// --- Process client's Certificate for client auth ---
462struct ExpectCertificate {
463    config: Arc<ServerConfig>,
464    transcript: HandshakeHash,
465    randoms: ConnectionRandoms,
466    session_id: SessionId,
467    suite: &'static Tls12CipherSuite,
468    using_ems: bool,
469    server_kx: Box<dyn ActiveKeyExchange>,
470    send_ticket: bool,
471}
472
473impl State<ServerConnectionData> for ExpectCertificate {
474    fn handle<'m>(
475        mut self: Box<Self>,
476        cx: &mut ServerContext<'_>,
477        m: Message<'m>,
478    ) -> hs::NextStateOrError<'m>
479    where
480        Self: 'm,
481    {
482        self.transcript.add_message(&m);
483        let cert_chain = require_handshake_msg_move!(
484            m,
485            HandshakeType::Certificate,
486            HandshakePayload::Certificate
487        )?;
488
489        // If we can't determine if the auth is mandatory, abort
490        let mandatory = self
491            .config
492            .verifier
493            .client_auth_mandatory();
494
495        trace!("certs {:?}", cert_chain);
496
497        let client_cert = match cert_chain.split_first() {
498            None if mandatory => {
499                return Err(cx.common.send_fatal_alert(
500                    AlertDescription::CertificateRequired,
501                    Error::NoCertificatesPresented,
502                ));
503            }
504            None => {
505                debug!("client auth requested but no certificate supplied");
506                self.transcript.abandon_client_auth();
507                None
508            }
509            Some((end_entity, intermediates)) => {
510                let now = self.config.current_time()?;
511
512                self.config
513                    .verifier
514                    .verify_client_cert(end_entity, intermediates, now)
515                    .map_err(|err| {
516                        cx.common
517                            .send_cert_verify_error_alert(err)
518                    })?;
519
520                Some(cert_chain)
521            }
522        };
523
524        Ok(Box::new(ExpectClientKx {
525            config: self.config,
526            transcript: self.transcript,
527            randoms: self.randoms,
528            session_id: self.session_id,
529            suite: self.suite,
530            using_ems: self.using_ems,
531            server_kx: self.server_kx,
532            client_cert,
533            send_ticket: self.send_ticket,
534        }))
535    }
536
537    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
538        self
539    }
540}
541
542// --- Process client's KeyExchange ---
543struct ExpectClientKx<'a> {
544    config: Arc<ServerConfig>,
545    transcript: HandshakeHash,
546    randoms: ConnectionRandoms,
547    session_id: SessionId,
548    suite: &'static Tls12CipherSuite,
549    using_ems: bool,
550    server_kx: Box<dyn ActiveKeyExchange>,
551    client_cert: Option<CertificateChain<'a>>,
552    send_ticket: bool,
553}
554
555impl State<ServerConnectionData> for ExpectClientKx<'_> {
556    fn handle<'m>(
557        mut self: Box<Self>,
558        cx: &mut ServerContext<'_>,
559        m: Message<'m>,
560    ) -> hs::NextStateOrError<'m>
561    where
562        Self: 'm,
563    {
564        let client_kx = require_handshake_msg!(
565            m,
566            HandshakeType::ClientKeyExchange,
567            HandshakePayload::ClientKeyExchange
568        )?;
569        self.transcript.add_message(&m);
570        let ems_seed = self
571            .using_ems
572            .then(|| self.transcript.current_hash());
573
574        // Complete key agreement, and set up encryption with the
575        // resulting premaster secret.
576        let peer_kx_params = tls12::decode_kx_params::<ClientKeyExchangeParams>(
577            self.suite.kx,
578            cx.common,
579            client_kx.bytes(),
580        )?;
581        let secrets = ConnectionSecrets::from_key_exchange(
582            self.server_kx,
583            peer_kx_params.pub_key(),
584            ems_seed,
585            self.randoms,
586            self.suite,
587        )
588        .map_err(|err| {
589            cx.common
590                .send_fatal_alert(AlertDescription::IllegalParameter, err)
591        })?;
592        cx.common.kx_state.complete();
593
594        self.config.key_log.log(
595            "CLIENT_RANDOM",
596            &secrets.randoms.client,
597            &secrets.master_secret,
598        );
599        cx.common
600            .start_encryption_tls12(&secrets, Side::Server);
601
602        match self.client_cert {
603            Some(client_cert) => Ok(Box::new(ExpectCertificateVerify {
604                config: self.config,
605                secrets,
606                transcript: self.transcript,
607                session_id: self.session_id,
608                using_ems: self.using_ems,
609                client_cert,
610                send_ticket: self.send_ticket,
611            })),
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_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
1003        Ok(self)
1004    }
1005
1006    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1007        self
1008    }
1009}
1010
1011impl KernelState for ExpectTraffic {
1012    fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1013        Err(Error::General(
1014            "TLS 1.2 connections do not support traffic secret updates".into(),
1015        ))
1016    }
1017
1018    fn handle_new_session_ticket(
1019        &mut self,
1020        _cx: &mut KernelContext<'_>,
1021        _message: &NewSessionTicketPayloadTls13,
1022    ) -> Result<(), Error> {
1023        unreachable!(
1024            "server connections should never have handle_new_session_ticket called on them"
1025        )
1026    }
1027}