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