rustls/client/
tls12.rs

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        // Save the signature and signed parameters for later verification.
202        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
327// --- Either a CertificateRequest, or a ServerHelloDone. ---
328// Existence of the CertificateRequest tells us the server is asking for
329// client auth.  Otherwise we go straight to ServerHelloDone.
330struct 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        // The RFC jovially describes the design here as 'somewhat complicated'
368        // and 'somewhat underspecified'.  So thanks for that.
369        //
370        // We ignore certreq.certtypes as a result, since the information it contains
371        // is entirely duplicated in certreq.sigschemes.
372
373        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        // 1. Verify the cert chain.
511        // 2. Verify any SCTs provided with the certificate.
512        // 3. Verify that the top certificate signed their kx.
513        // 4. If doing client auth, send our Certificate.
514        // 5. Complete the key exchange:
515        //    a) generate our kx pair
516        //    b) emit a ClientKeyExchange containing it
517        //    c) if doing client auth, emit a CertificateVerify
518        //    d) emit a CCS
519        //    e) derive the shared keys, and start encryption
520        // 6. emit a Finished, our first encrypted message under the new keys.
521
522        // 1.
523        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        // 2. Verify any included SCTs.
539        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        // 3.
547        // Build up the contents of the signed message.
548        // It's ClientHello.random || ServerHello.random || ServerKeyExchange.params
549        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            // Check the signature is compatible with the ciphersuite.
556            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        // 4.
575        if st.client_auth.is_some() {
576            emit_certificate(&mut st.handshake, st.client_auth.as_mut().unwrap(), sess);
577        }
578
579        // 5a.
580        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        // 5b.
587        emit_clientkx(&mut st.handshake, sess, &kxd);
588        // nb. EMS handshake hash only runs up to ClientKeyExchange.
589        let handshake_hash = st
590            .handshake
591            .transcript
592            .get_current_hash();
593
594        // 5c.
595        if st.client_auth.is_some() {
596            emit_certverify(&mut st.handshake, st.client_auth.as_mut().unwrap(), sess)?;
597        }
598
599        // 5d.
600        emit_ccs(sess);
601
602        // 5e. Now commit secrets.
603        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        // 6.
629        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
639// -- Waiting for their CCS --
640pub 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        // CCS should not be received interleaved with fragmented handshake-level
666        // message.
667        hs::check_aligned_handshake(sess)?;
668
669        // nb. msgs layer validates trivial contents of CCS
670        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
719// -- Waiting for their finished --
720fn save_session(
721    secrets: &SessionSecrets,
722    handshake: &mut HandshakeDetails,
723    recvd_ticket: &mut ReceivedTicketDetails,
724    sess: &mut ClientSessionImpl,
725) {
726    // Save a ticket.  If we got a new ticket, save that.  Otherwise, save the
727    // original ticket again.
728    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        // Work out what verify_data we expect.
801        let vh = st
802            .handshake
803            .transcript
804            .get_current_hash();
805        let expect_verify_data = st.secrets.server_verify_data(&vh);
806
807        // Constant-time verification of this is relatively unimportant: they only
808        // get one chance.  But it can't hurt.
809        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        // Hash this message too.
818        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
835// -- Traffic transit state --
836struct 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}