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, ECPointFormat};
44 use crate::msgs::handshake::{
45 CertificateRequestPayload, CertificateStatus, ClientExtension, ClientHelloPayload,
46 ClientSessionTicket, Random, ServerExtension, 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: Vec<ServerExtension>,
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.ems_support_offered() {
78 self.using_ems = true;
79 } else if self.config.require_ems {
80 return Err(cx.common.send_fatal_alert(
81 AlertDescription::HandshakeFailure,
82 PeerIncompatible::ExtendedMasterSecretExtensionRequired,
83 ));
84 }
85
86 let ecpoints_ext = client_hello
91 .ecpoints_extension()
92 .unwrap_or(&[ECPointFormat::Uncompressed]);
93
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 .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
133 .config
134 .ticketer
135 .decrypt(ticket.bytes());
136 if data.is_none() {
137 debug!("Ticket didn't decrypt");
138 }
139 data
140 })
141 .or_else(|| {
142 if client_hello.session_id.is_empty() || ticket_received {
145 return None;
146 }
147
148 self.config
149 .session_storage
150 .get(client_hello.session_id.as_ref())
151 })
152 .and_then(|x| persist::ServerSessionValue::read_bytes(&x).ok())
153 .filter(|resumedata| {
154 hs::can_resume(self.suite.into(), &cx.data.sni, self.using_ems, resumedata)
155 });
156
157 if let Some(data) = resume_data {
158 return self.start_resumption(cx, client_hello, &client_hello.session_id, data);
159 }
160
161 let sigschemes = self
163 .suite
164 .resolve_sig_schemes(&sigschemes_ext);
165
166 if sigschemes.is_empty() {
167 return Err(cx.common.send_fatal_alert(
168 AlertDescription::HandshakeFailure,
169 PeerIncompatible::NoSignatureSchemesInCommon,
170 ));
171 }
172
173 let ecpoint = ECPointFormat::SUPPORTED
174 .iter()
175 .find(|format| ecpoints_ext.contains(format))
176 .cloned()
177 .ok_or_else(|| {
178 cx.common.send_fatal_alert(
179 AlertDescription::HandshakeFailure,
180 PeerIncompatible::NoEcPointFormatsInCommon,
181 )
182 })?;
183
184 debug_assert_eq!(ecpoint, ECPointFormat::Uncompressed);
185
186 let mut ocsp_response = server_key.get_ocsp();
187
188 if !self.config.session_storage.can_cache() {
190 self.session_id = SessionId::empty();
191 } else if self.session_id.is_empty() && !ticket_received {
192 self.session_id = SessionId::random(self.config.provider.secure_random)?;
193 }
194
195 cx.common.kx_state = KxState::Start(selected_kxg);
196 cx.common.handshake_kind = Some(HandshakeKind::Full);
197
198 let mut flight = HandshakeFlightTls12::new(&mut self.transcript);
199
200 self.send_ticket = emit_server_hello(
201 &mut flight,
202 &self.config,
203 cx,
204 self.session_id,
205 self.suite,
206 self.using_ems,
207 &mut ocsp_response,
208 client_hello,
209 None,
210 &self.randoms,
211 self.extra_exts,
212 )?;
213 emit_certificate(&mut flight, server_key.get_cert());
214 if let Some(ocsp_response) = ocsp_response {
215 emit_cert_status(&mut flight, ocsp_response);
216 }
217 let server_kx = emit_server_kx(
218 &mut flight,
219 sigschemes,
220 selected_kxg,
221 server_key.get_key(),
222 &self.randoms,
223 )?;
224 let doing_client_auth = emit_certificate_req(&mut flight, &self.config)?;
225 emit_server_hello_done(&mut flight);
226
227 flight.finish(cx.common);
228
229 if doing_client_auth {
230 Ok(Box::new(ExpectCertificate {
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 send_ticket: self.send_ticket,
239 }))
240 } else {
241 Ok(Box::new(ExpectClientKx {
242 config: self.config,
243 transcript: self.transcript,
244 randoms: self.randoms,
245 session_id: self.session_id,
246 suite: self.suite,
247 using_ems: self.using_ems,
248 server_kx,
249 client_cert: None,
250 send_ticket: self.send_ticket,
251 }))
252 }
253 }
254
255 fn start_resumption(
256 mut self,
257 cx: &mut ServerContext<'_>,
258 client_hello: &ClientHelloPayload,
259 id: &SessionId,
260 resumedata: persist::ServerSessionValue,
261 ) -> hs::NextStateOrError<'static> {
262 debug!("Resuming connection");
263
264 if resumedata.extended_ms && !self.using_ems {
265 return Err(cx.common.send_fatal_alert(
266 AlertDescription::IllegalParameter,
267 PeerMisbehaved::ResumptionAttemptedWithVariedEms,
268 ));
269 }
270
271 self.session_id = *id;
272 let mut flight = HandshakeFlightTls12::new(&mut self.transcript);
273 self.send_ticket = emit_server_hello(
274 &mut flight,
275 &self.config,
276 cx,
277 self.session_id,
278 self.suite,
279 self.using_ems,
280 &mut None,
281 client_hello,
282 Some(&resumedata),
283 &self.randoms,
284 self.extra_exts,
285 )?;
286 flight.finish(cx.common);
287
288 let secrets = ConnectionSecrets::new_resume(
289 self.randoms,
290 self.suite,
291 &resumedata.master_secret.0,
292 );
293 self.config.key_log.log(
294 "CLIENT_RANDOM",
295 &secrets.randoms.client,
296 &secrets.master_secret,
297 );
298 cx.common
299 .start_encryption_tls12(&secrets, Side::Server);
300 cx.common.peer_certificates = resumedata.client_cert_chain;
301 cx.common.handshake_kind = Some(HandshakeKind::Resumed);
302
303 if self.send_ticket {
304 let now = self.config.current_time()?;
305
306 emit_ticket(
307 &secrets,
308 &mut self.transcript,
309 self.using_ems,
310 cx,
311 &*self.config.ticketer,
312 now,
313 )?;
314 }
315 emit_ccs(cx.common);
316 cx.common
317 .record_layer
318 .start_encrypting();
319 emit_finished(&secrets, &mut self.transcript, cx.common);
320
321 Ok(Box::new(ExpectCcs {
322 config: self.config,
323 secrets,
324 transcript: self.transcript,
325 session_id: self.session_id,
326 using_ems: self.using_ems,
327 resuming: true,
328 send_ticket: self.send_ticket,
329 }))
330 }
331 }
332
333 fn emit_server_hello(
334 flight: &mut HandshakeFlightTls12<'_>,
335 config: &ServerConfig,
336 cx: &mut ServerContext<'_>,
337 session_id: SessionId,
338 suite: &'static Tls12CipherSuite,
339 using_ems: bool,
340 ocsp_response: &mut Option<&[u8]>,
341 hello: &ClientHelloPayload,
342 resumedata: Option<&persist::ServerSessionValue>,
343 randoms: &ConnectionRandoms,
344 extra_exts: Vec<ServerExtension>,
345 ) -> Result<bool, Error> {
346 let mut ep = hs::ExtensionProcessing::new();
347 ep.process_common(config, cx, ocsp_response, hello, resumedata, extra_exts)?;
348 ep.process_tls12(config, hello, using_ems);
349
350 let sh = HandshakeMessagePayload {
351 typ: HandshakeType::ServerHello,
352 payload: HandshakePayload::ServerHello(ServerHelloPayload {
353 legacy_version: ProtocolVersion::TLSv1_2,
354 random: Random::from(randoms.server),
355 session_id,
356 cipher_suite: suite.common.suite,
357 compression_method: Compression::Null,
358 extensions: ep.exts,
359 }),
360 };
361 trace!("sending server hello {:?}", sh);
362 flight.add(sh);
363
364 Ok(ep.send_ticket)
365 }
366
367 fn emit_certificate(
368 flight: &mut HandshakeFlightTls12<'_>,
369 cert_chain: &[CertificateDer<'static>],
370 ) {
371 flight.add(HandshakeMessagePayload {
372 typ: HandshakeType::Certificate,
373 payload: HandshakePayload::Certificate(CertificateChain(cert_chain.to_vec())),
374 });
375 }
376
377 fn emit_cert_status(flight: &mut HandshakeFlightTls12<'_>, ocsp: &[u8]) {
378 flight.add(HandshakeMessagePayload {
379 typ: HandshakeType::CertificateStatus,
380 payload: HandshakePayload::CertificateStatus(CertificateStatus::new(ocsp)),
381 });
382 }
383
384 fn emit_server_kx(
385 flight: &mut HandshakeFlightTls12<'_>,
386 sigschemes: Vec<SignatureScheme>,
387 selected_group: &'static dyn SupportedKxGroup,
388 signing_key: &dyn sign::SigningKey,
389 randoms: &ConnectionRandoms,
390 ) -> Result<Box<dyn ActiveKeyExchange>, Error> {
391 let kx = selected_group.start()?;
392 let kx_params = ServerKeyExchangeParams::new(&*kx);
393
394 let mut msg = Vec::new();
395 msg.extend(randoms.client);
396 msg.extend(randoms.server);
397 kx_params.encode(&mut msg);
398
399 let signer = signing_key
400 .choose_scheme(&sigschemes)
401 .ok_or_else(|| Error::General("incompatible signing key".to_string()))?;
402 let sigscheme = signer.scheme();
403 let sig = signer.sign(&msg)?;
404
405 let skx = ServerKeyExchangePayload::from(ServerKeyExchange {
406 params: kx_params,
407 dss: DigitallySignedStruct::new(sigscheme, sig),
408 });
409
410 flight.add(HandshakeMessagePayload {
411 typ: HandshakeType::ServerKeyExchange,
412 payload: HandshakePayload::ServerKeyExchange(skx),
413 });
414 Ok(kx)
415 }
416
417 fn emit_certificate_req(
418 flight: &mut HandshakeFlightTls12<'_>,
419 config: &ServerConfig,
420 ) -> Result<bool, Error> {
421 let client_auth = &config.verifier;
422
423 if !client_auth.offer_client_auth() {
424 return Ok(false);
425 }
426
427 let verify_schemes = client_auth.supported_verify_schemes();
428
429 let names = config
430 .verifier
431 .root_hint_subjects()
432 .to_vec();
433
434 let cr = CertificateRequestPayload {
435 certtypes: vec![
436 ClientCertificateType::RSASign,
437 ClientCertificateType::ECDSASign,
438 ],
439 sigschemes: verify_schemes,
440 canames: names,
441 };
442
443 let creq = HandshakeMessagePayload {
444 typ: HandshakeType::CertificateRequest,
445 payload: HandshakePayload::CertificateRequest(cr),
446 };
447
448 trace!("Sending CertificateRequest {:?}", creq);
449 flight.add(creq);
450 Ok(true)
451 }
452
453 fn emit_server_hello_done(flight: &mut HandshakeFlightTls12<'_>) {
454 flight.add(HandshakeMessagePayload {
455 typ: HandshakeType::ServerHelloDone,
456 payload: HandshakePayload::ServerHelloDone,
457 });
458 }
459}
460
461struct ExpectCertificate {
463 config: Arc<ServerConfig>,
464 transcript: HandshakeHash,
465 randoms: ConnectionRandoms,
466 session_id: SessionId,
467 suite: &'static Tls12CipherSuite,
468 using_ems: bool,
469 server_kx: Box<dyn ActiveKeyExchange>,
470 send_ticket: bool,
471}
472
473impl State<ServerConnectionData> for ExpectCertificate {
474 fn handle<'m>(
475 mut self: Box<Self>,
476 cx: &mut ServerContext<'_>,
477 m: Message<'m>,
478 ) -> hs::NextStateOrError<'m>
479 where
480 Self: 'm,
481 {
482 self.transcript.add_message(&m);
483 let cert_chain = require_handshake_msg_move!(
484 m,
485 HandshakeType::Certificate,
486 HandshakePayload::Certificate
487 )?;
488
489 let mandatory = self
491 .config
492 .verifier
493 .client_auth_mandatory();
494
495 trace!("certs {:?}", cert_chain);
496
497 let client_cert = match cert_chain.split_first() {
498 None if mandatory => {
499 return Err(cx.common.send_fatal_alert(
500 AlertDescription::CertificateRequired,
501 Error::NoCertificatesPresented,
502 ));
503 }
504 None => {
505 debug!("client auth requested but no certificate supplied");
506 self.transcript.abandon_client_auth();
507 None
508 }
509 Some((end_entity, intermediates)) => {
510 let now = self.config.current_time()?;
511
512 self.config
513 .verifier
514 .verify_client_cert(end_entity, intermediates, now)
515 .map_err(|err| {
516 cx.common
517 .send_cert_verify_error_alert(err)
518 })?;
519
520 Some(cert_chain)
521 }
522 };
523
524 Ok(Box::new(ExpectClientKx {
525 config: self.config,
526 transcript: self.transcript,
527 randoms: self.randoms,
528 session_id: self.session_id,
529 suite: self.suite,
530 using_ems: self.using_ems,
531 server_kx: self.server_kx,
532 client_cert,
533 send_ticket: self.send_ticket,
534 }))
535 }
536
537 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
538 self
539 }
540}
541
542struct ExpectClientKx<'a> {
544 config: Arc<ServerConfig>,
545 transcript: HandshakeHash,
546 randoms: ConnectionRandoms,
547 session_id: SessionId,
548 suite: &'static Tls12CipherSuite,
549 using_ems: bool,
550 server_kx: Box<dyn ActiveKeyExchange>,
551 client_cert: Option<CertificateChain<'a>>,
552 send_ticket: bool,
553}
554
555impl State<ServerConnectionData> for ExpectClientKx<'_> {
556 fn handle<'m>(
557 mut self: Box<Self>,
558 cx: &mut ServerContext<'_>,
559 m: Message<'m>,
560 ) -> hs::NextStateOrError<'m>
561 where
562 Self: 'm,
563 {
564 let client_kx = require_handshake_msg!(
565 m,
566 HandshakeType::ClientKeyExchange,
567 HandshakePayload::ClientKeyExchange
568 )?;
569 self.transcript.add_message(&m);
570 let ems_seed = self
571 .using_ems
572 .then(|| self.transcript.current_hash());
573
574 let peer_kx_params = tls12::decode_kx_params::<ClientKeyExchangeParams>(
577 self.suite.kx,
578 cx.common,
579 client_kx.bytes(),
580 )?;
581 let secrets = ConnectionSecrets::from_key_exchange(
582 self.server_kx,
583 peer_kx_params.pub_key(),
584 ems_seed,
585 self.randoms,
586 self.suite,
587 )
588 .map_err(|err| {
589 cx.common
590 .send_fatal_alert(AlertDescription::IllegalParameter, err)
591 })?;
592 cx.common.kx_state.complete();
593
594 self.config.key_log.log(
595 "CLIENT_RANDOM",
596 &secrets.randoms.client,
597 &secrets.master_secret,
598 );
599 cx.common
600 .start_encryption_tls12(&secrets, Side::Server);
601
602 match self.client_cert {
603 Some(client_cert) => Ok(Box::new(ExpectCertificateVerify {
604 config: self.config,
605 secrets,
606 transcript: self.transcript,
607 session_id: self.session_id,
608 using_ems: self.using_ems,
609 client_cert,
610 send_ticket: self.send_ticket,
611 })),
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_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
1003 Ok(self)
1004 }
1005
1006 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1007 self
1008 }
1009}
1010
1011impl KernelState for ExpectTraffic {
1012 fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1013 Err(Error::General(
1014 "TLS 1.2 connections do not support traffic secret updates".into(),
1015 ))
1016 }
1017
1018 fn handle_new_session_ticket(
1019 &mut self,
1020 _cx: &mut KernelContext<'_>,
1021 _message: &NewSessionTicketPayloadTls13,
1022 ) -> Result<(), Error> {
1023 unreachable!(
1024 "server connections should never have handle_new_session_ticket called on them"
1025 )
1026 }
1027}