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