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