rustls/client/
tls12.rs

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            // Look for TLS1.3 downgrade signal in server random
70            // both the server random and TLS12_DOWNGRADE_SENTINEL are
71            // public values and don't require constant time comparison
72            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            // Doing EMS?
83            self.using_ems = server_hello.ems_support_acked();
84
85            // Might the server send a ticket?
86            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            // Might the server send a CertificateStatus between Certificate and
97            // ServerKeyExchange?
98            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            // Save any sent SCTs for verification against the certificate.
106            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            // See if we're successfully resuming.
118            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                    // Is the server telling lies about the ciphersuite?
123                    if resuming.suite() != suite {
124                        return Err(PeerMisbehaved::ResumptionOfferedWithVariedCipherSuite.into());
125                    }
126
127                    // And about EMS support?
128                    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                    // Since we're resuming, we verified the certificate and
143                    // proof of possession in the prior session.
144                    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        // Save the signature and signed parameters for later verification.
417        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
547// --- Either a CertificateRequest, or a ServerHelloDone. ---
548// Existence of the CertificateRequest tells us the server is asking for
549// client auth.  Otherwise we go straight to ServerHelloDone.
550struct 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        // The RFC jovially describes the design here as 'somewhat complicated'
641        // and 'somewhat underspecified'.  So thanks for that.
642        //
643        // We ignore certreq.certtypes as a result, since the information it contains
644        // is entirely duplicated in certreq.sigschemes.
645
646        const NO_CONTEXT: Option<Vec<u8>> = None; // TLS 1.2 doesn't use a context.
647        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        // 1. Verify the cert chain.
719        // 2. Verify any SCTs provided with the certificate.
720        // 3. Verify that the top certificate signed their kx.
721        // 4. If doing client auth, send our Certificate.
722        // 5. Complete the key exchange:
723        //    a) generate our kx pair
724        //    b) emit a ClientKeyExchange containing it
725        //    c) if doing client auth, emit a CertificateVerify
726        //    d) emit a CCS
727        //    e) derive the shared keys, and start encryption
728        // 6. emit a Finished, our first encrypted message under the new keys.
729
730        // 1.
731        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        // 3.
754        // Build up the contents of the signed message.
755        // It's ClientHello.random || ServerHello.random || ServerKeyExchange.params
756        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            // Check the signature is compatible with the ciphersuite.
763            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        // 4.
785        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        // 5a.
794        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        // 5b.
804        let mut transcript = st.transcript;
805        emit_clientkx(&mut transcript, cx.common, &kx.pubkey);
806        // nb. EMS handshake hash only runs up to ClientKeyExchange.
807        let ems_seed = st
808            .using_ems
809            .then(|| transcript.get_current_hash());
810
811        // 5c.
812        if let Some(ClientAuthDetails::Verify { signer, .. }) = &st.client_auth {
813            emit_certverify(&mut transcript, signer.as_ref(), cx.common)?;
814        }
815
816        // 5d.
817        emit_ccs(cx.common);
818
819        // 5e. Now commit secrets.
820        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        // 6.
840        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
916// -- Waiting for their CCS --
917struct 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        // CCS should not be received interleaved with fragmented handshake-level
943        // message.
944        cx.common.check_aligned_handshake()?;
945
946        // nb. msgs layer validates trivial contents of CCS
947        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    // -- Waiting for their finished --
983    fn save_session(&mut self, cx: &ClientContext<'_>) {
984        // Save a ticket.  If we got a new ticket, save that.  Otherwise, save the
985        // original ticket again.
986        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        // Work out what verify_data we expect.
1041        let vh = st.transcript.get_current_hash();
1042        let expect_verify_data = st.secrets.server_verify_data(&vh);
1043
1044        // Constant-time verification of this is relatively unimportant: they only
1045        // get one chance.  But it can't hurt.
1046        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        // Hash this message too.
1055        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    // we could not decrypt the encrypted handshake message with session resumption
1077    // this might mean that the ticket was invalid for some reason, so we remove it
1078    // from the store to restart a session from scratch
1079    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
1089// -- Traffic transit state --
1090struct 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}