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