1use alloc::boxed::Box;
2use alloc::string::ToString;
3use alloc::vec;
4use alloc::vec::Vec;
5
6pub(super) use client_hello::CompleteClientHelloHandling;
7use pki_types::UnixTime;
8use subtle::ConstantTimeEq;
9
10use super::common::ActiveCertifiedKey;
11use super::hs::{self, ServerContext};
12use super::server_conn::{ProducesTickets, ServerConfig, ServerConnectionData};
13use crate::check::inappropriate_message;
14use crate::common_state::{CommonState, HandshakeFlightTls12, HandshakeKind, Side, State};
15use crate::conn::ConnectionRandoms;
16use crate::conn::kernel::{Direction, KernelContext, KernelState};
17use crate::crypto::ActiveKeyExchange;
18use crate::enums::{AlertDescription, ContentType, HandshakeType, ProtocolVersion};
19use crate::error::{Error, PeerIncompatible, PeerMisbehaved};
20use crate::hash_hs::HandshakeHash;
21use crate::log::{debug, trace};
22use crate::msgs::base::Payload;
23use crate::msgs::ccs::ChangeCipherSpecPayload;
24use crate::msgs::codec::Codec;
25use crate::msgs::handshake::{
26 CertificateChain, ClientKeyExchangeParams, HandshakeMessagePayload, HandshakePayload,
27 NewSessionTicketPayload, NewSessionTicketPayloadTls13, SessionId,
28};
29use crate::msgs::message::{Message, MessagePayload};
30use crate::msgs::persist;
31use crate::suites::PartiallyExtractedSecrets;
32use crate::sync::Arc;
33use crate::tls12::{self, ConnectionSecrets, Tls12CipherSuite};
34use crate::{ConnectionTrafficSecrets, verify};
35
36mod client_hello {
37 use pki_types::CertificateDer;
38
39 use super::*;
40 use crate::common_state::KxState;
41 use crate::crypto::SupportedKxGroup;
42 use crate::enums::SignatureScheme;
43 use crate::msgs::enums::{ClientCertificateType, Compression};
44 use crate::msgs::handshake::{
45 CertificateRequestPayload, CertificateStatus, ClientHelloPayload, ClientSessionTicket,
46 Random, ServerExtensionsInput, ServerHelloPayload, ServerKeyExchange,
47 ServerKeyExchangeParams, ServerKeyExchangePayload,
48 };
49 use crate::sign;
50 use crate::verify::DigitallySignedStruct;
51
52 pub(in crate::server) struct CompleteClientHelloHandling {
53 pub(in crate::server) config: Arc<ServerConfig>,
54 pub(in crate::server) transcript: HandshakeHash,
55 pub(in crate::server) session_id: SessionId,
56 pub(in crate::server) suite: &'static Tls12CipherSuite,
57 pub(in crate::server) using_ems: bool,
58 pub(in crate::server) randoms: ConnectionRandoms,
59 pub(in crate::server) send_ticket: bool,
60 pub(in crate::server) extra_exts: ServerExtensionsInput<'static>,
61 }
62
63 impl CompleteClientHelloHandling {
64 pub(in crate::server) fn handle_client_hello(
65 mut self,
66 cx: &mut ServerContext<'_>,
67 server_key: ActiveCertifiedKey<'_>,
68 chm: &Message<'_>,
69 client_hello: &ClientHelloPayload,
70 selected_kxg: &'static dyn SupportedKxGroup,
71 sigschemes_ext: Vec<SignatureScheme>,
72 tls13_enabled: bool,
73 ) -> hs::NextStateOrError<'static> {
74 self.transcript.add_message(chm);
76
77 if client_hello
78 .extended_master_secret_request
79 .is_some()
80 {
81 self.using_ems = true;
82 } else if self.config.require_ems {
83 return Err(cx.common.send_fatal_alert(
84 AlertDescription::HandshakeFailure,
85 PeerIncompatible::ExtendedMasterSecretExtensionRequired,
86 ));
87 }
88
89 let supported_ec_point_formats = client_hello
94 .ec_point_formats
95 .unwrap_or_default();
96
97 trace!("ecpoints {supported_ec_point_formats:?}");
98
99 if !supported_ec_point_formats.uncompressed {
100 return Err(cx.common.send_fatal_alert(
101 AlertDescription::IllegalParameter,
102 PeerIncompatible::UncompressedEcPointsRequired,
103 ));
104 }
105
106 if tls13_enabled {
108 self.randoms.server[24..].copy_from_slice(&tls12::DOWNGRADE_SENTINEL);
109 }
110
111 let mut ticket_received = false;
124 let resume_data = client_hello
125 .session_ticket
126 .as_ref()
127 .and_then(|ticket_ext| match ticket_ext {
128 ClientSessionTicket::Offer(ticket) => Some(ticket),
129 _ => None,
130 })
131 .and_then(|ticket| {
132 ticket_received = true;
133 debug!("Ticket received");
134 let data = self
135 .config
136 .ticketer
137 .decrypt(ticket.bytes());
138 if data.is_none() {
139 debug!("Ticket didn't decrypt");
140 }
141 data
142 })
143 .or_else(|| {
144 if client_hello.session_id.is_empty() || ticket_received {
147 return None;
148 }
149
150 self.config
151 .session_storage
152 .get(client_hello.session_id.as_ref())
153 })
154 .and_then(|x| persist::ServerSessionValue::read_bytes(&x).ok())
155 .filter(|resumedata| {
156 hs::can_resume(self.suite.into(), &cx.data.sni, self.using_ems, resumedata)
157 });
158
159 if let Some(data) = resume_data {
160 return self.start_resumption(cx, client_hello, &client_hello.session_id, data);
161 }
162
163 let sigschemes = self
165 .suite
166 .resolve_sig_schemes(&sigschemes_ext);
167
168 if sigschemes.is_empty() {
169 return Err(cx.common.send_fatal_alert(
170 AlertDescription::HandshakeFailure,
171 PeerIncompatible::NoSignatureSchemesInCommon,
172 ));
173 }
174
175 let mut ocsp_response = server_key.get_ocsp();
176
177 if !self.config.session_storage.can_cache() {
179 self.session_id = SessionId::empty();
180 } else if self.session_id.is_empty() && !ticket_received {
181 self.session_id = SessionId::random(self.config.provider.secure_random)?;
182 }
183
184 cx.common.kx_state = KxState::Start(selected_kxg);
185 cx.common.handshake_kind = Some(HandshakeKind::Full);
186
187 let mut flight = HandshakeFlightTls12::new(&mut self.transcript);
188
189 self.send_ticket = emit_server_hello(
190 &mut flight,
191 &self.config,
192 cx,
193 self.session_id,
194 self.suite,
195 self.using_ems,
196 &mut ocsp_response,
197 client_hello,
198 None,
199 &self.randoms,
200 self.extra_exts,
201 )?;
202 emit_certificate(&mut flight, server_key.get_cert());
203 if let Some(ocsp_response) = ocsp_response {
204 emit_cert_status(&mut flight, ocsp_response);
205 }
206 let server_kx = emit_server_kx(
207 &mut flight,
208 sigschemes,
209 selected_kxg,
210 server_key.get_key(),
211 &self.randoms,
212 )?;
213 let doing_client_auth = emit_certificate_req(&mut flight, &self.config)?;
214 emit_server_hello_done(&mut flight);
215
216 flight.finish(cx.common);
217
218 if doing_client_auth {
219 Ok(Box::new(ExpectCertificate {
220 config: self.config,
221 transcript: self.transcript,
222 randoms: self.randoms,
223 session_id: self.session_id,
224 suite: self.suite,
225 using_ems: self.using_ems,
226 server_kx,
227 send_ticket: self.send_ticket,
228 }))
229 } else {
230 Ok(Box::new(ExpectClientKx {
231 config: self.config,
232 transcript: self.transcript,
233 randoms: self.randoms,
234 session_id: self.session_id,
235 suite: self.suite,
236 using_ems: self.using_ems,
237 server_kx,
238 client_cert: None,
239 send_ticket: self.send_ticket,
240 }))
241 }
242 }
243
244 fn start_resumption(
245 mut self,
246 cx: &mut ServerContext<'_>,
247 client_hello: &ClientHelloPayload,
248 id: &SessionId,
249 resumedata: persist::ServerSessionValue,
250 ) -> hs::NextStateOrError<'static> {
251 debug!("Resuming connection");
252
253 if resumedata.extended_ms && !self.using_ems {
254 return Err(cx.common.send_fatal_alert(
255 AlertDescription::IllegalParameter,
256 PeerMisbehaved::ResumptionAttemptedWithVariedEms,
257 ));
258 }
259
260 self.session_id = *id;
261 let mut flight = HandshakeFlightTls12::new(&mut self.transcript);
262 self.send_ticket = emit_server_hello(
263 &mut flight,
264 &self.config,
265 cx,
266 self.session_id,
267 self.suite,
268 self.using_ems,
269 &mut None,
270 client_hello,
271 Some(&resumedata),
272 &self.randoms,
273 self.extra_exts,
274 )?;
275 flight.finish(cx.common);
276
277 let secrets = ConnectionSecrets::new_resume(
278 self.randoms,
279 self.suite,
280 &resumedata.master_secret.0,
281 );
282 self.config.key_log.log(
283 "CLIENT_RANDOM",
284 &secrets.randoms.client,
285 &secrets.master_secret,
286 );
287 cx.common
288 .start_encryption_tls12(&secrets, Side::Server);
289 cx.common.peer_certificates = resumedata.client_cert_chain;
290 cx.common.handshake_kind = Some(HandshakeKind::Resumed);
291
292 if self.send_ticket {
293 let now = self.config.current_time()?;
294
295 emit_ticket(
296 &secrets,
297 &mut self.transcript,
298 self.using_ems,
299 cx,
300 &*self.config.ticketer,
301 now,
302 )?;
303 }
304 emit_ccs(cx.common);
305 cx.common
306 .record_layer
307 .start_encrypting();
308 emit_finished(&secrets, &mut self.transcript, cx.common);
309
310 Ok(Box::new(ExpectCcs {
311 config: self.config,
312 secrets,
313 transcript: self.transcript,
314 session_id: self.session_id,
315 using_ems: self.using_ems,
316 resuming: true,
317 send_ticket: self.send_ticket,
318 }))
319 }
320 }
321
322 fn emit_server_hello(
323 flight: &mut HandshakeFlightTls12<'_>,
324 config: &ServerConfig,
325 cx: &mut ServerContext<'_>,
326 session_id: SessionId,
327 suite: &'static Tls12CipherSuite,
328 using_ems: bool,
329 ocsp_response: &mut Option<&[u8]>,
330 hello: &ClientHelloPayload,
331 resumedata: Option<&persist::ServerSessionValue>,
332 randoms: &ConnectionRandoms,
333 extra_exts: ServerExtensionsInput<'static>,
334 ) -> Result<bool, Error> {
335 let mut ep = hs::ExtensionProcessing::new(extra_exts);
336 ep.process_common(config, cx, ocsp_response, hello, resumedata)?;
337 ep.process_tls12(config, hello, using_ems);
338
339 let sh = HandshakeMessagePayload(HandshakePayload::ServerHello(ServerHelloPayload {
340 legacy_version: ProtocolVersion::TLSv1_2,
341 random: Random::from(randoms.server),
342 session_id,
343 cipher_suite: suite.common.suite,
344 compression_method: Compression::Null,
345 extensions: ep.extensions,
346 }));
347 trace!("sending server hello {sh:?}");
348 flight.add(sh);
349
350 Ok(ep.send_ticket)
351 }
352
353 fn emit_certificate(
354 flight: &mut HandshakeFlightTls12<'_>,
355 cert_chain: &[CertificateDer<'static>],
356 ) {
357 flight.add(HandshakeMessagePayload(HandshakePayload::Certificate(
358 CertificateChain(cert_chain.to_vec()),
359 )));
360 }
361
362 fn emit_cert_status(flight: &mut HandshakeFlightTls12<'_>, ocsp: &[u8]) {
363 flight.add(HandshakeMessagePayload(
364 HandshakePayload::CertificateStatus(CertificateStatus::new(ocsp)),
365 ));
366 }
367
368 fn emit_server_kx(
369 flight: &mut HandshakeFlightTls12<'_>,
370 sigschemes: Vec<SignatureScheme>,
371 selected_group: &'static dyn SupportedKxGroup,
372 signing_key: &dyn sign::SigningKey,
373 randoms: &ConnectionRandoms,
374 ) -> Result<Box<dyn ActiveKeyExchange>, Error> {
375 let kx = selected_group.start()?;
376 let kx_params = ServerKeyExchangeParams::new(&*kx);
377
378 let mut msg = Vec::new();
379 msg.extend(randoms.client);
380 msg.extend(randoms.server);
381 kx_params.encode(&mut msg);
382
383 let signer = signing_key
384 .choose_scheme(&sigschemes)
385 .ok_or_else(|| Error::General("incompatible signing key".to_string()))?;
386 let sigscheme = signer.scheme();
387 let sig = signer.sign(&msg)?;
388
389 let skx = ServerKeyExchangePayload::from(ServerKeyExchange {
390 params: kx_params,
391 dss: DigitallySignedStruct::new(sigscheme, sig),
392 });
393
394 flight.add(HandshakeMessagePayload(
395 HandshakePayload::ServerKeyExchange(skx),
396 ));
397 Ok(kx)
398 }
399
400 fn emit_certificate_req(
401 flight: &mut HandshakeFlightTls12<'_>,
402 config: &ServerConfig,
403 ) -> Result<bool, Error> {
404 let client_auth = &config.verifier;
405
406 if !client_auth.offer_client_auth() {
407 return Ok(false);
408 }
409
410 let mut verify_schemes = client_auth.supported_verify_schemes();
411 verify_schemes.retain(|scheme| scheme.algorithm().is_some());
412
413 let names = config
414 .verifier
415 .root_hint_subjects()
416 .to_vec();
417
418 let cr = CertificateRequestPayload {
419 certtypes: vec![
420 ClientCertificateType::RSASign,
421 ClientCertificateType::ECDSASign,
422 ],
423 sigschemes: verify_schemes,
424 canames: names,
425 };
426
427 let creq = HandshakeMessagePayload(HandshakePayload::CertificateRequest(cr));
428
429 trace!("Sending CertificateRequest {creq:?}");
430 flight.add(creq);
431 Ok(true)
432 }
433
434 fn emit_server_hello_done(flight: &mut HandshakeFlightTls12<'_>) {
435 flight.add(HandshakeMessagePayload(HandshakePayload::ServerHelloDone));
436 }
437}
438
439struct ExpectCertificate {
441 config: Arc<ServerConfig>,
442 transcript: HandshakeHash,
443 randoms: ConnectionRandoms,
444 session_id: SessionId,
445 suite: &'static Tls12CipherSuite,
446 using_ems: bool,
447 server_kx: Box<dyn ActiveKeyExchange>,
448 send_ticket: bool,
449}
450
451impl State<ServerConnectionData> for ExpectCertificate {
452 fn handle<'m>(
453 mut self: Box<Self>,
454 cx: &mut ServerContext<'_>,
455 m: Message<'m>,
456 ) -> hs::NextStateOrError<'m>
457 where
458 Self: 'm,
459 {
460 self.transcript.add_message(&m);
461 let cert_chain = require_handshake_msg_move!(
462 m,
463 HandshakeType::Certificate,
464 HandshakePayload::Certificate
465 )?;
466
467 let mandatory = self
469 .config
470 .verifier
471 .client_auth_mandatory();
472
473 trace!("certs {cert_chain:?}");
474
475 let client_cert = match cert_chain.split_first() {
476 None if mandatory => {
477 return Err(cx.common.send_fatal_alert(
478 AlertDescription::CertificateRequired,
479 Error::NoCertificatesPresented,
480 ));
481 }
482 None => {
483 debug!("client auth requested but no certificate supplied");
484 self.transcript.abandon_client_auth();
485 None
486 }
487 Some((end_entity, intermediates)) => {
488 let now = self.config.current_time()?;
489
490 self.config
491 .verifier
492 .verify_client_cert(end_entity, intermediates, now)
493 .map_err(|err| {
494 cx.common
495 .send_cert_verify_error_alert(err)
496 })?;
497
498 Some(cert_chain)
499 }
500 };
501
502 Ok(Box::new(ExpectClientKx {
503 config: self.config,
504 transcript: self.transcript,
505 randoms: self.randoms,
506 session_id: self.session_id,
507 suite: self.suite,
508 using_ems: self.using_ems,
509 server_kx: self.server_kx,
510 client_cert,
511 send_ticket: self.send_ticket,
512 }))
513 }
514
515 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
516 self
517 }
518}
519
520struct ExpectClientKx<'a> {
522 config: Arc<ServerConfig>,
523 transcript: HandshakeHash,
524 randoms: ConnectionRandoms,
525 session_id: SessionId,
526 suite: &'static Tls12CipherSuite,
527 using_ems: bool,
528 server_kx: Box<dyn ActiveKeyExchange>,
529 client_cert: Option<CertificateChain<'a>>,
530 send_ticket: bool,
531}
532
533impl State<ServerConnectionData> for ExpectClientKx<'_> {
534 fn handle<'m>(
535 mut self: Box<Self>,
536 cx: &mut ServerContext<'_>,
537 m: Message<'m>,
538 ) -> hs::NextStateOrError<'m>
539 where
540 Self: 'm,
541 {
542 let client_kx = require_handshake_msg!(
543 m,
544 HandshakeType::ClientKeyExchange,
545 HandshakePayload::ClientKeyExchange
546 )?;
547 self.transcript.add_message(&m);
548 let ems_seed = self
549 .using_ems
550 .then(|| self.transcript.current_hash());
551
552 let peer_kx_params = tls12::decode_kx_params::<ClientKeyExchangeParams>(
555 self.suite.kx,
556 cx.common,
557 client_kx.bytes(),
558 )?;
559 let secrets = ConnectionSecrets::from_key_exchange(
560 self.server_kx,
561 peer_kx_params.pub_key(),
562 ems_seed,
563 self.randoms,
564 self.suite,
565 )
566 .map_err(|err| {
567 cx.common
568 .send_fatal_alert(AlertDescription::IllegalParameter, err)
569 })?;
570 cx.common.kx_state.complete();
571
572 self.config.key_log.log(
573 "CLIENT_RANDOM",
574 &secrets.randoms.client,
575 &secrets.master_secret,
576 );
577 cx.common
578 .start_encryption_tls12(&secrets, Side::Server);
579
580 match self.client_cert {
581 Some(client_cert) => Ok(Box::new(ExpectCertificateVerify {
582 config: self.config,
583 secrets,
584 transcript: self.transcript,
585 session_id: self.session_id,
586 using_ems: self.using_ems,
587 client_cert,
588 send_ticket: self.send_ticket,
589 })),
590 _ => Ok(Box::new(ExpectCcs {
591 config: self.config,
592 secrets,
593 transcript: self.transcript,
594 session_id: self.session_id,
595 using_ems: self.using_ems,
596 resuming: false,
597 send_ticket: self.send_ticket,
598 })),
599 }
600 }
601
602 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
603 Box::new(ExpectClientKx {
604 config: self.config,
605 transcript: self.transcript,
606 randoms: self.randoms,
607 session_id: self.session_id,
608 suite: self.suite,
609 using_ems: self.using_ems,
610 server_kx: self.server_kx,
611 client_cert: self
612 .client_cert
613 .map(|cert| cert.into_owned()),
614 send_ticket: self.send_ticket,
615 })
616 }
617}
618
619struct ExpectCertificateVerify<'a> {
621 config: Arc<ServerConfig>,
622 secrets: ConnectionSecrets,
623 transcript: HandshakeHash,
624 session_id: SessionId,
625 using_ems: bool,
626 client_cert: CertificateChain<'a>,
627 send_ticket: bool,
628}
629
630impl State<ServerConnectionData> for ExpectCertificateVerify<'_> {
631 fn handle<'m>(
632 mut self: Box<Self>,
633 cx: &mut ServerContext<'_>,
634 m: Message<'m>,
635 ) -> hs::NextStateOrError<'m>
636 where
637 Self: 'm,
638 {
639 let rc = {
640 let sig = require_handshake_msg!(
641 m,
642 HandshakeType::CertificateVerify,
643 HandshakePayload::CertificateVerify
644 )?;
645
646 match self.transcript.take_handshake_buf() {
647 Some(msgs) => {
648 let certs = &self.client_cert;
649 self.config
650 .verifier
651 .verify_tls12_signature(&msgs, &certs[0], sig)
652 }
653 None => {
654 return Err(cx.common.send_fatal_alert(
660 AlertDescription::AccessDenied,
661 Error::General("client authentication not set up".into()),
662 ));
663 }
664 }
665 };
666
667 if let Err(e) = rc {
668 return Err(cx
669 .common
670 .send_cert_verify_error_alert(e));
671 }
672
673 trace!("client CertificateVerify OK");
674 cx.common.peer_certificates = Some(self.client_cert.into_owned());
675
676 self.transcript.add_message(&m);
677 Ok(Box::new(ExpectCcs {
678 config: self.config,
679 secrets: self.secrets,
680 transcript: self.transcript,
681 session_id: self.session_id,
682 using_ems: self.using_ems,
683 resuming: false,
684 send_ticket: self.send_ticket,
685 }))
686 }
687
688 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
689 Box::new(ExpectCertificateVerify {
690 config: self.config,
691 secrets: self.secrets,
692 transcript: self.transcript,
693 session_id: self.session_id,
694 using_ems: self.using_ems,
695 client_cert: self.client_cert.into_owned(),
696 send_ticket: self.send_ticket,
697 })
698 }
699}
700
701struct ExpectCcs {
703 config: Arc<ServerConfig>,
704 secrets: ConnectionSecrets,
705 transcript: HandshakeHash,
706 session_id: SessionId,
707 using_ems: bool,
708 resuming: bool,
709 send_ticket: bool,
710}
711
712impl State<ServerConnectionData> for ExpectCcs {
713 fn handle<'m>(
714 self: Box<Self>,
715 cx: &mut ServerContext<'_>,
716 m: Message<'m>,
717 ) -> hs::NextStateOrError<'m>
718 where
719 Self: 'm,
720 {
721 match m.payload {
722 MessagePayload::ChangeCipherSpec(..) => {}
723 payload => {
724 return Err(inappropriate_message(
725 &payload,
726 &[ContentType::ChangeCipherSpec],
727 ));
728 }
729 }
730
731 cx.common.check_aligned_handshake()?;
734
735 cx.common
736 .record_layer
737 .start_decrypting();
738 Ok(Box::new(ExpectFinished {
739 config: self.config,
740 secrets: self.secrets,
741 transcript: self.transcript,
742 session_id: self.session_id,
743 using_ems: self.using_ems,
744 resuming: self.resuming,
745 send_ticket: self.send_ticket,
746 }))
747 }
748
749 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
750 self
751 }
752}
753
754fn get_server_connection_value_tls12(
756 secrets: &ConnectionSecrets,
757 using_ems: bool,
758 cx: &ServerContext<'_>,
759 time_now: UnixTime,
760) -> persist::ServerSessionValue {
761 let version = ProtocolVersion::TLSv1_2;
762
763 let mut v = persist::ServerSessionValue::new(
764 cx.data.sni.as_ref(),
765 version,
766 secrets.suite().common.suite,
767 secrets.master_secret(),
768 cx.common.peer_certificates.clone(),
769 cx.common.alpn_protocol.clone(),
770 cx.data.resumption_data.clone(),
771 time_now,
772 0,
773 );
774
775 if using_ems {
776 v.set_extended_ms_used();
777 }
778
779 v
780}
781
782fn emit_ticket(
783 secrets: &ConnectionSecrets,
784 transcript: &mut HandshakeHash,
785 using_ems: bool,
786 cx: &mut ServerContext<'_>,
787 ticketer: &dyn ProducesTickets,
788 now: UnixTime,
789) -> Result<(), Error> {
790 let plain = get_server_connection_value_tls12(secrets, using_ems, cx, now).get_encoding();
791
792 let ticket = ticketer
795 .encrypt(&plain)
796 .unwrap_or_default();
797 let ticket_lifetime = ticketer.lifetime();
798
799 let m = Message {
800 version: ProtocolVersion::TLSv1_2,
801 payload: MessagePayload::handshake(HandshakeMessagePayload(
802 HandshakePayload::NewSessionTicket(NewSessionTicketPayload::new(
803 ticket_lifetime,
804 ticket,
805 )),
806 )),
807 };
808
809 transcript.add_message(&m);
810 cx.common.send_msg(m, false);
811 Ok(())
812}
813
814fn emit_ccs(common: &mut CommonState) {
815 let m = Message {
816 version: ProtocolVersion::TLSv1_2,
817 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
818 };
819
820 common.send_msg(m, false);
821}
822
823fn emit_finished(
824 secrets: &ConnectionSecrets,
825 transcript: &mut HandshakeHash,
826 common: &mut CommonState,
827) {
828 let vh = transcript.current_hash();
829 let verify_data = secrets.server_verify_data(&vh);
830 let verify_data_payload = Payload::new(verify_data);
831
832 let f = Message {
833 version: ProtocolVersion::TLSv1_2,
834 payload: MessagePayload::handshake(HandshakeMessagePayload(HandshakePayload::Finished(
835 verify_data_payload,
836 ))),
837 };
838
839 transcript.add_message(&f);
840 common.send_msg(f, true);
841}
842
843struct ExpectFinished {
844 config: Arc<ServerConfig>,
845 secrets: ConnectionSecrets,
846 transcript: HandshakeHash,
847 session_id: SessionId,
848 using_ems: bool,
849 resuming: bool,
850 send_ticket: bool,
851}
852
853impl State<ServerConnectionData> for ExpectFinished {
854 fn handle<'m>(
855 mut self: Box<Self>,
856 cx: &mut ServerContext<'_>,
857 m: Message<'m>,
858 ) -> hs::NextStateOrError<'m>
859 where
860 Self: 'm,
861 {
862 let finished =
863 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
864
865 cx.common.check_aligned_handshake()?;
866
867 let vh = self.transcript.current_hash();
868 let expect_verify_data = self.secrets.client_verify_data(&vh);
869
870 let _fin_verified =
871 match ConstantTimeEq::ct_eq(&expect_verify_data[..], finished.bytes()).into() {
872 true => verify::FinishedMessageVerified::assertion(),
873 false => {
874 return Err(cx
875 .common
876 .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
877 }
878 };
879
880 if !self.resuming && !self.session_id.is_empty() {
882 let now = self.config.current_time()?;
883
884 let value = get_server_connection_value_tls12(&self.secrets, self.using_ems, cx, now);
885
886 let worked = self
887 .config
888 .session_storage
889 .put(self.session_id.as_ref().to_vec(), value.get_encoding());
890 #[cfg_attr(not(feature = "logging"), allow(clippy::if_same_then_else))]
891 if worked {
892 debug!("Session saved");
893 } else {
894 debug!("Session not saved");
895 }
896 }
897
898 self.transcript.add_message(&m);
900 if !self.resuming {
901 if self.send_ticket {
902 let now = self.config.current_time()?;
903 emit_ticket(
904 &self.secrets,
905 &mut self.transcript,
906 self.using_ems,
907 cx,
908 &*self.config.ticketer,
909 now,
910 )?;
911 }
912 emit_ccs(cx.common);
913 cx.common
914 .record_layer
915 .start_encrypting();
916 emit_finished(&self.secrets, &mut self.transcript, cx.common);
917 }
918
919 cx.common
920 .start_traffic(&mut cx.sendable_plaintext);
921 Ok(Box::new(ExpectTraffic {
922 secrets: self.secrets,
923 _fin_verified,
924 }))
925 }
926
927 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
928 self
929 }
930}
931
932struct ExpectTraffic {
934 secrets: ConnectionSecrets,
935 _fin_verified: verify::FinishedMessageVerified,
936}
937
938impl ExpectTraffic {}
939
940impl State<ServerConnectionData> for ExpectTraffic {
941 fn handle<'m>(
942 self: Box<Self>,
943 cx: &mut ServerContext<'_>,
944 m: Message<'m>,
945 ) -> hs::NextStateOrError<'m>
946 where
947 Self: 'm,
948 {
949 match m.payload {
950 MessagePayload::ApplicationData(payload) => cx
951 .common
952 .take_received_plaintext(payload),
953 payload => {
954 return Err(inappropriate_message(
955 &payload,
956 &[ContentType::ApplicationData],
957 ));
958 }
959 }
960 Ok(self)
961 }
962
963 fn export_keying_material(
964 &self,
965 output: &mut [u8],
966 label: &[u8],
967 context: Option<&[u8]>,
968 ) -> Result<(), Error> {
969 self.secrets
970 .export_keying_material(output, label, context);
971 Ok(())
972 }
973
974 fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
975 self.secrets
976 .extract_secrets(Side::Server)
977 }
978
979 fn into_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
980 Ok(self)
981 }
982
983 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
984 self
985 }
986}
987
988impl KernelState for ExpectTraffic {
989 fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
990 Err(Error::General(
991 "TLS 1.2 connections do not support traffic secret updates".into(),
992 ))
993 }
994
995 fn handle_new_session_ticket(
996 &mut self,
997 _cx: &mut KernelContext<'_>,
998 _message: &NewSessionTicketPayloadTls13,
999 ) -> Result<(), Error> {
1000 unreachable!(
1001 "server connections should never have handle_new_session_ticket called on them"
1002 )
1003 }
1004}