Skip to main content

rustls/server/
tls13.rs

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