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