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