rustls/server/
tls13.rs

1use alloc::boxed::Box;
2use alloc::sync::Arc;
3use alloc::vec;
4use alloc::vec::Vec;
5
6pub(super) use client_hello::CompleteClientHelloHandling;
7use pki_types::{CertificateDer, UnixTime};
8use subtle::ConstantTimeEq;
9
10use super::hs::{self, HandshakeHashOrBuffer, ServerContext};
11use super::server_conn::ServerConnectionData;
12use crate::check::{inappropriate_handshake_message, inappropriate_message};
13use crate::common_state::{CommonState, HandshakeKind, Protocol, Side, State};
14use crate::conn::ConnectionRandoms;
15use crate::enums::{AlertDescription, ContentType, HandshakeType, ProtocolVersion};
16use crate::error::{Error, InvalidMessage, PeerIncompatible, PeerMisbehaved};
17use crate::hash_hs::HandshakeHash;
18use crate::log::{debug, trace, warn};
19use crate::msgs::codec::{Codec, Reader};
20use crate::msgs::enums::KeyUpdateRequest;
21use crate::msgs::handshake::{
22    CertificateChain, CertificatePayloadTls13, HandshakeMessagePayload, HandshakePayload,
23    NewSessionTicketExtension, NewSessionTicketPayloadTls13, CERTIFICATE_MAX_SIZE_LIMIT,
24};
25use crate::msgs::message::{Message, MessagePayload};
26use crate::msgs::persist;
27use crate::server::ServerConfig;
28use crate::suites::PartiallyExtractedSecrets;
29use crate::tls13::key_schedule::{KeyScheduleTraffic, KeyScheduleTrafficWithClientFinishedPending};
30use crate::tls13::{
31    construct_client_verify_message, construct_server_verify_message, Tls13CipherSuite,
32};
33use crate::{compress, rand, verify};
34
35mod client_hello {
36    use super::*;
37    use crate::compress::CertCompressor;
38    use crate::crypto::SupportedKxGroup;
39    use crate::enums::SignatureScheme;
40    use crate::msgs::base::{Payload, PayloadU8};
41    use crate::msgs::ccs::ChangeCipherSpecPayload;
42    use crate::msgs::enums::{Compression, NamedGroup, PSKKeyExchangeMode};
43    use crate::msgs::handshake::{
44        CertReqExtension, CertificatePayloadTls13, CertificateRequestPayloadTls13,
45        ClientHelloPayload, HelloRetryExtension, HelloRetryRequest, KeyShareEntry, Random,
46        ServerExtension, ServerHelloPayload, SessionId,
47    };
48    use crate::server::common::ActiveCertifiedKey;
49    use crate::sign;
50    use crate::tls13::key_schedule::{
51        KeyScheduleEarly, KeyScheduleHandshake, KeySchedulePreHandshake,
52    };
53    use crate::verify::DigitallySignedStruct;
54
55    #[derive(PartialEq)]
56    pub(super) enum EarlyDataDecision {
57        Disabled,
58        RequestedButRejected,
59        Accepted,
60    }
61
62    pub(in crate::server) struct CompleteClientHelloHandling {
63        pub(in crate::server) config: Arc<ServerConfig>,
64        pub(in crate::server) transcript: HandshakeHash,
65        pub(in crate::server) suite: &'static Tls13CipherSuite,
66        pub(in crate::server) randoms: ConnectionRandoms,
67        pub(in crate::server) done_retry: bool,
68        pub(in crate::server) send_tickets: usize,
69        pub(in crate::server) extra_exts: Vec<ServerExtension>,
70    }
71
72    fn max_early_data_size(configured: u32) -> usize {
73        if configured != 0 {
74            configured as usize
75        } else {
76            // The relevant max_early_data_size may in fact be unknowable: if
77            // we (the server) have turned off early_data but the client has
78            // a stale ticket from when we allowed early_data: we'll naturally
79            // reject early_data but need an upper bound on the amount of data
80            // to drop.
81            //
82            // Use a single maximum-sized message.
83            16384
84        }
85    }
86
87    impl CompleteClientHelloHandling {
88        fn check_binder(
89            &self,
90            suite: &'static Tls13CipherSuite,
91            client_hello: &Message<'_>,
92            psk: &[u8],
93            binder: &[u8],
94        ) -> bool {
95            let binder_plaintext = match &client_hello.payload {
96                MessagePayload::Handshake { parsed, .. } => parsed.encoding_for_binder_signing(),
97                _ => unreachable!(),
98            };
99
100            let handshake_hash = self
101                .transcript
102                .hash_given(&binder_plaintext);
103
104            let key_schedule = KeyScheduleEarly::new(suite, psk);
105            let real_binder =
106                key_schedule.resumption_psk_binder_key_and_sign_verify_data(&handshake_hash);
107
108            ConstantTimeEq::ct_eq(real_binder.as_ref(), binder).into()
109        }
110
111        fn attempt_tls13_ticket_decryption(
112            &mut self,
113            ticket: &[u8],
114        ) -> Option<persist::ServerSessionValue> {
115            if self.config.ticketer.enabled() {
116                self.config
117                    .ticketer
118                    .decrypt(ticket)
119                    .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain).ok())
120            } else {
121                self.config
122                    .session_storage
123                    .take(ticket)
124                    .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain).ok())
125            }
126        }
127
128        pub(in crate::server) fn handle_client_hello(
129            mut self,
130            cx: &mut ServerContext<'_>,
131            server_key: ActiveCertifiedKey<'_>,
132            chm: &Message<'_>,
133            client_hello: &ClientHelloPayload,
134            selected_kxg: &'static dyn SupportedKxGroup,
135            mut sigschemes_ext: Vec<SignatureScheme>,
136        ) -> hs::NextStateOrError<'static> {
137            if client_hello.compression_methods.len() != 1 {
138                return Err(cx.common.send_fatal_alert(
139                    AlertDescription::IllegalParameter,
140                    PeerMisbehaved::OfferedIncorrectCompressions,
141                ));
142            }
143
144            sigschemes_ext.retain(SignatureScheme::supported_in_tls13);
145
146            let shares_ext = client_hello
147                .keyshare_extension()
148                .ok_or_else(|| {
149                    cx.common.send_fatal_alert(
150                        AlertDescription::HandshakeFailure,
151                        PeerIncompatible::KeyShareExtensionRequired,
152                    )
153                })?;
154
155            if client_hello.has_keyshare_extension_with_duplicates() {
156                return Err(cx.common.send_fatal_alert(
157                    AlertDescription::IllegalParameter,
158                    PeerMisbehaved::OfferedDuplicateKeyShares,
159                ));
160            }
161
162            if client_hello.has_certificate_compression_extension_with_duplicates() {
163                return Err(cx.common.send_fatal_alert(
164                    AlertDescription::IllegalParameter,
165                    PeerMisbehaved::OfferedDuplicateCertificateCompressions,
166                ));
167            }
168
169            let cert_compressor = client_hello
170                .certificate_compression_extension()
171                .and_then(|offered|
172                    // prefer server order when choosing a compression: the client's
173                    // extension here does not denote any preference.
174                    self.config
175                        .cert_compressors
176                        .iter()
177                        .find(|compressor| offered.contains(&compressor.algorithm()))
178                        .cloned());
179
180            let early_data_requested = client_hello.early_data_extension_offered();
181
182            // EarlyData extension is illegal in second ClientHello
183            if self.done_retry && early_data_requested {
184                return Err({
185                    cx.common.send_fatal_alert(
186                        AlertDescription::IllegalParameter,
187                        PeerMisbehaved::EarlyDataAttemptedInSecondClientHello,
188                    )
189                });
190            }
191
192            // See if there is a KeyShare for the selected kx group.
193            let chosen_share_and_kxg = shares_ext.iter().find_map(|share| {
194                (share.group == selected_kxg.name()).then_some((share, selected_kxg))
195            });
196
197            let chosen_share_and_kxg = match chosen_share_and_kxg {
198                Some(s) => s,
199                None => {
200                    // We don't have a suitable key share.  Send a HelloRetryRequest
201                    // for the mutually_preferred_group.
202                    self.transcript.add_message(chm);
203
204                    if self.done_retry {
205                        return Err(cx.common.send_fatal_alert(
206                            AlertDescription::IllegalParameter,
207                            PeerMisbehaved::RefusedToFollowHelloRetryRequest,
208                        ));
209                    }
210
211                    emit_hello_retry_request(
212                        &mut self.transcript,
213                        self.suite,
214                        client_hello.session_id,
215                        cx.common,
216                        selected_kxg.name(),
217                    );
218                    emit_fake_ccs(cx.common);
219
220                    let skip_early_data = max_early_data_size(self.config.max_early_data_size);
221
222                    let next = Box::new(hs::ExpectClientHello {
223                        config: self.config,
224                        transcript: HandshakeHashOrBuffer::Hash(self.transcript),
225                        #[cfg(feature = "tls12")]
226                        session_id: SessionId::empty(),
227                        #[cfg(feature = "tls12")]
228                        using_ems: false,
229                        done_retry: true,
230                        send_tickets: self.send_tickets,
231                        extra_exts: self.extra_exts,
232                    });
233
234                    return if early_data_requested {
235                        Ok(Box::new(ExpectAndSkipRejectedEarlyData {
236                            skip_data_left: skip_early_data,
237                            next,
238                        }))
239                    } else {
240                        Ok(next)
241                    };
242                }
243            };
244
245            let mut chosen_psk_index = None;
246            let mut resumedata = None;
247
248            if let Some(psk_offer) = client_hello.psk() {
249                if !client_hello.check_psk_ext_is_last() {
250                    return Err(cx.common.send_fatal_alert(
251                        AlertDescription::IllegalParameter,
252                        PeerMisbehaved::PskExtensionMustBeLast,
253                    ));
254                }
255
256                // "A client MUST provide a "psk_key_exchange_modes" extension if it
257                //  offers a "pre_shared_key" extension. If clients offer
258                //  "pre_shared_key" without a "psk_key_exchange_modes" extension,
259                //  servers MUST abort the handshake." - RFC8446 4.2.9
260                if client_hello.psk_modes().is_none() {
261                    return Err(cx.common.send_fatal_alert(
262                        AlertDescription::MissingExtension,
263                        PeerMisbehaved::MissingPskModesExtension,
264                    ));
265                }
266
267                if psk_offer.binders.is_empty() {
268                    return Err(cx.common.send_fatal_alert(
269                        AlertDescription::DecodeError,
270                        PeerMisbehaved::MissingBinderInPskExtension,
271                    ));
272                }
273
274                if psk_offer.binders.len() != psk_offer.identities.len() {
275                    return Err(cx.common.send_fatal_alert(
276                        AlertDescription::IllegalParameter,
277                        PeerMisbehaved::PskExtensionWithMismatchedIdsAndBinders,
278                    ));
279                }
280
281                for (i, psk_id) in psk_offer.identities.iter().enumerate() {
282                    let now = self.config.current_time()?;
283
284                    let resume = match self
285                        .attempt_tls13_ticket_decryption(&psk_id.identity.0)
286                        .map(|resumedata| {
287                            resumedata.set_freshness(psk_id.obfuscated_ticket_age, now)
288                        })
289                        .filter(|resumedata| {
290                            hs::can_resume(self.suite.into(), &cx.data.sni, false, resumedata)
291                        }) {
292                        Some(resume) => resume,
293                        None => continue,
294                    };
295
296                    if !self.check_binder(
297                        self.suite,
298                        chm,
299                        &resume.master_secret.0,
300                        psk_offer.binders[i].as_ref(),
301                    ) {
302                        return Err(cx.common.send_fatal_alert(
303                            AlertDescription::DecryptError,
304                            PeerMisbehaved::IncorrectBinder,
305                        ));
306                    }
307
308                    chosen_psk_index = Some(i);
309                    resumedata = Some(resume);
310                    break;
311                }
312            }
313
314            if !client_hello.psk_mode_offered(PSKKeyExchangeMode::PSK_DHE_KE) {
315                debug!("Client unwilling to resume, DHE_KE not offered");
316                self.send_tickets = 0;
317                chosen_psk_index = None;
318                resumedata = None;
319            } else {
320                self.send_tickets = self.config.send_tls13_tickets;
321            }
322
323            if let Some(ref resume) = resumedata {
324                cx.data.received_resumption_data = Some(resume.application_data.0.clone());
325                cx.common
326                    .peer_certificates
327                    .clone_from(&resume.client_cert_chain);
328            }
329
330            let full_handshake = resumedata.is_none();
331            self.transcript.add_message(chm);
332            let key_schedule = emit_server_hello(
333                &mut self.transcript,
334                &self.randoms,
335                self.suite,
336                cx,
337                &client_hello.session_id,
338                chosen_share_and_kxg,
339                chosen_psk_index,
340                resumedata
341                    .as_ref()
342                    .map(|x| &x.master_secret.0[..]),
343                &self.config,
344            )?;
345            if !self.done_retry {
346                emit_fake_ccs(cx.common);
347            }
348
349            if full_handshake {
350                cx.common
351                    .handshake_kind
352                    .get_or_insert(HandshakeKind::Full);
353            } else {
354                cx.common.handshake_kind = Some(HandshakeKind::Resumed);
355            }
356
357            let mut ocsp_response = server_key.get_ocsp();
358            let doing_early_data = emit_encrypted_extensions(
359                &mut self.transcript,
360                self.suite,
361                cx,
362                &mut ocsp_response,
363                client_hello,
364                resumedata.as_ref(),
365                self.extra_exts,
366                &self.config,
367            )?;
368
369            let doing_client_auth = if full_handshake {
370                let client_auth =
371                    emit_certificate_req_tls13(&mut self.transcript, cx, &self.config)?;
372
373                if let Some(compressor) = cert_compressor {
374                    emit_compressed_certificate_tls13(
375                        &mut self.transcript,
376                        cx.common,
377                        &self.config,
378                        server_key.get_cert(),
379                        ocsp_response,
380                        compressor,
381                    );
382                } else {
383                    emit_certificate_tls13(
384                        &mut self.transcript,
385                        cx.common,
386                        server_key.get_cert(),
387                        ocsp_response,
388                    );
389                }
390                emit_certificate_verify_tls13(
391                    &mut self.transcript,
392                    cx.common,
393                    server_key.get_key(),
394                    &sigschemes_ext,
395                )?;
396                client_auth
397            } else {
398                false
399            };
400
401            // If we're not doing early data, then the next messages we receive
402            // are encrypted with the handshake keys.
403            match doing_early_data {
404                EarlyDataDecision::Disabled => {
405                    key_schedule.set_handshake_decrypter(None, cx.common);
406                    cx.data.early_data.reject();
407                }
408                EarlyDataDecision::RequestedButRejected => {
409                    debug!("Client requested early_data, but not accepted: switching to handshake keys with trial decryption");
410                    key_schedule.set_handshake_decrypter(
411                        Some(max_early_data_size(self.config.max_early_data_size)),
412                        cx.common,
413                    );
414                    cx.data.early_data.reject();
415                }
416                EarlyDataDecision::Accepted => {
417                    cx.data
418                        .early_data
419                        .accept(self.config.max_early_data_size as usize);
420                }
421            }
422
423            cx.common.check_aligned_handshake()?;
424            let key_schedule_traffic = emit_finished_tls13(
425                &mut self.transcript,
426                &self.randoms,
427                cx,
428                key_schedule,
429                &self.config,
430            );
431
432            if !doing_client_auth && self.config.send_half_rtt_data {
433                // Application data can be sent immediately after Finished, in one
434                // flight.  However, if client auth is enabled, we don't want to send
435                // application data to an unauthenticated peer.
436                cx.common
437                    .start_outgoing_traffic(&mut cx.sendable_plaintext);
438            }
439
440            if doing_client_auth {
441                if self
442                    .config
443                    .cert_decompressors
444                    .is_empty()
445                {
446                    Ok(Box::new(ExpectCertificate {
447                        config: self.config,
448                        transcript: self.transcript,
449                        suite: self.suite,
450                        key_schedule: key_schedule_traffic,
451                        send_tickets: self.send_tickets,
452                        message_already_in_transcript: false,
453                    }))
454                } else {
455                    Ok(Box::new(ExpectCertificateOrCompressedCertificate {
456                        config: self.config,
457                        transcript: self.transcript,
458                        suite: self.suite,
459                        key_schedule: key_schedule_traffic,
460                        send_tickets: self.send_tickets,
461                    }))
462                }
463            } else if doing_early_data == EarlyDataDecision::Accepted && !cx.common.is_quic() {
464                // Not used for QUIC: RFC 9001 ยง8.3: Clients MUST NOT send the EndOfEarlyData
465                // message. A server MUST treat receipt of a CRYPTO frame in a 0-RTT packet as a
466                // connection error of type PROTOCOL_VIOLATION.
467                Ok(Box::new(ExpectEarlyData {
468                    config: self.config,
469                    transcript: self.transcript,
470                    suite: self.suite,
471                    key_schedule: key_schedule_traffic,
472                    send_tickets: self.send_tickets,
473                }))
474            } else {
475                Ok(Box::new(ExpectFinished {
476                    config: self.config,
477                    transcript: self.transcript,
478                    suite: self.suite,
479                    key_schedule: key_schedule_traffic,
480                    send_tickets: self.send_tickets,
481                }))
482            }
483        }
484    }
485
486    fn emit_server_hello(
487        transcript: &mut HandshakeHash,
488        randoms: &ConnectionRandoms,
489        suite: &'static Tls13CipherSuite,
490        cx: &mut ServerContext<'_>,
491        session_id: &SessionId,
492        share_and_kxgroup: (&KeyShareEntry, &'static dyn SupportedKxGroup),
493        chosen_psk_idx: Option<usize>,
494        resuming_psk: Option<&[u8]>,
495        config: &ServerConfig,
496    ) -> Result<KeyScheduleHandshake, Error> {
497        let mut extensions = Vec::new();
498
499        // Prepare key exchange; the caller already found the matching SupportedKxGroup
500        let (share, kxgroup) = share_and_kxgroup;
501        debug_assert_eq!(kxgroup.name(), share.group);
502        let ckx = kxgroup.start_and_complete(&share.payload.0)?;
503        cx.common.kx_state.complete();
504
505        extensions.push(ServerExtension::KeyShare(KeyShareEntry::new(
506            ckx.group,
507            ckx.pub_key,
508        )));
509        extensions.push(ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_3));
510
511        if let Some(psk_idx) = chosen_psk_idx {
512            extensions.push(ServerExtension::PresharedKey(psk_idx as u16));
513        }
514
515        let sh = Message {
516            version: ProtocolVersion::TLSv1_2,
517            payload: MessagePayload::handshake(HandshakeMessagePayload {
518                typ: HandshakeType::ServerHello,
519                payload: HandshakePayload::ServerHello(ServerHelloPayload {
520                    legacy_version: ProtocolVersion::TLSv1_2,
521                    random: Random::from(randoms.server),
522                    session_id: *session_id,
523                    cipher_suite: suite.common.suite,
524                    compression_method: Compression::Null,
525                    extensions,
526                }),
527            }),
528        };
529
530        cx.common.check_aligned_handshake()?;
531
532        let client_hello_hash = transcript.hash_given(&[]);
533
534        trace!("sending server hello {:?}", sh);
535        transcript.add_message(&sh);
536        cx.common.send_msg(sh, false);
537
538        // Start key schedule
539        let key_schedule_pre_handshake = if let Some(psk) = resuming_psk {
540            let early_key_schedule = KeyScheduleEarly::new(suite, psk);
541            early_key_schedule.client_early_traffic_secret(
542                &client_hello_hash,
543                &*config.key_log,
544                &randoms.client,
545                cx.common,
546            );
547
548            KeySchedulePreHandshake::from(early_key_schedule)
549        } else {
550            KeySchedulePreHandshake::new(suite)
551        };
552
553        // Do key exchange
554        let key_schedule = key_schedule_pre_handshake.into_handshake(ckx.secret);
555
556        let handshake_hash = transcript.current_hash();
557        let key_schedule = key_schedule.derive_server_handshake_secrets(
558            handshake_hash,
559            &*config.key_log,
560            &randoms.client,
561            cx.common,
562        );
563
564        Ok(key_schedule)
565    }
566
567    fn emit_fake_ccs(common: &mut CommonState) {
568        if common.is_quic() {
569            return;
570        }
571        let m = Message {
572            version: ProtocolVersion::TLSv1_2,
573            payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
574        };
575        common.send_msg(m, false);
576    }
577
578    fn emit_hello_retry_request(
579        transcript: &mut HandshakeHash,
580        suite: &'static Tls13CipherSuite,
581        session_id: SessionId,
582        common: &mut CommonState,
583        group: NamedGroup,
584    ) {
585        let mut req = HelloRetryRequest {
586            legacy_version: ProtocolVersion::TLSv1_2,
587            session_id,
588            cipher_suite: suite.common.suite,
589            extensions: Vec::new(),
590        };
591
592        req.extensions
593            .push(HelloRetryExtension::KeyShare(group));
594        req.extensions
595            .push(HelloRetryExtension::SupportedVersions(
596                ProtocolVersion::TLSv1_3,
597            ));
598
599        let m = Message {
600            version: ProtocolVersion::TLSv1_2,
601            payload: MessagePayload::handshake(HandshakeMessagePayload {
602                typ: HandshakeType::HelloRetryRequest,
603                payload: HandshakePayload::HelloRetryRequest(req),
604            }),
605        };
606
607        trace!("Requesting retry {:?}", m);
608        transcript.rollup_for_hrr();
609        transcript.add_message(&m);
610        common.send_msg(m, false);
611        common.handshake_kind = Some(HandshakeKind::FullWithHelloRetryRequest);
612    }
613
614    fn decide_if_early_data_allowed(
615        cx: &mut ServerContext<'_>,
616        client_hello: &ClientHelloPayload,
617        resumedata: Option<&persist::ServerSessionValue>,
618        suite: &'static Tls13CipherSuite,
619        config: &ServerConfig,
620    ) -> EarlyDataDecision {
621        let early_data_requested = client_hello.early_data_extension_offered();
622        let rejected_or_disabled = match early_data_requested {
623            true => EarlyDataDecision::RequestedButRejected,
624            false => EarlyDataDecision::Disabled,
625        };
626
627        let resume = match resumedata {
628            Some(resume) => resume,
629            None => {
630                // never any early data if not resuming.
631                return rejected_or_disabled;
632            }
633        };
634
635        /* Non-zero max_early_data_size controls whether early_data is allowed at all.
636         * We also require stateful resumption. */
637        let early_data_configured = config.max_early_data_size > 0 && !config.ticketer.enabled();
638
639        /* "For PSKs provisioned via NewSessionTicket, a server MUST validate
640         *  that the ticket age for the selected PSK identity (computed by
641         *  subtracting ticket_age_add from PskIdentity.obfuscated_ticket_age
642         *  modulo 2^32) is within a small tolerance of the time since the ticket
643         *  was issued (see Section 8)." -- this is implemented in ServerSessionValue::set_freshness()
644         *  and related.
645         *
646         * "In order to accept early data, the server [...] MUST verify that the
647         *  following values are the same as those associated with the
648         *  selected PSK:
649         *
650         *  - The TLS version number
651         *  - The selected cipher suite
652         *  - The selected ALPN [RFC7301] protocol, if any"
653         *
654         * (RFC8446, 4.2.10) */
655        let early_data_possible = early_data_requested
656            && resume.is_fresh()
657            && Some(resume.version) == cx.common.negotiated_version
658            && resume.cipher_suite == suite.common.suite
659            && resume.alpn.as_ref().map(|x| &x.0) == cx.common.alpn_protocol.as_ref();
660
661        if early_data_configured && early_data_possible && !cx.data.early_data.was_rejected() {
662            EarlyDataDecision::Accepted
663        } else {
664            if cx.common.is_quic() {
665                // Clobber value set in tls13::emit_server_hello
666                cx.common.quic.early_secret = None;
667            }
668
669            rejected_or_disabled
670        }
671    }
672
673    fn emit_encrypted_extensions(
674        transcript: &mut HandshakeHash,
675        suite: &'static Tls13CipherSuite,
676        cx: &mut ServerContext<'_>,
677        ocsp_response: &mut Option<&[u8]>,
678        hello: &ClientHelloPayload,
679        resumedata: Option<&persist::ServerSessionValue>,
680        extra_exts: Vec<ServerExtension>,
681        config: &ServerConfig,
682    ) -> Result<EarlyDataDecision, Error> {
683        let mut ep = hs::ExtensionProcessing::new();
684        ep.process_common(config, cx, ocsp_response, hello, resumedata, extra_exts)?;
685
686        let early_data = decide_if_early_data_allowed(cx, hello, resumedata, suite, config);
687        if early_data == EarlyDataDecision::Accepted {
688            ep.exts.push(ServerExtension::EarlyData);
689        }
690
691        let ee = Message {
692            version: ProtocolVersion::TLSv1_3,
693            payload: MessagePayload::handshake(HandshakeMessagePayload {
694                typ: HandshakeType::EncryptedExtensions,
695                payload: HandshakePayload::EncryptedExtensions(ep.exts),
696            }),
697        };
698
699        trace!("sending encrypted extensions {:?}", ee);
700        transcript.add_message(&ee);
701        cx.common.send_msg(ee, true);
702        Ok(early_data)
703    }
704
705    fn emit_certificate_req_tls13(
706        transcript: &mut HandshakeHash,
707        cx: &mut ServerContext<'_>,
708        config: &ServerConfig,
709    ) -> Result<bool, Error> {
710        if !config.verifier.offer_client_auth() {
711            return Ok(false);
712        }
713
714        let mut cr = CertificateRequestPayloadTls13 {
715            context: PayloadU8::empty(),
716            extensions: Vec::new(),
717        };
718
719        let schemes = config
720            .verifier
721            .supported_verify_schemes();
722        cr.extensions
723            .push(CertReqExtension::SignatureAlgorithms(schemes.to_vec()));
724
725        if !config.cert_decompressors.is_empty() {
726            cr.extensions
727                .push(CertReqExtension::CertificateCompressionAlgorithms(
728                    config
729                        .cert_decompressors
730                        .iter()
731                        .map(|decomp| decomp.algorithm())
732                        .collect(),
733                ));
734        }
735
736        let authorities = config.verifier.root_hint_subjects();
737        if !authorities.is_empty() {
738            cr.extensions
739                .push(CertReqExtension::AuthorityNames(authorities.to_vec()));
740        }
741
742        let m = Message {
743            version: ProtocolVersion::TLSv1_3,
744            payload: MessagePayload::handshake(HandshakeMessagePayload {
745                typ: HandshakeType::CertificateRequest,
746                payload: HandshakePayload::CertificateRequestTls13(cr),
747            }),
748        };
749
750        trace!("Sending CertificateRequest {:?}", m);
751        transcript.add_message(&m);
752        cx.common.send_msg(m, true);
753        Ok(true)
754    }
755
756    fn emit_certificate_tls13(
757        transcript: &mut HandshakeHash,
758        common: &mut CommonState,
759        cert_chain: &[CertificateDer<'static>],
760        ocsp_response: Option<&[u8]>,
761    ) {
762        let cert_body = CertificatePayloadTls13::new(cert_chain.iter(), ocsp_response);
763        let c = Message {
764            version: ProtocolVersion::TLSv1_3,
765            payload: MessagePayload::handshake(HandshakeMessagePayload {
766                typ: HandshakeType::Certificate,
767                payload: HandshakePayload::CertificateTls13(cert_body),
768            }),
769        };
770
771        trace!("sending certificate {:?}", c);
772        transcript.add_message(&c);
773        common.send_msg(c, true);
774    }
775
776    fn emit_compressed_certificate_tls13(
777        transcript: &mut HandshakeHash,
778        common: &mut CommonState,
779        config: &ServerConfig,
780        cert_chain: &[CertificateDer<'static>],
781        ocsp_response: Option<&[u8]>,
782        cert_compressor: &'static dyn CertCompressor,
783    ) {
784        let payload = CertificatePayloadTls13::new(cert_chain.iter(), ocsp_response);
785
786        let entry = match config
787            .cert_compression_cache
788            .compression_for(cert_compressor, &payload)
789        {
790            Ok(entry) => entry,
791            Err(_) => return emit_certificate_tls13(transcript, common, cert_chain, ocsp_response),
792        };
793
794        let c = Message {
795            version: ProtocolVersion::TLSv1_3,
796            payload: MessagePayload::handshake(HandshakeMessagePayload {
797                typ: HandshakeType::CompressedCertificate,
798                payload: HandshakePayload::CompressedCertificate(entry.compressed_cert_payload()),
799            }),
800        };
801
802        trace!("sending compressed certificate {:?}", c);
803        transcript.add_message(&c);
804        common.send_msg(c, true);
805    }
806
807    fn emit_certificate_verify_tls13(
808        transcript: &mut HandshakeHash,
809        common: &mut CommonState,
810        signing_key: &dyn sign::SigningKey,
811        schemes: &[SignatureScheme],
812    ) -> Result<(), Error> {
813        let message = construct_server_verify_message(&transcript.current_hash());
814
815        let signer = signing_key
816            .choose_scheme(schemes)
817            .ok_or_else(|| {
818                common.send_fatal_alert(
819                    AlertDescription::HandshakeFailure,
820                    PeerIncompatible::NoSignatureSchemesInCommon,
821                )
822            })?;
823
824        let scheme = signer.scheme();
825        let sig = signer.sign(&message)?;
826
827        let cv = DigitallySignedStruct::new(scheme, sig);
828
829        let m = Message {
830            version: ProtocolVersion::TLSv1_3,
831            payload: MessagePayload::handshake(HandshakeMessagePayload {
832                typ: HandshakeType::CertificateVerify,
833                payload: HandshakePayload::CertificateVerify(cv),
834            }),
835        };
836
837        trace!("sending certificate-verify {:?}", m);
838        transcript.add_message(&m);
839        common.send_msg(m, true);
840        Ok(())
841    }
842
843    fn emit_finished_tls13(
844        transcript: &mut HandshakeHash,
845        randoms: &ConnectionRandoms,
846        cx: &mut ServerContext<'_>,
847        key_schedule: KeyScheduleHandshake,
848        config: &ServerConfig,
849    ) -> KeyScheduleTrafficWithClientFinishedPending {
850        let handshake_hash = transcript.current_hash();
851        let verify_data = key_schedule.sign_server_finish(&handshake_hash);
852        let verify_data_payload = Payload::new(verify_data.as_ref());
853
854        let m = Message {
855            version: ProtocolVersion::TLSv1_3,
856            payload: MessagePayload::handshake(HandshakeMessagePayload {
857                typ: HandshakeType::Finished,
858                payload: HandshakePayload::Finished(verify_data_payload),
859            }),
860        };
861
862        trace!("sending finished {:?}", m);
863        transcript.add_message(&m);
864        let hash_at_server_fin = transcript.current_hash();
865        cx.common.send_msg(m, true);
866
867        // Now move to application data keys.  Read key change is deferred until
868        // the Finish message is received & validated.
869        key_schedule.into_traffic_with_client_finished_pending(
870            hash_at_server_fin,
871            &*config.key_log,
872            &randoms.client,
873            cx.common,
874        )
875    }
876}
877
878struct ExpectAndSkipRejectedEarlyData {
879    skip_data_left: usize,
880    next: Box<hs::ExpectClientHello>,
881}
882
883impl State<ServerConnectionData> for ExpectAndSkipRejectedEarlyData {
884    fn handle<'m>(
885        mut self: Box<Self>,
886        cx: &mut ServerContext<'_>,
887        m: Message<'m>,
888    ) -> hs::NextStateOrError<'m>
889    where
890        Self: 'm,
891    {
892        /* "The server then ignores early data by skipping all records with an external
893         *  content type of "application_data" (indicating that they are encrypted),
894         *  up to the configured max_early_data_size."
895         * (RFC8446, 14.2.10) */
896        if let MessagePayload::ApplicationData(ref skip_data) = m.payload {
897            if skip_data.bytes().len() <= self.skip_data_left {
898                self.skip_data_left -= skip_data.bytes().len();
899                return Ok(self);
900            }
901        }
902
903        self.next.handle(cx, m)
904    }
905
906    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
907        self
908    }
909}
910
911struct ExpectCertificateOrCompressedCertificate {
912    config: Arc<ServerConfig>,
913    transcript: HandshakeHash,
914    suite: &'static Tls13CipherSuite,
915    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
916    send_tickets: usize,
917}
918
919impl State<ServerConnectionData> for ExpectCertificateOrCompressedCertificate {
920    fn handle<'m>(
921        self: Box<Self>,
922        cx: &mut ServerContext<'_>,
923        m: Message<'m>,
924    ) -> hs::NextStateOrError<'m>
925    where
926        Self: 'm,
927    {
928        match m.payload {
929            MessagePayload::Handshake {
930                parsed:
931                    HandshakeMessagePayload {
932                        payload: HandshakePayload::CertificateTls13(..),
933                        ..
934                    },
935                ..
936            } => Box::new(ExpectCertificate {
937                config: self.config,
938                transcript: self.transcript,
939                suite: self.suite,
940                key_schedule: self.key_schedule,
941                send_tickets: self.send_tickets,
942                message_already_in_transcript: false,
943            })
944            .handle(cx, m),
945
946            MessagePayload::Handshake {
947                parsed:
948                    HandshakeMessagePayload {
949                        payload: HandshakePayload::CompressedCertificate(..),
950                        ..
951                    },
952                ..
953            } => Box::new(ExpectCompressedCertificate {
954                config: self.config,
955                transcript: self.transcript,
956                suite: self.suite,
957                key_schedule: self.key_schedule,
958                send_tickets: self.send_tickets,
959            })
960            .handle(cx, m),
961
962            payload => Err(inappropriate_handshake_message(
963                &payload,
964                &[ContentType::Handshake],
965                &[
966                    HandshakeType::Certificate,
967                    HandshakeType::CompressedCertificate,
968                ],
969            )),
970        }
971    }
972
973    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
974        self
975    }
976}
977
978struct ExpectCompressedCertificate {
979    config: Arc<ServerConfig>,
980    transcript: HandshakeHash,
981    suite: &'static Tls13CipherSuite,
982    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
983    send_tickets: usize,
984}
985
986impl State<ServerConnectionData> for ExpectCompressedCertificate {
987    fn handle<'m>(
988        mut self: Box<Self>,
989        cx: &mut ServerContext<'_>,
990        m: Message<'m>,
991    ) -> hs::NextStateOrError<'m>
992    where
993        Self: 'm,
994    {
995        self.transcript.add_message(&m);
996        let compressed_cert = require_handshake_msg_move!(
997            m,
998            HandshakeType::CompressedCertificate,
999            HandshakePayload::CompressedCertificate
1000        )?;
1001
1002        let decompressor = match self
1003            .config
1004            .cert_decompressors
1005            .iter()
1006            .find(|item| item.algorithm() == compressed_cert.alg)
1007        {
1008            Some(dec) => dec,
1009            None => {
1010                return Err(cx.common.send_fatal_alert(
1011                    AlertDescription::BadCertificate,
1012                    PeerMisbehaved::SelectedUnofferedCertCompression,
1013                ));
1014            }
1015        };
1016
1017        if compressed_cert.uncompressed_len as usize > CERTIFICATE_MAX_SIZE_LIMIT {
1018            return Err(cx.common.send_fatal_alert(
1019                AlertDescription::BadCertificate,
1020                InvalidMessage::MessageTooLarge,
1021            ));
1022        }
1023
1024        let mut decompress_buffer = vec![0u8; compressed_cert.uncompressed_len as usize];
1025        if let Err(compress::DecompressionFailed) =
1026            decompressor.decompress(compressed_cert.compressed.0.bytes(), &mut decompress_buffer)
1027        {
1028            return Err(cx.common.send_fatal_alert(
1029                AlertDescription::BadCertificate,
1030                PeerMisbehaved::InvalidCertCompression,
1031            ));
1032        }
1033
1034        let cert_payload =
1035            match CertificatePayloadTls13::read(&mut Reader::init(&decompress_buffer)) {
1036                Ok(cm) => cm,
1037                Err(err) => {
1038                    return Err(cx
1039                        .common
1040                        .send_fatal_alert(AlertDescription::BadCertificate, err));
1041                }
1042            };
1043        trace!(
1044            "Client certificate decompressed using {:?} ({} bytes -> {})",
1045            compressed_cert.alg,
1046            compressed_cert
1047                .compressed
1048                .0
1049                .bytes()
1050                .len(),
1051            compressed_cert.uncompressed_len,
1052        );
1053
1054        let m = Message {
1055            version: ProtocolVersion::TLSv1_3,
1056            payload: MessagePayload::handshake(HandshakeMessagePayload {
1057                typ: HandshakeType::Certificate,
1058                payload: HandshakePayload::CertificateTls13(cert_payload.into_owned()),
1059            }),
1060        };
1061
1062        Box::new(ExpectCertificate {
1063            config: self.config,
1064            transcript: self.transcript,
1065            suite: self.suite,
1066            key_schedule: self.key_schedule,
1067            send_tickets: self.send_tickets,
1068            message_already_in_transcript: true,
1069        })
1070        .handle(cx, m)
1071    }
1072
1073    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1074        self
1075    }
1076}
1077
1078struct ExpectCertificate {
1079    config: Arc<ServerConfig>,
1080    transcript: HandshakeHash,
1081    suite: &'static Tls13CipherSuite,
1082    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1083    send_tickets: usize,
1084    message_already_in_transcript: bool,
1085}
1086
1087impl State<ServerConnectionData> for ExpectCertificate {
1088    fn handle<'m>(
1089        mut self: Box<Self>,
1090        cx: &mut ServerContext<'_>,
1091        m: Message<'m>,
1092    ) -> hs::NextStateOrError<'m>
1093    where
1094        Self: 'm,
1095    {
1096        if !self.message_already_in_transcript {
1097            self.transcript.add_message(&m);
1098        }
1099        let certp = require_handshake_msg_move!(
1100            m,
1101            HandshakeType::Certificate,
1102            HandshakePayload::CertificateTls13
1103        )?;
1104
1105        // We don't send any CertificateRequest extensions, so any extensions
1106        // here are illegal.
1107        if certp.any_entry_has_extension() {
1108            return Err(PeerMisbehaved::UnsolicitedCertExtension.into());
1109        }
1110
1111        let client_cert = certp.into_certificate_chain();
1112
1113        let mandatory = self
1114            .config
1115            .verifier
1116            .client_auth_mandatory();
1117
1118        let (end_entity, intermediates) = match client_cert.split_first() {
1119            None => {
1120                if !mandatory {
1121                    debug!("client auth requested but no certificate supplied");
1122                    self.transcript.abandon_client_auth();
1123                    return Ok(Box::new(ExpectFinished {
1124                        config: self.config,
1125                        suite: self.suite,
1126                        key_schedule: self.key_schedule,
1127                        transcript: self.transcript,
1128                        send_tickets: self.send_tickets,
1129                    }));
1130                }
1131
1132                return Err(cx.common.send_fatal_alert(
1133                    AlertDescription::CertificateRequired,
1134                    Error::NoCertificatesPresented,
1135                ));
1136            }
1137            Some(chain) => chain,
1138        };
1139
1140        let now = self.config.current_time()?;
1141
1142        self.config
1143            .verifier
1144            .verify_client_cert(end_entity, intermediates, now)
1145            .map_err(|err| {
1146                cx.common
1147                    .send_cert_verify_error_alert(err)
1148            })?;
1149
1150        Ok(Box::new(ExpectCertificateVerify {
1151            config: self.config,
1152            suite: self.suite,
1153            transcript: self.transcript,
1154            key_schedule: self.key_schedule,
1155            client_cert: client_cert.into_owned(),
1156            send_tickets: self.send_tickets,
1157        }))
1158    }
1159
1160    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1161        self
1162    }
1163}
1164
1165struct ExpectCertificateVerify {
1166    config: Arc<ServerConfig>,
1167    transcript: HandshakeHash,
1168    suite: &'static Tls13CipherSuite,
1169    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1170    client_cert: CertificateChain<'static>,
1171    send_tickets: usize,
1172}
1173
1174impl State<ServerConnectionData> for ExpectCertificateVerify {
1175    fn handle<'m>(
1176        mut self: Box<Self>,
1177        cx: &mut ServerContext<'_>,
1178        m: Message<'m>,
1179    ) -> hs::NextStateOrError<'m>
1180    where
1181        Self: 'm,
1182    {
1183        let rc = {
1184            let sig = require_handshake_msg!(
1185                m,
1186                HandshakeType::CertificateVerify,
1187                HandshakePayload::CertificateVerify
1188            )?;
1189            let handshake_hash = self.transcript.current_hash();
1190            self.transcript.abandon_client_auth();
1191            let certs = &self.client_cert;
1192            let msg = construct_client_verify_message(&handshake_hash);
1193
1194            self.config
1195                .verifier
1196                .verify_tls13_signature(&msg, &certs[0], sig)
1197        };
1198
1199        if let Err(e) = rc {
1200            return Err(cx
1201                .common
1202                .send_cert_verify_error_alert(e));
1203        }
1204
1205        trace!("client CertificateVerify OK");
1206        cx.common.peer_certificates = Some(self.client_cert);
1207
1208        self.transcript.add_message(&m);
1209        Ok(Box::new(ExpectFinished {
1210            config: self.config,
1211            suite: self.suite,
1212            key_schedule: self.key_schedule,
1213            transcript: self.transcript,
1214            send_tickets: self.send_tickets,
1215        }))
1216    }
1217
1218    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1219        self
1220    }
1221}
1222
1223// --- Process (any number of) early ApplicationData messages,
1224//     followed by a terminating handshake EndOfEarlyData message ---
1225
1226struct ExpectEarlyData {
1227    config: Arc<ServerConfig>,
1228    transcript: HandshakeHash,
1229    suite: &'static Tls13CipherSuite,
1230    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1231    send_tickets: usize,
1232}
1233
1234impl State<ServerConnectionData> for ExpectEarlyData {
1235    fn handle<'m>(
1236        mut self: Box<Self>,
1237        cx: &mut ServerContext<'_>,
1238        m: Message<'m>,
1239    ) -> hs::NextStateOrError<'m>
1240    where
1241        Self: 'm,
1242    {
1243        match m.payload {
1244            MessagePayload::ApplicationData(payload) => {
1245                match cx
1246                    .data
1247                    .early_data
1248                    .take_received_plaintext(payload)
1249                {
1250                    true => Ok(self),
1251                    false => Err(cx.common.send_fatal_alert(
1252                        AlertDescription::UnexpectedMessage,
1253                        PeerMisbehaved::TooMuchEarlyDataReceived,
1254                    )),
1255                }
1256            }
1257            MessagePayload::Handshake {
1258                parsed:
1259                    HandshakeMessagePayload {
1260                        typ: HandshakeType::EndOfEarlyData,
1261                        payload: HandshakePayload::EndOfEarlyData,
1262                    },
1263                ..
1264            } => {
1265                self.key_schedule
1266                    .update_decrypter(cx.common);
1267                self.transcript.add_message(&m);
1268                Ok(Box::new(ExpectFinished {
1269                    config: self.config,
1270                    suite: self.suite,
1271                    key_schedule: self.key_schedule,
1272                    transcript: self.transcript,
1273                    send_tickets: self.send_tickets,
1274                }))
1275            }
1276            payload => Err(inappropriate_handshake_message(
1277                &payload,
1278                &[ContentType::ApplicationData, ContentType::Handshake],
1279                &[HandshakeType::EndOfEarlyData],
1280            )),
1281        }
1282    }
1283
1284    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1285        self
1286    }
1287}
1288
1289// --- Process client's Finished ---
1290fn get_server_session_value(
1291    transcript: &HandshakeHash,
1292    suite: &'static Tls13CipherSuite,
1293    key_schedule: &KeyScheduleTraffic,
1294    cx: &ServerContext<'_>,
1295    nonce: &[u8],
1296    time_now: UnixTime,
1297    age_obfuscation_offset: u32,
1298) -> persist::ServerSessionValue {
1299    let version = ProtocolVersion::TLSv1_3;
1300
1301    let handshake_hash = transcript.current_hash();
1302    let secret =
1303        key_schedule.resumption_master_secret_and_derive_ticket_psk(&handshake_hash, nonce);
1304
1305    persist::ServerSessionValue::new(
1306        cx.data.sni.as_ref(),
1307        version,
1308        suite.common.suite,
1309        secret.as_ref(),
1310        cx.common.peer_certificates.clone(),
1311        cx.common.alpn_protocol.clone(),
1312        cx.data.resumption_data.clone(),
1313        time_now,
1314        age_obfuscation_offset,
1315    )
1316}
1317
1318struct ExpectFinished {
1319    config: Arc<ServerConfig>,
1320    transcript: HandshakeHash,
1321    suite: &'static Tls13CipherSuite,
1322    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1323    send_tickets: usize,
1324}
1325
1326impl ExpectFinished {
1327    fn emit_ticket(
1328        transcript: &HandshakeHash,
1329        suite: &'static Tls13CipherSuite,
1330        cx: &mut ServerContext<'_>,
1331        key_schedule: &KeyScheduleTraffic,
1332        config: &ServerConfig,
1333    ) -> Result<(), Error> {
1334        let secure_random = config.provider.secure_random;
1335        let nonce = rand::random_vec(secure_random, 32)?;
1336        let age_add = rand::random_u32(secure_random)?;
1337
1338        let now = config.current_time()?;
1339
1340        let plain =
1341            get_server_session_value(transcript, suite, key_schedule, cx, &nonce, now, age_add)
1342                .get_encoding();
1343
1344        let stateless = config.ticketer.enabled();
1345        let (ticket, lifetime) = if stateless {
1346            let ticket = match config.ticketer.encrypt(&plain) {
1347                Some(t) => t,
1348                None => return Ok(()),
1349            };
1350            (ticket, config.ticketer.lifetime())
1351        } else {
1352            let id = rand::random_vec(secure_random, 32)?;
1353            let stored = config
1354                .session_storage
1355                .put(id.clone(), plain);
1356            if !stored {
1357                trace!("resumption not available; not issuing ticket");
1358                return Ok(());
1359            }
1360            let stateful_lifetime = 24 * 60 * 60; // this is a bit of a punt
1361            (id, stateful_lifetime)
1362        };
1363
1364        let mut payload = NewSessionTicketPayloadTls13::new(lifetime, age_add, nonce, ticket);
1365
1366        if config.max_early_data_size > 0 {
1367            if !stateless {
1368                payload
1369                    .exts
1370                    .push(NewSessionTicketExtension::EarlyData(
1371                        config.max_early_data_size,
1372                    ));
1373            } else {
1374                // We implement RFC8446 section 8.1: by enforcing that 0-RTT is
1375                // only possible if using stateful resumption
1376                warn!("early_data with stateless resumption is not allowed");
1377            }
1378        }
1379
1380        let m = Message {
1381            version: ProtocolVersion::TLSv1_3,
1382            payload: MessagePayload::handshake(HandshakeMessagePayload {
1383                typ: HandshakeType::NewSessionTicket,
1384                payload: HandshakePayload::NewSessionTicketTls13(payload),
1385            }),
1386        };
1387
1388        trace!("sending new ticket {:?} (stateless: {})", m, stateless);
1389        cx.common.send_msg(m, true);
1390        Ok(())
1391    }
1392}
1393
1394impl State<ServerConnectionData> for ExpectFinished {
1395    fn handle<'m>(
1396        mut self: Box<Self>,
1397        cx: &mut ServerContext<'_>,
1398        m: Message<'m>,
1399    ) -> hs::NextStateOrError<'m>
1400    where
1401        Self: 'm,
1402    {
1403        let finished =
1404            require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1405
1406        let handshake_hash = self.transcript.current_hash();
1407        let (key_schedule_traffic, expect_verify_data) = self
1408            .key_schedule
1409            .sign_client_finish(&handshake_hash, cx.common);
1410
1411        let fin = match ConstantTimeEq::ct_eq(expect_verify_data.as_ref(), finished.bytes()).into()
1412        {
1413            true => verify::FinishedMessageVerified::assertion(),
1414            false => {
1415                return Err(cx
1416                    .common
1417                    .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
1418            }
1419        };
1420
1421        // Note: future derivations include Client Finished, but not the
1422        // main application data keying.
1423        self.transcript.add_message(&m);
1424
1425        cx.common.check_aligned_handshake()?;
1426
1427        for _ in 0..self.send_tickets {
1428            Self::emit_ticket(
1429                &self.transcript,
1430                self.suite,
1431                cx,
1432                &key_schedule_traffic,
1433                &self.config,
1434            )?;
1435        }
1436
1437        // Application data may now flow, even if we have client auth enabled.
1438        cx.common
1439            .start_traffic(&mut cx.sendable_plaintext);
1440
1441        Ok(match cx.common.is_quic() {
1442            true => Box::new(ExpectQuicTraffic {
1443                key_schedule: key_schedule_traffic,
1444                _fin_verified: fin,
1445            }),
1446            false => Box::new(ExpectTraffic {
1447                key_schedule: key_schedule_traffic,
1448                _fin_verified: fin,
1449            }),
1450        })
1451    }
1452
1453    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1454        self
1455    }
1456}
1457
1458// --- Process traffic ---
1459struct ExpectTraffic {
1460    key_schedule: KeyScheduleTraffic,
1461    _fin_verified: verify::FinishedMessageVerified,
1462}
1463
1464impl ExpectTraffic {
1465    fn handle_key_update(
1466        &mut self,
1467        common: &mut CommonState,
1468        key_update_request: &KeyUpdateRequest,
1469    ) -> Result<(), Error> {
1470        if let Protocol::Quic = common.protocol {
1471            return Err(common.send_fatal_alert(
1472                AlertDescription::UnexpectedMessage,
1473                PeerMisbehaved::KeyUpdateReceivedInQuicConnection,
1474            ));
1475        }
1476
1477        common.check_aligned_handshake()?;
1478
1479        if common.should_update_key(key_update_request)? {
1480            self.key_schedule
1481                .update_encrypter_and_notify(common);
1482        }
1483
1484        // Update our read-side keys.
1485        self.key_schedule
1486            .update_decrypter(common);
1487        Ok(())
1488    }
1489}
1490
1491impl State<ServerConnectionData> for ExpectTraffic {
1492    fn handle<'m>(
1493        mut self: Box<Self>,
1494        cx: &mut ServerContext<'_>,
1495        m: Message<'m>,
1496    ) -> hs::NextStateOrError<'m>
1497    where
1498        Self: 'm,
1499    {
1500        match m.payload {
1501            MessagePayload::ApplicationData(payload) => cx
1502                .common
1503                .take_received_plaintext(payload),
1504            MessagePayload::Handshake {
1505                parsed:
1506                    HandshakeMessagePayload {
1507                        payload: HandshakePayload::KeyUpdate(key_update),
1508                        ..
1509                    },
1510                ..
1511            } => self.handle_key_update(cx.common, &key_update)?,
1512            payload => {
1513                return Err(inappropriate_handshake_message(
1514                    &payload,
1515                    &[ContentType::ApplicationData, ContentType::Handshake],
1516                    &[HandshakeType::KeyUpdate],
1517                ));
1518            }
1519        }
1520
1521        Ok(self)
1522    }
1523
1524    fn export_keying_material(
1525        &self,
1526        output: &mut [u8],
1527        label: &[u8],
1528        context: Option<&[u8]>,
1529    ) -> Result<(), Error> {
1530        self.key_schedule
1531            .export_keying_material(output, label, context)
1532    }
1533
1534    fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
1535        self.key_schedule
1536            .extract_secrets(Side::Server)
1537    }
1538
1539    fn send_key_update_request(&mut self, common: &mut CommonState) -> Result<(), Error> {
1540        self.key_schedule
1541            .request_key_update_and_update_encrypter(common)
1542    }
1543
1544    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1545        self
1546    }
1547}
1548
1549struct ExpectQuicTraffic {
1550    key_schedule: KeyScheduleTraffic,
1551    _fin_verified: verify::FinishedMessageVerified,
1552}
1553
1554impl State<ServerConnectionData> for ExpectQuicTraffic {
1555    fn handle<'m>(
1556        self: Box<Self>,
1557        _cx: &mut ServerContext<'_>,
1558        m: Message<'m>,
1559    ) -> hs::NextStateOrError<'m>
1560    where
1561        Self: 'm,
1562    {
1563        // reject all messages
1564        Err(inappropriate_message(&m.payload, &[]))
1565    }
1566
1567    fn export_keying_material(
1568        &self,
1569        output: &mut [u8],
1570        label: &[u8],
1571        context: Option<&[u8]>,
1572    ) -> Result<(), Error> {
1573        self.key_schedule
1574            .export_keying_material(output, label, context)
1575    }
1576
1577    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1578        self
1579    }
1580}