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