1use crate::check::check_message;
2use crate::client::ClientSessionImpl;
3use crate::error::TLSError;
4#[cfg(feature = "logging")]
5use crate::log::{debug, trace};
6use crate::msgs::base::{Payload, PayloadU8};
7use crate::msgs::ccs::ChangeCipherSpecPayload;
8use crate::msgs::codec::Codec;
9use crate::msgs::enums::{AlertDescription, ProtocolVersion};
10use crate::msgs::enums::{ContentType, HandshakeType};
11use crate::msgs::handshake::DecomposedSignatureScheme;
12use crate::msgs::handshake::DigitallySignedStruct;
13use crate::msgs::handshake::ServerKeyExchangePayload;
14use crate::msgs::handshake::{HandshakeMessagePayload, HandshakePayload};
15use crate::msgs::message::{Message, MessagePayload};
16use crate::msgs::persist;
17use crate::session::SessionSecrets;
18use crate::suites;
19use crate::ticketer;
20use crate::verify;
21
22use crate::client::common::{ClientAuthDetails, ReceivedTicketDetails};
23use crate::client::common::{HandshakeDetails, ServerCertDetails, ServerKXDetails};
24use crate::client::hs;
25
26use ring::constant_time;
27use std::mem;
28
29pub struct ExpectCertificate {
30 pub handshake: HandshakeDetails,
31 pub server_cert: ServerCertDetails,
32 pub may_send_cert_status: bool,
33 pub must_issue_new_ticket: bool,
34}
35
36impl ExpectCertificate {
37 fn into_expect_certificate_status_or_server_kx(self) -> hs::NextState {
38 Box::new(ExpectCertificateStatusOrServerKX {
39 handshake: self.handshake,
40 server_cert: self.server_cert,
41 must_issue_new_ticket: self.must_issue_new_ticket,
42 })
43 }
44
45 fn into_expect_server_kx(self) -> hs::NextState {
46 Box::new(ExpectServerKX {
47 handshake: self.handshake,
48 server_cert: self.server_cert,
49 must_issue_new_ticket: self.must_issue_new_ticket,
50 })
51 }
52}
53
54impl hs::State for ExpectCertificate {
55 fn handle(
56 mut self: Box<Self>,
57 _sess: &mut ClientSessionImpl,
58 m: Message,
59 ) -> hs::NextStateOrError {
60 let cert_chain =
61 require_handshake_msg!(m, HandshakeType::Certificate, HandshakePayload::Certificate)?;
62 self.handshake
63 .transcript
64 .add_message(&m);
65
66 self.server_cert.cert_chain = cert_chain.clone();
67
68 if self.may_send_cert_status {
69 Ok(self.into_expect_certificate_status_or_server_kx())
70 } else {
71 Ok(self.into_expect_server_kx())
72 }
73 }
74}
75
76struct ExpectCertificateStatus {
77 handshake: HandshakeDetails,
78 server_cert: ServerCertDetails,
79 must_issue_new_ticket: bool,
80}
81
82impl ExpectCertificateStatus {
83 fn into_expect_server_kx(self) -> hs::NextState {
84 Box::new(ExpectServerKX {
85 handshake: self.handshake,
86 server_cert: self.server_cert,
87 must_issue_new_ticket: self.must_issue_new_ticket,
88 })
89 }
90}
91
92impl hs::State for ExpectCertificateStatus {
93 fn handle(
94 mut self: Box<Self>,
95 _sess: &mut ClientSessionImpl,
96 m: Message,
97 ) -> hs::NextStateOrError {
98 self.handshake
99 .transcript
100 .add_message(&m);
101 let mut status = require_handshake_msg_mut!(
102 m,
103 HandshakeType::CertificateStatus,
104 HandshakePayload::CertificateStatus
105 )?;
106
107 self.server_cert.ocsp_response = status.take_ocsp_response();
108 trace!(
109 "Server stapled OCSP response is {:?}",
110 self.server_cert.ocsp_response
111 );
112 Ok(self.into_expect_server_kx())
113 }
114}
115
116struct ExpectCertificateStatusOrServerKX {
117 handshake: HandshakeDetails,
118 server_cert: ServerCertDetails,
119 must_issue_new_ticket: bool,
120}
121
122impl ExpectCertificateStatusOrServerKX {
123 fn into_expect_server_kx(self) -> hs::NextState {
124 Box::new(ExpectServerKX {
125 handshake: self.handshake,
126 server_cert: self.server_cert,
127 must_issue_new_ticket: self.must_issue_new_ticket,
128 })
129 }
130
131 fn into_expect_certificate_status(self) -> hs::NextState {
132 Box::new(ExpectCertificateStatus {
133 handshake: self.handshake,
134 server_cert: self.server_cert,
135 must_issue_new_ticket: self.must_issue_new_ticket,
136 })
137 }
138}
139
140impl hs::State for ExpectCertificateStatusOrServerKX {
141 fn handle(self: Box<Self>, sess: &mut ClientSessionImpl, m: Message) -> hs::NextStateOrError {
142 check_message(
143 &m,
144 &[ContentType::Handshake],
145 &[
146 HandshakeType::ServerKeyExchange,
147 HandshakeType::CertificateStatus,
148 ],
149 )?;
150 if m.is_handshake_type(HandshakeType::ServerKeyExchange) {
151 self.into_expect_server_kx()
152 .handle(sess, m)
153 } else {
154 self.into_expect_certificate_status()
155 .handle(sess, m)
156 }
157 }
158}
159
160struct ExpectServerKX {
161 handshake: HandshakeDetails,
162 server_cert: ServerCertDetails,
163 must_issue_new_ticket: bool,
164}
165
166impl ExpectServerKX {
167 fn into_expect_server_done_or_certreq(self, skx: ServerKXDetails) -> hs::NextState {
168 Box::new(ExpectServerDoneOrCertReq {
169 handshake: self.handshake,
170 server_cert: self.server_cert,
171 server_kx: skx,
172 must_issue_new_ticket: self.must_issue_new_ticket,
173 })
174 }
175}
176
177impl hs::State for ExpectServerKX {
178 fn handle(
179 mut self: Box<Self>,
180 sess: &mut ClientSessionImpl,
181 m: Message,
182 ) -> hs::NextStateOrError {
183 let opaque_kx = require_handshake_msg!(
184 m,
185 HandshakeType::ServerKeyExchange,
186 HandshakePayload::ServerKeyExchange
187 )?;
188 let maybe_decoded_kx = opaque_kx.unwrap_given_kxa(&sess.common.get_suite_assert().kx);
189 self.handshake
190 .transcript
191 .add_message(&m);
192
193 if maybe_decoded_kx.is_none() {
194 sess.common
195 .send_fatal_alert(AlertDescription::DecodeError);
196 return Err(TLSError::CorruptMessagePayload(ContentType::Handshake));
197 }
198
199 let decoded_kx = maybe_decoded_kx.unwrap();
200
201 let mut kx_params = Vec::new();
203 decoded_kx.encode_params(&mut kx_params);
204 let skx = ServerKXDetails::new(kx_params, decoded_kx.get_sig().unwrap());
205
206 #[cfg_attr(not(feature = "logging"), allow(unused_variables))]
207 {
208 if let ServerKeyExchangePayload::ECDHE(ecdhe) = decoded_kx {
209 debug!("ECDHE curve is {:?}", ecdhe.params.curve_params);
210 }
211 }
212
213 Ok(self.into_expect_server_done_or_certreq(skx))
214 }
215}
216
217fn emit_certificate(
218 handshake: &mut HandshakeDetails,
219 client_auth: &mut ClientAuthDetails,
220 sess: &mut ClientSessionImpl,
221) {
222 let chosen_cert = client_auth.cert.take();
223
224 let cert = Message {
225 typ: ContentType::Handshake,
226 version: ProtocolVersion::TLSv1_2,
227 payload: MessagePayload::Handshake(HandshakeMessagePayload {
228 typ: HandshakeType::Certificate,
229 payload: HandshakePayload::Certificate(chosen_cert.unwrap_or_else(Vec::new)),
230 }),
231 };
232
233 handshake.transcript.add_message(&cert);
234 sess.common.send_msg(cert, false);
235}
236
237fn emit_clientkx(
238 handshake: &mut HandshakeDetails,
239 sess: &mut ClientSessionImpl,
240 kxd: &suites::KeyExchangeResult,
241) {
242 let mut buf = Vec::new();
243 let ecpoint = PayloadU8::new(Vec::from(kxd.pubkey.as_ref()));
244 ecpoint.encode(&mut buf);
245 let pubkey = Payload::new(buf);
246
247 let ckx = Message {
248 typ: ContentType::Handshake,
249 version: ProtocolVersion::TLSv1_2,
250 payload: MessagePayload::Handshake(HandshakeMessagePayload {
251 typ: HandshakeType::ClientKeyExchange,
252 payload: HandshakePayload::ClientKeyExchange(pubkey),
253 }),
254 };
255
256 handshake.transcript.add_message(&ckx);
257 sess.common.send_msg(ckx, false);
258}
259
260fn emit_certverify(
261 handshake: &mut HandshakeDetails,
262 client_auth: &mut ClientAuthDetails,
263 sess: &mut ClientSessionImpl,
264) -> Result<(), TLSError> {
265 if client_auth.signer.is_none() {
266 trace!("Not sending CertificateVerify, no key");
267 handshake
268 .transcript
269 .abandon_client_auth();
270 return Ok(());
271 }
272
273 let message = handshake
274 .transcript
275 .take_handshake_buf();
276 let signer = client_auth.signer.take().unwrap();
277 let scheme = signer.get_scheme();
278 let sig = signer.sign(&message)?;
279 let body = DigitallySignedStruct::new(scheme, sig);
280
281 let m = Message {
282 typ: ContentType::Handshake,
283 version: ProtocolVersion::TLSv1_2,
284 payload: MessagePayload::Handshake(HandshakeMessagePayload {
285 typ: HandshakeType::CertificateVerify,
286 payload: HandshakePayload::CertificateVerify(body),
287 }),
288 };
289
290 handshake.transcript.add_message(&m);
291 sess.common.send_msg(m, false);
292 Ok(())
293}
294
295fn emit_ccs(sess: &mut ClientSessionImpl) {
296 let ccs = Message {
297 typ: ContentType::ChangeCipherSpec,
298 version: ProtocolVersion::TLSv1_2,
299 payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
300 };
301
302 sess.common.send_msg(ccs, false);
303}
304
305fn emit_finished(
306 secrets: &SessionSecrets,
307 handshake: &mut HandshakeDetails,
308 sess: &mut ClientSessionImpl,
309) {
310 let vh = handshake.transcript.get_current_hash();
311 let verify_data = secrets.client_verify_data(&vh);
312 let verify_data_payload = Payload::new(verify_data);
313
314 let f = Message {
315 typ: ContentType::Handshake,
316 version: ProtocolVersion::TLSv1_2,
317 payload: MessagePayload::Handshake(HandshakeMessagePayload {
318 typ: HandshakeType::Finished,
319 payload: HandshakePayload::Finished(verify_data_payload),
320 }),
321 };
322
323 handshake.transcript.add_message(&f);
324 sess.common.send_msg(f, true);
325}
326
327struct ExpectCertificateRequest {
331 handshake: HandshakeDetails,
332 server_cert: ServerCertDetails,
333 server_kx: ServerKXDetails,
334 must_issue_new_ticket: bool,
335}
336
337impl ExpectCertificateRequest {
338 fn into_expect_server_done(self, client_auth: ClientAuthDetails) -> hs::NextState {
339 Box::new(ExpectServerDone {
340 handshake: self.handshake,
341 server_cert: self.server_cert,
342 server_kx: self.server_kx,
343 client_auth: Some(client_auth),
344 must_issue_new_ticket: self.must_issue_new_ticket,
345 })
346 }
347}
348
349impl hs::State for ExpectCertificateRequest {
350 fn handle(
351 mut self: Box<Self>,
352 sess: &mut ClientSessionImpl,
353 m: Message,
354 ) -> hs::NextStateOrError {
355 let certreq = require_handshake_msg!(
356 m,
357 HandshakeType::CertificateRequest,
358 HandshakePayload::CertificateRequest
359 )?;
360 self.handshake
361 .transcript
362 .add_message(&m);
363 debug!("Got CertificateRequest {:?}", certreq);
364
365 let mut client_auth = ClientAuthDetails::new();
366
367 let canames = certreq
374 .canames
375 .iter()
376 .map(|p| p.0.as_slice())
377 .collect::<Vec<&[u8]>>();
378 let maybe_certkey = sess
379 .config
380 .client_auth_cert_resolver
381 .resolve(&canames, &certreq.sigschemes);
382
383 if let Some(mut certkey) = maybe_certkey {
384 let maybe_signer = certkey
385 .key
386 .choose_scheme(&certreq.sigschemes);
387
388 if let Some(_) = &maybe_signer {
389 debug!("Attempting client auth");
390 client_auth.cert = Some(certkey.take_cert());
391 }
392 client_auth.signer = maybe_signer;
393 } else {
394 debug!("Client auth requested but no cert/sigscheme available");
395 }
396
397 Ok(self.into_expect_server_done(client_auth))
398 }
399}
400
401struct ExpectServerDoneOrCertReq {
402 handshake: HandshakeDetails,
403 server_cert: ServerCertDetails,
404 server_kx: ServerKXDetails,
405 must_issue_new_ticket: bool,
406}
407
408impl ExpectServerDoneOrCertReq {
409 fn into_expect_certificate_req(self) -> hs::NextState {
410 Box::new(ExpectCertificateRequest {
411 handshake: self.handshake,
412 server_cert: self.server_cert,
413 server_kx: self.server_kx,
414 must_issue_new_ticket: self.must_issue_new_ticket,
415 })
416 }
417
418 fn into_expect_server_done(self) -> hs::NextState {
419 Box::new(ExpectServerDone {
420 handshake: self.handshake,
421 server_cert: self.server_cert,
422 server_kx: self.server_kx,
423 client_auth: None,
424 must_issue_new_ticket: self.must_issue_new_ticket,
425 })
426 }
427}
428
429impl hs::State for ExpectServerDoneOrCertReq {
430 fn handle(
431 mut self: Box<Self>,
432 sess: &mut ClientSessionImpl,
433 m: Message,
434 ) -> hs::NextStateOrError {
435 if require_handshake_msg!(
436 m,
437 HandshakeType::CertificateRequest,
438 HandshakePayload::CertificateRequest
439 )
440 .is_ok()
441 {
442 self.into_expect_certificate_req()
443 .handle(sess, m)
444 } else {
445 self.handshake
446 .transcript
447 .abandon_client_auth();
448 self.into_expect_server_done()
449 .handle(sess, m)
450 }
451 }
452}
453
454struct ExpectServerDone {
455 handshake: HandshakeDetails,
456 server_cert: ServerCertDetails,
457 server_kx: ServerKXDetails,
458 client_auth: Option<ClientAuthDetails>,
459 must_issue_new_ticket: bool,
460}
461
462impl ExpectServerDone {
463 fn into_expect_new_ticket(
464 self,
465 secrets: SessionSecrets,
466 certv: verify::ServerCertVerified,
467 sigv: verify::HandshakeSignatureValid,
468 ) -> hs::NextState {
469 Box::new(ExpectNewTicket {
470 secrets,
471 handshake: self.handshake,
472 resuming: false,
473 cert_verified: certv,
474 sig_verified: sigv,
475 })
476 }
477
478 fn into_expect_ccs(
479 self,
480 secrets: SessionSecrets,
481 certv: verify::ServerCertVerified,
482 sigv: verify::HandshakeSignatureValid,
483 ) -> hs::NextState {
484 Box::new(ExpectCCS {
485 secrets,
486 handshake: self.handshake,
487 ticket: ReceivedTicketDetails::new(),
488 resuming: false,
489 cert_verified: certv,
490 sig_verified: sigv,
491 })
492 }
493}
494
495impl hs::State for ExpectServerDone {
496 fn handle(self: Box<Self>, sess: &mut ClientSessionImpl, m: Message) -> hs::NextStateOrError {
497 let mut st = *self;
498 check_message(
499 &m,
500 &[ContentType::Handshake],
501 &[HandshakeType::ServerHelloDone],
502 )?;
503 st.handshake.transcript.add_message(&m);
504
505 hs::check_aligned_handshake(sess)?;
506
507 trace!("Server cert is {:?}", st.server_cert.cert_chain);
508 debug!("Server DNS name is {:?}", st.handshake.dns_name);
509
510 if st.server_cert.cert_chain.is_empty() {
524 return Err(TLSError::NoCertificatesPresented);
525 }
526
527 let certv = sess
528 .config
529 .get_verifier()
530 .verify_server_cert(
531 &sess.config.root_store,
532 &st.server_cert.cert_chain,
533 st.handshake.dns_name.as_ref(),
534 &st.server_cert.ocsp_response,
535 )
536 .map_err(|err| hs::send_cert_error_alert(sess, err))?;
537
538 match (st.server_cert.scts.as_ref(), sess.config.ct_logs) {
540 (Some(scts), Some(logs)) => {
541 verify::verify_scts(&st.server_cert.cert_chain[0], scts, logs)?;
542 }
543 (_, _) => {}
544 }
545
546 let sigv = {
550 let mut message = Vec::new();
551 message.extend_from_slice(&st.handshake.randoms.client);
552 message.extend_from_slice(&st.handshake.randoms.server);
553 message.extend_from_slice(&st.server_kx.kx_params);
554
555 let sig = &st.server_kx.kx_sig;
557 let scs = sess.common.get_suite_assert();
558 if !scs.usable_for_sigalg(sig.scheme.sign()) {
559 let error_message = format!(
560 "peer signed kx with wrong algorithm (got {:?} expect {:?})",
561 sig.scheme.sign(),
562 scs.sign
563 );
564 return Err(TLSError::PeerMisbehavedError(error_message));
565 }
566
567 sess.config
568 .get_verifier()
569 .verify_tls12_signature(&message, &st.server_cert.cert_chain[0], sig)
570 .map_err(|err| hs::send_cert_error_alert(sess, err))?
571 };
572 sess.server_cert_chain = st.server_cert.take_chain();
573
574 if st.client_auth.is_some() {
576 emit_certificate(&mut st.handshake, st.client_auth.as_mut().unwrap(), sess);
577 }
578
579 let kxd = sess
581 .common
582 .get_suite_assert()
583 .do_client_kx(&st.server_kx.kx_params)
584 .ok_or_else(|| TLSError::PeerMisbehavedError("key exchange failed".to_string()))?;
585
586 emit_clientkx(&mut st.handshake, sess, &kxd);
588 let handshake_hash = st
590 .handshake
591 .transcript
592 .get_current_hash();
593
594 if st.client_auth.is_some() {
596 emit_certverify(&mut st.handshake, st.client_auth.as_mut().unwrap(), sess)?;
597 }
598
599 emit_ccs(sess);
601
602 let hashalg = sess
604 .common
605 .get_suite_assert()
606 .get_hash();
607 let secrets = if st.handshake.using_ems {
608 SessionSecrets::new_ems(
609 &st.handshake.randoms,
610 &handshake_hash,
611 hashalg,
612 &kxd.shared_secret,
613 )
614 } else {
615 SessionSecrets::new(&st.handshake.randoms, hashalg, &kxd.shared_secret)
616 };
617 sess.config.key_log.log(
618 "CLIENT_RANDOM",
619 &secrets.randoms.client,
620 &secrets.master_secret,
621 );
622 sess.common
623 .start_encryption_tls12(&secrets);
624 sess.common
625 .record_layer
626 .start_encrypting();
627
628 emit_finished(&secrets, &mut st.handshake, sess);
630
631 if st.must_issue_new_ticket {
632 Ok(st.into_expect_new_ticket(secrets, certv, sigv))
633 } else {
634 Ok(st.into_expect_ccs(secrets, certv, sigv))
635 }
636 }
637}
638
639pub struct ExpectCCS {
641 pub secrets: SessionSecrets,
642 pub handshake: HandshakeDetails,
643 pub ticket: ReceivedTicketDetails,
644 pub resuming: bool,
645 pub cert_verified: verify::ServerCertVerified,
646 pub sig_verified: verify::HandshakeSignatureValid,
647}
648
649impl ExpectCCS {
650 fn into_expect_finished(self) -> hs::NextState {
651 Box::new(ExpectFinished {
652 secrets: self.secrets,
653 handshake: self.handshake,
654 ticket: self.ticket,
655 resuming: self.resuming,
656 cert_verified: self.cert_verified,
657 sig_verified: self.sig_verified,
658 })
659 }
660}
661
662impl hs::State for ExpectCCS {
663 fn handle(self: Box<Self>, sess: &mut ClientSessionImpl, m: Message) -> hs::NextStateOrError {
664 check_message(&m, &[ContentType::ChangeCipherSpec], &[])?;
665 hs::check_aligned_handshake(sess)?;
668
669 sess.common
671 .record_layer
672 .start_decrypting();
673
674 Ok(self.into_expect_finished())
675 }
676}
677
678pub struct ExpectNewTicket {
679 pub secrets: SessionSecrets,
680 pub handshake: HandshakeDetails,
681 pub resuming: bool,
682 pub cert_verified: verify::ServerCertVerified,
683 pub sig_verified: verify::HandshakeSignatureValid,
684}
685
686impl ExpectNewTicket {
687 fn into_expect_ccs(self, ticket: ReceivedTicketDetails) -> hs::NextState {
688 Box::new(ExpectCCS {
689 secrets: self.secrets,
690 handshake: self.handshake,
691 ticket,
692 resuming: self.resuming,
693 cert_verified: self.cert_verified,
694 sig_verified: self.sig_verified,
695 })
696 }
697}
698
699impl hs::State for ExpectNewTicket {
700 fn handle(
701 mut self: Box<Self>,
702 _sess: &mut ClientSessionImpl,
703 m: Message,
704 ) -> hs::NextStateOrError {
705 self.handshake
706 .transcript
707 .add_message(&m);
708
709 let nst = require_handshake_msg_mut!(
710 m,
711 HandshakeType::NewSessionTicket,
712 HandshakePayload::NewSessionTicket
713 )?;
714 let recvd = ReceivedTicketDetails::from(nst.ticket.0, nst.lifetime_hint);
715 Ok(self.into_expect_ccs(recvd))
716 }
717}
718
719fn save_session(
721 secrets: &SessionSecrets,
722 handshake: &mut HandshakeDetails,
723 recvd_ticket: &mut ReceivedTicketDetails,
724 sess: &mut ClientSessionImpl,
725) {
726 let mut ticket = mem::replace(&mut recvd_ticket.new_ticket, Vec::new());
729 if ticket.is_empty() && handshake.resuming_session.is_some() {
730 ticket = handshake
731 .resuming_session
732 .as_mut()
733 .unwrap()
734 .take_ticket();
735 }
736
737 if handshake.session_id.is_empty() && ticket.is_empty() {
738 debug!("Session not saved: server didn't allocate id or ticket");
739 return;
740 }
741
742 let key = persist::ClientSessionKey::session_for_dns_name(handshake.dns_name.as_ref());
743
744 let scs = sess.common.get_suite_assert();
745 let master_secret = secrets.get_master_secret();
746 let version = sess.get_protocol_version().unwrap();
747 let mut value = persist::ClientSessionValue::new(
748 version,
749 scs.suite,
750 &handshake.session_id,
751 ticket,
752 master_secret,
753 &sess.server_cert_chain,
754 );
755 value.set_times(ticketer::timebase(), recvd_ticket.new_ticket_lifetime, 0);
756 if handshake.using_ems {
757 value.set_extended_ms_used();
758 }
759
760 let worked = sess
761 .config
762 .session_persistence
763 .put(key.get_encoding(), value.get_encoding());
764
765 if worked {
766 debug!("Session saved");
767 } else {
768 debug!("Session not saved");
769 }
770}
771
772struct ExpectFinished {
773 handshake: HandshakeDetails,
774 ticket: ReceivedTicketDetails,
775 secrets: SessionSecrets,
776 resuming: bool,
777 cert_verified: verify::ServerCertVerified,
778 sig_verified: verify::HandshakeSignatureValid,
779}
780
781impl ExpectFinished {
782 fn into_expect_traffic(self, fin: verify::FinishedMessageVerified) -> hs::NextState {
783 Box::new(ExpectTraffic {
784 secrets: self.secrets,
785 _cert_verified: self.cert_verified,
786 _sig_verified: self.sig_verified,
787 _fin_verified: fin,
788 })
789 }
790}
791
792impl hs::State for ExpectFinished {
793 fn handle(self: Box<Self>, sess: &mut ClientSessionImpl, m: Message) -> hs::NextStateOrError {
794 let mut st = *self;
795 let finished =
796 require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
797
798 hs::check_aligned_handshake(sess)?;
799
800 let vh = st
802 .handshake
803 .transcript
804 .get_current_hash();
805 let expect_verify_data = st.secrets.server_verify_data(&vh);
806
807 let fin = constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0)
810 .map_err(|_| {
811 sess.common
812 .send_fatal_alert(AlertDescription::DecryptError);
813 TLSError::DecryptError
814 })
815 .map(|_| verify::FinishedMessageVerified::assertion())?;
816
817 st.handshake.transcript.add_message(&m);
819
820 save_session(&st.secrets, &mut st.handshake, &mut st.ticket, sess);
821
822 if st.resuming {
823 emit_ccs(sess);
824 sess.common
825 .record_layer
826 .start_encrypting();
827 emit_finished(&st.secrets, &mut st.handshake, sess);
828 }
829
830 sess.common.start_traffic();
831 Ok(st.into_expect_traffic(fin))
832 }
833}
834
835struct ExpectTraffic {
837 secrets: SessionSecrets,
838 _cert_verified: verify::ServerCertVerified,
839 _sig_verified: verify::HandshakeSignatureValid,
840 _fin_verified: verify::FinishedMessageVerified,
841}
842
843impl hs::State for ExpectTraffic {
844 fn handle(
845 self: Box<Self>,
846 sess: &mut ClientSessionImpl,
847 mut m: Message,
848 ) -> hs::NextStateOrError {
849 check_message(&m, &[ContentType::ApplicationData], &[])?;
850 sess.common
851 .take_received_plaintext(m.take_opaque_payload().unwrap());
852 Ok(self)
853 }
854
855 fn export_keying_material(
856 &self,
857 output: &mut [u8],
858 label: &[u8],
859 context: Option<&[u8]>,
860 ) -> Result<(), TLSError> {
861 self.secrets
862 .export_keying_material(output, label, context);
863 Ok(())
864 }
865}