1use alloc::borrow::ToOwned;
2use alloc::boxed::Box;
3use alloc::vec;
4use alloc::vec::Vec;
5
6use pki_types::ServerName;
7pub(super) use server_hello::CompleteServerHelloHandling;
8use subtle::ConstantTimeEq;
9
10use super::client_conn::ClientConnectionData;
11use super::hs::ClientContext;
12use crate::ConnectionTrafficSecrets;
13use crate::check::{inappropriate_handshake_message, inappropriate_message};
14use crate::client::common::{ClientAuthDetails, ServerCertDetails};
15use crate::client::{ClientConfig, hs};
16use crate::common_state::{CommonState, HandshakeKind, KxState, Side, State};
17use crate::conn::ConnectionRandoms;
18use crate::conn::kernel::{Direction, KernelContext, KernelState};
19use crate::crypto::KeyExchangeAlgorithm;
20use crate::enums::{AlertDescription, ContentType, HandshakeType, ProtocolVersion};
21use crate::error::{Error, InvalidMessage, PeerIncompatible, PeerMisbehaved};
22use crate::hash_hs::HandshakeHash;
23use crate::log::{debug, trace, warn};
24use crate::msgs::base::{Payload, PayloadU8, PayloadU16};
25use crate::msgs::ccs::ChangeCipherSpecPayload;
26use crate::msgs::handshake::{
27 CertificateChain, ClientDhParams, ClientEcdhParams, ClientKeyExchangeParams,
28 HandshakeMessagePayload, HandshakePayload, NewSessionTicketPayload,
29 NewSessionTicketPayloadTls13, ServerKeyExchangeParams, SessionId,
30};
31use crate::msgs::message::{Message, MessagePayload};
32use crate::msgs::persist;
33use crate::sign::Signer;
34use crate::suites::{PartiallyExtractedSecrets, SupportedCipherSuite};
35use crate::sync::Arc;
36use crate::tls12::{self, ConnectionSecrets, Tls12CipherSuite};
37use crate::verify::{self, DigitallySignedStruct};
38
39mod server_hello {
40 use super::*;
41 use crate::client::hs::{ClientHelloInput, ClientSessionValue};
42 use crate::msgs::handshake::ServerHelloPayload;
43
44 pub(in crate::client) struct CompleteServerHelloHandling {
45 pub(in crate::client) randoms: ConnectionRandoms,
46 pub(in crate::client) transcript: HandshakeHash,
47 pub(in crate::client) input: ClientHelloInput,
48 }
49
50 impl CompleteServerHelloHandling {
51 pub(in crate::client) fn handle_server_hello(
52 mut self,
53 cx: &mut ClientContext<'_>,
54 suite: &'static Tls12CipherSuite,
55 server_hello: &ServerHelloPayload,
56 tls13_supported: bool,
57 ) -> hs::NextStateOrError<'static> {
58 self.randoms
59 .server
60 .clone_from_slice(&server_hello.random.0[..]);
61
62 let has_downgrade_marker = self.randoms.server[24..] == tls12::DOWNGRADE_SENTINEL;
66 if tls13_supported && has_downgrade_marker {
67 return Err({
68 cx.common.send_fatal_alert(
69 AlertDescription::IllegalParameter,
70 PeerMisbehaved::AttemptedDowngradeToTls12WhenTls13IsSupported,
71 )
72 });
73 }
74
75 if self.input.resuming.is_none()
81 && !self.input.session_id.is_empty()
82 && self.input.session_id == server_hello.session_id
83 {
84 return Err({
85 cx.common.send_fatal_alert(
86 AlertDescription::IllegalParameter,
87 PeerMisbehaved::ServerEchoedCompatibilitySessionId,
88 )
89 });
90 }
91
92 let ClientHelloInput {
93 config,
94 server_name,
95 ..
96 } = self.input;
97
98 let resuming_session = self
99 .input
100 .resuming
101 .and_then(|resuming| match resuming.value {
102 ClientSessionValue::Tls12(inner) => Some(inner),
103 ClientSessionValue::Tls13(_) => None,
104 });
105
106 let using_ems = server_hello
108 .extended_master_secret_ack
109 .is_some();
110 if config.require_ems && !using_ems {
111 return Err({
112 cx.common.send_fatal_alert(
113 AlertDescription::HandshakeFailure,
114 PeerIncompatible::ExtendedMasterSecretExtensionRequired,
115 )
116 });
117 }
118
119 let must_issue_new_ticket = if server_hello
121 .session_ticket_ack
122 .is_some()
123 {
124 debug!("Server supports tickets");
125 true
126 } else {
127 false
128 };
129
130 let may_send_cert_status = server_hello
133 .certificate_status_request_ack
134 .is_some();
135 if may_send_cert_status {
136 debug!("Server may staple OCSP response");
137 }
138
139 if let Some(resuming) = resuming_session {
141 if resuming.session_id == server_hello.session_id {
142 debug!("Server agreed to resume");
143
144 if resuming.suite() != suite {
146 return Err(PeerMisbehaved::ResumptionOfferedWithVariedCipherSuite.into());
147 }
148
149 if resuming.extended_ms() != using_ems {
151 return Err(PeerMisbehaved::ResumptionOfferedWithVariedEms.into());
152 }
153
154 let secrets =
155 ConnectionSecrets::new_resume(self.randoms, suite, resuming.secret());
156 config.key_log.log(
157 "CLIENT_RANDOM",
158 &secrets.randoms.client,
159 &secrets.master_secret,
160 );
161 cx.common
162 .start_encryption_tls12(&secrets, Side::Client);
163
164 cx.common.peer_certificates = Some(
167 resuming
168 .server_cert_chain()
169 .clone()
170 .into_owned(),
171 );
172 cx.common.handshake_kind = Some(HandshakeKind::Resumed);
173 let cert_verified = verify::ServerCertVerified::assertion();
174 let sig_verified = verify::HandshakeSignatureValid::assertion();
175
176 return if must_issue_new_ticket {
177 Ok(Box::new(ExpectNewTicket {
178 config,
179 secrets,
180 resuming_session: Some(resuming),
181 session_id: server_hello.session_id,
182 server_name,
183 using_ems,
184 transcript: self.transcript,
185 resuming: true,
186 cert_verified,
187 sig_verified,
188 }))
189 } else {
190 Ok(Box::new(ExpectCcs {
191 config,
192 secrets,
193 resuming_session: Some(resuming),
194 session_id: server_hello.session_id,
195 server_name,
196 using_ems,
197 transcript: self.transcript,
198 ticket: None,
199 resuming: true,
200 cert_verified,
201 sig_verified,
202 }))
203 };
204 }
205 }
206
207 cx.common.handshake_kind = Some(HandshakeKind::Full);
208 Ok(Box::new(ExpectCertificate {
209 config,
210 resuming_session: None,
211 session_id: server_hello.session_id,
212 server_name,
213 randoms: self.randoms,
214 using_ems,
215 transcript: self.transcript,
216 suite,
217 may_send_cert_status,
218 must_issue_new_ticket,
219 }))
220 }
221 }
222}
223
224struct ExpectCertificate {
225 config: Arc<ClientConfig>,
226 resuming_session: Option<persist::Tls12ClientSessionValue>,
227 session_id: SessionId,
228 server_name: ServerName<'static>,
229 randoms: ConnectionRandoms,
230 using_ems: bool,
231 transcript: HandshakeHash,
232 pub(super) suite: &'static Tls12CipherSuite,
233 may_send_cert_status: bool,
234 must_issue_new_ticket: bool,
235}
236
237impl State<ClientConnectionData> for ExpectCertificate {
238 fn handle<'m>(
239 mut self: Box<Self>,
240 _cx: &mut ClientContext<'_>,
241 m: Message<'m>,
242 ) -> hs::NextStateOrError<'m>
243 where
244 Self: 'm,
245 {
246 self.transcript.add_message(&m);
247 let server_cert_chain = require_handshake_msg_move!(
248 m,
249 HandshakeType::Certificate,
250 HandshakePayload::Certificate
251 )?;
252
253 if self.may_send_cert_status {
254 Ok(Box::new(ExpectCertificateStatusOrServerKx {
255 config: self.config,
256 resuming_session: self.resuming_session,
257 session_id: self.session_id,
258 server_name: self.server_name,
259 randoms: self.randoms,
260 using_ems: self.using_ems,
261 transcript: self.transcript,
262 suite: self.suite,
263 server_cert_chain,
264 must_issue_new_ticket: self.must_issue_new_ticket,
265 }))
266 } else {
267 let server_cert = ServerCertDetails::new(server_cert_chain, vec![]);
268
269 Ok(Box::new(ExpectServerKx {
270 config: self.config,
271 resuming_session: self.resuming_session,
272 session_id: self.session_id,
273 server_name: self.server_name,
274 randoms: self.randoms,
275 using_ems: self.using_ems,
276 transcript: self.transcript,
277 suite: self.suite,
278 server_cert,
279 must_issue_new_ticket: self.must_issue_new_ticket,
280 }))
281 }
282 }
283
284 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
285 self
286 }
287}
288
289struct ExpectCertificateStatusOrServerKx<'m> {
290 config: Arc<ClientConfig>,
291 resuming_session: Option<persist::Tls12ClientSessionValue>,
292 session_id: SessionId,
293 server_name: ServerName<'static>,
294 randoms: ConnectionRandoms,
295 using_ems: bool,
296 transcript: HandshakeHash,
297 suite: &'static Tls12CipherSuite,
298 server_cert_chain: CertificateChain<'m>,
299 must_issue_new_ticket: bool,
300}
301
302impl State<ClientConnectionData> for ExpectCertificateStatusOrServerKx<'_> {
303 fn handle<'m>(
304 self: Box<Self>,
305 cx: &mut ClientContext<'_>,
306 m: Message<'m>,
307 ) -> hs::NextStateOrError<'m>
308 where
309 Self: 'm,
310 {
311 match m.payload {
312 MessagePayload::Handshake {
313 parsed: HandshakeMessagePayload(HandshakePayload::ServerKeyExchange(..)),
314 ..
315 } => Box::new(ExpectServerKx {
316 config: self.config,
317 resuming_session: self.resuming_session,
318 session_id: self.session_id,
319 server_name: self.server_name,
320 randoms: self.randoms,
321 using_ems: self.using_ems,
322 transcript: self.transcript,
323 suite: self.suite,
324 server_cert: ServerCertDetails::new(self.server_cert_chain, vec![]),
325 must_issue_new_ticket: self.must_issue_new_ticket,
326 })
327 .handle(cx, m),
328 MessagePayload::Handshake {
329 parsed: HandshakeMessagePayload(HandshakePayload::CertificateStatus(..)),
330 ..
331 } => Box::new(ExpectCertificateStatus {
332 config: self.config,
333 resuming_session: self.resuming_session,
334 session_id: self.session_id,
335 server_name: self.server_name,
336 randoms: self.randoms,
337 using_ems: self.using_ems,
338 transcript: self.transcript,
339 suite: self.suite,
340 server_cert_chain: self.server_cert_chain,
341 must_issue_new_ticket: self.must_issue_new_ticket,
342 })
343 .handle(cx, m),
344 payload => Err(inappropriate_handshake_message(
345 &payload,
346 &[ContentType::Handshake],
347 &[
348 HandshakeType::ServerKeyExchange,
349 HandshakeType::CertificateStatus,
350 ],
351 )),
352 }
353 }
354
355 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
356 Box::new(ExpectCertificateStatusOrServerKx {
357 config: self.config,
358 resuming_session: self.resuming_session,
359 session_id: self.session_id,
360 server_name: self.server_name,
361 randoms: self.randoms,
362 using_ems: self.using_ems,
363 transcript: self.transcript,
364 suite: self.suite,
365 server_cert_chain: self.server_cert_chain.into_owned(),
366 must_issue_new_ticket: self.must_issue_new_ticket,
367 })
368 }
369}
370
371struct ExpectCertificateStatus<'a> {
372 config: Arc<ClientConfig>,
373 resuming_session: Option<persist::Tls12ClientSessionValue>,
374 session_id: SessionId,
375 server_name: ServerName<'static>,
376 randoms: ConnectionRandoms,
377 using_ems: bool,
378 transcript: HandshakeHash,
379 suite: &'static Tls12CipherSuite,
380 server_cert_chain: CertificateChain<'a>,
381 must_issue_new_ticket: bool,
382}
383
384impl State<ClientConnectionData> for ExpectCertificateStatus<'_> {
385 fn handle<'m>(
386 mut self: Box<Self>,
387 _cx: &mut ClientContext<'_>,
388 m: Message<'m>,
389 ) -> hs::NextStateOrError<'m>
390 where
391 Self: 'm,
392 {
393 self.transcript.add_message(&m);
394 let server_cert_ocsp_response = require_handshake_msg_move!(
395 m,
396 HandshakeType::CertificateStatus,
397 HandshakePayload::CertificateStatus
398 )?
399 .into_inner();
400
401 trace!(
402 "Server stapled OCSP response is {:?}",
403 &server_cert_ocsp_response
404 );
405
406 let server_cert = ServerCertDetails::new(self.server_cert_chain, server_cert_ocsp_response);
407
408 Ok(Box::new(ExpectServerKx {
409 config: self.config,
410 resuming_session: self.resuming_session,
411 session_id: self.session_id,
412 server_name: self.server_name,
413 randoms: self.randoms,
414 using_ems: self.using_ems,
415 transcript: self.transcript,
416 suite: self.suite,
417 server_cert,
418 must_issue_new_ticket: self.must_issue_new_ticket,
419 }))
420 }
421
422 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
423 Box::new(ExpectCertificateStatus {
424 config: self.config,
425 resuming_session: self.resuming_session,
426 session_id: self.session_id,
427 server_name: self.server_name,
428 randoms: self.randoms,
429 using_ems: self.using_ems,
430 transcript: self.transcript,
431 suite: self.suite,
432 server_cert_chain: self.server_cert_chain.into_owned(),
433 must_issue_new_ticket: self.must_issue_new_ticket,
434 })
435 }
436}
437
438struct ExpectServerKx<'a> {
439 config: Arc<ClientConfig>,
440 resuming_session: Option<persist::Tls12ClientSessionValue>,
441 session_id: SessionId,
442 server_name: ServerName<'static>,
443 randoms: ConnectionRandoms,
444 using_ems: bool,
445 transcript: HandshakeHash,
446 suite: &'static Tls12CipherSuite,
447 server_cert: ServerCertDetails<'a>,
448 must_issue_new_ticket: bool,
449}
450
451impl State<ClientConnectionData> for ExpectServerKx<'_> {
452 fn handle<'m>(
453 mut self: Box<Self>,
454 cx: &mut ClientContext<'_>,
455 m: Message<'m>,
456 ) -> hs::NextStateOrError<'m>
457 where
458 Self: 'm,
459 {
460 let opaque_kx = require_handshake_msg!(
461 m,
462 HandshakeType::ServerKeyExchange,
463 HandshakePayload::ServerKeyExchange
464 )?;
465 self.transcript.add_message(&m);
466
467 let kx = opaque_kx
468 .unwrap_given_kxa(self.suite.kx)
469 .ok_or_else(|| {
470 cx.common.send_fatal_alert(
471 AlertDescription::DecodeError,
472 InvalidMessage::MissingKeyExchange,
473 )
474 })?;
475
476 let mut kx_params = Vec::new();
478 kx.params.encode(&mut kx_params);
479 let server_kx = ServerKxDetails::new(kx_params, kx.dss);
480
481 #[cfg_attr(not(feature = "logging"), allow(unused_variables))]
482 {
483 match &kx.params {
484 ServerKeyExchangeParams::Ecdh(ecdhe) => {
485 debug!("ECDHE curve is {:?}", ecdhe.curve_params)
486 }
487 ServerKeyExchangeParams::Dh(dhe) => {
488 debug!("DHE params are p = {:?}, g = {:?}", dhe.dh_p, dhe.dh_g)
489 }
490 }
491 }
492
493 Ok(Box::new(ExpectServerDoneOrCertReq {
494 config: self.config,
495 resuming_session: self.resuming_session,
496 session_id: self.session_id,
497 server_name: self.server_name,
498 randoms: self.randoms,
499 using_ems: self.using_ems,
500 transcript: self.transcript,
501 suite: self.suite,
502 server_cert: self.server_cert,
503 server_kx,
504 must_issue_new_ticket: self.must_issue_new_ticket,
505 }))
506 }
507
508 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
509 Box::new(ExpectServerKx {
510 config: self.config,
511 resuming_session: self.resuming_session,
512 session_id: self.session_id,
513 server_name: self.server_name,
514 randoms: self.randoms,
515 using_ems: self.using_ems,
516 transcript: self.transcript,
517 suite: self.suite,
518 server_cert: self.server_cert.into_owned(),
519 must_issue_new_ticket: self.must_issue_new_ticket,
520 })
521 }
522}
523
524fn emit_certificate(
525 transcript: &mut HandshakeHash,
526 cert_chain: CertificateChain<'static>,
527 common: &mut CommonState,
528) {
529 let cert = Message {
530 version: ProtocolVersion::TLSv1_2,
531 payload: MessagePayload::handshake(HandshakeMessagePayload(HandshakePayload::Certificate(
532 cert_chain,
533 ))),
534 };
535
536 transcript.add_message(&cert);
537 common.send_msg(cert, false);
538}
539
540fn emit_client_kx(
541 transcript: &mut HandshakeHash,
542 kxa: KeyExchangeAlgorithm,
543 common: &mut CommonState,
544 pub_key: &[u8],
545) {
546 let mut buf = Vec::new();
547 match kxa {
548 KeyExchangeAlgorithm::ECDHE => ClientKeyExchangeParams::Ecdh(ClientEcdhParams {
549 public: PayloadU8::new(pub_key.to_vec()),
550 }),
551 KeyExchangeAlgorithm::DHE => ClientKeyExchangeParams::Dh(ClientDhParams {
552 public: PayloadU16::new(pub_key.to_vec()),
553 }),
554 }
555 .encode(&mut buf);
556 let pubkey = Payload::new(buf);
557
558 let ckx = Message {
559 version: ProtocolVersion::TLSv1_2,
560 payload: MessagePayload::handshake(HandshakeMessagePayload(
561 HandshakePayload::ClientKeyExchange(pubkey),
562 )),
563 };
564
565 transcript.add_message(&ckx);
566 common.send_msg(ckx, false);
567}
568
569fn emit_certverify(
570 transcript: &mut HandshakeHash,
571 signer: &dyn Signer,
572 common: &mut CommonState,
573) -> Result<(), Error> {
574 let message = transcript
575 .take_handshake_buf()
576 .ok_or_else(|| Error::General("Expected transcript".to_owned()))?;
577
578 let scheme = signer.scheme();
579 let sig = signer.sign(&message)?;
580 let body = DigitallySignedStruct::new(scheme, sig);
581
582 let m = Message {
583 version: ProtocolVersion::TLSv1_2,
584 payload: MessagePayload::handshake(HandshakeMessagePayload(
585 HandshakePayload::CertificateVerify(body),
586 )),
587 };
588
589 transcript.add_message(&m);
590 common.send_msg(m, false);
591 Ok(())
592}
593
594fn emit_ccs(common: &mut CommonState) {
595 let ccs = Message {
596 version: ProtocolVersion::TLSv1_2,
597 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
598 };
599
600 common.send_msg(ccs, false);
601}
602
603fn emit_finished(
604 secrets: &ConnectionSecrets,
605 transcript: &mut HandshakeHash,
606 common: &mut CommonState,
607) {
608 let vh = transcript.current_hash();
609 let verify_data = secrets.client_verify_data(&vh);
610 let verify_data_payload = Payload::new(verify_data);
611
612 let f = Message {
613 version: ProtocolVersion::TLSv1_2,
614 payload: MessagePayload::handshake(HandshakeMessagePayload(HandshakePayload::Finished(
615 verify_data_payload,
616 ))),
617 };
618
619 transcript.add_message(&f);
620 common.send_msg(f, true);
621}
622
623struct ServerKxDetails {
624 kx_params: Vec<u8>,
625 kx_sig: DigitallySignedStruct,
626}
627
628impl ServerKxDetails {
629 fn new(params: Vec<u8>, sig: DigitallySignedStruct) -> Self {
630 Self {
631 kx_params: params,
632 kx_sig: sig,
633 }
634 }
635}
636
637struct ExpectServerDoneOrCertReq<'a> {
641 config: Arc<ClientConfig>,
642 resuming_session: Option<persist::Tls12ClientSessionValue>,
643 session_id: SessionId,
644 server_name: ServerName<'static>,
645 randoms: ConnectionRandoms,
646 using_ems: bool,
647 transcript: HandshakeHash,
648 suite: &'static Tls12CipherSuite,
649 server_cert: ServerCertDetails<'a>,
650 server_kx: ServerKxDetails,
651 must_issue_new_ticket: bool,
652}
653
654impl State<ClientConnectionData> for ExpectServerDoneOrCertReq<'_> {
655 fn handle<'m>(
656 mut self: Box<Self>,
657 cx: &mut ClientContext<'_>,
658 m: Message<'m>,
659 ) -> hs::NextStateOrError<'m>
660 where
661 Self: 'm,
662 {
663 if matches!(
664 m.payload,
665 MessagePayload::Handshake {
666 parsed: HandshakeMessagePayload(HandshakePayload::CertificateRequest(_)),
667 ..
668 }
669 ) {
670 Box::new(ExpectCertificateRequest {
671 config: self.config,
672 resuming_session: self.resuming_session,
673 session_id: self.session_id,
674 server_name: self.server_name,
675 randoms: self.randoms,
676 using_ems: self.using_ems,
677 transcript: self.transcript,
678 suite: self.suite,
679 server_cert: self.server_cert,
680 server_kx: self.server_kx,
681 must_issue_new_ticket: self.must_issue_new_ticket,
682 })
683 .handle(cx, m)
684 } else {
685 self.transcript.abandon_client_auth();
686
687 Box::new(ExpectServerDone {
688 config: self.config,
689 resuming_session: self.resuming_session,
690 session_id: self.session_id,
691 server_name: self.server_name,
692 randoms: self.randoms,
693 using_ems: self.using_ems,
694 transcript: self.transcript,
695 suite: self.suite,
696 server_cert: self.server_cert,
697 server_kx: self.server_kx,
698 client_auth: None,
699 must_issue_new_ticket: self.must_issue_new_ticket,
700 })
701 .handle(cx, m)
702 }
703 }
704
705 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
706 Box::new(ExpectServerDoneOrCertReq {
707 config: self.config,
708 resuming_session: self.resuming_session,
709 session_id: self.session_id,
710 server_name: self.server_name,
711 randoms: self.randoms,
712 using_ems: self.using_ems,
713 transcript: self.transcript,
714 suite: self.suite,
715 server_cert: self.server_cert.into_owned(),
716 server_kx: self.server_kx,
717 must_issue_new_ticket: self.must_issue_new_ticket,
718 })
719 }
720}
721
722struct ExpectCertificateRequest<'a> {
723 config: Arc<ClientConfig>,
724 resuming_session: Option<persist::Tls12ClientSessionValue>,
725 session_id: SessionId,
726 server_name: ServerName<'static>,
727 randoms: ConnectionRandoms,
728 using_ems: bool,
729 transcript: HandshakeHash,
730 suite: &'static Tls12CipherSuite,
731 server_cert: ServerCertDetails<'a>,
732 server_kx: ServerKxDetails,
733 must_issue_new_ticket: bool,
734}
735
736impl State<ClientConnectionData> for ExpectCertificateRequest<'_> {
737 fn handle<'m>(
738 mut self: Box<Self>,
739 _cx: &mut ClientContext<'_>,
740 m: Message<'m>,
741 ) -> hs::NextStateOrError<'m>
742 where
743 Self: 'm,
744 {
745 let certreq = require_handshake_msg!(
746 m,
747 HandshakeType::CertificateRequest,
748 HandshakePayload::CertificateRequest
749 )?;
750 self.transcript.add_message(&m);
751 debug!("Got CertificateRequest {certreq:?}");
752
753 const NO_CONTEXT: Option<Vec<u8>> = None; let no_compression = None; let client_auth = ClientAuthDetails::resolve(
762 self.config
763 .client_auth_cert_resolver
764 .as_ref(),
765 Some(&certreq.canames),
766 &certreq.sigschemes,
767 NO_CONTEXT,
768 no_compression,
769 );
770
771 Ok(Box::new(ExpectServerDone {
772 config: self.config,
773 resuming_session: self.resuming_session,
774 session_id: self.session_id,
775 server_name: self.server_name,
776 randoms: self.randoms,
777 using_ems: self.using_ems,
778 transcript: self.transcript,
779 suite: self.suite,
780 server_cert: self.server_cert,
781 server_kx: self.server_kx,
782 client_auth: Some(client_auth),
783 must_issue_new_ticket: self.must_issue_new_ticket,
784 }))
785 }
786
787 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
788 Box::new(ExpectCertificateRequest {
789 config: self.config,
790 resuming_session: self.resuming_session,
791 session_id: self.session_id,
792 server_name: self.server_name,
793 randoms: self.randoms,
794 using_ems: self.using_ems,
795 transcript: self.transcript,
796 suite: self.suite,
797 server_cert: self.server_cert.into_owned(),
798 server_kx: self.server_kx,
799 must_issue_new_ticket: self.must_issue_new_ticket,
800 })
801 }
802}
803
804struct ExpectServerDone<'a> {
805 config: Arc<ClientConfig>,
806 resuming_session: Option<persist::Tls12ClientSessionValue>,
807 session_id: SessionId,
808 server_name: ServerName<'static>,
809 randoms: ConnectionRandoms,
810 using_ems: bool,
811 transcript: HandshakeHash,
812 suite: &'static Tls12CipherSuite,
813 server_cert: ServerCertDetails<'a>,
814 server_kx: ServerKxDetails,
815 client_auth: Option<ClientAuthDetails>,
816 must_issue_new_ticket: bool,
817}
818
819impl State<ClientConnectionData> for ExpectServerDone<'_> {
820 fn handle<'m>(
821 self: Box<Self>,
822 cx: &mut ClientContext<'_>,
823 m: Message<'m>,
824 ) -> hs::NextStateOrError<'m>
825 where
826 Self: 'm,
827 {
828 match m.payload {
829 MessagePayload::Handshake {
830 parsed: HandshakeMessagePayload(HandshakePayload::ServerHelloDone),
831 ..
832 } => {}
833 payload => {
834 return Err(inappropriate_handshake_message(
835 &payload,
836 &[ContentType::Handshake],
837 &[HandshakeType::ServerHelloDone],
838 ));
839 }
840 }
841
842 let mut st = *self;
843 st.transcript.add_message(&m);
844
845 cx.common.check_aligned_handshake()?;
846
847 trace!("Server cert is {:?}", st.server_cert.cert_chain);
848 debug!("Server DNS name is {:?}", st.server_name);
849
850 let suite = st.suite;
851
852 let (end_entity, intermediates) = st
866 .server_cert
867 .cert_chain
868 .split_first()
869 .ok_or(Error::NoCertificatesPresented)?;
870
871 let now = st.config.current_time()?;
872
873 let cert_verified = st
874 .config
875 .verifier
876 .verify_server_cert(
877 end_entity,
878 intermediates,
879 &st.server_name,
880 &st.server_cert.ocsp_response,
881 now,
882 )
883 .map_err(|err| {
884 cx.common
885 .send_cert_verify_error_alert(err)
886 })?;
887
888 let sig_verified = {
892 let mut message = Vec::new();
893 message.extend_from_slice(&st.randoms.client);
894 message.extend_from_slice(&st.randoms.server);
895 message.extend_from_slice(&st.server_kx.kx_params);
896
897 let sig = &st.server_kx.kx_sig;
899 if !SupportedCipherSuite::from(suite)
900 .usable_for_signature_algorithm(sig.scheme.algorithm())
901 {
902 warn!(
903 "peer signed kx with wrong algorithm (got {:?} expect {:?})",
904 sig.scheme.algorithm(),
905 suite.sign
906 );
907 return Err(PeerMisbehaved::SignedKxWithWrongAlgorithm.into());
908 }
909
910 st.config
911 .verifier
912 .verify_tls12_signature(&message, end_entity, sig)
913 .map_err(|err| {
914 cx.common
915 .send_cert_verify_error_alert(err)
916 })?
917 };
918 cx.common.peer_certificates = Some(st.server_cert.cert_chain.into_owned());
919
920 if let Some(client_auth) = &st.client_auth {
922 let certs = match client_auth {
923 ClientAuthDetails::Empty { .. } => CertificateChain::default(),
924 ClientAuthDetails::Verify { certkey, .. } => CertificateChain(certkey.cert.clone()),
925 };
926 emit_certificate(&mut st.transcript, certs, cx.common);
927 }
928
929 let kx_params = tls12::decode_kx_params::<ServerKeyExchangeParams>(
931 st.suite.kx,
932 cx.common,
933 &st.server_kx.kx_params,
934 )?;
935 let maybe_skxg = match &kx_params {
936 ServerKeyExchangeParams::Ecdh(ecdh) => st
937 .config
938 .find_kx_group(ecdh.curve_params.named_group, ProtocolVersion::TLSv1_2),
939 ServerKeyExchangeParams::Dh(dh) => {
940 let ffdhe_group = dh.as_ffdhe_group();
941
942 st.config
943 .provider
944 .kx_groups
945 .iter()
946 .find(|kxg| kxg.ffdhe_group() == Some(ffdhe_group))
947 .copied()
948 }
949 };
950 let Some(skxg) = maybe_skxg else {
951 return Err(cx.common.send_fatal_alert(
952 AlertDescription::IllegalParameter,
953 PeerMisbehaved::SelectedUnofferedKxGroup,
954 ));
955 };
956 cx.common.kx_state = KxState::Start(skxg);
957 let kx = skxg.start()?;
958
959 let mut transcript = st.transcript;
961 emit_client_kx(&mut transcript, st.suite.kx, cx.common, kx.pub_key());
962 let ems_seed = st
964 .using_ems
965 .then(|| transcript.current_hash());
966
967 if let Some(ClientAuthDetails::Verify { signer, .. }) = &st.client_auth {
969 emit_certverify(&mut transcript, signer.as_ref(), cx.common)?;
970 }
971
972 let secrets = ConnectionSecrets::from_key_exchange(
976 kx,
977 kx_params.pub_key(),
978 ems_seed,
979 st.randoms,
980 suite,
981 )
982 .map_err(|err| {
983 cx.common
984 .send_fatal_alert(AlertDescription::IllegalParameter, err)
985 })?;
986 cx.common.kx_state.complete();
987
988 emit_ccs(cx.common);
990
991 st.config.key_log.log(
993 "CLIENT_RANDOM",
994 &secrets.randoms.client,
995 &secrets.master_secret,
996 );
997 cx.common
998 .start_encryption_tls12(&secrets, Side::Client);
999 cx.common
1000 .record_layer
1001 .start_encrypting();
1002
1003 emit_finished(&secrets, &mut transcript, cx.common);
1005
1006 if st.must_issue_new_ticket {
1007 Ok(Box::new(ExpectNewTicket {
1008 config: st.config,
1009 secrets,
1010 resuming_session: st.resuming_session,
1011 session_id: st.session_id,
1012 server_name: st.server_name,
1013 using_ems: st.using_ems,
1014 transcript,
1015 resuming: false,
1016 cert_verified,
1017 sig_verified,
1018 }))
1019 } else {
1020 Ok(Box::new(ExpectCcs {
1021 config: st.config,
1022 secrets,
1023 resuming_session: st.resuming_session,
1024 session_id: st.session_id,
1025 server_name: st.server_name,
1026 using_ems: st.using_ems,
1027 transcript,
1028 ticket: None,
1029 resuming: false,
1030 cert_verified,
1031 sig_verified,
1032 }))
1033 }
1034 }
1035
1036 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1037 Box::new(ExpectServerDone {
1038 config: self.config,
1039 resuming_session: self.resuming_session,
1040 session_id: self.session_id,
1041 server_name: self.server_name,
1042 randoms: self.randoms,
1043 using_ems: self.using_ems,
1044 transcript: self.transcript,
1045 suite: self.suite,
1046 server_cert: self.server_cert.into_owned(),
1047 server_kx: self.server_kx,
1048 client_auth: self.client_auth,
1049 must_issue_new_ticket: self.must_issue_new_ticket,
1050 })
1051 }
1052}
1053
1054struct ExpectNewTicket {
1055 config: Arc<ClientConfig>,
1056 secrets: ConnectionSecrets,
1057 resuming_session: Option<persist::Tls12ClientSessionValue>,
1058 session_id: SessionId,
1059 server_name: ServerName<'static>,
1060 using_ems: bool,
1061 transcript: HandshakeHash,
1062 resuming: bool,
1063 cert_verified: verify::ServerCertVerified,
1064 sig_verified: verify::HandshakeSignatureValid,
1065}
1066
1067impl State<ClientConnectionData> for ExpectNewTicket {
1068 fn handle<'m>(
1069 mut self: Box<Self>,
1070 _cx: &mut ClientContext<'_>,
1071 m: Message<'m>,
1072 ) -> hs::NextStateOrError<'m>
1073 where
1074 Self: 'm,
1075 {
1076 self.transcript.add_message(&m);
1077
1078 let nst = require_handshake_msg_move!(
1079 m,
1080 HandshakeType::NewSessionTicket,
1081 HandshakePayload::NewSessionTicket
1082 )?;
1083
1084 Ok(Box::new(ExpectCcs {
1085 config: self.config,
1086 secrets: self.secrets,
1087 resuming_session: self.resuming_session,
1088 session_id: self.session_id,
1089 server_name: self.server_name,
1090 using_ems: self.using_ems,
1091 transcript: self.transcript,
1092 ticket: Some(nst),
1093 resuming: self.resuming,
1094 cert_verified: self.cert_verified,
1095 sig_verified: self.sig_verified,
1096 }))
1097 }
1098
1099 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1100 self
1101 }
1102}
1103
1104struct ExpectCcs {
1106 config: Arc<ClientConfig>,
1107 secrets: ConnectionSecrets,
1108 resuming_session: Option<persist::Tls12ClientSessionValue>,
1109 session_id: SessionId,
1110 server_name: ServerName<'static>,
1111 using_ems: bool,
1112 transcript: HandshakeHash,
1113 ticket: Option<NewSessionTicketPayload>,
1114 resuming: bool,
1115 cert_verified: verify::ServerCertVerified,
1116 sig_verified: verify::HandshakeSignatureValid,
1117}
1118
1119impl State<ClientConnectionData> for ExpectCcs {
1120 fn handle<'m>(
1121 self: Box<Self>,
1122 cx: &mut ClientContext<'_>,
1123 m: Message<'m>,
1124 ) -> hs::NextStateOrError<'m>
1125 where
1126 Self: 'm,
1127 {
1128 match m.payload {
1129 MessagePayload::ChangeCipherSpec(..) => {}
1130 payload => {
1131 return Err(inappropriate_message(
1132 &payload,
1133 &[ContentType::ChangeCipherSpec],
1134 ));
1135 }
1136 }
1137 cx.common.check_aligned_handshake()?;
1140
1141 cx.common
1143 .record_layer
1144 .start_decrypting();
1145
1146 Ok(Box::new(ExpectFinished {
1147 config: self.config,
1148 secrets: self.secrets,
1149 resuming_session: self.resuming_session,
1150 session_id: self.session_id,
1151 server_name: self.server_name,
1152 using_ems: self.using_ems,
1153 transcript: self.transcript,
1154 ticket: self.ticket,
1155 resuming: self.resuming,
1156 cert_verified: self.cert_verified,
1157 sig_verified: self.sig_verified,
1158 }))
1159 }
1160
1161 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1162 self
1163 }
1164}
1165
1166struct ExpectFinished {
1167 config: Arc<ClientConfig>,
1168 resuming_session: Option<persist::Tls12ClientSessionValue>,
1169 session_id: SessionId,
1170 server_name: ServerName<'static>,
1171 using_ems: bool,
1172 transcript: HandshakeHash,
1173 ticket: Option<NewSessionTicketPayload>,
1174 secrets: ConnectionSecrets,
1175 resuming: bool,
1176 cert_verified: verify::ServerCertVerified,
1177 sig_verified: verify::HandshakeSignatureValid,
1178}
1179
1180impl ExpectFinished {
1181 fn save_session(&mut self, cx: &ClientContext<'_>) {
1183 let (mut ticket, lifetime) = match self.ticket.take() {
1186 Some(nst) => (nst.ticket, nst.lifetime_hint),
1187 None => (Arc::new(PayloadU16::empty()), 0),
1188 };
1189
1190 if ticket.0.is_empty() {
1191 if let Some(resuming_session) = &mut self.resuming_session {
1192 ticket = resuming_session.ticket();
1193 }
1194 }
1195
1196 if self.session_id.is_empty() && ticket.0.is_empty() {
1197 debug!("Session not saved: server didn't allocate id or ticket");
1198 return;
1199 }
1200
1201 let Ok(now) = self.config.current_time() else {
1202 debug!("Could not get current time");
1203 return;
1204 };
1205
1206 let session_value = persist::Tls12ClientSessionValue::new(
1207 self.secrets.suite(),
1208 self.session_id,
1209 ticket,
1210 self.secrets.master_secret(),
1211 cx.common
1212 .peer_certificates
1213 .clone()
1214 .unwrap_or_default(),
1215 &self.config.verifier,
1216 &self.config.client_auth_cert_resolver,
1217 now,
1218 lifetime,
1219 self.using_ems,
1220 );
1221
1222 self.config
1223 .resumption
1224 .store
1225 .set_tls12_session(self.server_name.clone(), session_value);
1226 }
1227}
1228
1229impl State<ClientConnectionData> for ExpectFinished {
1230 fn handle<'m>(
1231 self: Box<Self>,
1232 cx: &mut ClientContext<'_>,
1233 m: Message<'m>,
1234 ) -> hs::NextStateOrError<'m>
1235 where
1236 Self: 'm,
1237 {
1238 let mut st = *self;
1239 let finished =
1240 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1241
1242 cx.common.check_aligned_handshake()?;
1243
1244 let vh = st.transcript.current_hash();
1246 let expect_verify_data = st.secrets.server_verify_data(&vh);
1247
1248 let _fin_verified =
1251 match ConstantTimeEq::ct_eq(&expect_verify_data[..], finished.bytes()).into() {
1252 true => verify::FinishedMessageVerified::assertion(),
1253 false => {
1254 return Err(cx
1255 .common
1256 .send_fatal_alert(AlertDescription::DecryptError, Error::DecryptError));
1257 }
1258 };
1259
1260 st.transcript.add_message(&m);
1262
1263 st.save_session(cx);
1264
1265 if st.resuming {
1266 emit_ccs(cx.common);
1267 cx.common
1268 .record_layer
1269 .start_encrypting();
1270 emit_finished(&st.secrets, &mut st.transcript, cx.common);
1271 }
1272
1273 cx.common
1274 .start_traffic(&mut cx.sendable_plaintext);
1275 Ok(Box::new(ExpectTraffic {
1276 secrets: st.secrets,
1277 _cert_verified: st.cert_verified,
1278 _sig_verified: st.sig_verified,
1279 _fin_verified,
1280 }))
1281 }
1282
1283 fn handle_decrypt_error(&self) {
1287 if self.resuming {
1288 self.config
1289 .resumption
1290 .store
1291 .remove_tls12_session(&self.server_name);
1292 }
1293 }
1294
1295 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1296 self
1297 }
1298}
1299
1300struct ExpectTraffic {
1302 secrets: ConnectionSecrets,
1303 _cert_verified: verify::ServerCertVerified,
1304 _sig_verified: verify::HandshakeSignatureValid,
1305 _fin_verified: verify::FinishedMessageVerified,
1306}
1307
1308impl State<ClientConnectionData> for ExpectTraffic {
1309 fn handle<'m>(
1310 self: Box<Self>,
1311 cx: &mut ClientContext<'_>,
1312 m: Message<'m>,
1313 ) -> hs::NextStateOrError<'m>
1314 where
1315 Self: 'm,
1316 {
1317 match m.payload {
1318 MessagePayload::ApplicationData(payload) => cx
1319 .common
1320 .take_received_plaintext(payload),
1321 payload => {
1322 return Err(inappropriate_message(
1323 &payload,
1324 &[ContentType::ApplicationData],
1325 ));
1326 }
1327 }
1328 Ok(self)
1329 }
1330
1331 fn export_keying_material(
1332 &self,
1333 output: &mut [u8],
1334 label: &[u8],
1335 context: Option<&[u8]>,
1336 ) -> Result<(), Error> {
1337 self.secrets
1338 .export_keying_material(output, label, context);
1339 Ok(())
1340 }
1341
1342 fn extract_secrets(&self) -> Result<PartiallyExtractedSecrets, Error> {
1343 self.secrets
1344 .extract_secrets(Side::Client)
1345 }
1346
1347 fn into_external_state(self: Box<Self>) -> Result<Box<dyn KernelState + 'static>, Error> {
1348 Ok(self)
1349 }
1350
1351 fn into_owned(self: Box<Self>) -> hs::NextState<'static> {
1352 self
1353 }
1354}
1355
1356impl KernelState for ExpectTraffic {
1357 fn update_secrets(&mut self, _: Direction) -> Result<ConnectionTrafficSecrets, Error> {
1358 Err(Error::General(
1359 "TLS 1.2 connections do not support traffic secret updates".into(),
1360 ))
1361 }
1362
1363 fn handle_new_session_ticket(
1364 &mut self,
1365 _cx: &mut KernelContext<'_>,
1366 _message: &NewSessionTicketPayloadTls13,
1367 ) -> Result<(), Error> {
1368 Err(Error::General(
1369 "TLS 1.2 session tickets may not be sent once the handshake has completed".into(),
1370 ))
1371 }
1372}