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, 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.get_encoding())
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 self.send_ticket = emit_server_hello(
198 &self.config,
199 &mut self.transcript,
200 cx,
201 self.session_id,
202 self.suite,
203 self.using_ems,
204 &mut ocsp_response,
205 client_hello,
206 None,
207 &self.randoms,
208 self.extra_exts,
209 )?;
210 emit_certificate(&mut self.transcript, cx.common, server_key.get_cert());
211 if let Some(ocsp_response) = ocsp_response {
212 emit_cert_status(&mut self.transcript, cx.common, ocsp_response);
213 }
214 let server_kx = emit_server_kx(
215 &mut self.transcript,
216 cx.common,
217 sigschemes,
218 selected_kxg,
219 server_key.get_key(),
220 &self.randoms,
221 )?;
222 let doing_client_auth = emit_certificate_req(&self.config, &mut self.transcript, cx)?;
223 emit_server_hello_done(&mut self.transcript, cx.common);
224
225 if doing_client_auth {
226 Ok(Box::new(ExpectCertificate {
227 config: self.config,
228 transcript: self.transcript,
229 randoms: self.randoms,
230 session_id: self.session_id,
231 suite: self.suite,
232 using_ems: self.using_ems,
233 server_kx,
234 send_ticket: self.send_ticket,
235 }))
236 } else {
237 Ok(Box::new(ExpectClientKx {
238 config: self.config,
239 transcript: self.transcript,
240 randoms: self.randoms,
241 session_id: self.session_id,
242 suite: self.suite,
243 using_ems: self.using_ems,
244 server_kx,
245 client_cert: None,
246 send_ticket: self.send_ticket,
247 }))
248 }
249 }
250
251 fn start_resumption(
252 mut self,
253 cx: &mut ServerContext<'_>,
254 client_hello: &ClientHelloPayload,
255 id: &SessionId,
256 resumedata: persist::ServerSessionValue,
257 ) -> hs::NextStateOrError<'static> {
258 debug!("Resuming connection");
259
260 if resumedata.extended_ms && !self.using_ems {
261 return Err(cx.common.send_fatal_alert(
262 AlertDescription::IllegalParameter,
263 PeerMisbehaved::ResumptionAttemptedWithVariedEms,
264 ));
265 }
266
267 self.session_id = *id;
268 self.send_ticket = emit_server_hello(
269 &self.config,
270 &mut self.transcript,
271 cx,
272 self.session_id,
273 self.suite,
274 self.using_ems,
275 &mut None,
276 client_hello,
277 Some(&resumedata),
278 &self.randoms,
279 self.extra_exts,
280 )?;
281
282 let secrets = ConnectionSecrets::new_resume(
283 self.randoms,
284 self.suite,
285 &resumedata.master_secret.0,
286 );
287 self.config.key_log.log(
288 "CLIENT_RANDOM",
289 &secrets.randoms.client,
290 &secrets.master_secret,
291 );
292 cx.common
293 .start_encryption_tls12(&secrets, Side::Server);
294 cx.common.peer_certificates = resumedata.client_cert_chain;
295 cx.common.handshake_kind = Some(HandshakeKind::Resumed);
296
297 if self.send_ticket {
298 let now = self.config.current_time()?;
299
300 emit_ticket(
301 &secrets,
302 &mut self.transcript,
303 self.using_ems,
304 cx,
305 &*self.config.ticketer,
306 now,
307 )?;
308 }
309 emit_ccs(cx.common);
310 cx.common
311 .record_layer
312 .start_encrypting();
313 emit_finished(&secrets, &mut self.transcript, cx.common);
314
315 Ok(Box::new(ExpectCcs {
316 config: self.config,
317 secrets,
318 transcript: self.transcript,
319 session_id: self.session_id,
320 using_ems: self.using_ems,
321 resuming: true,
322 send_ticket: self.send_ticket,
323 }))
324 }
325 }
326
327 fn emit_server_hello(
328 config: &ServerConfig,
329 transcript: &mut HandshakeHash,
330 cx: &mut ServerContext<'_>,
331 session_id: SessionId,
332 suite: &'static Tls12CipherSuite,
333 using_ems: bool,
334 ocsp_response: &mut Option<&[u8]>,
335 hello: &ClientHelloPayload,
336 resumedata: Option<&persist::ServerSessionValue>,
337 randoms: &ConnectionRandoms,
338 extra_exts: Vec<ServerExtension>,
339 ) -> Result<bool, Error> {
340 let mut ep = hs::ExtensionProcessing::new();
341 ep.process_common(config, cx, ocsp_response, hello, resumedata, extra_exts)?;
342 ep.process_tls12(config, hello, using_ems);
343
344 let sh = Message {
345 version: ProtocolVersion::TLSv1_2,
346 payload: MessagePayload::handshake(HandshakeMessagePayload {
347 typ: HandshakeType::ServerHello,
348 payload: HandshakePayload::ServerHello(ServerHelloPayload {
349 legacy_version: ProtocolVersion::TLSv1_2,
350 random: Random::from(randoms.server),
351 session_id,
352 cipher_suite: suite.common.suite,
353 compression_method: Compression::Null,
354 extensions: ep.exts,
355 }),
356 }),
357 };
358
359 trace!("sending server hello {:?}", sh);
360 transcript.add_message(&sh);
361 cx.common.send_msg(sh, false);
362 Ok(ep.send_ticket)
363 }
364
365 fn emit_certificate(
366 transcript: &mut HandshakeHash,
367 common: &mut CommonState,
368 cert_chain: &[CertificateDer<'static>],
369 ) {
370 let c = Message {
371 version: ProtocolVersion::TLSv1_2,
372 payload: MessagePayload::handshake(HandshakeMessagePayload {
373 typ: HandshakeType::Certificate,
374 payload: HandshakePayload::Certificate(CertificateChain(cert_chain.to_vec())),
375 }),
376 };
377
378 transcript.add_message(&c);
379 common.send_msg(c, false);
380 }
381
382 fn emit_cert_status(transcript: &mut HandshakeHash, common: &mut CommonState, ocsp: &[u8]) {
383 let c = Message {
384 version: ProtocolVersion::TLSv1_2,
385 payload: MessagePayload::handshake(HandshakeMessagePayload {
386 typ: HandshakeType::CertificateStatus,
387 payload: HandshakePayload::CertificateStatus(CertificateStatus::new(ocsp)),
388 }),
389 };
390
391 transcript.add_message(&c);
392 common.send_msg(c, false);
393 }
394
395 fn emit_server_kx(
396 transcript: &mut HandshakeHash,
397 common: &mut CommonState,
398 sigschemes: Vec<SignatureScheme>,
399 selected_group: &'static dyn SupportedKxGroup,
400 signing_key: &dyn sign::SigningKey,
401 randoms: &ConnectionRandoms,
402 ) -> Result<Box<dyn ActiveKeyExchange>, Error> {
403 let kx = selected_group.start()?;
404 let kx_params = ServerKeyExchangeParams::new(&*kx);
405
406 let mut msg = Vec::new();
407 msg.extend(randoms.client);
408 msg.extend(randoms.server);
409 kx_params.encode(&mut msg);
410
411 let signer = signing_key
412 .choose_scheme(&sigschemes)
413 .ok_or_else(|| Error::General("incompatible signing key".to_string()))?;
414 let sigscheme = signer.scheme();
415 let sig = signer.sign(&msg)?;
416
417 let skx = ServerKeyExchangePayload::from(ServerKeyExchange {
418 params: kx_params,
419 dss: DigitallySignedStruct::new(sigscheme, sig),
420 });
421
422 let m = Message {
423 version: ProtocolVersion::TLSv1_2,
424 payload: MessagePayload::handshake(HandshakeMessagePayload {
425 typ: HandshakeType::ServerKeyExchange,
426 payload: HandshakePayload::ServerKeyExchange(skx),
427 }),
428 };
429
430 transcript.add_message(&m);
431 common.send_msg(m, false);
432 Ok(kx)
433 }
434
435 fn emit_certificate_req(
436 config: &ServerConfig,
437 transcript: &mut HandshakeHash,
438 cx: &mut ServerContext<'_>,
439 ) -> Result<bool, Error> {
440 let client_auth = &config.verifier;
441
442 if !client_auth.offer_client_auth() {
443 return Ok(false);
444 }
445
446 let verify_schemes = client_auth.supported_verify_schemes();
447
448 let names = config
449 .verifier
450 .root_hint_subjects()
451 .to_vec();
452
453 let cr = CertificateRequestPayload {
454 certtypes: vec![
455 ClientCertificateType::RSASign,
456 ClientCertificateType::ECDSASign,
457 ],
458 sigschemes: verify_schemes,
459 canames: names,
460 };
461
462 let m = Message {
463 version: ProtocolVersion::TLSv1_2,
464 payload: MessagePayload::handshake(HandshakeMessagePayload {
465 typ: HandshakeType::CertificateRequest,
466 payload: HandshakePayload::CertificateRequest(cr),
467 }),
468 };
469
470 trace!("Sending CertificateRequest {:?}", m);
471 transcript.add_message(&m);
472 cx.common.send_msg(m, false);
473 Ok(true)
474 }
475
476 fn emit_server_hello_done(transcript: &mut HandshakeHash, common: &mut CommonState) {
477 let m = Message {
478 version: ProtocolVersion::TLSv1_2,
479 payload: MessagePayload::handshake(HandshakeMessagePayload {
480 typ: HandshakeType::ServerHelloDone,
481 payload: HandshakePayload::ServerHelloDone,
482 }),
483 };
484
485 transcript.add_message(&m);
486 common.send_msg(m, false);
487 }
488}
489
490struct ExpectCertificate {
492 config: Arc<ServerConfig>,
493 transcript: HandshakeHash,
494 randoms: ConnectionRandoms,
495 session_id: SessionId,
496 suite: &'static Tls12CipherSuite,
497 using_ems: bool,
498 server_kx: Box<dyn ActiveKeyExchange>,
499 send_ticket: bool,
500}
501
502impl State<ServerConnectionData> for ExpectCertificate {
503 fn handle<'m>(
504 mut self: Box<Self>,
505 cx: &mut ServerContext<'_>,
506 m: Message<'m>,
507 ) -> hs::NextStateOrError<'m>
508 where
509 Self: 'm,
510 {
511 self.transcript.add_message(&m);
512 let cert_chain = require_handshake_msg_move!(
513 m,
514 HandshakeType::Certificate,
515 HandshakePayload::Certificate
516 )?;
517
518 let mandatory = self
520 .config
521 .verifier
522 .client_auth_mandatory();
523
524 trace!("certs {:?}", cert_chain);
525
526 let client_cert = match cert_chain.split_first() {
527 None if mandatory => {
528 return Err(cx.common.send_fatal_alert(
529 AlertDescription::CertificateRequired,
530 Error::NoCertificatesPresented,
531 ));
532 }
533 None => {
534 debug!("client auth requested but no certificate supplied");
535 self.transcript.abandon_client_auth();
536 None
537 }
538 Some((end_entity, intermediates)) => {
539 let now = self.config.current_time()?;
540
541 self.config
542 .verifier
543 .verify_client_cert(end_entity, intermediates, now)
544 .map_err(|err| {
545 cx.common
546 .send_cert_verify_error_alert(err)
547 })?;
548
549 Some(cert_chain)
550 }
551 };
552
553 Ok(Box::new(ExpectClientKx {
554 config: self.config,
555 transcript: self.transcript,
556 randoms: self.randoms,
557 session_id: self.session_id,
558 suite: self.suite,
559 using_ems: self.using_ems,
560 server_kx: self.server_kx,
561 client_cert,
562 send_ticket: self.send_ticket,
563 }))
564 }
565
566 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
567 self
568 }
569}
570
571struct ExpectClientKx<'a> {
573 config: Arc<ServerConfig>,
574 transcript: HandshakeHash,
575 randoms: ConnectionRandoms,
576 session_id: SessionId,
577 suite: &'static Tls12CipherSuite,
578 using_ems: bool,
579 server_kx: Box<dyn ActiveKeyExchange>,
580 client_cert: Option<CertificateChain<'a>>,
581 send_ticket: bool,
582}
583
584impl State<ServerConnectionData> for ExpectClientKx<'_> {
585 fn handle<'m>(
586 mut self: Box<Self>,
587 cx: &mut ServerContext<'_>,
588 m: Message<'m>,
589 ) -> hs::NextStateOrError<'m>
590 where
591 Self: 'm,
592 {
593 let client_kx = require_handshake_msg!(
594 m,
595 HandshakeType::ClientKeyExchange,
596 HandshakePayload::ClientKeyExchange
597 )?;
598 self.transcript.add_message(&m);
599 let ems_seed = self
600 .using_ems
601 .then(|| self.transcript.current_hash());
602
603 let peer_kx_params = tls12::decode_kx_params::<ClientKeyExchangeParams>(
606 self.suite.kx,
607 cx.common,
608 client_kx.bytes(),
609 )?;
610 let secrets = ConnectionSecrets::from_key_exchange(
611 self.server_kx,
612 peer_kx_params.pub_key(),
613 ems_seed,
614 self.randoms,
615 self.suite,
616 )?;
617 cx.common.kx_state.complete();
618
619 self.config.key_log.log(
620 "CLIENT_RANDOM",
621 &secrets.randoms.client,
622 &secrets.master_secret,
623 );
624 cx.common
625 .start_encryption_tls12(&secrets, Side::Server);
626
627 if let Some(client_cert) = self.client_cert {
628 Ok(Box::new(ExpectCertificateVerify {
629 config: self.config,
630 secrets,
631 transcript: self.transcript,
632 session_id: self.session_id,
633 using_ems: self.using_ems,
634 client_cert,
635 send_ticket: self.send_ticket,
636 }))
637 } else {
638 Ok(Box::new(ExpectCcs {
639 config: self.config,
640 secrets,
641 transcript: self.transcript,
642 session_id: self.session_id,
643 using_ems: self.using_ems,
644 resuming: false,
645 send_ticket: self.send_ticket,
646 }))
647 }
648 }
649
650 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
651 Box::new(ExpectClientKx {
652 config: self.config,
653 transcript: self.transcript,
654 randoms: self.randoms,
655 session_id: self.session_id,
656 suite: self.suite,
657 using_ems: self.using_ems,
658 server_kx: self.server_kx,
659 client_cert: self
660 .client_cert
661 .map(|cert| cert.into_owned()),
662 send_ticket: self.send_ticket,
663 })
664 }
665}
666
667struct ExpectCertificateVerify<'a> {
669 config: Arc<ServerConfig>,
670 secrets: ConnectionSecrets,
671 transcript: HandshakeHash,
672 session_id: SessionId,
673 using_ems: bool,
674 client_cert: CertificateChain<'a>,
675 send_ticket: bool,
676}
677
678impl State<ServerConnectionData> for ExpectCertificateVerify<'_> {
679 fn handle<'m>(
680 mut self: Box<Self>,
681 cx: &mut ServerContext<'_>,
682 m: Message<'m>,
683 ) -> hs::NextStateOrError<'m>
684 where
685 Self: 'm,
686 {
687 let rc = {
688 let sig = require_handshake_msg!(
689 m,
690 HandshakeType::CertificateVerify,
691 HandshakePayload::CertificateVerify
692 )?;
693
694 match self.transcript.take_handshake_buf() {
695 Some(msgs) => {
696 let certs = &self.client_cert;
697 self.config
698 .verifier
699 .verify_tls12_signature(&msgs, &certs[0], sig)
700 }
701 None => {
702 return Err(cx.common.send_fatal_alert(
708 AlertDescription::AccessDenied,
709 Error::General("client authentication not set up".into()),
710 ));
711 }
712 }
713 };
714
715 if let Err(e) = rc {
716 return Err(cx
717 .common
718 .send_cert_verify_error_alert(e));
719 }
720
721 trace!("client CertificateVerify OK");
722 cx.common.peer_certificates = Some(self.client_cert.into_owned());
723
724 self.transcript.add_message(&m);
725 Ok(Box::new(ExpectCcs {
726 config: self.config,
727 secrets: self.secrets,
728 transcript: self.transcript,
729 session_id: self.session_id,
730 using_ems: self.using_ems,
731 resuming: false,
732 send_ticket: self.send_ticket,
733 }))
734 }
735
736 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
737 Box::new(ExpectCertificateVerify {
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 client_cert: self.client_cert.into_owned(),
744 send_ticket: self.send_ticket,
745 })
746 }
747}
748
749struct ExpectCcs {
751 config: Arc<ServerConfig>,
752 secrets: ConnectionSecrets,
753 transcript: HandshakeHash,
754 session_id: SessionId,
755 using_ems: bool,
756 resuming: bool,
757 send_ticket: bool,
758}
759
760impl State<ServerConnectionData> for ExpectCcs {
761 fn handle<'m>(
762 self: Box<Self>,
763 cx: &mut ServerContext<'_>,
764 m: Message<'m>,
765 ) -> hs::NextStateOrError<'m>
766 where
767 Self: 'm,
768 {
769 match m.payload {
770 MessagePayload::ChangeCipherSpec(..) => {}
771 payload => {
772 return Err(inappropriate_message(
773 &payload,
774 &[ContentType::ChangeCipherSpec],
775 ))
776 }
777 }
778
779 cx.common.check_aligned_handshake()?;
782
783 cx.common
784 .record_layer
785 .start_decrypting();
786 Ok(Box::new(ExpectFinished {
787 config: self.config,
788 secrets: self.secrets,
789 transcript: self.transcript,
790 session_id: self.session_id,
791 using_ems: self.using_ems,
792 resuming: self.resuming,
793 send_ticket: self.send_ticket,
794 }))
795 }
796
797 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
798 self
799 }
800}
801
802fn get_server_connection_value_tls12(
804 secrets: &ConnectionSecrets,
805 using_ems: bool,
806 cx: &ServerContext<'_>,
807 time_now: UnixTime,
808) -> persist::ServerSessionValue {
809 let version = ProtocolVersion::TLSv1_2;
810
811 let mut v = persist::ServerSessionValue::new(
812 cx.data.sni.as_ref(),
813 version,
814 secrets.suite().common.suite,
815 secrets.master_secret(),
816 cx.common.peer_certificates.clone(),
817 cx.common.alpn_protocol.clone(),
818 cx.data.resumption_data.clone(),
819 time_now,
820 0,
821 );
822
823 if using_ems {
824 v.set_extended_ms_used();
825 }
826
827 v
828}
829
830fn emit_ticket(
831 secrets: &ConnectionSecrets,
832 transcript: &mut HandshakeHash,
833 using_ems: bool,
834 cx: &mut ServerContext<'_>,
835 ticketer: &dyn ProducesTickets,
836 now: UnixTime,
837) -> Result<(), Error> {
838 let plain = get_server_connection_value_tls12(secrets, using_ems, cx, now).get_encoding();
839
840 let ticket = ticketer
843 .encrypt(&plain)
844 .unwrap_or_default();
845 let ticket_lifetime = ticketer.lifetime();
846
847 let m = Message {
848 version: ProtocolVersion::TLSv1_2,
849 payload: MessagePayload::handshake(HandshakeMessagePayload {
850 typ: HandshakeType::NewSessionTicket,
851 payload: HandshakePayload::NewSessionTicket(NewSessionTicketPayload::new(
852 ticket_lifetime,
853 ticket,
854 )),
855 }),
856 };
857
858 transcript.add_message(&m);
859 cx.common.send_msg(m, false);
860 Ok(())
861}
862
863fn emit_ccs(common: &mut CommonState) {
864 let m = Message {
865 version: ProtocolVersion::TLSv1_2,
866 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
867 };
868
869 common.send_msg(m, false);
870}
871
872fn emit_finished(
873 secrets: &ConnectionSecrets,
874 transcript: &mut HandshakeHash,
875 common: &mut CommonState,
876) {
877 let vh = transcript.current_hash();
878 let verify_data = secrets.server_verify_data(&vh);
879 let verify_data_payload = Payload::new(verify_data);
880
881 let f = Message {
882 version: ProtocolVersion::TLSv1_2,
883 payload: MessagePayload::handshake(HandshakeMessagePayload {
884 typ: HandshakeType::Finished,
885 payload: HandshakePayload::Finished(verify_data_payload),
886 }),
887 };
888
889 transcript.add_message(&f);
890 common.send_msg(f, true);
891}
892
893struct ExpectFinished {
894 config: Arc<ServerConfig>,
895 secrets: ConnectionSecrets,
896 transcript: HandshakeHash,
897 session_id: SessionId,
898 using_ems: bool,
899 resuming: bool,
900 send_ticket: bool,
901}
902
903impl State<ServerConnectionData> for ExpectFinished {
904 fn handle<'m>(
905 mut self: Box<Self>,
906 cx: &mut ServerContext<'_>,
907 m: Message<'m>,
908 ) -> hs::NextStateOrError<'m>
909 where
910 Self: 'm,
911 {
912 let finished =
913 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
914
915 cx.common.check_aligned_handshake()?;
916
917 let vh = self.transcript.current_hash();
918 let expect_verify_data = self.secrets.client_verify_data(&vh);
919
920 let _fin_verified =
921 match ConstantTimeEq::ct_eq(&expect_verify_data[..], finished.bytes()).into() {
922 true => verify::FinishedMessageVerified::assertion(),
923 false => {
924 return Err(cx
925 .common
926 .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
927 }
928 };
929
930 if !self.resuming && !self.session_id.is_empty() {
932 let now = self.config.current_time()?;
933
934 let value = get_server_connection_value_tls12(&self.secrets, self.using_ems, cx, now);
935
936 let worked = self
937 .config
938 .session_storage
939 .put(self.session_id.get_encoding(), value.get_encoding());
940 if worked {
941 debug!("Session saved");
942 } else {
943 debug!("Session not saved");
944 }
945 }
946
947 self.transcript.add_message(&m);
949 if !self.resuming {
950 if self.send_ticket {
951 let now = self.config.current_time()?;
952 emit_ticket(
953 &self.secrets,
954 &mut self.transcript,
955 self.using_ems,
956 cx,
957 &*self.config.ticketer,
958 now,
959 )?;
960 }
961 emit_ccs(cx.common);
962 cx.common
963 .record_layer
964 .start_encrypting();
965 emit_finished(&self.secrets, &mut self.transcript, cx.common);
966 }
967
968 cx.common
969 .start_traffic(&mut cx.sendable_plaintext);
970 Ok(Box::new(ExpectTraffic {
971 secrets: self.secrets,
972 _fin_verified,
973 }))
974 }
975
976 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
977 self
978 }
979}
980
981struct ExpectTraffic {
983 secrets: ConnectionSecrets,
984 _fin_verified: verify::FinishedMessageVerified,
985}
986
987impl ExpectTraffic {}
988
989impl State<ServerConnectionData> for ExpectTraffic {
990 fn handle<'m>(
991 self: Box<Self>,
992 cx: &mut ServerContext<'_>,
993 m: Message<'m>,
994 ) -> hs::NextStateOrError<'m>
995 where
996 Self: 'm,
997 {
998 match m.payload {
999 MessagePayload::ApplicationData(payload) => cx
1000 .common
1001 .take_received_plaintext(payload),
1002 payload => {
1003 return Err(inappropriate_message(
1004 &payload,
1005 &[ContentType::ApplicationData],
1006 ));
1007 }
1008 }
1009 Ok(self)
1010 }
1011
1012 fn export_keying_material(
1013 &self,
1014 output: &mut [u8],
1015 label: &[u8],
1016 context: Option<&[u8]>,
1017 ) -> Result<(), Error> {
1018 self.secrets
1019 .export_keying_material(output, label, context);
1020 Ok(())
1021 }
1022
1023 fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
1024 self.secrets
1025 .extract_secrets(Side::Server)
1026 }
1027
1028 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1029 self
1030 }
1031}