1use crate::check::check_message;
2use crate::cipher;
3use crate::error::TLSError;
4use crate::key_schedule::{
5 KeyScheduleEarly, KeyScheduleHandshake, KeyScheduleNonSecret, KeyScheduleTraffic,
6 KeyScheduleTrafficWithClientFinishedPending,
7};
8#[cfg(feature = "logging")]
9use crate::log::{debug, trace, warn};
10use crate::msgs::base::{Payload, PayloadU8};
11use crate::msgs::ccs::ChangeCipherSpecPayload;
12use crate::msgs::codec::Codec;
13use crate::msgs::enums::KeyUpdateRequest;
14use crate::msgs::enums::{AlertDescription, NamedGroup, SignatureScheme};
15use crate::msgs::enums::{Compression, PSKKeyExchangeMode};
16use crate::msgs::enums::{ContentType, HandshakeType, ProtocolVersion};
17use crate::msgs::handshake::CertReqExtension;
18use crate::msgs::handshake::CertificateEntry;
19use crate::msgs::handshake::CertificateExtension;
20use crate::msgs::handshake::CertificatePayloadTLS13;
21use crate::msgs::handshake::CertificateRequestPayloadTLS13;
22use crate::msgs::handshake::CertificateStatus;
23use crate::msgs::handshake::ClientHelloPayload;
24use crate::msgs::handshake::DigitallySignedStruct;
25use crate::msgs::handshake::HandshakeMessagePayload;
26use crate::msgs::handshake::HandshakePayload;
27use crate::msgs::handshake::HelloRetryExtension;
28use crate::msgs::handshake::HelloRetryRequest;
29use crate::msgs::handshake::KeyShareEntry;
30use crate::msgs::handshake::NewSessionTicketPayloadTLS13;
31use crate::msgs::handshake::Random;
32use crate::msgs::handshake::ServerExtension;
33use crate::msgs::handshake::ServerHelloPayload;
34use crate::msgs::handshake::SessionID;
35use crate::msgs::message::{Message, MessagePayload};
36use crate::msgs::persist;
37use crate::rand;
38use crate::server::ServerSessionImpl;
39use crate::sign;
40use crate::suites;
41use crate::verify;
42#[cfg(feature = "quic")]
43use crate::{msgs::handshake::NewSessionTicketExtension, quic, session::Protocol};
44
45use crate::server::common::{ClientCertDetails, HandshakeDetails};
46use crate::server::hs;
47
48use ring::constant_time;
49
50pub struct CompleteClientHelloHandling {
51 pub handshake: HandshakeDetails,
52 pub done_retry: bool,
53 pub send_cert_status: bool,
54 pub send_sct: bool,
55 pub send_ticket: bool,
56}
57
58impl CompleteClientHelloHandling {
59 fn check_binder(
60 &self,
61 sess: &mut ServerSessionImpl,
62 client_hello: &Message,
63 psk: &[u8],
64 binder: &[u8],
65 ) -> bool {
66 let binder_plaintext = match client_hello.payload {
67 MessagePayload::Handshake(ref hmp) => hmp.get_encoding_for_binder_signing(),
68 _ => unreachable!(),
69 };
70
71 let suite = sess.common.get_suite_assert();
72 let suite_hash = suite.get_hash();
73 let handshake_hash = self
74 .handshake
75 .transcript
76 .get_hash_given(suite_hash, &binder_plaintext);
77
78 let key_schedule = KeyScheduleEarly::new(suite.hkdf_algorithm, &psk);
79 let real_binder =
80 key_schedule.resumption_psk_binder_key_and_sign_verify_data(&handshake_hash);
81
82 constant_time::verify_slices_are_equal(&real_binder, binder).is_ok()
83 }
84
85 fn into_expect_retried_client_hello(self) -> hs::NextState {
86 Box::new(hs::ExpectClientHello {
87 handshake: self.handshake,
88 done_retry: true,
89 send_cert_status: self.send_cert_status,
90 send_sct: self.send_sct,
91 send_ticket: self.send_ticket,
92 })
93 }
94
95 fn into_expect_certificate(
96 self,
97 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
98 ) -> hs::NextState {
99 Box::new(ExpectCertificate {
100 handshake: self.handshake,
101 key_schedule,
102 send_ticket: self.send_ticket,
103 })
104 }
105
106 fn into_expect_finished(
107 self,
108 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
109 ) -> hs::NextState {
110 Box::new(ExpectFinished {
111 handshake: self.handshake,
112 key_schedule,
113 send_ticket: self.send_ticket,
114 })
115 }
116
117 fn emit_server_hello(
118 &mut self,
119 sess: &mut ServerSessionImpl,
120 session_id: &SessionID,
121 share: &KeyShareEntry,
122 chosen_psk_idx: Option<usize>,
123 resuming_psk: Option<&[u8]>,
124 ) -> Result<KeyScheduleHandshake, TLSError> {
125 let mut extensions = Vec::new();
126
127 let kxr = suites::KeyExchange::start_ecdhe(share.group)
129 .and_then(|kx| kx.complete(&share.payload.0))
130 .ok_or_else(|| TLSError::PeerMisbehavedError("key exchange failed".to_string()))?;
131
132 let kse = KeyShareEntry::new(share.group, kxr.pubkey.as_ref());
133 extensions.push(ServerExtension::KeyShare(kse));
134 extensions.push(ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_3));
135
136 if let Some(psk_idx) = chosen_psk_idx {
137 extensions.push(ServerExtension::PresharedKey(psk_idx as u16));
138 }
139
140 let sh = Message {
141 typ: ContentType::Handshake,
142 version: ProtocolVersion::TLSv1_2,
143 payload: MessagePayload::Handshake(HandshakeMessagePayload {
144 typ: HandshakeType::ServerHello,
145 payload: HandshakePayload::ServerHello(ServerHelloPayload {
146 legacy_version: ProtocolVersion::TLSv1_2,
147 random: Random::from_slice(&self.handshake.randoms.server),
148 session_id: *session_id,
149 cipher_suite: sess.common.get_suite_assert().suite,
150 compression_method: Compression::Null,
151 extensions,
152 }),
153 }),
154 };
155
156 hs::check_aligned_handshake(sess)?;
157
158 #[cfg(feature = "quic")]
159 let client_hello_hash = self
160 .handshake
161 .transcript
162 .get_hash_given(
163 sess.common
164 .get_suite_assert()
165 .get_hash(),
166 &[],
167 );
168
169 trace!("sending server hello {:?}", sh);
170 self.handshake
171 .transcript
172 .add_message(&sh);
173 sess.common.send_msg(sh, false);
174
175 let suite = sess.common.get_suite_assert();
177 let mut key_schedule = if let Some(psk) = resuming_psk {
178 let early_key_schedule = KeyScheduleEarly::new(suite.hkdf_algorithm, psk);
179
180 #[cfg(feature = "quic")]
181 {
182 if sess.common.protocol == Protocol::Quic {
183 let client_early_traffic_secret = early_key_schedule
184 .client_early_traffic_secret(
185 &client_hello_hash,
186 &*sess.config.key_log,
187 &self.handshake.randoms.client,
188 );
189 sess.common.quic.early_secret = Some(client_early_traffic_secret);
192 }
193 }
194
195 early_key_schedule.into_handshake(&kxr.shared_secret)
196 } else {
197 KeyScheduleNonSecret::new(suite.hkdf_algorithm).into_handshake(&kxr.shared_secret)
198 };
199
200 let handshake_hash = self
201 .handshake
202 .transcript
203 .get_current_hash();
204 let write_key = key_schedule.server_handshake_traffic_secret(
205 &handshake_hash,
206 &*sess.config.key_log,
207 &self.handshake.randoms.client,
208 );
209 sess.common
210 .record_layer
211 .set_message_encrypter(cipher::new_tls13_write(suite, &write_key));
212
213 let read_key = key_schedule.client_handshake_traffic_secret(
214 &handshake_hash,
215 &*sess.config.key_log,
216 &self.handshake.randoms.client,
217 );
218 sess.common
219 .record_layer
220 .set_message_decrypter(cipher::new_tls13_read(suite, &read_key));
221
222 #[cfg(feature = "quic")]
223 {
224 sess.common.quic.hs_secrets = Some(quic::Secrets {
225 client: read_key,
226 server: write_key,
227 });
228 }
229
230 Ok(key_schedule)
231 }
232
233 fn emit_fake_ccs(&mut self, sess: &mut ServerSessionImpl) {
234 if sess.common.is_quic() {
235 return;
236 }
237 let m = Message {
238 typ: ContentType::ChangeCipherSpec,
239 version: ProtocolVersion::TLSv1_2,
240 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
241 };
242 sess.common.send_msg(m, false);
243 }
244
245 fn emit_hello_retry_request(&mut self, sess: &mut ServerSessionImpl, group: NamedGroup) {
246 let mut req = HelloRetryRequest {
247 legacy_version: ProtocolVersion::TLSv1_2,
248 session_id: SessionID::empty(),
249 cipher_suite: sess.common.get_suite_assert().suite,
250 extensions: Vec::new(),
251 };
252
253 req.extensions
254 .push(HelloRetryExtension::KeyShare(group));
255 req.extensions
256 .push(HelloRetryExtension::SupportedVersions(
257 ProtocolVersion::TLSv1_3,
258 ));
259
260 let m = Message {
261 typ: ContentType::Handshake,
262 version: ProtocolVersion::TLSv1_2,
263 payload: MessagePayload::Handshake(HandshakeMessagePayload {
264 typ: HandshakeType::HelloRetryRequest,
265 payload: HandshakePayload::HelloRetryRequest(req),
266 }),
267 };
268
269 trace!("Requesting retry {:?}", m);
270 self.handshake
271 .transcript
272 .rollup_for_hrr();
273 self.handshake
274 .transcript
275 .add_message(&m);
276 sess.common.send_msg(m, false);
277 }
278
279 fn emit_encrypted_extensions(
280 &mut self,
281 sess: &mut ServerSessionImpl,
282 server_key: &mut sign::CertifiedKey,
283 hello: &ClientHelloPayload,
284 resumedata: Option<&persist::ServerSessionValue>,
285 ) -> Result<(), TLSError> {
286 let mut ep = hs::ExtensionProcessing::new();
287 ep.process_common(sess, Some(server_key), hello, resumedata, &self.handshake)?;
288
289 self.send_cert_status = ep.send_cert_status;
290 self.send_sct = ep.send_sct;
291
292 let ee = Message {
293 typ: ContentType::Handshake,
294 version: ProtocolVersion::TLSv1_3,
295 payload: MessagePayload::Handshake(HandshakeMessagePayload {
296 typ: HandshakeType::EncryptedExtensions,
297 payload: HandshakePayload::EncryptedExtensions(ep.exts),
298 }),
299 };
300
301 trace!("sending encrypted extensions {:?}", ee);
302 self.handshake
303 .transcript
304 .add_message(&ee);
305 sess.common.send_msg(ee, true);
306 Ok(())
307 }
308
309 fn emit_certificate_req_tls13(
310 &mut self,
311 sess: &mut ServerSessionImpl,
312 ) -> Result<bool, TLSError> {
313 if !sess.config.verifier.offer_client_auth() {
314 return Ok(false);
315 }
316
317 let mut cr = CertificateRequestPayloadTLS13 {
318 context: PayloadU8::empty(),
319 extensions: Vec::new(),
320 };
321
322 let schemes = sess
323 .config
324 .get_verifier()
325 .supported_verify_schemes();
326 cr.extensions
327 .push(CertReqExtension::SignatureAlgorithms(schemes.to_vec()));
328
329 let names = sess
330 .config
331 .verifier
332 .client_auth_root_subjects(sess.get_sni())
333 .ok_or_else(|| {
334 debug!("could not determine root subjects based on SNI");
335 sess.common
336 .send_fatal_alert(AlertDescription::AccessDenied);
337 TLSError::General("client rejected by client_auth_root_subjects".into())
338 })?;
339
340 if !names.is_empty() {
341 cr.extensions
342 .push(CertReqExtension::AuthorityNames(names));
343 }
344
345 let m = Message {
346 typ: ContentType::Handshake,
347 version: ProtocolVersion::TLSv1_3,
348 payload: MessagePayload::Handshake(HandshakeMessagePayload {
349 typ: HandshakeType::CertificateRequest,
350 payload: HandshakePayload::CertificateRequestTLS13(cr),
351 }),
352 };
353
354 trace!("Sending CertificateRequest {:?}", m);
355 self.handshake
356 .transcript
357 .add_message(&m);
358 sess.common.send_msg(m, true);
359 Ok(true)
360 }
361
362 fn emit_certificate_tls13(
363 &mut self,
364 sess: &mut ServerSessionImpl,
365 server_key: &mut sign::CertifiedKey,
366 ) {
367 let mut cert_entries = vec![];
368 for cert in server_key.take_cert() {
369 let entry = CertificateEntry {
370 cert,
371 exts: Vec::new(),
372 };
373
374 cert_entries.push(entry);
375 }
376
377 if let Some(end_entity_cert) = cert_entries.first_mut() {
378 if self.send_cert_status {
381 if let Some(ocsp) = server_key.take_ocsp() {
382 let cst = CertificateStatus::new(ocsp);
383 end_entity_cert
384 .exts
385 .push(CertificateExtension::CertificateStatus(cst));
386 }
387 }
388
389 if self.send_sct {
391 if let Some(sct_list) = server_key.take_sct_list() {
392 end_entity_cert
393 .exts
394 .push(CertificateExtension::make_sct(sct_list));
395 }
396 }
397 }
398
399 let cert_body = CertificatePayloadTLS13::new(cert_entries);
400 let c = Message {
401 typ: ContentType::Handshake,
402 version: ProtocolVersion::TLSv1_3,
403 payload: MessagePayload::Handshake(HandshakeMessagePayload {
404 typ: HandshakeType::Certificate,
405 payload: HandshakePayload::CertificateTLS13(cert_body),
406 }),
407 };
408
409 trace!("sending certificate {:?}", c);
410 self.handshake
411 .transcript
412 .add_message(&c);
413 sess.common.send_msg(c, true);
414 }
415
416 fn emit_certificate_verify_tls13(
417 &mut self,
418 sess: &mut ServerSessionImpl,
419 server_key: &mut sign::CertifiedKey,
420 schemes: &[SignatureScheme],
421 ) -> Result<(), TLSError> {
422 let message = verify::construct_tls13_server_verify_message(
423 &self
424 .handshake
425 .transcript
426 .get_current_hash(),
427 );
428
429 let signing_key = &server_key.key;
430 let signer = signing_key
431 .choose_scheme(schemes)
432 .ok_or_else(|| hs::incompatible(sess, "no overlapping sigschemes"))?;
433
434 let scheme = signer.get_scheme();
435 let sig = signer.sign(&message)?;
436
437 let cv = DigitallySignedStruct::new(scheme, sig);
438
439 let m = Message {
440 typ: ContentType::Handshake,
441 version: ProtocolVersion::TLSv1_3,
442 payload: MessagePayload::Handshake(HandshakeMessagePayload {
443 typ: HandshakeType::CertificateVerify,
444 payload: HandshakePayload::CertificateVerify(cv),
445 }),
446 };
447
448 trace!("sending certificate-verify {:?}", m);
449 self.handshake
450 .transcript
451 .add_message(&m);
452 sess.common.send_msg(m, true);
453 Ok(())
454 }
455
456 fn emit_finished_tls13(
457 &mut self,
458 sess: &mut ServerSessionImpl,
459 key_schedule: KeyScheduleHandshake,
460 ) -> KeyScheduleTrafficWithClientFinishedPending {
461 let handshake_hash = self
462 .handshake
463 .transcript
464 .get_current_hash();
465 let verify_data = key_schedule.sign_server_finish(&handshake_hash);
466 let verify_data_payload = Payload::new(verify_data);
467
468 let m = Message {
469 typ: ContentType::Handshake,
470 version: ProtocolVersion::TLSv1_3,
471 payload: MessagePayload::Handshake(HandshakeMessagePayload {
472 typ: HandshakeType::Finished,
473 payload: HandshakePayload::Finished(verify_data_payload),
474 }),
475 };
476
477 trace!("sending finished {:?}", m);
478 self.handshake
479 .transcript
480 .add_message(&m);
481 self.handshake.hash_at_server_fin = self
482 .handshake
483 .transcript
484 .get_current_hash();
485 sess.common.send_msg(m, true);
486
487 let mut key_schedule_traffic = key_schedule.into_traffic_with_client_finished_pending();
490 let suite = sess.common.get_suite_assert();
491 let write_key = key_schedule_traffic.server_application_traffic_secret(
492 &self.handshake.hash_at_server_fin,
493 &*sess.config.key_log,
494 &self.handshake.randoms.client,
495 );
496 sess.common
497 .record_layer
498 .set_message_encrypter(cipher::new_tls13_write(suite, &write_key));
499
500 key_schedule_traffic.exporter_master_secret(
501 &self.handshake.hash_at_server_fin,
502 &*sess.config.key_log,
503 &self.handshake.randoms.client,
504 );
505
506 let _read_key = key_schedule_traffic.client_application_traffic_secret(
507 &self.handshake.hash_at_server_fin,
508 &*sess.config.key_log,
509 &self.handshake.randoms.client,
510 );
511
512 #[cfg(feature = "quic")]
513 {
514 sess.common.quic.traffic_secrets = Some(quic::Secrets {
515 client: _read_key,
516 server: write_key,
517 });
518 }
519
520 key_schedule_traffic
521 }
522
523 fn attempt_tls13_ticket_decryption(
524 &mut self,
525 sess: &mut ServerSessionImpl,
526 ticket: &[u8],
527 ) -> Option<persist::ServerSessionValue> {
528 if sess.config.ticketer.enabled() {
529 sess.config
530 .ticketer
531 .decrypt(ticket)
532 .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain))
533 } else {
534 sess.config
535 .session_storage
536 .take(ticket)
537 .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain))
538 }
539 }
540
541 pub fn handle_client_hello(
542 mut self,
543 sess: &mut ServerSessionImpl,
544 mut server_key: sign::CertifiedKey,
545 chm: &Message,
546 ) -> hs::NextStateOrError {
547 let client_hello = require_handshake_msg!(
548 chm,
549 HandshakeType::ClientHello,
550 HandshakePayload::ClientHello
551 )?;
552
553 if client_hello.compression_methods.len() != 1 {
554 return Err(hs::illegal_param(sess, "client offered wrong compressions"));
555 }
556
557 let groups_ext = client_hello
558 .get_namedgroups_extension()
559 .ok_or_else(|| hs::incompatible(sess, "client didn't describe groups"))?;
560
561 let mut sigschemes_ext = client_hello
562 .get_sigalgs_extension()
563 .ok_or_else(|| hs::incompatible(sess, "client didn't describe sigschemes"))?
564 .clone();
565
566 let tls13_schemes = sign::supported_sign_tls13();
567 sigschemes_ext.retain(|scheme| tls13_schemes.contains(scheme));
568
569 let shares_ext = client_hello
570 .get_keyshare_extension()
571 .ok_or_else(|| hs::incompatible(sess, "client didn't send keyshares"))?;
572
573 if client_hello.has_keyshare_extension_with_duplicates() {
574 return Err(hs::illegal_param(sess, "client sent duplicate keyshares"));
575 }
576
577 let share_groups: Vec<NamedGroup> = shares_ext
578 .iter()
579 .map(|share| share.group)
580 .collect();
581
582 let supported_groups = suites::KeyExchange::supported_groups();
583 let chosen_group = supported_groups
584 .iter()
585 .filter(|group| share_groups.contains(group))
586 .nth(0)
587 .cloned();
588
589 if chosen_group.is_none() {
590 let retry_group_maybe = supported_groups
593 .iter()
594 .filter(|group| groups_ext.contains(group))
595 .nth(0)
596 .cloned();
597 self.handshake
598 .transcript
599 .add_message(chm);
600
601 if let Some(group) = retry_group_maybe {
602 if self.done_retry {
603 return Err(hs::illegal_param(sess, "did not follow retry request"));
604 }
605
606 self.emit_hello_retry_request(sess, group);
607 self.emit_fake_ccs(sess);
608 return Ok(self.into_expect_retried_client_hello());
609 }
610
611 return Err(hs::incompatible(sess, "no kx group overlap with client"));
612 }
613
614 let chosen_group = chosen_group.unwrap();
615 let chosen_share = shares_ext
616 .iter()
617 .find(|share| share.group == chosen_group)
618 .unwrap();
619
620 let mut chosen_psk_index = None;
621 let mut resumedata = None;
622 if let Some(psk_offer) = client_hello.get_psk() {
623 if !client_hello.check_psk_ext_is_last() {
624 return Err(hs::illegal_param(sess, "psk extension in wrong position"));
625 }
626
627 if psk_offer.binders.is_empty() {
628 return Err(hs::decode_error(sess, "psk extension missing binder"));
629 }
630
631 if psk_offer.binders.len() != psk_offer.identities.len() {
632 return Err(hs::illegal_param(
633 sess,
634 "psk extension mismatched ids/binders",
635 ));
636 }
637
638 for (i, psk_id) in psk_offer.identities.iter().enumerate() {
639 let maybe_resume = self.attempt_tls13_ticket_decryption(sess, &psk_id.identity.0);
640
641 if !hs::can_resume(sess, &self.handshake, &maybe_resume) {
642 continue;
643 }
644
645 let resume = maybe_resume.unwrap();
646
647 if !self.check_binder(sess, chm, &resume.master_secret.0, &psk_offer.binders[i].0) {
648 sess.common
649 .send_fatal_alert(AlertDescription::DecryptError);
650 return Err(TLSError::PeerMisbehavedError(
651 "client sent wrong binder".to_string(),
652 ));
653 }
654
655 chosen_psk_index = Some(i);
656 resumedata = Some(resume);
657 break;
658 }
659 }
660
661 if !client_hello.psk_mode_offered(PSKKeyExchangeMode::PSK_DHE_KE) {
662 debug!("Client unwilling to resume, DHE_KE not offered");
663 self.send_ticket = false;
664 chosen_psk_index = None;
665 resumedata = None;
666 } else {
667 self.send_ticket = true;
668 }
669
670 if let Some(ref resume) = resumedata {
671 sess.received_resumption_data = Some(resume.application_data.0.clone());
672 sess.client_cert_chain = resume.client_cert_chain.clone();
673 }
674
675 let full_handshake = resumedata.is_none();
676 self.handshake
677 .transcript
678 .add_message(chm);
679 let key_schedule = self.emit_server_hello(
680 sess,
681 &client_hello.session_id,
682 chosen_share,
683 chosen_psk_index,
684 resumedata
685 .as_ref()
686 .map(|x| &x.master_secret.0[..]),
687 )?;
688 if !self.done_retry {
689 self.emit_fake_ccs(sess);
690 }
691 self.emit_encrypted_extensions(sess, &mut server_key, client_hello, resumedata.as_ref())?;
692
693 let doing_client_auth = if full_handshake {
694 let client_auth = self.emit_certificate_req_tls13(sess)?;
695 self.emit_certificate_tls13(sess, &mut server_key);
696 self.emit_certificate_verify_tls13(sess, &mut server_key, &sigschemes_ext)?;
697 client_auth
698 } else {
699 false
700 };
701
702 hs::check_aligned_handshake(sess)?;
703 let key_schedule_traffic = self.emit_finished_tls13(sess, key_schedule);
704
705 if doing_client_auth {
706 Ok(self.into_expect_certificate(key_schedule_traffic))
707 } else {
708 Ok(self.into_expect_finished(key_schedule_traffic))
709 }
710 }
711}
712
713pub struct ExpectCertificate {
714 pub handshake: HandshakeDetails,
715 pub key_schedule: KeyScheduleTrafficWithClientFinishedPending,
716 pub send_ticket: bool,
717}
718
719impl ExpectCertificate {
720 fn into_expect_finished(self) -> hs::NextState {
721 Box::new(ExpectFinished {
722 key_schedule: self.key_schedule,
723 handshake: self.handshake,
724 send_ticket: self.send_ticket,
725 })
726 }
727
728 fn into_expect_certificate_verify(self, cert: ClientCertDetails) -> hs::NextState {
729 Box::new(ExpectCertificateVerify {
730 handshake: self.handshake,
731 key_schedule: self.key_schedule,
732 client_cert: cert,
733 send_ticket: self.send_ticket,
734 })
735 }
736}
737
738impl hs::State for ExpectCertificate {
739 fn handle(
740 mut self: Box<Self>,
741 sess: &mut ServerSessionImpl,
742 m: Message,
743 ) -> hs::NextStateOrError {
744 let certp = require_handshake_msg!(
745 m,
746 HandshakeType::Certificate,
747 HandshakePayload::CertificateTLS13
748 )?;
749 self.handshake
750 .transcript
751 .add_message(&m);
752
753 if certp.any_entry_has_extension() {
756 return Err(TLSError::PeerMisbehavedError(
757 "client sent unsolicited cert extension".to_string(),
758 ));
759 }
760
761 let cert_chain = certp.convert();
762
763 let mandatory = sess
764 .config
765 .verifier
766 .client_auth_mandatory(sess.get_sni())
767 .ok_or_else(|| {
768 debug!("could not determine if client auth is mandatory based on SNI");
769 sess.common
770 .send_fatal_alert(AlertDescription::AccessDenied);
771 TLSError::General("client rejected by client_auth_mandatory".into())
772 })?;
773
774 if cert_chain.is_empty() {
775 if !mandatory {
776 debug!("client auth requested but no certificate supplied");
777 self.handshake
778 .transcript
779 .abandon_client_auth();
780 return Ok(self.into_expect_finished());
781 }
782
783 sess.common
784 .send_fatal_alert(AlertDescription::CertificateRequired);
785 return Err(TLSError::NoCertificatesPresented);
786 }
787
788 sess.config
789 .get_verifier()
790 .verify_client_cert(&cert_chain, sess.get_sni())
791 .or_else(|err| {
792 hs::incompatible(sess, "certificate invalid");
793 Err(err)
794 })?;
795
796 let cert = ClientCertDetails::new(cert_chain);
797 Ok(self.into_expect_certificate_verify(cert))
798 }
799}
800
801pub struct ExpectCertificateVerify {
802 handshake: HandshakeDetails,
803 key_schedule: KeyScheduleTrafficWithClientFinishedPending,
804 client_cert: ClientCertDetails,
805 send_ticket: bool,
806}
807
808impl ExpectCertificateVerify {
809 fn into_expect_finished(self) -> hs::NextState {
810 Box::new(ExpectFinished {
811 key_schedule: self.key_schedule,
812 handshake: self.handshake,
813 send_ticket: self.send_ticket,
814 })
815 }
816}
817
818impl hs::State for ExpectCertificateVerify {
819 fn handle(
820 mut self: Box<Self>,
821 sess: &mut ServerSessionImpl,
822 m: Message,
823 ) -> hs::NextStateOrError {
824 let rc = {
825 let sig = require_handshake_msg!(
826 m,
827 HandshakeType::CertificateVerify,
828 HandshakePayload::CertificateVerify
829 )?;
830 let handshake_hash = self
831 .handshake
832 .transcript
833 .get_current_hash();
834 self.handshake
835 .transcript
836 .abandon_client_auth();
837 let certs = &self.client_cert.cert_chain;
838 let msg = verify::construct_tls13_client_verify_message(&handshake_hash);
839
840 sess.config
841 .get_verifier()
842 .verify_tls13_signature(&msg, &certs[0], sig)
843 };
844
845 if let Err(e) = rc {
846 sess.common
847 .send_fatal_alert(AlertDescription::AccessDenied);
848 return Err(e);
849 }
850
851 trace!("client CertificateVerify OK");
852 sess.client_cert_chain = Some(self.client_cert.take_chain());
853
854 self.handshake
855 .transcript
856 .add_message(&m);
857 Ok(self.into_expect_finished())
858 }
859}
860
861fn get_server_session_value(
863 handshake: &mut HandshakeDetails,
864 key_schedule: &KeyScheduleTraffic,
865 sess: &ServerSessionImpl,
866 nonce: &[u8],
867) -> persist::ServerSessionValue {
868 let scs = sess.common.get_suite_assert();
869 let version = ProtocolVersion::TLSv1_3;
870
871 let handshake_hash = handshake.transcript.get_current_hash();
872 let secret =
873 key_schedule.resumption_master_secret_and_derive_ticket_psk(&handshake_hash, nonce);
874
875 persist::ServerSessionValue::new(
876 sess.get_sni(),
877 version,
878 scs.suite,
879 secret,
880 &sess.client_cert_chain,
881 sess.alpn_protocol.clone(),
882 sess.resumption_data.clone(),
883 )
884}
885
886pub struct ExpectFinished {
887 pub handshake: HandshakeDetails,
888 pub key_schedule: KeyScheduleTrafficWithClientFinishedPending,
889 pub send_ticket: bool,
890}
891
892impl ExpectFinished {
893 fn into_expect_traffic(
894 fin: verify::FinishedMessageVerified,
895 ks: KeyScheduleTraffic,
896 ) -> hs::NextState {
897 Box::new(ExpectTraffic {
898 key_schedule: ks,
899 want_write_key_update: false,
900 _fin_verified: fin,
901 })
902 }
903
904 fn emit_stateless_ticket(
905 handshake: &mut HandshakeDetails,
906 sess: &mut ServerSessionImpl,
907 key_schedule: &KeyScheduleTraffic,
908 ) {
909 let nonce = rand::random_vec(32);
910 let plain = get_server_session_value(handshake, key_schedule, sess, &nonce).get_encoding();
911 let maybe_ticket = sess.config.ticketer.encrypt(&plain);
912 let ticket_lifetime = sess.config.ticketer.get_lifetime();
913
914 if maybe_ticket.is_none() {
915 return;
916 }
917
918 let ticket = maybe_ticket.unwrap();
919 let age_add = rand::random_u32(); #[allow(unused_mut)]
921 let mut payload =
922 NewSessionTicketPayloadTLS13::new(ticket_lifetime, age_add, nonce, ticket);
923 #[cfg(feature = "quic")]
924 {
925 if sess.config.max_early_data_size > 0 && sess.common.protocol == Protocol::Quic {
926 payload
927 .exts
928 .push(NewSessionTicketExtension::EarlyData(
929 sess.config.max_early_data_size,
930 ));
931 }
932 }
933 let m = Message {
934 typ: ContentType::Handshake,
935 version: ProtocolVersion::TLSv1_3,
936 payload: MessagePayload::Handshake(HandshakeMessagePayload {
937 typ: HandshakeType::NewSessionTicket,
938 payload: HandshakePayload::NewSessionTicketTLS13(payload),
939 }),
940 };
941
942 trace!("sending new ticket {:?}", m);
943 handshake.transcript.add_message(&m);
944 sess.common.send_msg(m, true);
945 }
946
947 fn emit_stateful_ticket(
948 handshake: &mut HandshakeDetails,
949 sess: &mut ServerSessionImpl,
950 key_schedule: &KeyScheduleTraffic,
951 ) {
952 let nonce = rand::random_vec(32);
953 let id = rand::random_vec(32);
954 let plain = get_server_session_value(handshake, key_schedule, sess, &nonce).get_encoding();
955
956 if sess
957 .config
958 .session_storage
959 .put(id.clone(), plain)
960 {
961 let stateful_lifetime = 24 * 60 * 60; let age_add = rand::random_u32();
963 #[allow(unused_mut)]
964 let mut payload =
965 NewSessionTicketPayloadTLS13::new(stateful_lifetime, age_add, nonce, id);
966 #[cfg(feature = "quic")]
967 {
968 if sess.config.max_early_data_size > 0 && sess.common.protocol == Protocol::Quic {
969 payload
970 .exts
971 .push(NewSessionTicketExtension::EarlyData(
972 sess.config.max_early_data_size,
973 ));
974 }
975 }
976 let m = Message {
977 typ: ContentType::Handshake,
978 version: ProtocolVersion::TLSv1_3,
979 payload: MessagePayload::Handshake(HandshakeMessagePayload {
980 typ: HandshakeType::NewSessionTicket,
981 payload: HandshakePayload::NewSessionTicketTLS13(payload),
982 }),
983 };
984
985 trace!("sending new stateful ticket {:?}", m);
986 handshake.transcript.add_message(&m);
987 sess.common.send_msg(m, true);
988 } else {
989 trace!("resumption not available; not issuing ticket");
990 }
991 }
992}
993
994impl hs::State for ExpectFinished {
995 fn handle(
996 mut self: Box<Self>,
997 sess: &mut ServerSessionImpl,
998 m: Message,
999 ) -> hs::NextStateOrError {
1000 let finished =
1001 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1002
1003 let handshake_hash = self
1004 .handshake
1005 .transcript
1006 .get_current_hash();
1007 let expect_verify_data = self
1008 .key_schedule
1009 .sign_client_finish(&handshake_hash);
1010
1011 let fin = constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0)
1012 .map_err(|_| {
1013 sess.common
1014 .send_fatal_alert(AlertDescription::DecryptError);
1015 warn!("Finished wrong");
1016 TLSError::DecryptError
1017 })
1018 .map(|_| verify::FinishedMessageVerified::assertion())?;
1019
1020 self.handshake
1023 .transcript
1024 .add_message(&m);
1025
1026 hs::check_aligned_handshake(sess)?;
1027
1028 let suite = sess.common.get_suite_assert();
1029
1030 let read_key = self
1032 .key_schedule
1033 .client_application_traffic_secret(
1034 &self.handshake.hash_at_server_fin,
1035 &*sess.config.key_log,
1036 &self.handshake.randoms.client,
1037 );
1038 sess.common
1039 .record_layer
1040 .set_message_decrypter(cipher::new_tls13_read(suite, &read_key));
1041
1042 let key_schedule_traffic = self.key_schedule.into_traffic();
1043
1044 if self.send_ticket {
1045 if sess.config.ticketer.enabled() {
1046 Self::emit_stateless_ticket(&mut self.handshake, sess, &key_schedule_traffic);
1047 } else {
1048 Self::emit_stateful_ticket(&mut self.handshake, sess, &key_schedule_traffic);
1049 }
1050 }
1051
1052 sess.common.start_traffic();
1053
1054 #[cfg(feature = "quic")]
1055 {
1056 if sess.common.protocol == Protocol::Quic {
1057 return Ok(Box::new(ExpectQUICTraffic {
1058 key_schedule: key_schedule_traffic,
1059 _fin_verified: fin,
1060 }));
1061 }
1062 }
1063
1064 Ok(Self::into_expect_traffic(fin, key_schedule_traffic))
1065 }
1066}
1067
1068pub struct ExpectTraffic {
1070 key_schedule: KeyScheduleTraffic,
1071 want_write_key_update: bool,
1072 _fin_verified: verify::FinishedMessageVerified,
1073}
1074
1075impl ExpectTraffic {
1076 fn handle_traffic(&self, sess: &mut ServerSessionImpl, mut m: Message) -> Result<(), TLSError> {
1077 sess.common
1078 .take_received_plaintext(m.take_opaque_payload().unwrap());
1079 Ok(())
1080 }
1081
1082 fn handle_key_update(
1083 &mut self,
1084 sess: &mut ServerSessionImpl,
1085 kur: &KeyUpdateRequest,
1086 ) -> Result<(), TLSError> {
1087 #[cfg(feature = "quic")]
1088 {
1089 if let Protocol::Quic = sess.common.protocol {
1090 sess.common
1091 .send_fatal_alert(AlertDescription::UnexpectedMessage);
1092 let msg = "KeyUpdate received in QUIC connection".to_string();
1093 warn!("{}", msg);
1094 return Err(TLSError::PeerMisbehavedError(msg));
1095 }
1096 }
1097
1098 hs::check_aligned_handshake(sess)?;
1099
1100 match kur {
1101 KeyUpdateRequest::UpdateNotRequested => {}
1102 KeyUpdateRequest::UpdateRequested => {
1103 self.want_write_key_update = true;
1104 }
1105 _ => {
1106 sess.common
1107 .send_fatal_alert(AlertDescription::IllegalParameter);
1108 return Err(TLSError::CorruptMessagePayload(ContentType::Handshake));
1109 }
1110 }
1111
1112 let new_read_key = self
1114 .key_schedule
1115 .next_client_application_traffic_secret();
1116 let suite = sess.common.get_suite_assert();
1117 sess.common
1118 .record_layer
1119 .set_message_decrypter(cipher::new_tls13_read(suite, &new_read_key));
1120
1121 Ok(())
1122 }
1123}
1124
1125impl hs::State for ExpectTraffic {
1126 fn handle(
1127 mut self: Box<Self>,
1128 sess: &mut ServerSessionImpl,
1129 m: Message,
1130 ) -> hs::NextStateOrError {
1131 if m.is_content_type(ContentType::ApplicationData) {
1132 self.handle_traffic(sess, m)?;
1133 } else if let Ok(key_update) =
1134 require_handshake_msg!(m, HandshakeType::KeyUpdate, HandshakePayload::KeyUpdate)
1135 {
1136 self.handle_key_update(sess, key_update)?;
1137 } else {
1138 check_message(
1139 &m,
1140 &[ContentType::ApplicationData, ContentType::Handshake],
1141 &[HandshakeType::KeyUpdate],
1142 )?;
1143 }
1144
1145 Ok(self)
1146 }
1147
1148 fn export_keying_material(
1149 &self,
1150 output: &mut [u8],
1151 label: &[u8],
1152 context: Option<&[u8]>,
1153 ) -> Result<(), TLSError> {
1154 self.key_schedule
1155 .export_keying_material(output, label, context)
1156 }
1157
1158 fn perhaps_write_key_update(&mut self, sess: &mut ServerSessionImpl) {
1159 if self.want_write_key_update {
1160 self.want_write_key_update = false;
1161 sess.common
1162 .send_msg_encrypt(Message::build_key_update_notify());
1163
1164 let write_key = self
1165 .key_schedule
1166 .next_server_application_traffic_secret();
1167 let scs = sess.common.get_suite_assert();
1168 sess.common
1169 .record_layer
1170 .set_message_encrypter(cipher::new_tls13_write(scs, &write_key));
1171 }
1172 }
1173}
1174
1175#[cfg(feature = "quic")]
1176pub struct ExpectQUICTraffic {
1177 key_schedule: KeyScheduleTraffic,
1178 _fin_verified: verify::FinishedMessageVerified,
1179}
1180
1181#[cfg(feature = "quic")]
1182impl hs::State for ExpectQUICTraffic {
1183 fn handle(self: Box<Self>, _: &mut ServerSessionImpl, m: Message) -> hs::NextStateOrError {
1184 check_message(&m, &[], &[])?;
1186 unreachable!();
1187 }
1188
1189 fn export_keying_material(
1190 &self,
1191 output: &mut [u8],
1192 label: &[u8],
1193 context: Option<&[u8]>,
1194 ) -> Result<(), TLSError> {
1195 self.key_schedule
1196 .export_keying_material(output, label, context)
1197 }
1198}