rustls/server/
tls12.rs

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