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 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 resumedata: Option<&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(resume) = resumedata 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
690 && resume.is_fresh()
691 && Some(resume.version) == cx.common.negotiated_version
692 && resume.cipher_suite == suite.common.suite
693 && resume.alpn.as_ref().map(|p| &p.0[..]) == cx.common.alpn_protocol.as_deref();
694
695 if early_data_configured && early_data_possible && !cx.data.early_data.was_rejected() {
696 EarlyDataDecision::Accepted
697 } else {
698 if cx.common.is_quic() {
699 cx.common.quic.early_secret = None;
701 }
702
703 rejected_or_disabled
704 }
705 }
706
707 fn emit_encrypted_extensions(
708 flight: &mut HandshakeFlightTls13<'_>,
709 suite: &'static Tls13CipherSuite,
710 cx: &mut ServerContext<'_>,
711 ocsp_response: &mut Option<&[u8]>,
712 hello: &ClientHelloPayload,
713 resumedata: Option<&persist::ServerSessionValue>,
714 extra_exts: ServerExtensionsInput<'static>,
715 config: &ServerConfig,
716 send_tickets: usize,
717 ) -> Result<EarlyDataDecision, Error> {
718 let mut ep = hs::ExtensionProcessing::new(extra_exts);
719 ep.process_common(config, cx, ocsp_response, hello, resumedata)?;
720
721 if hello.ticket_request.is_some() && config.max_tls13_tickets > 0 {
723 ep.extensions.ticket_request = Some(ServerTicketRequestHint {
724 expected_count: Ord::min(send_tickets, usize::from(u8::MAX)) as u8,
725 });
726 }
727
728 let early_data = decide_if_early_data_allowed(cx, hello, resumedata, suite, config);
729 if early_data == EarlyDataDecision::Accepted {
730 ep.extensions.early_data_ack = Some(());
731 }
732
733 let ee = HandshakeMessagePayload(HandshakePayload::EncryptedExtensions(ep.extensions));
734
735 trace!("sending encrypted extensions {ee:?}");
736 flight.add(ee);
737 Ok(early_data)
738 }
739
740 fn emit_certificate_req_tls13(
741 flight: &mut HandshakeFlightTls13<'_>,
742 config: &ServerConfig,
743 ) -> Result<bool, Error> {
744 if !config.verifier.offer_client_auth() {
745 return Ok(false);
746 }
747
748 let cr = CertificateRequestPayloadTls13 {
749 context: PayloadU8::empty(),
750 extensions: CertificateRequestExtensions {
751 signature_algorithms: Some(
752 config
753 .verifier
754 .supported_verify_schemes(),
755 ),
756 certificate_compression_algorithms: match config.cert_decompressors.as_slice() {
757 &[] => None,
758 decomps => Some(
759 decomps
760 .iter()
761 .map(|decomp| decomp.algorithm())
762 .collect(),
763 ),
764 },
765 authority_names: match config.verifier.root_hint_subjects() {
766 &[] => None,
767 authorities => Some(authorities.to_vec()),
768 },
769 },
770 };
771
772 let creq = HandshakeMessagePayload(HandshakePayload::CertificateRequestTls13(cr));
773
774 trace!("Sending CertificateRequest {creq:?}");
775 flight.add(creq);
776 Ok(true)
777 }
778
779 fn emit_certificate_tls13(
780 flight: &mut HandshakeFlightTls13<'_>,
781 cert_chain: &[CertificateDer<'static>],
782 ocsp_response: Option<&[u8]>,
783 ) {
784 let cert = HandshakeMessagePayload(HandshakePayload::CertificateTls13(
785 CertificatePayloadTls13::new(cert_chain.iter(), ocsp_response),
786 ));
787
788 trace!("sending certificate {cert:?}");
789 flight.add(cert);
790 }
791
792 fn emit_compressed_certificate_tls13(
793 flight: &mut HandshakeFlightTls13<'_>,
794 config: &ServerConfig,
795 cert_chain: &[CertificateDer<'static>],
796 ocsp_response: Option<&[u8]>,
797 cert_compressor: &'static dyn CertCompressor,
798 ) {
799 let payload = CertificatePayloadTls13::new(cert_chain.iter(), ocsp_response);
800
801 let Ok(entry) = config
802 .cert_compression_cache
803 .compression_for(cert_compressor, &payload)
804 else {
805 return emit_certificate_tls13(flight, cert_chain, ocsp_response);
806 };
807
808 let c = HandshakeMessagePayload(HandshakePayload::CompressedCertificate(
809 entry.compressed_cert_payload(),
810 ));
811
812 trace!("sending compressed certificate {c:?}");
813 flight.add(c);
814 }
815
816 fn emit_certificate_verify_tls13(
817 flight: &mut HandshakeFlightTls13<'_>,
818 common: &mut CommonState,
819 signing_key: &dyn sign::SigningKey,
820 schemes: &[SignatureScheme],
821 ) -> Result<(), Error> {
822 let message = construct_server_verify_message(&flight.transcript.current_hash());
823
824 let signer = signing_key
825 .choose_scheme(schemes)
826 .ok_or_else(|| {
827 common.send_fatal_alert(
828 AlertDescription::HandshakeFailure,
829 PeerIncompatible::NoSignatureSchemesInCommon,
830 )
831 })?;
832
833 let scheme = signer.scheme();
834 let sig = signer.sign(message.as_ref())?;
835
836 let cv = DigitallySignedStruct::new(scheme, sig);
837
838 let cv = HandshakeMessagePayload(HandshakePayload::CertificateVerify(cv));
839
840 trace!("sending certificate-verify {cv:?}");
841 flight.add(cv);
842 Ok(())
843 }
844
845 fn emit_finished_tls13(
846 mut flight: HandshakeFlightTls13<'_>,
847 randoms: &ConnectionRandoms,
848 cx: &mut ServerContext<'_>,
849 key_schedule: KeyScheduleHandshake,
850 config: &ServerConfig,
851 ) -> KeyScheduleTrafficWithClientFinishedPending {
852 let handshake_hash = flight.transcript.current_hash();
853 let verify_data = key_schedule.sign_server_finish(&handshake_hash);
854 let verify_data_payload = Payload::new(verify_data.as_ref());
855
856 let fin = HandshakeMessagePayload(HandshakePayload::Finished(verify_data_payload));
857
858 trace!("sending finished {fin:?}");
859 flight.add(fin);
860 let hash_at_server_fin = flight.transcript.current_hash();
861 flight.finish(cx.common);
862
863 key_schedule.into_traffic_with_client_finished_pending(
866 hash_at_server_fin,
867 &*config.key_log,
868 &randoms.client,
869 cx.common,
870 )
871 }
872}
873
874struct ExpectAndSkipRejectedEarlyData {
875 skip_data_left: usize,
876 next: Box<hs::ExpectClientHello>,
877}
878
879impl State<ServerConnectionData> for ExpectAndSkipRejectedEarlyData {
880 fn handle<'m>(
881 mut self: Box<Self>,
882 cx: &mut ServerContext<'_>,
883 m: Message<'m>,
884 ) -> hs::NextStateOrError<'m>
885 where
886 Self: 'm,
887 {
888 if let MessagePayload::ApplicationData(skip_data) = &m.payload {
893 if skip_data.bytes().len() <= self.skip_data_left {
894 self.skip_data_left -= skip_data.bytes().len();
895 return Ok(self);
896 }
897 }
898
899 self.next.handle(cx, m)
900 }
901
902 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
903 self
904 }
905}
906
907struct ExpectCertificateOrCompressedCertificate {
908 config: Arc<ServerConfig>,
909 transcript: HandshakeHash,
910 suite: &'static Tls13CipherSuite,
911 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
912 send_tickets: usize,
913}
914
915impl State<ServerConnectionData> for ExpectCertificateOrCompressedCertificate {
916 fn handle<'m>(
917 self: Box<Self>,
918 cx: &mut ServerContext<'_>,
919 m: Message<'m>,
920 ) -> hs::NextStateOrError<'m>
921 where
922 Self: 'm,
923 {
924 match m.payload {
925 MessagePayload::Handshake {
926 parsed: HandshakeMessagePayload(HandshakePayload::CertificateTls13(..)),
927 ..
928 } => Box::new(ExpectCertificate {
929 config: self.config,
930 transcript: self.transcript,
931 suite: self.suite,
932 key_schedule: self.key_schedule,
933 send_tickets: self.send_tickets,
934 message_already_in_transcript: false,
935 })
936 .handle(cx, m),
937
938 MessagePayload::Handshake {
939 parsed: HandshakeMessagePayload(HandshakePayload::CompressedCertificate(..)),
940 ..
941 } => Box::new(ExpectCompressedCertificate {
942 config: self.config,
943 transcript: self.transcript,
944 suite: self.suite,
945 key_schedule: self.key_schedule,
946 send_tickets: self.send_tickets,
947 })
948 .handle(cx, m),
949
950 payload => Err(inappropriate_handshake_message(
951 &payload,
952 &[ContentType::Handshake],
953 &[
954 HandshakeType::Certificate,
955 HandshakeType::CompressedCertificate,
956 ],
957 )),
958 }
959 }
960
961 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
962 self
963 }
964}
965
966struct ExpectCompressedCertificate {
967 config: Arc<ServerConfig>,
968 transcript: HandshakeHash,
969 suite: &'static Tls13CipherSuite,
970 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
971 send_tickets: usize,
972}
973
974impl State<ServerConnectionData> for ExpectCompressedCertificate {
975 fn handle<'m>(
976 mut self: Box<Self>,
977 cx: &mut ServerContext<'_>,
978 m: Message<'m>,
979 ) -> hs::NextStateOrError<'m>
980 where
981 Self: 'm,
982 {
983 self.transcript.add_message(&m);
984 let compressed_cert = require_handshake_msg_move!(
985 m,
986 HandshakeType::CompressedCertificate,
987 HandshakePayload::CompressedCertificate
988 )?;
989
990 let selected_decompressor = self
991 .config
992 .cert_decompressors
993 .iter()
994 .find(|item| item.algorithm() == compressed_cert.alg);
995
996 let Some(decompressor) = selected_decompressor else {
997 return Err(cx.common.send_fatal_alert(
998 AlertDescription::BadCertificate,
999 PeerMisbehaved::SelectedUnofferedCertCompression,
1000 ));
1001 };
1002
1003 if compressed_cert.uncompressed_len as usize > CERTIFICATE_MAX_SIZE_LIMIT {
1004 return Err(cx.common.send_fatal_alert(
1005 AlertDescription::BadCertificate,
1006 InvalidMessage::MessageTooLarge,
1007 ));
1008 }
1009
1010 let mut decompress_buffer = vec![0u8; compressed_cert.uncompressed_len as usize];
1011 if let Err(compress::DecompressionFailed) =
1012 decompressor.decompress(compressed_cert.compressed.0.bytes(), &mut decompress_buffer)
1013 {
1014 return Err(cx.common.send_fatal_alert(
1015 AlertDescription::BadCertificate,
1016 PeerMisbehaved::InvalidCertCompression,
1017 ));
1018 }
1019
1020 let cert_payload =
1021 match CertificatePayloadTls13::read(&mut Reader::init(&decompress_buffer)) {
1022 Ok(cm) => cm,
1023 Err(err) => {
1024 return Err(cx
1025 .common
1026 .send_fatal_alert(AlertDescription::BadCertificate, err));
1027 }
1028 };
1029 trace!(
1030 "Client certificate decompressed using {:?} ({} bytes -> {})",
1031 compressed_cert.alg,
1032 compressed_cert
1033 .compressed
1034 .0
1035 .bytes()
1036 .len(),
1037 compressed_cert.uncompressed_len,
1038 );
1039
1040 let m = Message {
1041 version: ProtocolVersion::TLSv1_3,
1042 payload: MessagePayload::handshake(HandshakeMessagePayload(
1043 HandshakePayload::CertificateTls13(cert_payload.into_owned()),
1044 )),
1045 };
1046
1047 Box::new(ExpectCertificate {
1048 config: self.config,
1049 transcript: self.transcript,
1050 suite: self.suite,
1051 key_schedule: self.key_schedule,
1052 send_tickets: self.send_tickets,
1053 message_already_in_transcript: true,
1054 })
1055 .handle(cx, m)
1056 }
1057
1058 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1059 self
1060 }
1061}
1062
1063struct ExpectCertificate {
1064 config: Arc<ServerConfig>,
1065 transcript: HandshakeHash,
1066 suite: &'static Tls13CipherSuite,
1067 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1068 send_tickets: usize,
1069 message_already_in_transcript: bool,
1070}
1071
1072impl State<ServerConnectionData> for ExpectCertificate {
1073 fn handle<'m>(
1074 mut self: Box<Self>,
1075 cx: &mut ServerContext<'_>,
1076 m: Message<'m>,
1077 ) -> hs::NextStateOrError<'m>
1078 where
1079 Self: 'm,
1080 {
1081 if !self.message_already_in_transcript {
1082 self.transcript.add_message(&m);
1083 }
1084 let certp = require_handshake_msg_move!(
1085 m,
1086 HandshakeType::Certificate,
1087 HandshakePayload::CertificateTls13
1088 )?;
1089
1090 if certp
1093 .entries
1094 .iter()
1095 .any(|e| !e.extensions.only_contains(&[]))
1096 {
1097 return Err(PeerMisbehaved::UnsolicitedCertExtension.into());
1098 }
1099
1100 let client_cert = certp.into_certificate_chain();
1101
1102 let mandatory = self
1103 .config
1104 .verifier
1105 .client_auth_mandatory();
1106
1107 let Some((end_entity, intermediates)) = client_cert.split_first() else {
1108 if !mandatory {
1109 debug!("client auth requested but no certificate supplied");
1110 self.transcript.abandon_client_auth();
1111 return Ok(Box::new(ExpectFinished {
1112 config: self.config,
1113 suite: self.suite,
1114 key_schedule: self.key_schedule,
1115 transcript: self.transcript,
1116 send_tickets: self.send_tickets,
1117 }));
1118 }
1119
1120 return Err(cx.common.send_fatal_alert(
1121 AlertDescription::CertificateRequired,
1122 Error::NoCertificatesPresented,
1123 ));
1124 };
1125
1126 let now = self.config.current_time()?;
1127
1128 self.config
1129 .verifier
1130 .verify_client_cert(end_entity, intermediates, now)
1131 .map_err(|err| {
1132 cx.common
1133 .send_cert_verify_error_alert(err)
1134 })?;
1135
1136 Ok(Box::new(ExpectCertificateVerify {
1137 config: self.config,
1138 suite: self.suite,
1139 transcript: self.transcript,
1140 key_schedule: self.key_schedule,
1141 client_cert: client_cert.into_owned(),
1142 send_tickets: self.send_tickets,
1143 }))
1144 }
1145
1146 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1147 self
1148 }
1149}
1150
1151struct ExpectCertificateVerify {
1152 config: Arc<ServerConfig>,
1153 transcript: HandshakeHash,
1154 suite: &'static Tls13CipherSuite,
1155 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1156 client_cert: CertificateChain<'static>,
1157 send_tickets: usize,
1158}
1159
1160impl State<ServerConnectionData> for ExpectCertificateVerify {
1161 fn handle<'m>(
1162 mut self: Box<Self>,
1163 cx: &mut ServerContext<'_>,
1164 m: Message<'m>,
1165 ) -> hs::NextStateOrError<'m>
1166 where
1167 Self: 'm,
1168 {
1169 let rc = {
1170 let sig = require_handshake_msg!(
1171 m,
1172 HandshakeType::CertificateVerify,
1173 HandshakePayload::CertificateVerify
1174 )?;
1175 let handshake_hash = self.transcript.current_hash();
1176 self.transcript.abandon_client_auth();
1177 let certs = &self.client_cert;
1178 let msg = construct_client_verify_message(&handshake_hash);
1179
1180 self.config
1181 .verifier
1182 .verify_tls13_signature(msg.as_ref(), &certs[0], sig)
1183 };
1184
1185 if let Err(e) = rc {
1186 return Err(cx
1187 .common
1188 .send_cert_verify_error_alert(e));
1189 }
1190
1191 trace!("client CertificateVerify OK");
1192 cx.common.peer_certificates = Some(self.client_cert);
1193
1194 self.transcript.add_message(&m);
1195 Ok(Box::new(ExpectFinished {
1196 config: self.config,
1197 suite: self.suite,
1198 key_schedule: self.key_schedule,
1199 transcript: self.transcript,
1200 send_tickets: self.send_tickets,
1201 }))
1202 }
1203
1204 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1205 self
1206 }
1207}
1208
1209struct ExpectEarlyData {
1213 config: Arc<ServerConfig>,
1214 transcript: HandshakeHash,
1215 suite: &'static Tls13CipherSuite,
1216 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1217 send_tickets: usize,
1218}
1219
1220impl State<ServerConnectionData> for ExpectEarlyData {
1221 fn handle<'m>(
1222 mut self: Box<Self>,
1223 cx: &mut ServerContext<'_>,
1224 m: Message<'m>,
1225 ) -> hs::NextStateOrError<'m>
1226 where
1227 Self: 'm,
1228 {
1229 match m.payload {
1230 MessagePayload::ApplicationData(payload) => {
1231 match cx
1232 .data
1233 .early_data
1234 .take_received_plaintext(payload)
1235 {
1236 true => Ok(self),
1237 false => Err(cx.common.send_fatal_alert(
1238 AlertDescription::UnexpectedMessage,
1239 PeerMisbehaved::TooMuchEarlyDataReceived,
1240 )),
1241 }
1242 }
1243 MessagePayload::Handshake {
1244 parsed: HandshakeMessagePayload(HandshakePayload::EndOfEarlyData),
1245 ..
1246 } => {
1247 self.key_schedule
1248 .update_decrypter(cx.common);
1249 self.transcript.add_message(&m);
1250 Ok(Box::new(ExpectFinished {
1251 config: self.config,
1252 suite: self.suite,
1253 key_schedule: self.key_schedule,
1254 transcript: self.transcript,
1255 send_tickets: self.send_tickets,
1256 }))
1257 }
1258 payload => Err(inappropriate_handshake_message(
1259 &payload,
1260 &[ContentType::ApplicationData, ContentType::Handshake],
1261 &[HandshakeType::EndOfEarlyData],
1262 )),
1263 }
1264 }
1265
1266 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1267 self
1268 }
1269}
1270
1271fn get_server_session_value(
1273 suite: &'static Tls13CipherSuite,
1274 resumption: &KeyScheduleResumption,
1275 cx: &ServerContext<'_>,
1276 nonce: &[u8],
1277 time_now: UnixTime,
1278 age_obfuscation_offset: u32,
1279) -> persist::ServerSessionValue {
1280 let version = ProtocolVersion::TLSv1_3;
1281
1282 let secret = resumption.derive_ticket_psk(nonce);
1283
1284 persist::ServerSessionValue::new(
1285 cx.data.sni.as_ref(),
1286 version,
1287 suite.common.suite,
1288 secret.as_ref(),
1289 cx.common.peer_certificates.clone(),
1290 cx.common.alpn_protocol.clone(),
1291 cx.data.resumption_data.clone(),
1292 time_now,
1293 age_obfuscation_offset,
1294 )
1295}
1296
1297struct ExpectFinished {
1298 config: Arc<ServerConfig>,
1299 transcript: HandshakeHash,
1300 suite: &'static Tls13CipherSuite,
1301 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
1302 send_tickets: usize,
1303}
1304
1305impl ExpectFinished {
1306 fn emit_ticket(
1307 flight: &mut HandshakeFlightTls13<'_>,
1308 suite: &'static Tls13CipherSuite,
1309 cx: &ServerContext<'_>,
1310 resumption: &KeyScheduleResumption,
1311 config: &ServerConfig,
1312 ) -> Result<(), Error> {
1313 let secure_random = config.provider.secure_random;
1314 let nonce = rand::random_vec(secure_random, 32)?;
1315 let age_add = rand::random_u32(secure_random)?;
1316
1317 let now = config.current_time()?;
1318
1319 let plain =
1320 get_server_session_value(suite, resumption, cx, &nonce, now, age_add).get_encoding();
1321
1322 let stateless = config.ticketer.enabled();
1323 let (ticket, lifetime) = if stateless {
1324 let Some(ticket) = config.ticketer.encrypt(&plain) else {
1325 return Ok(());
1326 };
1327 (ticket, config.ticketer.lifetime())
1328 } else {
1329 let id = rand::random_vec(secure_random, 32)?;
1330 let stored = config
1331 .session_storage
1332 .put(id.clone(), plain);
1333 if !stored {
1334 trace!("resumption not available; not issuing ticket");
1335 return Ok(());
1336 }
1337 let stateful_lifetime = 24 * 60 * 60; (id, stateful_lifetime)
1339 };
1340
1341 let mut payload = NewSessionTicketPayloadTls13::new(lifetime, age_add, nonce, ticket);
1342
1343 if config.max_early_data_size > 0 {
1344 if !stateless {
1345 payload.extensions.max_early_data_size = Some(config.max_early_data_size);
1346 } else {
1347 warn!("early_data with stateless resumption is not allowed");
1350 }
1351 }
1352
1353 let t = HandshakeMessagePayload(HandshakePayload::NewSessionTicketTls13(payload));
1354 trace!("sending new ticket {t:?} (stateless: {stateless})");
1355 flight.add(t);
1356
1357 Ok(())
1358 }
1359}
1360
1361impl State<ServerConnectionData> for ExpectFinished {
1362 fn handle<'m>(
1363 mut self: Box<Self>,
1364 cx: &mut ServerContext<'_>,
1365 m: Message<'m>,
1366 ) -> hs::NextStateOrError<'m>
1367 where
1368 Self: 'm,
1369 {
1370 let finished =
1371 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1372
1373 let handshake_hash = self.transcript.current_hash();
1374 let (key_schedule_before_finished, expect_verify_data) = self
1375 .key_schedule
1376 .sign_client_finish(&handshake_hash, cx.common);
1377
1378 let fin = match ConstantTimeEq::ct_eq(expect_verify_data.as_ref(), finished.bytes()).into()
1379 {
1380 true => verify::FinishedMessageVerified::assertion(),
1381 false => {
1382 return Err(cx
1383 .common
1384 .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
1385 }
1386 };
1387
1388 self.transcript.add_message(&m);
1391
1392 cx.common.check_aligned_handshake()?;
1393
1394 let (key_schedule_traffic, resumption) =
1395 key_schedule_before_finished.into_traffic(self.transcript.current_hash());
1396
1397 let mut flight = HandshakeFlightTls13::new(&mut self.transcript);
1398 for _ in 0..self.send_tickets {
1399 Self::emit_ticket(&mut flight, self.suite, cx, &resumption, &self.config)?;
1400 }
1401 flight.finish(cx.common);
1402
1403 cx.common
1405 .start_traffic(&mut cx.sendable_plaintext);
1406
1407 Ok(match cx.common.is_quic() {
1408 true => Box::new(ExpectQuicTraffic {
1409 key_schedule: key_schedule_traffic,
1410 _fin_verified: fin,
1411 }),
1412 false => Box::new(ExpectTraffic {
1413 key_schedule: key_schedule_traffic,
1414 _fin_verified: fin,
1415 }),
1416 })
1417 }
1418
1419 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1420 self
1421 }
1422}
1423
1424struct ExpectTraffic {
1426 key_schedule: KeyScheduleTraffic,
1427 _fin_verified: verify::FinishedMessageVerified,
1428}
1429
1430impl ExpectTraffic {
1431 fn handle_key_update(
1432 &mut self,
1433 common: &mut CommonState,
1434 key_update_request: &KeyUpdateRequest,
1435 ) -> Result<(), Error> {
1436 if let Protocol::Quic = common.protocol {
1437 return Err(common.send_fatal_alert(
1438 AlertDescription::UnexpectedMessage,
1439 PeerMisbehaved::KeyUpdateReceivedInQuicConnection,
1440 ));
1441 }
1442
1443 common.check_aligned_handshake()?;
1444
1445 if common.should_update_key(key_update_request)? {
1446 self.key_schedule
1447 .update_encrypter_and_notify(common);
1448 }
1449
1450 self.key_schedule
1452 .update_decrypter(common);
1453 Ok(())
1454 }
1455}
1456
1457impl State<ServerConnectionData> for ExpectTraffic {
1458 fn handle<'m>(
1459 mut self: Box<Self>,
1460 cx: &mut ServerContext<'_>,
1461 m: Message<'m>,
1462 ) -> hs::NextStateOrError<'m>
1463 where
1464 Self: 'm,
1465 {
1466 match m.payload {
1467 MessagePayload::ApplicationData(payload) => cx
1468 .common
1469 .take_received_plaintext(payload),
1470 MessagePayload::Handshake {
1471 parsed: HandshakeMessagePayload(HandshakePayload::KeyUpdate(key_update)),
1472 ..
1473 } => self.handle_key_update(cx.common, &key_update)?,
1474 payload => {
1475 return Err(inappropriate_handshake_message(
1476 &payload,
1477 &[ContentType::ApplicationData, ContentType::Handshake],
1478 &[HandshakeType::KeyUpdate],
1479 ));
1480 }
1481 }
1482
1483 Ok(self)
1484 }
1485
1486 fn export_keying_material(
1487 &self,
1488 output: &mut [u8],
1489 label: &[u8],
1490 context: Option<&[u8]>,
1491 ) -> Result<(), Error> {
1492 self.key_schedule
1493 .export_keying_material(output, label, context)
1494 }
1495
1496 fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
1497 self.key_schedule
1498 .extract_secrets(Side::Server)
1499 }
1500
1501 fn send_key_update_request(&mut self, common: &mut CommonState) -> Result<(), Error> {
1502 self.key_schedule
1503 .request_key_update_and_update_encrypter(common)
1504 }
1505
1506 fn into_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
1507 Ok(self)
1508 }
1509
1510 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1511 self
1512 }
1513}
1514
1515impl KernelState for ExpectTraffic {
1516 fn update_secrets(&mut self, dir: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1517 self.key_schedule
1518 .refresh_traffic_secret(match dir {
1519 Direction::Transmit => Side::Server,
1520 Direction::Receive => Side::Client,
1521 })
1522 }
1523
1524 fn handle_new_session_ticket(
1525 &mut self,
1526 _cx: &mut KernelContext<'_>,
1527 _message: &NewSessionTicketPayloadTls13,
1528 ) -> Result<(), Error> {
1529 unreachable!(
1530 "server connections should never have handle_new_session_ticket called on them"
1531 )
1532 }
1533}
1534
1535struct ExpectQuicTraffic {
1536 key_schedule: KeyScheduleTraffic,
1537 _fin_verified: verify::FinishedMessageVerified,
1538}
1539
1540impl State<ServerConnectionData> for ExpectQuicTraffic {
1541 fn handle<'m>(
1542 self: Box<Self>,
1543 _cx: &mut ServerContext<'_>,
1544 m: Message<'m>,
1545 ) -> hs::NextStateOrError<'m>
1546 where
1547 Self: 'm,
1548 {
1549 Err(inappropriate_message(&m.payload, &[]))
1551 }
1552
1553 fn export_keying_material(
1554 &self,
1555 output: &mut [u8],
1556 label: &[u8],
1557 context: Option<&[u8]>,
1558 ) -> Result<(), Error> {
1559 self.key_schedule
1560 .export_keying_material(output, label, context)
1561 }
1562
1563 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1564 self
1565 }
1566}
1567
1568impl KernelState for ExpectQuicTraffic {
1569 fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1570 Err(Error::General(
1571 "QUIC connections do not support key updates".into(),
1572 ))
1573 }
1574
1575 fn handle_new_session_ticket(
1576 &mut self,
1577 _cx: &mut KernelContext<'_>,
1578 _message: &NewSessionTicketPayloadTls13,
1579 ) -> Result<(), Error> {
1580 unreachable!("handle_new_session_ticket should not be called for server-side connections")
1581 }
1582}