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 verify_schemes = client_auth.supported_verify_schemes();
411
412 let names = config
413 .verifier
414 .root_hint_subjects()
415 .to_vec();
416
417 let cr = CertificateRequestPayload {
418 certtypes: vec![
419 ClientCertificateType::RSASign,
420 ClientCertificateType::ECDSASign,
421 ],
422 sigschemes: verify_schemes,
423 canames: names,
424 };
425
426 let creq = HandshakeMessagePayload(HandshakePayload::CertificateRequest(cr));
427
428 trace!("Sending CertificateRequest {creq:?}");
429 flight.add(creq);
430 Ok(true)
431 }
432
433 fn emit_server_hello_done(flight: &mut HandshakeFlightTls12<'_>) {
434 flight.add(HandshakeMessagePayload(HandshakePayload::ServerHelloDone));
435 }
436}
437
438struct ExpectCertificate {
440 config: Arc<ServerConfig>,
441 transcript: HandshakeHash,
442 randoms: ConnectionRandoms,
443 session_id: SessionId,
444 suite: &'static Tls12CipherSuite,
445 using_ems: bool,
446 server_kx: Box<dyn ActiveKeyExchange>,
447 send_ticket: bool,
448}
449
450impl State<ServerConnectionData> for ExpectCertificate {
451 fn handle<'m>(
452 mut self: Box<Self>,
453 cx: &mut ServerContext<'_>,
454 m: Message<'m>,
455 ) -> hs::NextStateOrError<'m>
456 where
457 Self: 'm,
458 {
459 self.transcript.add_message(&m);
460 let cert_chain = require_handshake_msg_move!(
461 m,
462 HandshakeType::Certificate,
463 HandshakePayload::Certificate
464 )?;
465
466 let mandatory = self
468 .config
469 .verifier
470 .client_auth_mandatory();
471
472 trace!("certs {cert_chain:?}");
473
474 let client_cert = match cert_chain.split_first() {
475 None if mandatory => {
476 return Err(cx.common.send_fatal_alert(
477 AlertDescription::CertificateRequired,
478 Error::NoCertificatesPresented,
479 ));
480 }
481 None => {
482 debug!("client auth requested but no certificate supplied");
483 self.transcript.abandon_client_auth();
484 None
485 }
486 Some((end_entity, intermediates)) => {
487 let now = self.config.current_time()?;
488
489 self.config
490 .verifier
491 .verify_client_cert(end_entity, intermediates, now)
492 .map_err(|err| {
493 cx.common
494 .send_cert_verify_error_alert(err)
495 })?;
496
497 Some(cert_chain)
498 }
499 };
500
501 Ok(Box::new(ExpectClientKx {
502 config: self.config,
503 transcript: self.transcript,
504 randoms: self.randoms,
505 session_id: self.session_id,
506 suite: self.suite,
507 using_ems: self.using_ems,
508 server_kx: self.server_kx,
509 client_cert,
510 send_ticket: self.send_ticket,
511 }))
512 }
513
514 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
515 self
516 }
517}
518
519struct ExpectClientKx<'a> {
521 config: Arc<ServerConfig>,
522 transcript: HandshakeHash,
523 randoms: ConnectionRandoms,
524 session_id: SessionId,
525 suite: &'static Tls12CipherSuite,
526 using_ems: bool,
527 server_kx: Box<dyn ActiveKeyExchange>,
528 client_cert: Option<CertificateChain<'a>>,
529 send_ticket: bool,
530}
531
532impl State<ServerConnectionData> for ExpectClientKx<'_> {
533 fn handle<'m>(
534 mut self: Box<Self>,
535 cx: &mut ServerContext<'_>,
536 m: Message<'m>,
537 ) -> hs::NextStateOrError<'m>
538 where
539 Self: 'm,
540 {
541 let client_kx = require_handshake_msg!(
542 m,
543 HandshakeType::ClientKeyExchange,
544 HandshakePayload::ClientKeyExchange
545 )?;
546 self.transcript.add_message(&m);
547 let ems_seed = self
548 .using_ems
549 .then(|| self.transcript.current_hash());
550
551 let peer_kx_params = tls12::decode_kx_params::<ClientKeyExchangeParams>(
554 self.suite.kx,
555 cx.common,
556 client_kx.bytes(),
557 )?;
558 let secrets = ConnectionSecrets::from_key_exchange(
559 self.server_kx,
560 peer_kx_params.pub_key(),
561 ems_seed,
562 self.randoms,
563 self.suite,
564 )
565 .map_err(|err| {
566 cx.common
567 .send_fatal_alert(AlertDescription::IllegalParameter, err)
568 })?;
569 cx.common.kx_state.complete();
570
571 self.config.key_log.log(
572 "CLIENT_RANDOM",
573 &secrets.randoms.client,
574 &secrets.master_secret,
575 );
576 cx.common
577 .start_encryption_tls12(&secrets, Side::Server);
578
579 match self.client_cert {
580 Some(client_cert) => Ok(Box::new(ExpectCertificateVerify {
581 config: self.config,
582 secrets,
583 transcript: self.transcript,
584 session_id: self.session_id,
585 using_ems: self.using_ems,
586 client_cert,
587 send_ticket: self.send_ticket,
588 })),
589 _ => Ok(Box::new(ExpectCcs {
590 config: self.config,
591 secrets,
592 transcript: self.transcript,
593 session_id: self.session_id,
594 using_ems: self.using_ems,
595 resuming: false,
596 send_ticket: self.send_ticket,
597 })),
598 }
599 }
600
601 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
602 Box::new(ExpectClientKx {
603 config: self.config,
604 transcript: self.transcript,
605 randoms: self.randoms,
606 session_id: self.session_id,
607 suite: self.suite,
608 using_ems: self.using_ems,
609 server_kx: self.server_kx,
610 client_cert: self
611 .client_cert
612 .map(|cert| cert.into_owned()),
613 send_ticket: self.send_ticket,
614 })
615 }
616}
617
618struct ExpectCertificateVerify<'a> {
620 config: Arc<ServerConfig>,
621 secrets: ConnectionSecrets,
622 transcript: HandshakeHash,
623 session_id: SessionId,
624 using_ems: bool,
625 client_cert: CertificateChain<'a>,
626 send_ticket: bool,
627}
628
629impl State<ServerConnectionData> for ExpectCertificateVerify<'_> {
630 fn handle<'m>(
631 mut self: Box<Self>,
632 cx: &mut ServerContext<'_>,
633 m: Message<'m>,
634 ) -> hs::NextStateOrError<'m>
635 where
636 Self: 'm,
637 {
638 let rc = {
639 let sig = require_handshake_msg!(
640 m,
641 HandshakeType::CertificateVerify,
642 HandshakePayload::CertificateVerify
643 )?;
644
645 match self.transcript.take_handshake_buf() {
646 Some(msgs) => {
647 let certs = &self.client_cert;
648 self.config
649 .verifier
650 .verify_tls12_signature(&msgs, &certs[0], sig)
651 }
652 None => {
653 return Err(cx.common.send_fatal_alert(
659 AlertDescription::AccessDenied,
660 Error::General("client authentication not set up".into()),
661 ));
662 }
663 }
664 };
665
666 if let Err(e) = rc {
667 return Err(cx
668 .common
669 .send_cert_verify_error_alert(e));
670 }
671
672 trace!("client CertificateVerify OK");
673 cx.common.peer_certificates = Some(self.client_cert.into_owned());
674
675 self.transcript.add_message(&m);
676 Ok(Box::new(ExpectCcs {
677 config: self.config,
678 secrets: self.secrets,
679 transcript: self.transcript,
680 session_id: self.session_id,
681 using_ems: self.using_ems,
682 resuming: false,
683 send_ticket: self.send_ticket,
684 }))
685 }
686
687 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
688 Box::new(ExpectCertificateVerify {
689 config: self.config,
690 secrets: self.secrets,
691 transcript: self.transcript,
692 session_id: self.session_id,
693 using_ems: self.using_ems,
694 client_cert: self.client_cert.into_owned(),
695 send_ticket: self.send_ticket,
696 })
697 }
698}
699
700struct ExpectCcs {
702 config: Arc<ServerConfig>,
703 secrets: ConnectionSecrets,
704 transcript: HandshakeHash,
705 session_id: SessionId,
706 using_ems: bool,
707 resuming: bool,
708 send_ticket: bool,
709}
710
711impl State<ServerConnectionData> for ExpectCcs {
712 fn handle<'m>(
713 self: Box<Self>,
714 cx: &mut ServerContext<'_>,
715 m: Message<'m>,
716 ) -> hs::NextStateOrError<'m>
717 where
718 Self: 'm,
719 {
720 match m.payload {
721 MessagePayload::ChangeCipherSpec(..) => {}
722 payload => {
723 return Err(inappropriate_message(
724 &payload,
725 &[ContentType::ChangeCipherSpec],
726 ));
727 }
728 }
729
730 cx.common.check_aligned_handshake()?;
733
734 cx.common
735 .record_layer
736 .start_decrypting();
737 Ok(Box::new(ExpectFinished {
738 config: self.config,
739 secrets: self.secrets,
740 transcript: self.transcript,
741 session_id: self.session_id,
742 using_ems: self.using_ems,
743 resuming: self.resuming,
744 send_ticket: self.send_ticket,
745 }))
746 }
747
748 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
749 self
750 }
751}
752
753fn get_server_connection_value_tls12(
755 secrets: &ConnectionSecrets,
756 using_ems: bool,
757 cx: &ServerContext<'_>,
758 time_now: UnixTime,
759) -> persist::ServerSessionValue {
760 let version = ProtocolVersion::TLSv1_2;
761
762 let mut v = persist::ServerSessionValue::new(
763 cx.data.sni.as_ref(),
764 version,
765 secrets.suite().common.suite,
766 secrets.master_secret(),
767 cx.common.peer_certificates.clone(),
768 cx.common.alpn_protocol.clone(),
769 cx.data.resumption_data.clone(),
770 time_now,
771 0,
772 );
773
774 if using_ems {
775 v.set_extended_ms_used();
776 }
777
778 v
779}
780
781fn emit_ticket(
782 secrets: &ConnectionSecrets,
783 transcript: &mut HandshakeHash,
784 using_ems: bool,
785 cx: &mut ServerContext<'_>,
786 ticketer: &dyn ProducesTickets,
787 now: UnixTime,
788) -> Result<(), Error> {
789 let plain = get_server_connection_value_tls12(secrets, using_ems, cx, now).get_encoding();
790
791 let ticket = ticketer
794 .encrypt(&plain)
795 .unwrap_or_default();
796 let ticket_lifetime = ticketer.lifetime();
797
798 let m = Message {
799 version: ProtocolVersion::TLSv1_2,
800 payload: MessagePayload::handshake(HandshakeMessagePayload(
801 HandshakePayload::NewSessionTicket(NewSessionTicketPayload::new(
802 ticket_lifetime,
803 ticket,
804 )),
805 )),
806 };
807
808 transcript.add_message(&m);
809 cx.common.send_msg(m, false);
810 Ok(())
811}
812
813fn emit_ccs(common: &mut CommonState) {
814 let m = Message {
815 version: ProtocolVersion::TLSv1_2,
816 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
817 };
818
819 common.send_msg(m, false);
820}
821
822fn emit_finished(
823 secrets: &ConnectionSecrets,
824 transcript: &mut HandshakeHash,
825 common: &mut CommonState,
826) {
827 let vh = transcript.current_hash();
828 let verify_data = secrets.server_verify_data(&vh);
829 let verify_data_payload = Payload::new(verify_data);
830
831 let f = Message {
832 version: ProtocolVersion::TLSv1_2,
833 payload: MessagePayload::handshake(HandshakeMessagePayload(HandshakePayload::Finished(
834 verify_data_payload,
835 ))),
836 };
837
838 transcript.add_message(&f);
839 common.send_msg(f, true);
840}
841
842struct ExpectFinished {
843 config: Arc<ServerConfig>,
844 secrets: ConnectionSecrets,
845 transcript: HandshakeHash,
846 session_id: SessionId,
847 using_ems: bool,
848 resuming: bool,
849 send_ticket: bool,
850}
851
852impl State<ServerConnectionData> for ExpectFinished {
853 fn handle<'m>(
854 mut self: Box<Self>,
855 cx: &mut ServerContext<'_>,
856 m: Message<'m>,
857 ) -> hs::NextStateOrError<'m>
858 where
859 Self: 'm,
860 {
861 let finished =
862 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
863
864 cx.common.check_aligned_handshake()?;
865
866 let vh = self.transcript.current_hash();
867 let expect_verify_data = self.secrets.client_verify_data(&vh);
868
869 let _fin_verified =
870 match ConstantTimeEq::ct_eq(&expect_verify_data[..], finished.bytes()).into() {
871 true => verify::FinishedMessageVerified::assertion(),
872 false => {
873 return Err(cx
874 .common
875 .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
876 }
877 };
878
879 if !self.resuming && !self.session_id.is_empty() {
881 let now = self.config.current_time()?;
882
883 let value = get_server_connection_value_tls12(&self.secrets, self.using_ems, cx, now);
884
885 let worked = self
886 .config
887 .session_storage
888 .put(self.session_id.as_ref().to_vec(), value.get_encoding());
889 #[cfg_attr(not(feature = "logging"), allow(clippy::if_same_then_else))]
890 if worked {
891 debug!("Session saved");
892 } else {
893 debug!("Session not saved");
894 }
895 }
896
897 self.transcript.add_message(&m);
899 if !self.resuming {
900 if self.send_ticket {
901 let now = self.config.current_time()?;
902 emit_ticket(
903 &self.secrets,
904 &mut self.transcript,
905 self.using_ems,
906 cx,
907 &*self.config.ticketer,
908 now,
909 )?;
910 }
911 emit_ccs(cx.common);
912 cx.common
913 .record_layer
914 .start_encrypting();
915 emit_finished(&self.secrets, &mut self.transcript, cx.common);
916 }
917
918 cx.common
919 .start_traffic(&mut cx.sendable_plaintext);
920 Ok(Box::new(ExpectTraffic {
921 secrets: self.secrets,
922 _fin_verified,
923 }))
924 }
925
926 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
927 self
928 }
929}
930
931struct ExpectTraffic {
933 secrets: ConnectionSecrets,
934 _fin_verified: verify::FinishedMessageVerified,
935}
936
937impl ExpectTraffic {}
938
939impl State<ServerConnectionData> for ExpectTraffic {
940 fn handle<'m>(
941 self: Box<Self>,
942 cx: &mut ServerContext<'_>,
943 m: Message<'m>,
944 ) -> hs::NextStateOrError<'m>
945 where
946 Self: 'm,
947 {
948 match m.payload {
949 MessagePayload::ApplicationData(payload) => cx
950 .common
951 .take_received_plaintext(payload),
952 payload => {
953 return Err(inappropriate_message(
954 &payload,
955 &[ContentType::ApplicationData],
956 ));
957 }
958 }
959 Ok(self)
960 }
961
962 fn export_keying_material(
963 &self,
964 output: &mut [u8],
965 label: &[u8],
966 context: Option<&[u8]>,
967 ) -> Result<(), Error> {
968 self.secrets
969 .export_keying_material(output, label, context);
970 Ok(())
971 }
972
973 fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
974 self.secrets
975 .extract_secrets(Side::Server)
976 }
977
978 fn into_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
979 Ok(self)
980 }
981
982 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
983 self
984 }
985}
986
987impl KernelState for ExpectTraffic {
988 fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
989 Err(Error::General(
990 "TLS 1.2 connections do not support traffic secret updates".into(),
991 ))
992 }
993
994 fn handle_new_session_ticket(
995 &mut self,
996 _cx: &mut KernelContext<'_>,
997 _message: &NewSessionTicketPayloadTls13,
998 ) -> Result<(), Error> {
999 unreachable!(
1000 "server connections should never have handle_new_session_ticket called on them"
1001 )
1002 }
1003}