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