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