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                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        resumedata: Option<&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(resume) = resumedata 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         * (RFC8446, 4.2.10) */
689        let early_data_possible = early_data_requested
690            && resume.is_fresh()
691            && Some(resume.version) == cx.common.negotiated_version
692            && resume.cipher_suite == suite.common.suite
693            && resume.alpn.as_ref().map(|p| &p.0[..]) == cx.common.alpn_protocol.as_deref();
694
695        if early_data_configured && early_data_possible && !cx.data.early_data.was_rejected() {
696            EarlyDataDecision::Accepted
697        } else {
698            if cx.common.is_quic() {
699                // Clobber value set in tls13::emit_server_hello
700                cx.common.quic.early_secret = None;
701            }
702
703            rejected_or_disabled
704        }
705    }
706
707    fn emit_encrypted_extensions(
708        flight: &mut HandshakeFlightTls13<'_>,
709        suite: &'static Tls13CipherSuite,
710        cx: &mut ServerContext<'_>,
711        ocsp_response: &mut Option<&[u8]>,
712        hello: &ClientHelloPayload,
713        resumedata: Option<&persist::ServerSessionValue>,
714        extra_exts: ServerExtensionsInput<'static>,
715        config: &ServerConfig,
716        send_tickets: usize,
717    ) -> Result<EarlyDataDecision, Error> {
718        let mut ep = hs::ExtensionProcessing::new(extra_exts);
719        ep.process_common(config, cx, ocsp_response, hello, resumedata)?;
720
721        // RFC 9149: echo the expected ticket count if the client sent the extension.
722        if hello.ticket_request.is_some() && config.max_tls13_tickets > 0 {
723            ep.extensions.ticket_request = Some(ServerTicketRequestHint {
724                expected_count: Ord::min(send_tickets, usize::from(u8::MAX)) as u8,
725            });
726        }
727
728        let early_data = decide_if_early_data_allowed(cx, hello, resumedata, suite, config);
729        if early_data == EarlyDataDecision::Accepted {
730            ep.extensions.early_data_ack = Some(());
731        }
732
733        let ee = HandshakeMessagePayload(HandshakePayload::EncryptedExtensions(ep.extensions));
734
735        trace!("sending encrypted extensions {ee:?}");
736        flight.add(ee);
737        Ok(early_data)
738    }
739
740    fn emit_certificate_req_tls13(
741        flight: &mut HandshakeFlightTls13<'_>,
742        config: &ServerConfig,
743    ) -> Result<bool, Error> {
744        if !config.verifier.offer_client_auth() {
745            return Ok(false);
746        }
747
748        let cr = CertificateRequestPayloadTls13 {
749            context: PayloadU8::empty(),
750            extensions: CertificateRequestExtensions {
751                signature_algorithms: Some(
752                    config
753                        .verifier
754                        .supported_verify_schemes(),
755                ),
756                certificate_compression_algorithms: match config.cert_decompressors.as_slice() {
757                    &[] => None,
758                    decomps => Some(
759                        decomps
760                            .iter()
761                            .map(|decomp| decomp.algorithm())
762                            .collect(),
763                    ),
764                },
765                authority_names: match config.verifier.root_hint_subjects() {
766                    &[] => None,
767                    authorities => Some(authorities.to_vec()),
768                },
769            },
770        };
771
772        let creq = HandshakeMessagePayload(HandshakePayload::CertificateRequestTls13(cr));
773
774        trace!("Sending CertificateRequest {creq:?}");
775        flight.add(creq);
776        Ok(true)
777    }
778
779    fn emit_certificate_tls13(
780        flight: &mut HandshakeFlightTls13<'_>,
781        cert_chain: &[CertificateDer<'static>],
782        ocsp_response: Option<&[u8]>,
783    ) {
784        let cert = HandshakeMessagePayload(HandshakePayload::CertificateTls13(
785            CertificatePayloadTls13::new(cert_chain.iter(), ocsp_response),
786        ));
787
788        trace!("sending certificate {cert:?}");
789        flight.add(cert);
790    }
791
792    fn emit_compressed_certificate_tls13(
793        flight: &mut HandshakeFlightTls13<'_>,
794        config: &ServerConfig,
795        cert_chain: &[CertificateDer<'static>],
796        ocsp_response: Option<&[u8]>,
797        cert_compressor: &'static dyn CertCompressor,
798    ) {
799        let payload = CertificatePayloadTls13::new(cert_chain.iter(), ocsp_response);
800
801        let Ok(entry) = config
802            .cert_compression_cache
803            .compression_for(cert_compressor, &payload)
804        else {
805            return emit_certificate_tls13(flight, cert_chain, ocsp_response);
806        };
807
808        let c = HandshakeMessagePayload(HandshakePayload::CompressedCertificate(
809            entry.compressed_cert_payload(),
810        ));
811
812        trace!("sending compressed certificate {c:?}");
813        flight.add(c);
814    }
815
816    fn emit_certificate_verify_tls13(
817        flight: &mut HandshakeFlightTls13<'_>,
818        common: &mut CommonState,
819        signing_key: &dyn sign::SigningKey,
820        schemes: &[SignatureScheme],
821    ) -> Result<(), Error> {
822        let message = construct_server_verify_message(&flight.transcript.current_hash());
823
824        let signer = signing_key
825            .choose_scheme(schemes)
826            .ok_or_else(|| {
827                common.send_fatal_alert(
828                    AlertDescription::HandshakeFailure,
829                    PeerIncompatible::NoSignatureSchemesInCommon,
830                )
831            })?;
832
833        let scheme = signer.scheme();
834        let sig = signer.sign(message.as_ref())?;
835
836        let cv = DigitallySignedStruct::new(scheme, sig);
837
838        let cv = HandshakeMessagePayload(HandshakePayload::CertificateVerify(cv));
839
840        trace!("sending certificate-verify {cv:?}");
841        flight.add(cv);
842        Ok(())
843    }
844
845    fn emit_finished_tls13(
846        mut flight: HandshakeFlightTls13<'_>,
847        randoms: &ConnectionRandoms,
848        cx: &mut ServerContext<'_>,
849        key_schedule: KeyScheduleHandshake,
850        config: &ServerConfig,
851    ) -> KeyScheduleTrafficWithClientFinishedPending {
852        let handshake_hash = flight.transcript.current_hash();
853        let verify_data = key_schedule.sign_server_finish(&handshake_hash);
854        let verify_data_payload = Payload::new(verify_data.as_ref());
855
856        let fin = HandshakeMessagePayload(HandshakePayload::Finished(verify_data_payload));
857
858        trace!("sending finished {fin:?}");
859        flight.add(fin);
860        let hash_at_server_fin = flight.transcript.current_hash();
861        flight.finish(cx.common);
862
863        // Now move to application data keys.  Read key change is deferred until
864        // the Finish message is received & validated.
865        key_schedule.into_traffic_with_client_finished_pending(
866            hash_at_server_fin,
867            &*config.key_log,
868            &randoms.client,
869            cx.common,
870        )
871    }
872}
873
874struct ExpectAndSkipRejectedEarlyData {
875    skip_data_left: usize,
876    next: Box<hs::ExpectClientHello>,
877}
878
879impl State<ServerConnectionData> for ExpectAndSkipRejectedEarlyData {
880    fn handle<'m>(
881        mut self: Box<Self>,
882        cx: &mut ServerContext<'_>,
883        m: Message<'m>,
884    ) -> hs::NextStateOrError<'m>
885    where
886        Self: 'm,
887    {
888        /* "The server then ignores early data by skipping all records with an external
889         *  content type of "application_data" (indicating that they are encrypted),
890         *  up to the configured max_early_data_size."
891         * (RFC8446, 14.2.10) */
892        if let MessagePayload::ApplicationData(skip_data) = &m.payload {
893            if skip_data.bytes().len() <= self.skip_data_left {
894                self.skip_data_left -= skip_data.bytes().len();
895                return Ok(self);
896            }
897        }
898
899        self.next.handle(cx, m)
900    }
901
902    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
903        self
904    }
905}
906
907struct ExpectCertificateOrCompressedCertificate {
908    config: Arc<ServerConfig>,
909    transcript: HandshakeHash,
910    suite: &'static Tls13CipherSuite,
911    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
912    send_tickets: usize,
913}
914
915impl State<ServerConnectionData> for ExpectCertificateOrCompressedCertificate {
916    fn handle<'m>(
917        self: Box<Self>,
918        cx: &mut ServerContext<'_>,
919        m: Message<'m>,
920    ) -> hs::NextStateOrError<'m>
921    where
922        Self: 'm,
923    {
924        match m.payload {
925            MessagePayload::Handshake {
926                parsed: HandshakeMessagePayload(HandshakePayload::CertificateTls13(..)),
927                ..
928            } => Box::new(ExpectCertificate {
929                config: self.config,
930                transcript: self.transcript,
931                suite: self.suite,
932                key_schedule: self.key_schedule,
933                send_tickets: self.send_tickets,
934                message_already_in_transcript: false,
935            })
936            .handle(cx, m),
937
938            MessagePayload::Handshake {
939                parsed: HandshakeMessagePayload(HandshakePayload::CompressedCertificate(..)),
940                ..
941            } => Box::new(ExpectCompressedCertificate {
942                config: self.config,
943                transcript: self.transcript,
944                suite: self.suite,
945                key_schedule: self.key_schedule,
946                send_tickets: self.send_tickets,
947            })
948            .handle(cx, m),
949
950            payload => Err(inappropriate_handshake_message(
951                &payload,
952                &[ContentType::Handshake],
953                &[
954                    HandshakeType::Certificate,
955                    HandshakeType::CompressedCertificate,
956                ],
957            )),
958        }
959    }
960
961    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
962        self
963    }
964}
965
966struct ExpectCompressedCertificate {
967    config: Arc<ServerConfig>,
968    transcript: HandshakeHash,
969    suite: &'static Tls13CipherSuite,
970    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
971    send_tickets: usize,
972}
973
974impl State<ServerConnectionData> for ExpectCompressedCertificate {
975    fn handle<'m>(
976        mut self: Box<Self>,
977        cx: &mut ServerContext<'_>,
978        m: Message<'m>,
979    ) -> hs::NextStateOrError<'m>
980    where
981        Self: 'm,
982    {
983        self.transcript.add_message(&m);
984        let compressed_cert = require_handshake_msg_move!(
985            m,
986            HandshakeType::CompressedCertificate,
987            HandshakePayload::CompressedCertificate
988        )?;
989
990        let selected_decompressor = self
991            .config
992            .cert_decompressors
993            .iter()
994            .find(|item| item.algorithm() == compressed_cert.alg);
995
996        let Some(decompressor) = selected_decompressor else {
997            return Err(cx.common.send_fatal_alert(
998                AlertDescription::BadCertificate,
999                PeerMisbehaved::SelectedUnofferedCertCompression,
1000            ));
1001        };
1002
1003        if compressed_cert.uncompressed_len as usize > CERTIFICATE_MAX_SIZE_LIMIT {
1004            return Err(cx.common.send_fatal_alert(
1005                AlertDescription::BadCertificate,
1006                InvalidMessage::MessageTooLarge,
1007            ));
1008        }
1009
1010        let mut decompress_buffer = vec![0u8; compressed_cert.uncompressed_len as usize];
1011        if let Err(compress::DecompressionFailed) =
1012            decompressor.decompress(compressed_cert.compressed.0.bytes(), &mut decompress_buffer)
1013        {
1014            return Err(cx.common.send_fatal_alert(
1015                AlertDescription::BadCertificate,
1016                PeerMisbehaved::InvalidCertCompression,
1017            ));
1018        }
1019
1020        let cert_payload =
1021            match CertificatePayloadTls13::read(&mut Reader::init(&decompress_buffer)) {
1022                Ok(cm) => cm,
1023                Err(err) => {
1024                    return Err(cx
1025                        .common
1026                        .send_fatal_alert(AlertDescription::BadCertificate, err));
1027                }
1028            };
1029        trace!(
1030            "Client certificate decompressed using {:?} ({} bytes -> {})",
1031            compressed_cert.alg,
1032            compressed_cert
1033                .compressed
1034                .0
1035                .bytes()
1036                .len(),
1037            compressed_cert.uncompressed_len,
1038        );
1039
1040        let m = Message {
1041            version: ProtocolVersion::TLSv1_3,
1042            payload: MessagePayload::handshake(HandshakeMessagePayload(
1043                HandshakePayload::CertificateTls13(cert_payload.into_owned()),
1044            )),
1045        };
1046
1047        Box::new(ExpectCertificate {
1048            config: self.config,
1049            transcript: self.transcript,
1050            suite: self.suite,
1051            key_schedule: self.key_schedule,
1052            send_tickets: self.send_tickets,
1053            message_already_in_transcript: true,
1054        })
1055        .handle(cx, m)
1056    }
1057
1058    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1059        self
1060    }
1061}
1062
1063struct ExpectCertificate {
1064    config: Arc<ServerConfig>,
1065    transcript: HandshakeHash,
1066    suite: &'static Tls13CipherSuite,
1067    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1068    send_tickets: usize,
1069    message_already_in_transcript: bool,
1070}
1071
1072impl State<ServerConnectionData> for ExpectCertificate {
1073    fn handle<'m>(
1074        mut self: Box<Self>,
1075        cx: &mut ServerContext<'_>,
1076        m: Message<'m>,
1077    ) -> hs::NextStateOrError<'m>
1078    where
1079        Self: 'm,
1080    {
1081        if !self.message_already_in_transcript {
1082            self.transcript.add_message(&m);
1083        }
1084        let certp = require_handshake_msg_move!(
1085            m,
1086            HandshakeType::Certificate,
1087            HandshakePayload::CertificateTls13
1088        )?;
1089
1090        // We don't send any CertificateRequest extensions, so any extensions
1091        // here are illegal.
1092        if certp
1093            .entries
1094            .iter()
1095            .any(|e| !e.extensions.only_contains(&[]))
1096        {
1097            return Err(PeerMisbehaved::UnsolicitedCertExtension.into());
1098        }
1099
1100        let client_cert = certp.into_certificate_chain();
1101
1102        let mandatory = self
1103            .config
1104            .verifier
1105            .client_auth_mandatory();
1106
1107        let Some((end_entity, intermediates)) = client_cert.split_first() else {
1108            if !mandatory {
1109                debug!("client auth requested but no certificate supplied");
1110                self.transcript.abandon_client_auth();
1111                return Ok(Box::new(ExpectFinished {
1112                    config: self.config,
1113                    suite: self.suite,
1114                    key_schedule: self.key_schedule,
1115                    transcript: self.transcript,
1116                    send_tickets: self.send_tickets,
1117                }));
1118            }
1119
1120            return Err(cx.common.send_fatal_alert(
1121                AlertDescription::CertificateRequired,
1122                Error::NoCertificatesPresented,
1123            ));
1124        };
1125
1126        let now = self.config.current_time()?;
1127
1128        self.config
1129            .verifier
1130            .verify_client_cert(end_entity, intermediates, now)
1131            .map_err(|err| {
1132                cx.common
1133                    .send_cert_verify_error_alert(err)
1134            })?;
1135
1136        Ok(Box::new(ExpectCertificateVerify {
1137            config: self.config,
1138            suite: self.suite,
1139            transcript: self.transcript,
1140            key_schedule: self.key_schedule,
1141            client_cert: client_cert.into_owned(),
1142            send_tickets: self.send_tickets,
1143        }))
1144    }
1145
1146    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1147        self
1148    }
1149}
1150
1151struct ExpectCertificateVerify {
1152    config: Arc<ServerConfig>,
1153    transcript: HandshakeHash,
1154    suite: &'static Tls13CipherSuite,
1155    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1156    client_cert: CertificateChain<'static>,
1157    send_tickets: usize,
1158}
1159
1160impl State<ServerConnectionData> for ExpectCertificateVerify {
1161    fn handle<'m>(
1162        mut self: Box<Self>,
1163        cx: &mut ServerContext<'_>,
1164        m: Message<'m>,
1165    ) -> hs::NextStateOrError<'m>
1166    where
1167        Self: 'm,
1168    {
1169        let rc = {
1170            let sig = require_handshake_msg!(
1171                m,
1172                HandshakeType::CertificateVerify,
1173                HandshakePayload::CertificateVerify
1174            )?;
1175            let handshake_hash = self.transcript.current_hash();
1176            self.transcript.abandon_client_auth();
1177            let certs = &self.client_cert;
1178            let msg = construct_client_verify_message(&handshake_hash);
1179
1180            self.config
1181                .verifier
1182                .verify_tls13_signature(msg.as_ref(), &certs[0], sig)
1183        };
1184
1185        if let Err(e) = rc {
1186            return Err(cx
1187                .common
1188                .send_cert_verify_error_alert(e));
1189        }
1190
1191        trace!("client CertificateVerify OK");
1192        cx.common.peer_certificates = Some(self.client_cert);
1193
1194        self.transcript.add_message(&m);
1195        Ok(Box::new(ExpectFinished {
1196            config: self.config,
1197            suite: self.suite,
1198            key_schedule: self.key_schedule,
1199            transcript: self.transcript,
1200            send_tickets: self.send_tickets,
1201        }))
1202    }
1203
1204    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1205        self
1206    }
1207}
1208
1209// --- Process (any number of) early ApplicationData messages,
1210//     followed by a terminating handshake EndOfEarlyData message ---
1211
1212struct ExpectEarlyData {
1213    config: Arc<ServerConfig>,
1214    transcript: HandshakeHash,
1215    suite: &'static Tls13CipherSuite,
1216    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1217    send_tickets: usize,
1218}
1219
1220impl State<ServerConnectionData> for ExpectEarlyData {
1221    fn handle<'m>(
1222        mut self: Box<Self>,
1223        cx: &mut ServerContext<'_>,
1224        m: Message<'m>,
1225    ) -> hs::NextStateOrError<'m>
1226    where
1227        Self: 'm,
1228    {
1229        match m.payload {
1230            MessagePayload::ApplicationData(payload) => {
1231                match cx
1232                    .data
1233                    .early_data
1234                    .take_received_plaintext(payload)
1235                {
1236                    true => Ok(self),
1237                    false => Err(cx.common.send_fatal_alert(
1238                        AlertDescription::UnexpectedMessage,
1239                        PeerMisbehaved::TooMuchEarlyDataReceived,
1240                    )),
1241                }
1242            }
1243            MessagePayload::Handshake {
1244                parsed: HandshakeMessagePayload(HandshakePayload::EndOfEarlyData),
1245                ..
1246            } => {
1247                self.key_schedule
1248                    .update_decrypter(cx.common);
1249                self.transcript.add_message(&m);
1250                Ok(Box::new(ExpectFinished {
1251                    config: self.config,
1252                    suite: self.suite,
1253                    key_schedule: self.key_schedule,
1254                    transcript: self.transcript,
1255                    send_tickets: self.send_tickets,
1256                }))
1257            }
1258            payload => Err(inappropriate_handshake_message(
1259                &payload,
1260                &[ContentType::ApplicationData, ContentType::Handshake],
1261                &[HandshakeType::EndOfEarlyData],
1262            )),
1263        }
1264    }
1265
1266    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1267        self
1268    }
1269}
1270
1271// --- Process client's Finished ---
1272fn get_server_session_value(
1273    suite: &'static Tls13CipherSuite,
1274    resumption: &KeyScheduleResumption,
1275    cx: &ServerContext<'_>,
1276    nonce: &[u8],
1277    time_now: UnixTime,
1278    age_obfuscation_offset: u32,
1279) -> persist::ServerSessionValue {
1280    let version = ProtocolVersion::TLSv1_3;
1281
1282    let secret = resumption.derive_ticket_psk(nonce);
1283
1284    persist::ServerSessionValue::new(
1285        cx.data.sni.as_ref(),
1286        version,
1287        suite.common.suite,
1288        secret.as_ref(),
1289        cx.common.peer_certificates.clone(),
1290        cx.common.alpn_protocol.clone(),
1291        cx.data.resumption_data.clone(),
1292        time_now,
1293        age_obfuscation_offset,
1294    )
1295}
1296
1297struct ExpectFinished {
1298    config: Arc<ServerConfig>,
1299    transcript: HandshakeHash,
1300    suite: &'static Tls13CipherSuite,
1301    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1302    send_tickets: usize,
1303}
1304
1305impl ExpectFinished {
1306    fn emit_ticket(
1307        flight: &mut HandshakeFlightTls13<'_>,
1308        suite: &'static Tls13CipherSuite,
1309        cx: &ServerContext<'_>,
1310        resumption: &KeyScheduleResumption,
1311        config: &ServerConfig,
1312    ) -> Result<(), Error> {
1313        let secure_random = config.provider.secure_random;
1314        let nonce = rand::random_vec(secure_random, 32)?;
1315        let age_add = rand::random_u32(secure_random)?;
1316
1317        let now = config.current_time()?;
1318
1319        let plain =
1320            get_server_session_value(suite, resumption, cx, &nonce, now, age_add).get_encoding();
1321
1322        let stateless = config.ticketer.enabled();
1323        let (ticket, lifetime) = if stateless {
1324            let Some(ticket) = config.ticketer.encrypt(&plain) else {
1325                return Ok(());
1326            };
1327            (ticket, config.ticketer.lifetime())
1328        } else {
1329            let id = rand::random_vec(secure_random, 32)?;
1330            let stored = config
1331                .session_storage
1332                .put(id.clone(), plain);
1333            if !stored {
1334                trace!("resumption not available; not issuing ticket");
1335                return Ok(());
1336            }
1337            let stateful_lifetime = 24 * 60 * 60; // this is a bit of a punt
1338            (id, stateful_lifetime)
1339        };
1340
1341        let mut payload = NewSessionTicketPayloadTls13::new(lifetime, age_add, nonce, ticket);
1342
1343        if config.max_early_data_size > 0 {
1344            if !stateless {
1345                payload.extensions.max_early_data_size = Some(config.max_early_data_size);
1346            } else {
1347                // We implement RFC8446 section 8.1: by enforcing that 0-RTT is
1348                // only possible if using stateful resumption
1349                warn!("early_data with stateless resumption is not allowed");
1350            }
1351        }
1352
1353        let t = HandshakeMessagePayload(HandshakePayload::NewSessionTicketTls13(payload));
1354        trace!("sending new ticket {t:?} (stateless: {stateless})");
1355        flight.add(t);
1356
1357        Ok(())
1358    }
1359}
1360
1361impl State<ServerConnectionData> for ExpectFinished {
1362    fn handle<'m>(
1363        mut self: Box<Self>,
1364        cx: &mut ServerContext<'_>,
1365        m: Message<'m>,
1366    ) -> hs::NextStateOrError<'m>
1367    where
1368        Self: 'm,
1369    {
1370        let finished =
1371            require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1372
1373        let handshake_hash = self.transcript.current_hash();
1374        let (key_schedule_before_finished, expect_verify_data) = self
1375            .key_schedule
1376            .sign_client_finish(&handshake_hash, cx.common);
1377
1378        let fin = match ConstantTimeEq::ct_eq(expect_verify_data.as_ref(), finished.bytes()).into()
1379        {
1380            true => verify::FinishedMessageVerified::assertion(),
1381            false => {
1382                return Err(cx
1383                    .common
1384                    .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
1385            }
1386        };
1387
1388        // Note: future derivations include Client Finished, but not the
1389        // main application data keying.
1390        self.transcript.add_message(&m);
1391
1392        cx.common.check_aligned_handshake()?;
1393
1394        let (key_schedule_traffic, resumption) =
1395            key_schedule_before_finished.into_traffic(self.transcript.current_hash());
1396
1397        let mut flight = HandshakeFlightTls13::new(&mut self.transcript);
1398        for _ in 0..self.send_tickets {
1399            Self::emit_ticket(&mut flight, self.suite, cx, &resumption, &self.config)?;
1400        }
1401        flight.finish(cx.common);
1402
1403        // Application data may now flow, even if we have client auth enabled.
1404        cx.common
1405            .start_traffic(&mut cx.sendable_plaintext);
1406
1407        Ok(match cx.common.is_quic() {
1408            true => Box::new(ExpectQuicTraffic {
1409                key_schedule: key_schedule_traffic,
1410                _fin_verified: fin,
1411            }),
1412            false => Box::new(ExpectTraffic {
1413                key_schedule: key_schedule_traffic,
1414                _fin_verified: fin,
1415            }),
1416        })
1417    }
1418
1419    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1420        self
1421    }
1422}
1423
1424// --- Process traffic ---
1425struct ExpectTraffic {
1426    key_schedule: KeyScheduleTraffic,
1427    _fin_verified: verify::FinishedMessageVerified,
1428}
1429
1430impl ExpectTraffic {
1431    fn handle_key_update(
1432        &mut self,
1433        common: &mut CommonState,
1434        key_update_request: &KeyUpdateRequest,
1435    ) -> Result<(), Error> {
1436        if let Protocol::Quic = common.protocol {
1437            return Err(common.send_fatal_alert(
1438                AlertDescription::UnexpectedMessage,
1439                PeerMisbehaved::KeyUpdateReceivedInQuicConnection,
1440            ));
1441        }
1442
1443        common.check_aligned_handshake()?;
1444
1445        if common.should_update_key(key_update_request)? {
1446            self.key_schedule
1447                .update_encrypter_and_notify(common);
1448        }
1449
1450        // Update our read-side keys.
1451        self.key_schedule
1452            .update_decrypter(common);
1453        Ok(())
1454    }
1455}
1456
1457impl State<ServerConnectionData> for ExpectTraffic {
1458    fn handle<'m>(
1459        mut self: Box<Self>,
1460        cx: &mut ServerContext<'_>,
1461        m: Message<'m>,
1462    ) -> hs::NextStateOrError<'m>
1463    where
1464        Self: 'm,
1465    {
1466        match m.payload {
1467            MessagePayload::ApplicationData(payload) => cx
1468                .common
1469                .take_received_plaintext(payload),
1470            MessagePayload::Handshake {
1471                parsed: HandshakeMessagePayload(HandshakePayload::KeyUpdate(key_update)),
1472                ..
1473            } => self.handle_key_update(cx.common, &key_update)?,
1474            payload => {
1475                return Err(inappropriate_handshake_message(
1476                    &payload,
1477                    &[ContentType::ApplicationData, ContentType::Handshake],
1478                    &[HandshakeType::KeyUpdate],
1479                ));
1480            }
1481        }
1482
1483        Ok(self)
1484    }
1485
1486    fn export_keying_material(
1487        &self,
1488        output: &mut [u8],
1489        label: &[u8],
1490        context: Option<&[u8]>,
1491    ) -> Result<(), Error> {
1492        self.key_schedule
1493            .export_keying_material(output, label, context)
1494    }
1495
1496    fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
1497        self.key_schedule
1498            .extract_secrets(Side::Server)
1499    }
1500
1501    fn send_key_update_request(&mut self, common: &mut CommonState) -> Result<(), Error> {
1502        self.key_schedule
1503            .request_key_update_and_update_encrypter(common)
1504    }
1505
1506    fn into_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
1507        Ok(self)
1508    }
1509
1510    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1511        self
1512    }
1513}
1514
1515impl KernelState for ExpectTraffic {
1516    fn update_secrets(&mut self, dir: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1517        self.key_schedule
1518            .refresh_traffic_secret(match dir {
1519                Direction::Transmit => Side::Server,
1520                Direction::Receive => Side::Client,
1521            })
1522    }
1523
1524    fn handle_new_session_ticket(
1525        &mut self,
1526        _cx: &mut KernelContext<'_>,
1527        _message: &NewSessionTicketPayloadTls13,
1528    ) -> Result<(), Error> {
1529        unreachable!(
1530            "server connections should never have handle_new_session_ticket called on them"
1531        )
1532    }
1533}
1534
1535struct ExpectQuicTraffic {
1536    key_schedule: KeyScheduleTraffic,
1537    _fin_verified: verify::FinishedMessageVerified,
1538}
1539
1540impl State<ServerConnectionData> for ExpectQuicTraffic {
1541    fn handle<'m>(
1542        self: Box<Self>,
1543        _cx: &mut ServerContext<'_>,
1544        m: Message<'m>,
1545    ) -> hs::NextStateOrError<'m>
1546    where
1547        Self: 'm,
1548    {
1549        // reject all messages
1550        Err(inappropriate_message(&m.payload, &[]))
1551    }
1552
1553    fn export_keying_material(
1554        &self,
1555        output: &mut [u8],
1556        label: &[u8],
1557        context: Option<&[u8]>,
1558    ) -> Result<(), Error> {
1559        self.key_schedule
1560            .export_keying_material(output, label, context)
1561    }
1562
1563    fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1564        self
1565    }
1566}
1567
1568impl KernelState for ExpectQuicTraffic {
1569    fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1570        Err(Error::General(
1571            "QUIC connections do not support key updates".into(),
1572        ))
1573    }
1574
1575    fn handle_new_session_ticket(
1576        &mut self,
1577        _cx: &mut KernelContext<'_>,
1578        _message: &NewSessionTicketPayloadTls13,
1579    ) -> Result<(), Error> {
1580        unreachable!("handle_new_session_ticket should not be called for server-side connections")
1581    }
1582}