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