1use crate::check::{inappropriate_handshake_message, 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, InvalidMessage, PeerMisbehaved};
7use crate::hash_hs::HandshakeHash;
8use crate::kx;
9#[cfg(feature = "logging")]
10use crate::log::{debug, trace, warn};
11use crate::msgs::base::{Payload, PayloadU8};
12use crate::msgs::ccs::ChangeCipherSpecPayload;
13use crate::msgs::codec::Codec;
14use crate::msgs::handshake::{
15 CertificatePayload, HandshakeMessagePayload, HandshakePayload, NewSessionTicketPayload, Sct,
16 ServerECDHParams, SessionId,
17};
18use crate::msgs::message::{Message, MessagePayload};
19use crate::msgs::persist;
20use crate::sign::Signer;
21#[cfg(feature = "secret_extraction")]
22use crate::suites::PartiallyExtractedSecrets;
23use crate::suites::SupportedCipherSuite;
24use crate::ticketer::TimeBase;
25use crate::tls12::{self, ConnectionSecrets, Tls12CipherSuite};
26use crate::verify::{self, DigitallySignedStruct};
27
28use super::client_conn::ClientConnectionData;
29use super::hs::ClientContext;
30use crate::client::common::ClientAuthDetails;
31use crate::client::common::ServerCertDetails;
32use crate::client::{hs, ClientConfig, ServerName};
33
34use ring::agreement::PublicKey;
35use ring::constant_time;
36
37use std::sync::Arc;
38
39pub(super) use server_hello::CompleteServerHelloHandling;
40
41mod server_hello {
42 use crate::msgs::enums::ExtensionType;
43 use crate::msgs::handshake::HasServerExtensions;
44 use crate::msgs::handshake::ServerHelloPayload;
45
46 use super::*;
47
48 pub(in crate::client) struct CompleteServerHelloHandling {
49 pub(in crate::client) config: Arc<ClientConfig>,
50 pub(in crate::client) resuming_session: Option<persist::Tls12ClientSessionValue>,
51 pub(in crate::client) server_name: ServerName,
52 pub(in crate::client) randoms: ConnectionRandoms,
53 pub(in crate::client) using_ems: bool,
54 pub(in crate::client) transcript: HandshakeHash,
55 }
56
57 impl CompleteServerHelloHandling {
58 pub(in crate::client) fn handle_server_hello(
59 mut self,
60 cx: &mut ClientContext,
61 suite: &'static Tls12CipherSuite,
62 server_hello: &ServerHelloPayload,
63 tls13_supported: bool,
64 ) -> hs::NextStateOrError {
65 server_hello
66 .random
67 .write_slice(&mut self.randoms.server);
68
69 let has_downgrade_marker = self.randoms.server[24..] == tls12::DOWNGRADE_SENTINEL;
73 if tls13_supported && has_downgrade_marker {
74 return Err({
75 cx.common.send_fatal_alert(
76 AlertDescription::IllegalParameter,
77 PeerMisbehaved::AttemptedDowngradeToTls12WhenTls13IsSupported,
78 )
79 });
80 }
81
82 self.using_ems = server_hello.ems_support_acked();
84
85 let must_issue_new_ticket = if server_hello
87 .find_extension(ExtensionType::SessionTicket)
88 .is_some()
89 {
90 debug!("Server supports tickets");
91 true
92 } else {
93 false
94 };
95
96 let may_send_cert_status = server_hello
99 .find_extension(ExtensionType::StatusRequest)
100 .is_some();
101 if may_send_cert_status {
102 debug!("Server may staple OCSP response");
103 }
104
105 let server_cert_sct_list = if let Some(sct_list) = server_hello.get_sct_list() {
107 debug!("Server sent {:?} SCTs", sct_list.len());
108
109 if hs::sct_list_is_invalid(sct_list) {
110 return Err(PeerMisbehaved::InvalidSctList.into());
111 }
112 Some(sct_list.to_owned())
113 } else {
114 None
115 };
116
117 if let Some(ref resuming) = self.resuming_session {
119 if resuming.session_id == server_hello.session_id {
120 debug!("Server agreed to resume");
121
122 if resuming.suite() != suite {
124 return Err(PeerMisbehaved::ResumptionOfferedWithVariedCipherSuite.into());
125 }
126
127 if resuming.extended_ms() != self.using_ems {
129 return Err(PeerMisbehaved::ResumptionOfferedWithVariedEms.into());
130 }
131
132 let secrets =
133 ConnectionSecrets::new_resume(self.randoms, suite, resuming.secret());
134 self.config.key_log.log(
135 "CLIENT_RANDOM",
136 &secrets.randoms.client,
137 &secrets.master_secret,
138 );
139 cx.common
140 .start_encryption_tls12(&secrets, Side::Client);
141
142 cx.common.peer_certificates = Some(resuming.server_cert_chain().to_vec());
145 let cert_verified = verify::ServerCertVerified::assertion();
146 let sig_verified = verify::HandshakeSignatureValid::assertion();
147
148 return if must_issue_new_ticket {
149 Ok(Box::new(ExpectNewTicket {
150 config: self.config,
151 secrets,
152 resuming_session: self.resuming_session,
153 session_id: server_hello.session_id,
154 server_name: self.server_name,
155 using_ems: self.using_ems,
156 transcript: self.transcript,
157 resuming: true,
158 cert_verified,
159 sig_verified,
160 }))
161 } else {
162 Ok(Box::new(ExpectCcs {
163 config: self.config,
164 secrets,
165 resuming_session: self.resuming_session,
166 session_id: server_hello.session_id,
167 server_name: self.server_name,
168 using_ems: self.using_ems,
169 transcript: self.transcript,
170 ticket: None,
171 resuming: true,
172 cert_verified,
173 sig_verified,
174 }))
175 };
176 }
177 }
178
179 Ok(Box::new(ExpectCertificate {
180 config: self.config,
181 resuming_session: self.resuming_session,
182 session_id: server_hello.session_id,
183 server_name: self.server_name,
184 randoms: self.randoms,
185 using_ems: self.using_ems,
186 transcript: self.transcript,
187 suite,
188 may_send_cert_status,
189 must_issue_new_ticket,
190 server_cert_sct_list,
191 }))
192 }
193 }
194}
195
196struct ExpectCertificate {
197 config: Arc<ClientConfig>,
198 resuming_session: Option<persist::Tls12ClientSessionValue>,
199 session_id: SessionId,
200 server_name: ServerName,
201 randoms: ConnectionRandoms,
202 using_ems: bool,
203 transcript: HandshakeHash,
204 pub(super) suite: &'static Tls12CipherSuite,
205 may_send_cert_status: bool,
206 must_issue_new_ticket: bool,
207 server_cert_sct_list: Option<Vec<Sct>>,
208}
209
210impl State<ClientConnectionData> for ExpectCertificate {
211 fn handle(
212 mut self: Box<Self>,
213 _cx: &mut ClientContext<'_>,
214 m: Message,
215 ) -> hs::NextStateOrError {
216 self.transcript.add_message(&m);
217 let server_cert_chain = require_handshake_msg_move!(
218 m,
219 HandshakeType::Certificate,
220 HandshakePayload::Certificate
221 )?;
222
223 if self.may_send_cert_status {
224 Ok(Box::new(ExpectCertificateStatusOrServerKx {
225 config: self.config,
226 resuming_session: self.resuming_session,
227 session_id: self.session_id,
228 server_name: self.server_name,
229 randoms: self.randoms,
230 using_ems: self.using_ems,
231 transcript: self.transcript,
232 suite: self.suite,
233 server_cert_sct_list: self.server_cert_sct_list,
234 server_cert_chain,
235 must_issue_new_ticket: self.must_issue_new_ticket,
236 }))
237 } else {
238 let server_cert =
239 ServerCertDetails::new(server_cert_chain, vec![], self.server_cert_sct_list);
240
241 Ok(Box::new(ExpectServerKx {
242 config: self.config,
243 resuming_session: self.resuming_session,
244 session_id: self.session_id,
245 server_name: self.server_name,
246 randoms: self.randoms,
247 using_ems: self.using_ems,
248 transcript: self.transcript,
249 suite: self.suite,
250 server_cert,
251 must_issue_new_ticket: self.must_issue_new_ticket,
252 }))
253 }
254 }
255}
256
257struct ExpectCertificateStatusOrServerKx {
258 config: Arc<ClientConfig>,
259 resuming_session: Option<persist::Tls12ClientSessionValue>,
260 session_id: SessionId,
261 server_name: ServerName,
262 randoms: ConnectionRandoms,
263 using_ems: bool,
264 transcript: HandshakeHash,
265 suite: &'static Tls12CipherSuite,
266 server_cert_sct_list: Option<Vec<Sct>>,
267 server_cert_chain: CertificatePayload,
268 must_issue_new_ticket: bool,
269}
270
271impl State<ClientConnectionData> for ExpectCertificateStatusOrServerKx {
272 fn handle(self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
273 match m.payload {
274 MessagePayload::Handshake {
275 parsed:
276 HandshakeMessagePayload {
277 payload: HandshakePayload::ServerKeyExchange(..),
278 ..
279 },
280 ..
281 } => Box::new(ExpectServerKx {
282 config: self.config,
283 resuming_session: self.resuming_session,
284 session_id: self.session_id,
285 server_name: self.server_name,
286 randoms: self.randoms,
287 using_ems: self.using_ems,
288 transcript: self.transcript,
289 suite: self.suite,
290 server_cert: ServerCertDetails::new(
291 self.server_cert_chain,
292 vec![],
293 self.server_cert_sct_list,
294 ),
295 must_issue_new_ticket: self.must_issue_new_ticket,
296 })
297 .handle(cx, m),
298 MessagePayload::Handshake {
299 parsed:
300 HandshakeMessagePayload {
301 payload: HandshakePayload::CertificateStatus(..),
302 ..
303 },
304 ..
305 } => Box::new(ExpectCertificateStatus {
306 config: self.config,
307 resuming_session: self.resuming_session,
308 session_id: self.session_id,
309 server_name: self.server_name,
310 randoms: self.randoms,
311 using_ems: self.using_ems,
312 transcript: self.transcript,
313 suite: self.suite,
314 server_cert_sct_list: self.server_cert_sct_list,
315 server_cert_chain: self.server_cert_chain,
316 must_issue_new_ticket: self.must_issue_new_ticket,
317 })
318 .handle(cx, m),
319 payload => Err(inappropriate_handshake_message(
320 &payload,
321 &[ContentType::Handshake],
322 &[
323 HandshakeType::ServerKeyExchange,
324 HandshakeType::CertificateStatus,
325 ],
326 )),
327 }
328 }
329}
330
331struct ExpectCertificateStatus {
332 config: Arc<ClientConfig>,
333 resuming_session: Option<persist::Tls12ClientSessionValue>,
334 session_id: SessionId,
335 server_name: ServerName,
336 randoms: ConnectionRandoms,
337 using_ems: bool,
338 transcript: HandshakeHash,
339 suite: &'static Tls12CipherSuite,
340 server_cert_sct_list: Option<Vec<Sct>>,
341 server_cert_chain: CertificatePayload,
342 must_issue_new_ticket: bool,
343}
344
345impl State<ClientConnectionData> for ExpectCertificateStatus {
346 fn handle(
347 mut self: Box<Self>,
348 _cx: &mut ClientContext<'_>,
349 m: Message,
350 ) -> hs::NextStateOrError {
351 self.transcript.add_message(&m);
352 let server_cert_ocsp_response = require_handshake_msg_move!(
353 m,
354 HandshakeType::CertificateStatus,
355 HandshakePayload::CertificateStatus
356 )?
357 .into_inner();
358
359 trace!(
360 "Server stapled OCSP response is {:?}",
361 &server_cert_ocsp_response
362 );
363
364 let server_cert = ServerCertDetails::new(
365 self.server_cert_chain,
366 server_cert_ocsp_response,
367 self.server_cert_sct_list,
368 );
369
370 Ok(Box::new(ExpectServerKx {
371 config: self.config,
372 resuming_session: self.resuming_session,
373 session_id: self.session_id,
374 server_name: self.server_name,
375 randoms: self.randoms,
376 using_ems: self.using_ems,
377 transcript: self.transcript,
378 suite: self.suite,
379 server_cert,
380 must_issue_new_ticket: self.must_issue_new_ticket,
381 }))
382 }
383}
384
385struct ExpectServerKx {
386 config: Arc<ClientConfig>,
387 resuming_session: Option<persist::Tls12ClientSessionValue>,
388 session_id: SessionId,
389 server_name: ServerName,
390 randoms: ConnectionRandoms,
391 using_ems: bool,
392 transcript: HandshakeHash,
393 suite: &'static Tls12CipherSuite,
394 server_cert: ServerCertDetails,
395 must_issue_new_ticket: bool,
396}
397
398impl State<ClientConnectionData> for ExpectServerKx {
399 fn handle(mut self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
400 let opaque_kx = require_handshake_msg!(
401 m,
402 HandshakeType::ServerKeyExchange,
403 HandshakePayload::ServerKeyExchange
404 )?;
405 self.transcript.add_message(&m);
406
407 let ecdhe = opaque_kx
408 .unwrap_given_kxa(self.suite.kx)
409 .ok_or_else(|| {
410 cx.common.send_fatal_alert(
411 AlertDescription::DecodeError,
412 InvalidMessage::MissingKeyExchange,
413 )
414 })?;
415
416 let mut kx_params = Vec::new();
418 ecdhe.params.encode(&mut kx_params);
419 let server_kx = ServerKxDetails::new(kx_params, ecdhe.dss);
420
421 #[cfg_attr(not(feature = "logging"), allow(unused_variables))]
422 {
423 debug!("ECDHE curve is {:?}", ecdhe.params.curve_params);
424 }
425
426 Ok(Box::new(ExpectServerDoneOrCertReq {
427 config: self.config,
428 resuming_session: self.resuming_session,
429 session_id: self.session_id,
430 server_name: self.server_name,
431 randoms: self.randoms,
432 using_ems: self.using_ems,
433 transcript: self.transcript,
434 suite: self.suite,
435 server_cert: self.server_cert,
436 server_kx,
437 must_issue_new_ticket: self.must_issue_new_ticket,
438 }))
439 }
440}
441
442fn emit_certificate(
443 transcript: &mut HandshakeHash,
444 cert_chain: CertificatePayload,
445 common: &mut CommonState,
446) {
447 let cert = Message {
448 version: ProtocolVersion::TLSv1_2,
449 payload: MessagePayload::handshake(HandshakeMessagePayload {
450 typ: HandshakeType::Certificate,
451 payload: HandshakePayload::Certificate(cert_chain),
452 }),
453 };
454
455 transcript.add_message(&cert);
456 common.send_msg(cert, false);
457}
458
459fn emit_clientkx(transcript: &mut HandshakeHash, common: &mut CommonState, pubkey: &PublicKey) {
460 let mut buf = Vec::new();
461 let ecpoint = PayloadU8::new(Vec::from(pubkey.as_ref()));
462 ecpoint.encode(&mut buf);
463 let pubkey = Payload::new(buf);
464
465 let ckx = Message {
466 version: ProtocolVersion::TLSv1_2,
467 payload: MessagePayload::handshake(HandshakeMessagePayload {
468 typ: HandshakeType::ClientKeyExchange,
469 payload: HandshakePayload::ClientKeyExchange(pubkey),
470 }),
471 };
472
473 transcript.add_message(&ckx);
474 common.send_msg(ckx, false);
475}
476
477fn emit_certverify(
478 transcript: &mut HandshakeHash,
479 signer: &dyn Signer,
480 common: &mut CommonState,
481) -> Result<(), Error> {
482 let message = transcript
483 .take_handshake_buf()
484 .ok_or_else(|| Error::General("Expected transcript".to_owned()))?;
485
486 let scheme = signer.scheme();
487 let sig = signer.sign(&message)?;
488 let body = DigitallySignedStruct::new(scheme, sig);
489
490 let m = Message {
491 version: ProtocolVersion::TLSv1_2,
492 payload: MessagePayload::handshake(HandshakeMessagePayload {
493 typ: HandshakeType::CertificateVerify,
494 payload: HandshakePayload::CertificateVerify(body),
495 }),
496 };
497
498 transcript.add_message(&m);
499 common.send_msg(m, false);
500 Ok(())
501}
502
503fn emit_ccs(common: &mut CommonState) {
504 let ccs = Message {
505 version: ProtocolVersion::TLSv1_2,
506 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
507 };
508
509 common.send_msg(ccs, false);
510}
511
512fn emit_finished(
513 secrets: &ConnectionSecrets,
514 transcript: &mut HandshakeHash,
515 common: &mut CommonState,
516) {
517 let vh = transcript.get_current_hash();
518 let verify_data = secrets.client_verify_data(&vh);
519 let verify_data_payload = Payload::new(verify_data);
520
521 let f = Message {
522 version: ProtocolVersion::TLSv1_2,
523 payload: MessagePayload::handshake(HandshakeMessagePayload {
524 typ: HandshakeType::Finished,
525 payload: HandshakePayload::Finished(verify_data_payload),
526 }),
527 };
528
529 transcript.add_message(&f);
530 common.send_msg(f, true);
531}
532
533struct ServerKxDetails {
534 kx_params: Vec<u8>,
535 kx_sig: DigitallySignedStruct,
536}
537
538impl ServerKxDetails {
539 fn new(params: Vec<u8>, sig: DigitallySignedStruct) -> Self {
540 Self {
541 kx_params: params,
542 kx_sig: sig,
543 }
544 }
545}
546
547struct ExpectServerDoneOrCertReq {
551 config: Arc<ClientConfig>,
552 resuming_session: Option<persist::Tls12ClientSessionValue>,
553 session_id: SessionId,
554 server_name: ServerName,
555 randoms: ConnectionRandoms,
556 using_ems: bool,
557 transcript: HandshakeHash,
558 suite: &'static Tls12CipherSuite,
559 server_cert: ServerCertDetails,
560 server_kx: ServerKxDetails,
561 must_issue_new_ticket: bool,
562}
563
564impl State<ClientConnectionData> for ExpectServerDoneOrCertReq {
565 fn handle(mut self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
566 if matches!(
567 m.payload,
568 MessagePayload::Handshake {
569 parsed: HandshakeMessagePayload {
570 payload: HandshakePayload::CertificateRequest(_),
571 ..
572 },
573 ..
574 }
575 ) {
576 Box::new(ExpectCertificateRequest {
577 config: self.config,
578 resuming_session: self.resuming_session,
579 session_id: self.session_id,
580 server_name: self.server_name,
581 randoms: self.randoms,
582 using_ems: self.using_ems,
583 transcript: self.transcript,
584 suite: self.suite,
585 server_cert: self.server_cert,
586 server_kx: self.server_kx,
587 must_issue_new_ticket: self.must_issue_new_ticket,
588 })
589 .handle(cx, m)
590 } else {
591 self.transcript.abandon_client_auth();
592
593 Box::new(ExpectServerDone {
594 config: self.config,
595 resuming_session: self.resuming_session,
596 session_id: self.session_id,
597 server_name: self.server_name,
598 randoms: self.randoms,
599 using_ems: self.using_ems,
600 transcript: self.transcript,
601 suite: self.suite,
602 server_cert: self.server_cert,
603 server_kx: self.server_kx,
604 client_auth: None,
605 must_issue_new_ticket: self.must_issue_new_ticket,
606 })
607 .handle(cx, m)
608 }
609 }
610}
611
612struct ExpectCertificateRequest {
613 config: Arc<ClientConfig>,
614 resuming_session: Option<persist::Tls12ClientSessionValue>,
615 session_id: SessionId,
616 server_name: ServerName,
617 randoms: ConnectionRandoms,
618 using_ems: bool,
619 transcript: HandshakeHash,
620 suite: &'static Tls12CipherSuite,
621 server_cert: ServerCertDetails,
622 server_kx: ServerKxDetails,
623 must_issue_new_ticket: bool,
624}
625
626impl State<ClientConnectionData> for ExpectCertificateRequest {
627 fn handle(
628 mut self: Box<Self>,
629 _cx: &mut ClientContext<'_>,
630 m: Message,
631 ) -> hs::NextStateOrError {
632 let certreq = require_handshake_msg!(
633 m,
634 HandshakeType::CertificateRequest,
635 HandshakePayload::CertificateRequest
636 )?;
637 self.transcript.add_message(&m);
638 debug!("Got CertificateRequest {:?}", certreq);
639
640 const NO_CONTEXT: Option<Vec<u8>> = None; let client_auth = ClientAuthDetails::resolve(
648 self.config
649 .client_auth_cert_resolver
650 .as_ref(),
651 Some(&certreq.canames),
652 &certreq.sigschemes,
653 NO_CONTEXT,
654 );
655
656 Ok(Box::new(ExpectServerDone {
657 config: self.config,
658 resuming_session: self.resuming_session,
659 session_id: self.session_id,
660 server_name: self.server_name,
661 randoms: self.randoms,
662 using_ems: self.using_ems,
663 transcript: self.transcript,
664 suite: self.suite,
665 server_cert: self.server_cert,
666 server_kx: self.server_kx,
667 client_auth: Some(client_auth),
668 must_issue_new_ticket: self.must_issue_new_ticket,
669 }))
670 }
671}
672
673struct ExpectServerDone {
674 config: Arc<ClientConfig>,
675 resuming_session: Option<persist::Tls12ClientSessionValue>,
676 session_id: SessionId,
677 server_name: ServerName,
678 randoms: ConnectionRandoms,
679 using_ems: bool,
680 transcript: HandshakeHash,
681 suite: &'static Tls12CipherSuite,
682 server_cert: ServerCertDetails,
683 server_kx: ServerKxDetails,
684 client_auth: Option<ClientAuthDetails>,
685 must_issue_new_ticket: bool,
686}
687
688impl State<ClientConnectionData> for ExpectServerDone {
689 fn handle(self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
690 match m.payload {
691 MessagePayload::Handshake {
692 parsed:
693 HandshakeMessagePayload {
694 payload: HandshakePayload::ServerHelloDone,
695 ..
696 },
697 ..
698 } => {}
699 payload => {
700 return Err(inappropriate_handshake_message(
701 &payload,
702 &[ContentType::Handshake],
703 &[HandshakeType::ServerHelloDone],
704 ));
705 }
706 }
707
708 let mut st = *self;
709 st.transcript.add_message(&m);
710
711 cx.common.check_aligned_handshake()?;
712
713 trace!("Server cert is {:?}", st.server_cert.cert_chain);
714 debug!("Server DNS name is {:?}", st.server_name);
715
716 let suite = st.suite;
717
718 let (end_entity, intermediates) = st
732 .server_cert
733 .cert_chain
734 .split_first()
735 .ok_or(Error::NoCertificatesPresented)?;
736 let now = std::time::SystemTime::now();
737 let cert_verified = st
738 .config
739 .verifier
740 .verify_server_cert(
741 end_entity,
742 intermediates,
743 &st.server_name,
744 &mut st.server_cert.scts(),
745 &st.server_cert.ocsp_response,
746 now,
747 )
748 .map_err(|err| {
749 cx.common
750 .send_cert_verify_error_alert(err)
751 })?;
752
753 let sig_verified = {
757 let mut message = Vec::new();
758 message.extend_from_slice(&st.randoms.client);
759 message.extend_from_slice(&st.randoms.server);
760 message.extend_from_slice(&st.server_kx.kx_params);
761
762 let sig = &st.server_kx.kx_sig;
764 if !SupportedCipherSuite::from(suite).usable_for_signature_algorithm(sig.scheme.sign())
765 {
766 warn!(
767 "peer signed kx with wrong algorithm (got {:?} expect {:?})",
768 sig.scheme.sign(),
769 suite.sign
770 );
771 return Err(PeerMisbehaved::SignedKxWithWrongAlgorithm.into());
772 }
773
774 st.config
775 .verifier
776 .verify_tls12_signature(&message, &st.server_cert.cert_chain[0], sig)
777 .map_err(|err| {
778 cx.common
779 .send_cert_verify_error_alert(err)
780 })?
781 };
782 cx.common.peer_certificates = Some(st.server_cert.cert_chain);
783
784 if let Some(client_auth) = &st.client_auth {
786 let certs = match client_auth {
787 ClientAuthDetails::Empty { .. } => Vec::new(),
788 ClientAuthDetails::Verify { certkey, .. } => certkey.cert.clone(),
789 };
790 emit_certificate(&mut st.transcript, certs, cx.common);
791 }
792
793 let ecdh_params =
795 tls12::decode_ecdh_params::<ServerECDHParams>(cx.common, &st.server_kx.kx_params)?;
796 let group =
797 kx::KeyExchange::choose(ecdh_params.curve_params.named_group, &st.config.kx_groups)
798 .ok_or(Error::PeerMisbehaved(
799 PeerMisbehaved::SelectedUnofferedKxGroup,
800 ))?;
801 let kx = kx::KeyExchange::start(group).ok_or(Error::FailedToGetRandomBytes)?;
802
803 let mut transcript = st.transcript;
805 emit_clientkx(&mut transcript, cx.common, &kx.pubkey);
806 let ems_seed = st
808 .using_ems
809 .then(|| transcript.get_current_hash());
810
811 if let Some(ClientAuthDetails::Verify { signer, .. }) = &st.client_auth {
813 emit_certverify(&mut transcript, signer.as_ref(), cx.common)?;
814 }
815
816 emit_ccs(cx.common);
818
819 let secrets = ConnectionSecrets::from_key_exchange(
821 kx,
822 &ecdh_params.public.0,
823 ems_seed,
824 st.randoms,
825 suite,
826 )?;
827
828 st.config.key_log.log(
829 "CLIENT_RANDOM",
830 &secrets.randoms.client,
831 &secrets.master_secret,
832 );
833 cx.common
834 .start_encryption_tls12(&secrets, Side::Client);
835 cx.common
836 .record_layer
837 .start_encrypting();
838
839 emit_finished(&secrets, &mut transcript, cx.common);
841
842 if st.must_issue_new_ticket {
843 Ok(Box::new(ExpectNewTicket {
844 config: st.config,
845 secrets,
846 resuming_session: st.resuming_session,
847 session_id: st.session_id,
848 server_name: st.server_name,
849 using_ems: st.using_ems,
850 transcript,
851 resuming: false,
852 cert_verified,
853 sig_verified,
854 }))
855 } else {
856 Ok(Box::new(ExpectCcs {
857 config: st.config,
858 secrets,
859 resuming_session: st.resuming_session,
860 session_id: st.session_id,
861 server_name: st.server_name,
862 using_ems: st.using_ems,
863 transcript,
864 ticket: None,
865 resuming: false,
866 cert_verified,
867 sig_verified,
868 }))
869 }
870 }
871}
872
873struct ExpectNewTicket {
874 config: Arc<ClientConfig>,
875 secrets: ConnectionSecrets,
876 resuming_session: Option<persist::Tls12ClientSessionValue>,
877 session_id: SessionId,
878 server_name: ServerName,
879 using_ems: bool,
880 transcript: HandshakeHash,
881 resuming: bool,
882 cert_verified: verify::ServerCertVerified,
883 sig_verified: verify::HandshakeSignatureValid,
884}
885
886impl State<ClientConnectionData> for ExpectNewTicket {
887 fn handle(
888 mut self: Box<Self>,
889 _cx: &mut ClientContext<'_>,
890 m: Message,
891 ) -> hs::NextStateOrError {
892 self.transcript.add_message(&m);
893
894 let nst = require_handshake_msg_move!(
895 m,
896 HandshakeType::NewSessionTicket,
897 HandshakePayload::NewSessionTicket
898 )?;
899
900 Ok(Box::new(ExpectCcs {
901 config: self.config,
902 secrets: self.secrets,
903 resuming_session: self.resuming_session,
904 session_id: self.session_id,
905 server_name: self.server_name,
906 using_ems: self.using_ems,
907 transcript: self.transcript,
908 ticket: Some(nst),
909 resuming: self.resuming,
910 cert_verified: self.cert_verified,
911 sig_verified: self.sig_verified,
912 }))
913 }
914}
915
916struct ExpectCcs {
918 config: Arc<ClientConfig>,
919 secrets: ConnectionSecrets,
920 resuming_session: Option<persist::Tls12ClientSessionValue>,
921 session_id: SessionId,
922 server_name: ServerName,
923 using_ems: bool,
924 transcript: HandshakeHash,
925 ticket: Option<NewSessionTicketPayload>,
926 resuming: bool,
927 cert_verified: verify::ServerCertVerified,
928 sig_verified: verify::HandshakeSignatureValid,
929}
930
931impl State<ClientConnectionData> for ExpectCcs {
932 fn handle(self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
933 match m.payload {
934 MessagePayload::ChangeCipherSpec(..) => {}
935 payload => {
936 return Err(inappropriate_message(
937 &payload,
938 &[ContentType::ChangeCipherSpec],
939 ));
940 }
941 }
942 cx.common.check_aligned_handshake()?;
945
946 cx.common
948 .record_layer
949 .start_decrypting();
950
951 Ok(Box::new(ExpectFinished {
952 config: self.config,
953 secrets: self.secrets,
954 resuming_session: self.resuming_session,
955 session_id: self.session_id,
956 server_name: self.server_name,
957 using_ems: self.using_ems,
958 transcript: self.transcript,
959 ticket: self.ticket,
960 resuming: self.resuming,
961 cert_verified: self.cert_verified,
962 sig_verified: self.sig_verified,
963 }))
964 }
965}
966
967struct ExpectFinished {
968 config: Arc<ClientConfig>,
969 resuming_session: Option<persist::Tls12ClientSessionValue>,
970 session_id: SessionId,
971 server_name: ServerName,
972 using_ems: bool,
973 transcript: HandshakeHash,
974 ticket: Option<NewSessionTicketPayload>,
975 secrets: ConnectionSecrets,
976 resuming: bool,
977 cert_verified: verify::ServerCertVerified,
978 sig_verified: verify::HandshakeSignatureValid,
979}
980
981impl ExpectFinished {
982 fn save_session(&mut self, cx: &ClientContext<'_>) {
984 let (mut ticket, lifetime) = match self.ticket.take() {
987 Some(nst) => (nst.ticket.0, nst.lifetime_hint),
988 None => (Vec::new(), 0),
989 };
990
991 if ticket.is_empty() {
992 if let Some(resuming_session) = &mut self.resuming_session {
993 ticket = resuming_session.take_ticket();
994 }
995 }
996
997 if self.session_id.is_empty() && ticket.is_empty() {
998 debug!("Session not saved: server didn't allocate id or ticket");
999 return;
1000 }
1001
1002 let time_now = match TimeBase::now() {
1003 Ok(time_now) => time_now,
1004 #[allow(unused_variables)]
1005 Err(e) => {
1006 debug!("Session not saved: {}", e);
1007 return;
1008 }
1009 };
1010
1011 let session_value = persist::Tls12ClientSessionValue::new(
1012 self.secrets.suite(),
1013 self.session_id,
1014 ticket,
1015 self.secrets.get_master_secret(),
1016 cx.common
1017 .peer_certificates
1018 .clone()
1019 .unwrap_or_default(),
1020 time_now,
1021 lifetime,
1022 self.using_ems,
1023 );
1024
1025 self.config
1026 .resumption
1027 .store
1028 .set_tls12_session(&self.server_name, session_value);
1029 }
1030}
1031
1032impl State<ClientConnectionData> for ExpectFinished {
1033 fn handle(self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
1034 let mut st = *self;
1035 let finished =
1036 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1037
1038 cx.common.check_aligned_handshake()?;
1039
1040 let vh = st.transcript.get_current_hash();
1042 let expect_verify_data = st.secrets.server_verify_data(&vh);
1043
1044 let _fin_verified =
1047 constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0)
1048 .map_err(|_| {
1049 cx.common
1050 .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError)
1051 })
1052 .map(|_| verify::FinishedMessageVerified::assertion())?;
1053
1054 st.transcript.add_message(&m);
1056
1057 st.save_session(cx);
1058
1059 if st.resuming {
1060 emit_ccs(cx.common);
1061 cx.common
1062 .record_layer
1063 .start_encrypting();
1064 emit_finished(&st.secrets, &mut st.transcript, cx.common);
1065 }
1066
1067 cx.common.start_traffic();
1068 Ok(Box::new(ExpectTraffic {
1069 secrets: st.secrets,
1070 _cert_verified: st.cert_verified,
1071 _sig_verified: st.sig_verified,
1072 _fin_verified,
1073 }))
1074 }
1075
1076 fn handle_decrypt_error(&self) {
1080 if self.resuming {
1081 self.config
1082 .resumption
1083 .store
1084 .remove_tls12_session(&self.server_name);
1085 }
1086 }
1087}
1088
1089struct ExpectTraffic {
1091 secrets: ConnectionSecrets,
1092 _cert_verified: verify::ServerCertVerified,
1093 _sig_verified: verify::HandshakeSignatureValid,
1094 _fin_verified: verify::FinishedMessageVerified,
1095}
1096
1097impl State<ClientConnectionData> for ExpectTraffic {
1098 fn handle(self: Box<Self>, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError {
1099 match m.payload {
1100 MessagePayload::ApplicationData(payload) => cx
1101 .common
1102 .take_received_plaintext(payload),
1103 payload => {
1104 return Err(inappropriate_message(
1105 &payload,
1106 &[ContentType::ApplicationData],
1107 ));
1108 }
1109 }
1110 Ok(self)
1111 }
1112
1113 fn export_keying_material(
1114 &self,
1115 output: &mut [u8],
1116 label: &[u8],
1117 context: Option<&[u8]>,
1118 ) -> Result<(), Error> {
1119 self.secrets
1120 .export_keying_material(output, label, context);
1121 Ok(())
1122 }
1123
1124 #[cfg(feature = "secret_extraction")]
1125 fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
1126 self.secrets
1127 .extract_secrets(Side::Client)
1128 }
1129}