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