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