rustls/server/
hs.rs

1use crate::error::TLSError;
2#[cfg(feature = "logging")]
3use crate::log::{debug, trace};
4use crate::msgs::codec::Codec;
5use crate::msgs::enums::{AlertDescription, ExtensionType};
6use crate::msgs::enums::{CipherSuite, Compression, ECPointFormat, NamedGroup};
7use crate::msgs::enums::{ClientCertificateType, SignatureScheme};
8use crate::msgs::enums::{ContentType, HandshakeType, ProtocolVersion};
9use crate::msgs::handshake::CertificateRequestPayload;
10use crate::msgs::handshake::CertificateStatus;
11use crate::msgs::handshake::ClientExtension;
12use crate::msgs::handshake::{ClientHelloPayload, ServerExtension, SessionID};
13use crate::msgs::handshake::{ConvertProtocolNameList, ConvertServerNameList};
14use crate::msgs::handshake::{DigitallySignedStruct, ServerECDHParams};
15use crate::msgs::handshake::{ECDHEServerKeyExchange, ServerKeyExchangePayload};
16use crate::msgs::handshake::{ECPointFormatList, SupportedPointFormats};
17use crate::msgs::handshake::{HandshakeMessagePayload, Random, ServerHelloPayload};
18use crate::msgs::handshake::{HandshakePayload, SupportedSignatureSchemes};
19use crate::msgs::message::{Message, MessagePayload};
20use crate::msgs::persist;
21use crate::rand;
22use crate::server::{ClientHello, ServerConfig, ServerSessionImpl};
23#[cfg(feature = "quic")]
24use crate::session::Protocol;
25use crate::session::SessionSecrets;
26use crate::sign;
27use crate::suites;
28use webpki;
29
30use crate::server::common::{HandshakeDetails, ServerKXDetails};
31use crate::server::{tls12, tls13};
32
33pub type NextState = Box<dyn State + Send + Sync>;
34pub type NextStateOrError = Result<NextState, TLSError>;
35
36pub trait State {
37    fn handle(self: Box<Self>, sess: &mut ServerSessionImpl, m: Message) -> NextStateOrError;
38
39    fn export_keying_material(
40        &self,
41        _output: &mut [u8],
42        _label: &[u8],
43        _context: Option<&[u8]>,
44    ) -> Result<(), TLSError> {
45        Err(TLSError::HandshakeNotComplete)
46    }
47
48    fn perhaps_write_key_update(&mut self, _sess: &mut ServerSessionImpl) {}
49}
50
51pub fn incompatible(sess: &mut ServerSessionImpl, why: &str) -> TLSError {
52    sess.common
53        .send_fatal_alert(AlertDescription::HandshakeFailure);
54    TLSError::PeerIncompatibleError(why.to_string())
55}
56
57fn bad_version(sess: &mut ServerSessionImpl, why: &str) -> TLSError {
58    sess.common
59        .send_fatal_alert(AlertDescription::ProtocolVersion);
60    TLSError::PeerIncompatibleError(why.to_string())
61}
62
63pub fn illegal_param(sess: &mut ServerSessionImpl, why: &str) -> TLSError {
64    sess.common
65        .send_fatal_alert(AlertDescription::IllegalParameter);
66    TLSError::PeerMisbehavedError(why.to_string())
67}
68
69pub fn decode_error(sess: &mut ServerSessionImpl, why: &str) -> TLSError {
70    sess.common
71        .send_fatal_alert(AlertDescription::DecodeError);
72    TLSError::PeerMisbehavedError(why.to_string())
73}
74
75pub fn can_resume(
76    sess: &ServerSessionImpl,
77    handshake: &HandshakeDetails,
78    resumedata: &Option<persist::ServerSessionValue>,
79) -> bool {
80    // The RFCs underspecify what happens if we try to resume to
81    // an unoffered/varying suite.  We merely don't resume in weird cases.
82    //
83    // RFC 6066 says "A server that implements this extension MUST NOT accept
84    // the request to resume the session if the server_name extension contains
85    // a different name. Instead, it proceeds with a full handshake to
86    // establish a new session."
87
88    if let Some(ref resume) = *resumedata {
89        resume.cipher_suite == sess.common.get_suite_assert().suite
90            && (resume.extended_ms == handshake.using_ems
91                || (resume.extended_ms && !handshake.using_ems))
92            && same_dns_name_or_both_none(resume.sni.as_ref(), sess.sni.as_ref())
93    } else {
94        false
95    }
96}
97
98// Require an exact match for the purpose of comparing SNI DNS Names from two
99// client hellos, even though a case-insensitive comparison might also be OK.
100fn same_dns_name_or_both_none(a: Option<&webpki::DNSName>, b: Option<&webpki::DNSName>) -> bool {
101    match (a, b) {
102        (Some(a), Some(b)) => {
103            let a: &str = a.as_ref().into();
104            let b: &str = b.as_ref().into();
105            a == b
106        }
107        (None, None) => true,
108        _ => false,
109    }
110}
111
112// Changing the keys must not span any fragmented handshake
113// messages.  Otherwise the defragmented messages will have
114// been protected with two different record layer protections,
115// which is illegal.  Not mentioned in RFC.
116pub fn check_aligned_handshake(sess: &mut ServerSessionImpl) -> Result<(), TLSError> {
117    if !sess.common.handshake_joiner.is_empty() {
118        sess.common
119            .send_fatal_alert(AlertDescription::UnexpectedMessage);
120        Err(TLSError::PeerMisbehavedError(
121            "key epoch or handshake flight with pending fragment".to_string(),
122        ))
123    } else {
124        Ok(())
125    }
126}
127
128pub fn save_sni(sess: &mut ServerSessionImpl, sni: Option<webpki::DNSName>) {
129    if let Some(sni) = sni {
130        // Save the SNI into the session.
131        sess.set_sni(sni);
132    }
133}
134
135#[derive(Default)]
136pub struct ExtensionProcessing {
137    // extensions to reply with
138    pub exts: Vec<ServerExtension>,
139
140    // effects on later handshake steps
141    pub send_cert_status: bool,
142    pub send_sct: bool,
143    pub send_ticket: bool,
144}
145
146impl ExtensionProcessing {
147    pub fn new() -> Self {
148        Default::default()
149    }
150
151    pub fn process_common(
152        &mut self,
153        sess: &mut ServerSessionImpl,
154        server_key: Option<&mut sign::CertifiedKey>,
155        hello: &ClientHelloPayload,
156        resumedata: Option<&persist::ServerSessionValue>,
157        handshake: &HandshakeDetails,
158    ) -> Result<(), TLSError> {
159        // ALPN
160        let our_protocols = &sess.config.alpn_protocols;
161        let maybe_their_protocols = hello.get_alpn_extension();
162        if let Some(their_protocols) = maybe_their_protocols {
163            let their_protocols = their_protocols.to_slices();
164
165            if their_protocols
166                .iter()
167                .any(|protocol| protocol.is_empty())
168            {
169                return Err(TLSError::PeerMisbehavedError(
170                    "client offered empty ALPN protocol".to_string(),
171                ));
172            }
173
174            sess.alpn_protocol = our_protocols
175                .iter()
176                .filter(|protocol| their_protocols.contains(&protocol.as_slice()))
177                .nth(0)
178                .cloned();
179            if let Some(ref selected_protocol) = sess.alpn_protocol {
180                debug!("Chosen ALPN protocol {:?}", selected_protocol);
181                self.exts
182                    .push(ServerExtension::make_alpn(&[selected_protocol]));
183            } else {
184                // For compatibility, strict ALPN validation is not employed unless targeting QUIC
185                #[cfg(feature = "quic")]
186                {
187                    if sess.common.protocol == Protocol::Quic && !our_protocols.is_empty() {
188                        sess.common
189                            .send_fatal_alert(AlertDescription::NoApplicationProtocol);
190                        return Err(TLSError::NoApplicationProtocol);
191                    }
192                }
193            }
194        }
195
196        #[cfg(feature = "quic")]
197        {
198            if sess.common.protocol == Protocol::Quic {
199                if let Some(params) = hello.get_quic_params_extension() {
200                    sess.common.quic.params = Some(params);
201                }
202
203                if let Some(resume) = resumedata {
204                    if sess.config.max_early_data_size > 0
205                        && hello.early_data_extension_offered()
206                        && resume.version == sess.common.negotiated_version.unwrap()
207                        && resume.cipher_suite == sess.common.get_suite_assert().suite
208                        && resume.alpn.as_ref().map(|x| &x.0) == sess.alpn_protocol.as_ref()
209                        && !sess.reject_early_data
210                    {
211                        self.exts
212                            .push(ServerExtension::EarlyData);
213                    } else {
214                        // Clobber value set in tls13::emit_server_hello
215                        sess.common.quic.early_secret = None;
216                    }
217                }
218            }
219        }
220
221        let for_resume = resumedata.is_some();
222        // SNI
223        if !for_resume && hello.get_sni_extension().is_some() {
224            self.exts
225                .push(ServerExtension::ServerNameAck);
226        }
227
228        if let Some(server_key) = server_key {
229            // Send status_request response if we have one.  This is not allowed
230            // if we're resuming, and is only triggered if we have an OCSP response
231            // to send.
232            if !for_resume
233                && hello
234                    .find_extension(ExtensionType::StatusRequest)
235                    .is_some()
236                && server_key.has_ocsp()
237            {
238                self.send_cert_status = true;
239
240                if !sess.common.is_tls13() {
241                    // Only TLS1.2 sends confirmation in ServerHello
242                    self.exts
243                        .push(ServerExtension::CertificateStatusAck);
244                }
245            }
246
247            if !for_resume
248                && hello
249                    .find_extension(ExtensionType::SCT)
250                    .is_some()
251                && server_key.has_sct_list()
252            {
253                self.send_sct = true;
254
255                if !sess.common.is_tls13() {
256                    let sct_list = server_key.take_sct_list().unwrap();
257                    self.exts
258                        .push(ServerExtension::make_sct(sct_list));
259                }
260            }
261        }
262
263        if !sess.common.is_tls13() {}
264
265        self.exts
266            .extend(handshake.extra_exts.iter().cloned());
267
268        Ok(())
269    }
270
271    fn process_tls12(
272        &mut self,
273        sess: &ServerSessionImpl,
274        hello: &ClientHelloPayload,
275        handshake: &HandshakeDetails,
276    ) {
277        // Renegotiation.
278        // (We don't do reneg at all, but would support the secure version if we did.)
279        let secure_reneg_offered = hello
280            .find_extension(ExtensionType::RenegotiationInfo)
281            .is_some()
282            || hello
283                .cipher_suites
284                .contains(&CipherSuite::TLS_EMPTY_RENEGOTIATION_INFO_SCSV);
285
286        if secure_reneg_offered {
287            self.exts
288                .push(ServerExtension::make_empty_renegotiation_info());
289        }
290
291        // Tickets:
292        // If we get any SessionTicket extension and have tickets enabled,
293        // we send an ack.
294        if hello
295            .find_extension(ExtensionType::SessionTicket)
296            .is_some()
297            && sess.config.ticketer.enabled()
298        {
299            self.send_ticket = true;
300            self.exts
301                .push(ServerExtension::SessionTicketAck);
302        }
303
304        // Confirm use of EMS if offered.
305        if handshake.using_ems {
306            self.exts
307                .push(ServerExtension::ExtendedMasterSecretAck);
308        }
309    }
310}
311
312pub struct ExpectClientHello {
313    pub handshake: HandshakeDetails,
314    pub done_retry: bool,
315    pub send_cert_status: bool,
316    pub send_sct: bool,
317    pub send_ticket: bool,
318}
319
320impl ExpectClientHello {
321    pub fn new(
322        server_config: &ServerConfig,
323        extra_exts: Vec<ServerExtension>,
324    ) -> ExpectClientHello {
325        let mut ech = ExpectClientHello {
326            handshake: HandshakeDetails::new(extra_exts),
327            done_retry: false,
328            send_cert_status: false,
329            send_sct: false,
330            send_ticket: false,
331        };
332
333        if server_config
334            .verifier
335            .offer_client_auth()
336        {
337            ech.handshake
338                .transcript
339                .set_client_auth_enabled();
340        }
341
342        ech
343    }
344
345    fn into_expect_tls12_ccs(self, secrets: SessionSecrets) -> NextState {
346        Box::new(tls12::ExpectCCS {
347            secrets,
348            handshake: self.handshake,
349            resuming: true,
350            send_ticket: self.send_ticket,
351        })
352    }
353
354    fn into_complete_tls13_client_hello_handling(self) -> tls13::CompleteClientHelloHandling {
355        tls13::CompleteClientHelloHandling {
356            handshake: self.handshake,
357            done_retry: self.done_retry,
358            send_cert_status: self.send_cert_status,
359            send_sct: self.send_sct,
360            send_ticket: self.send_ticket,
361        }
362    }
363
364    fn into_expect_tls12_certificate(self, kx: suites::KeyExchange) -> NextState {
365        Box::new(tls12::ExpectCertificate {
366            handshake: self.handshake,
367            server_kx: ServerKXDetails::new(kx),
368            send_ticket: self.send_ticket,
369        })
370    }
371
372    fn into_expect_tls12_client_kx(self, kx: suites::KeyExchange) -> NextState {
373        Box::new(tls12::ExpectClientKX {
374            handshake: self.handshake,
375            server_kx: ServerKXDetails::new(kx),
376            client_cert: None,
377            send_ticket: self.send_ticket,
378        })
379    }
380
381    fn emit_server_hello(
382        &mut self,
383        sess: &mut ServerSessionImpl,
384        server_key: Option<&mut sign::CertifiedKey>,
385        hello: &ClientHelloPayload,
386        resumedata: Option<&persist::ServerSessionValue>,
387    ) -> Result<(), TLSError> {
388        let mut ep = ExtensionProcessing::new();
389        ep.process_common(sess, server_key, hello, resumedata, &self.handshake)?;
390        ep.process_tls12(sess, hello, &self.handshake);
391
392        self.send_ticket = ep.send_ticket;
393        self.send_cert_status = ep.send_cert_status;
394        self.send_sct = ep.send_sct;
395
396        let sh = Message {
397            typ: ContentType::Handshake,
398            version: ProtocolVersion::TLSv1_2,
399            payload: MessagePayload::Handshake(HandshakeMessagePayload {
400                typ: HandshakeType::ServerHello,
401                payload: HandshakePayload::ServerHello(ServerHelloPayload {
402                    legacy_version: ProtocolVersion::TLSv1_2,
403                    random: Random::from_slice(&self.handshake.randoms.server),
404                    session_id: self.handshake.session_id,
405                    cipher_suite: sess.common.get_suite_assert().suite,
406                    compression_method: Compression::Null,
407                    extensions: ep.exts,
408                }),
409            }),
410        };
411
412        trace!("sending server hello {:?}", sh);
413        self.handshake
414            .transcript
415            .add_message(&sh);
416        sess.common.send_msg(sh, false);
417        Ok(())
418    }
419
420    fn emit_certificate(
421        &mut self,
422        sess: &mut ServerSessionImpl,
423        server_certkey: &mut sign::CertifiedKey,
424    ) {
425        let cert_chain = server_certkey.take_cert();
426
427        let c = Message {
428            typ: ContentType::Handshake,
429            version: ProtocolVersion::TLSv1_2,
430            payload: MessagePayload::Handshake(HandshakeMessagePayload {
431                typ: HandshakeType::Certificate,
432                payload: HandshakePayload::Certificate(cert_chain),
433            }),
434        };
435
436        self.handshake
437            .transcript
438            .add_message(&c);
439        sess.common.send_msg(c, false);
440    }
441
442    fn emit_cert_status(
443        &mut self,
444        sess: &mut ServerSessionImpl,
445        server_certkey: &mut sign::CertifiedKey,
446    ) {
447        if !self.send_cert_status || !server_certkey.has_ocsp() {
448            return;
449        }
450
451        let ocsp = server_certkey.take_ocsp();
452        let st = CertificateStatus::new(ocsp.unwrap());
453
454        let c = Message {
455            typ: ContentType::Handshake,
456            version: ProtocolVersion::TLSv1_2,
457            payload: MessagePayload::Handshake(HandshakeMessagePayload {
458                typ: HandshakeType::CertificateStatus,
459                payload: HandshakePayload::CertificateStatus(st),
460            }),
461        };
462
463        self.handshake
464            .transcript
465            .add_message(&c);
466        sess.common.send_msg(c, false);
467    }
468
469    fn emit_server_kx(
470        &mut self,
471        sess: &mut ServerSessionImpl,
472        sigschemes: Vec<SignatureScheme>,
473        group: NamedGroup,
474        server_certkey: &mut sign::CertifiedKey,
475    ) -> Result<suites::KeyExchange, TLSError> {
476        let kx = sess
477            .common
478            .get_suite_assert()
479            .start_server_kx(group)
480            .ok_or_else(|| TLSError::PeerMisbehavedError("key exchange failed".to_string()))?;
481        let secdh = ServerECDHParams::new(group, kx.pubkey.as_ref());
482
483        let mut msg = Vec::new();
484        msg.extend(&self.handshake.randoms.client);
485        msg.extend(&self.handshake.randoms.server);
486        secdh.encode(&mut msg);
487
488        let signing_key = &server_certkey.key;
489        let signer = signing_key
490            .choose_scheme(&sigschemes)
491            .ok_or_else(|| TLSError::General("incompatible signing key".to_string()))?;
492        let sigscheme = signer.get_scheme();
493        let sig = signer.sign(&msg)?;
494
495        let skx = ServerKeyExchangePayload::ECDHE(ECDHEServerKeyExchange {
496            params: secdh,
497            dss: DigitallySignedStruct::new(sigscheme, sig),
498        });
499
500        let m = Message {
501            typ: ContentType::Handshake,
502            version: ProtocolVersion::TLSv1_2,
503            payload: MessagePayload::Handshake(HandshakeMessagePayload {
504                typ: HandshakeType::ServerKeyExchange,
505                payload: HandshakePayload::ServerKeyExchange(skx),
506            }),
507        };
508
509        self.handshake
510            .transcript
511            .add_message(&m);
512        sess.common.send_msg(m, false);
513        Ok(kx)
514    }
515
516    fn emit_certificate_req(&mut self, sess: &mut ServerSessionImpl) -> Result<bool, TLSError> {
517        let client_auth = sess.config.get_verifier();
518
519        if !client_auth.offer_client_auth() {
520            return Ok(false);
521        }
522
523        let verify_schemes = client_auth.supported_verify_schemes();
524
525        let names = client_auth
526            .client_auth_root_subjects(sess.get_sni())
527            .ok_or_else(|| {
528                debug!("could not determine root subjects based on SNI");
529                sess.common
530                    .send_fatal_alert(AlertDescription::AccessDenied);
531                TLSError::General("client rejected by client_auth_root_subjects".into())
532            })?;
533
534        let cr = CertificateRequestPayload {
535            certtypes: vec![
536                ClientCertificateType::RSASign,
537                ClientCertificateType::ECDSASign,
538            ],
539            sigschemes: verify_schemes,
540            canames: names,
541        };
542
543        let m = Message {
544            typ: ContentType::Handshake,
545            version: ProtocolVersion::TLSv1_2,
546            payload: MessagePayload::Handshake(HandshakeMessagePayload {
547                typ: HandshakeType::CertificateRequest,
548                payload: HandshakePayload::CertificateRequest(cr),
549            }),
550        };
551
552        trace!("Sending CertificateRequest {:?}", m);
553        self.handshake
554            .transcript
555            .add_message(&m);
556        sess.common.send_msg(m, false);
557        Ok(true)
558    }
559
560    fn emit_server_hello_done(&mut self, sess: &mut ServerSessionImpl) {
561        let m = Message {
562            typ: ContentType::Handshake,
563            version: ProtocolVersion::TLSv1_2,
564            payload: MessagePayload::Handshake(HandshakeMessagePayload {
565                typ: HandshakeType::ServerHelloDone,
566                payload: HandshakePayload::ServerHelloDone,
567            }),
568        };
569
570        self.handshake
571            .transcript
572            .add_message(&m);
573        sess.common.send_msg(m, false);
574    }
575
576    fn start_resumption(
577        mut self,
578        sess: &mut ServerSessionImpl,
579        client_hello: &ClientHelloPayload,
580        sni: Option<&webpki::DNSName>,
581        id: &SessionID,
582        resumedata: persist::ServerSessionValue,
583    ) -> NextStateOrError {
584        debug!("Resuming session");
585
586        if resumedata.extended_ms && !self.handshake.using_ems {
587            return Err(illegal_param(sess, "refusing to resume without ems"));
588        }
589
590        self.handshake.session_id = *id;
591        self.emit_server_hello(sess, None, client_hello, Some(&resumedata))?;
592
593        let hashalg = sess
594            .common
595            .get_suite_assert()
596            .get_hash();
597        let secrets = SessionSecrets::new_resume(
598            &self.handshake.randoms,
599            hashalg,
600            &resumedata.master_secret.0,
601        );
602        sess.config.key_log.log(
603            "CLIENT_RANDOM",
604            &secrets.randoms.client,
605            &secrets.master_secret,
606        );
607        sess.common
608            .start_encryption_tls12(&secrets);
609        sess.client_cert_chain = resumedata.client_cert_chain;
610
611        if self.send_ticket {
612            tls12::emit_ticket(&secrets, &mut self.handshake, sess);
613        }
614        tls12::emit_ccs(sess);
615        sess.common
616            .record_layer
617            .start_encrypting();
618        tls12::emit_finished(&secrets, &mut self.handshake, sess);
619
620        assert!(same_dns_name_or_both_none(sni, sess.get_sni()));
621
622        Ok(self.into_expect_tls12_ccs(secrets))
623    }
624}
625
626impl State for ExpectClientHello {
627    fn handle(mut self: Box<Self>, sess: &mut ServerSessionImpl, m: Message) -> NextStateOrError {
628        let client_hello =
629            require_handshake_msg!(m, HandshakeType::ClientHello, HandshakePayload::ClientHello)?;
630        let tls13_enabled = sess
631            .config
632            .supports_version(ProtocolVersion::TLSv1_3);
633        let tls12_enabled = sess
634            .config
635            .supports_version(ProtocolVersion::TLSv1_2);
636        trace!("we got a clienthello {:?}", client_hello);
637
638        if !client_hello
639            .compression_methods
640            .contains(&Compression::Null)
641        {
642            sess.common
643                .send_fatal_alert(AlertDescription::IllegalParameter);
644            return Err(TLSError::PeerIncompatibleError(
645                "client did not offer Null compression".to_string(),
646            ));
647        }
648
649        if client_hello.has_duplicate_extension() {
650            return Err(decode_error(sess, "client sent duplicate extensions"));
651        }
652
653        // No handshake messages should follow this one in this flight.
654        check_aligned_handshake(sess)?;
655
656        // Are we doing TLS1.3?
657        let maybe_versions_ext = client_hello.get_versions_extension();
658        if let Some(versions) = maybe_versions_ext {
659            if versions.contains(&ProtocolVersion::TLSv1_3) && tls13_enabled {
660                sess.common.negotiated_version = Some(ProtocolVersion::TLSv1_3);
661            } else if !versions.contains(&ProtocolVersion::TLSv1_2) || !tls12_enabled {
662                return Err(bad_version(sess, "TLS1.2 not offered/enabled"));
663            }
664        } else if client_hello.client_version.get_u16() < ProtocolVersion::TLSv1_2.get_u16() {
665            return Err(bad_version(sess, "Client does not support TLSv1_2"));
666        } else if !tls12_enabled && tls13_enabled {
667            return Err(bad_version(
668                sess,
669                "Server requires TLS1.3, but client omitted versions ext",
670            ));
671        }
672
673        if sess.common.negotiated_version == None {
674            sess.common.negotiated_version = Some(ProtocolVersion::TLSv1_2);
675        }
676
677        // --- Common to TLS1.2 and TLS1.3: ciphersuite and certificate selection.
678
679        // Extract and validate the SNI DNS name, if any, before giving it to
680        // the cert resolver. In particular, if it is invalid then we should
681        // send an Illegal Parameter alert instead of the Internal Error alert
682        // (or whatever) that we'd send if this were checked later or in a
683        // different way.
684        let sni: Option<webpki::DNSName> = match client_hello.get_sni_extension() {
685            Some(sni) => {
686                if sni.has_duplicate_names_for_type() {
687                    return Err(decode_error(
688                        sess,
689                        "ClientHello SNI contains duplicate name types",
690                    ));
691                }
692
693                if let Some(hostname) = sni.get_single_hostname() {
694                    Some(hostname.into())
695                } else {
696                    return Err(illegal_param(
697                        sess,
698                        "ClientHello SNI did not contain a hostname",
699                    ));
700                }
701            }
702            None => None,
703        };
704
705        if !self.done_retry {
706            // save only the first SNI
707            save_sni(sess, sni.clone());
708        }
709
710        // We communicate to the upper layer what kind of key they should choose
711        // via the sigschemes value.  Clients tend to treat this extension
712        // orthogonally to offered ciphersuites (even though, in TLS1.2 it is not).
713        // So: reduce the offered sigschemes to those compatible with the
714        // intersection of ciphersuites.
715        let mut common_suites = sess.config.ciphersuites.clone();
716        common_suites.retain(|scs| {
717            client_hello
718                .cipher_suites
719                .contains(&scs.suite)
720        });
721
722        let mut sigschemes_ext = client_hello
723            .get_sigalgs_extension()
724            .cloned()
725            .unwrap_or_else(SupportedSignatureSchemes::default);
726        sigschemes_ext
727            .retain(|scheme| suites::compatible_sigscheme_for_suites(*scheme, &common_suites));
728
729        let alpn_protocols = client_hello
730            .get_alpn_extension()
731            .map(|protos| protos.to_slices());
732
733        // Choose a certificate.
734        let mut certkey = {
735            let sni_ref = sni
736                .as_ref()
737                .map(webpki::DNSName::as_ref);
738            trace!("sni {:?}", sni_ref);
739            trace!("sig schemes {:?}", sigschemes_ext);
740            trace!("alpn protocols {:?}", alpn_protocols);
741
742            let alpn_slices = match alpn_protocols {
743                Some(ref vec) => Some(vec.as_slice()),
744                None => None,
745            };
746
747            let client_hello = ClientHello::new(sni_ref, &sigschemes_ext, alpn_slices);
748
749            let certkey = sess
750                .config
751                .cert_resolver
752                .resolve(client_hello);
753            certkey.ok_or_else(|| {
754                sess.common
755                    .send_fatal_alert(AlertDescription::AccessDenied);
756                TLSError::General("no server certificate chain resolved".to_string())
757            })?
758        };
759
760        // Reduce our supported ciphersuites by the certificate.
761        // (no-op for TLS1.3)
762        let suitable_suites =
763            suites::reduce_given_sigalg(&sess.config.ciphersuites, certkey.key.algorithm());
764
765        // And version
766        let protocol_version = sess.common.negotiated_version.unwrap();
767        let suitable_suites = suites::reduce_given_version(&suitable_suites, protocol_version);
768
769        let maybe_ciphersuite = if sess.config.ignore_client_order {
770            suites::choose_ciphersuite_preferring_server(
771                &client_hello.cipher_suites,
772                &suitable_suites,
773            )
774        } else {
775            suites::choose_ciphersuite_preferring_client(
776                &client_hello.cipher_suites,
777                &suitable_suites,
778            )
779        };
780
781        if maybe_ciphersuite.is_none() {
782            return Err(incompatible(sess, "no ciphersuites in common"));
783        }
784
785        debug!(
786            "decided upon suite {:?}",
787            maybe_ciphersuite.as_ref().unwrap()
788        );
789        sess.common
790            .set_suite(maybe_ciphersuite.unwrap());
791
792        // Start handshake hash.
793        let starting_hash = sess
794            .common
795            .get_suite_assert()
796            .get_hash();
797        if !self
798            .handshake
799            .transcript
800            .start_hash(starting_hash)
801        {
802            sess.common
803                .send_fatal_alert(AlertDescription::IllegalParameter);
804            return Err(TLSError::PeerIncompatibleError(
805                "hash differed on retry".to_string(),
806            ));
807        }
808
809        // Save their Random.
810        client_hello
811            .random
812            .write_slice(&mut self.handshake.randoms.client);
813
814        if sess.common.is_tls13() {
815            return self
816                .into_complete_tls13_client_hello_handling()
817                .handle_client_hello(sess, certkey, &m);
818        }
819
820        // -- TLS1.2 only from hereon in --
821        self.handshake
822            .transcript
823            .add_message(&m);
824
825        if client_hello.ems_support_offered() {
826            self.handshake.using_ems = true;
827        }
828
829        let groups_ext = client_hello
830            .get_namedgroups_extension()
831            .ok_or_else(|| incompatible(sess, "client didn't describe groups"))?;
832        let ecpoints_ext = client_hello
833            .get_ecpoints_extension()
834            .ok_or_else(|| incompatible(sess, "client didn't describe ec points"))?;
835
836        trace!("namedgroups {:?}", groups_ext);
837        trace!("ecpoints {:?}", ecpoints_ext);
838
839        if !ecpoints_ext.contains(&ECPointFormat::Uncompressed) {
840            sess.common
841                .send_fatal_alert(AlertDescription::IllegalParameter);
842            return Err(TLSError::PeerIncompatibleError(
843                "client didn't support uncompressed ec points".to_string(),
844            ));
845        }
846
847        // -- If TLS1.3 is enabled, signal the downgrade in the server random
848        if tls13_enabled {
849            self.handshake
850                .randoms
851                .set_tls12_downgrade_marker();
852        }
853
854        // -- Check for resumption --
855        // We can do this either by (in order of preference):
856        // 1. receiving a ticket that decrypts
857        // 2. receiving a sessionid that is in our cache
858        //
859        // If we receive a ticket, the sessionid won't be in our
860        // cache, so don't check.
861        //
862        // If either works, we end up with a ServerSessionValue
863        // which is passed to start_resumption and concludes
864        // our handling of the ClientHello.
865        //
866        let mut ticket_received = false;
867
868        if let Some(ticket_ext) = client_hello.get_ticket_extension() {
869            if let ClientExtension::SessionTicketOffer(ref ticket) = *ticket_ext {
870                ticket_received = true;
871                debug!("Ticket received");
872
873                let maybe_resume = sess
874                    .config
875                    .ticketer
876                    .decrypt(&ticket.0)
877                    .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain));
878
879                if can_resume(sess, &self.handshake, &maybe_resume) {
880                    return self.start_resumption(
881                        sess,
882                        client_hello,
883                        sni.as_ref(),
884                        &client_hello.session_id,
885                        maybe_resume.unwrap(),
886                    );
887                } else {
888                    debug!("Ticket didn't decrypt");
889                }
890            }
891        }
892
893        // If we're not offered a ticket or a potential session ID,
894        // allocate a session ID.
895        if self.handshake.session_id.is_empty() && !ticket_received {
896            let mut bytes = [0u8; 32];
897            rand::fill_random(&mut bytes);
898            self.handshake.session_id = SessionID::new(&bytes);
899        }
900
901        // Perhaps resume?  If we received a ticket, the sessionid
902        // does not correspond to a real session.
903        if !client_hello.session_id.is_empty() && !ticket_received {
904            let maybe_resume = sess
905                .config
906                .session_storage
907                .get(&client_hello.session_id.get_encoding())
908                .and_then(|x| persist::ServerSessionValue::read_bytes(&x));
909
910            if can_resume(sess, &self.handshake, &maybe_resume) {
911                return self.start_resumption(
912                    sess,
913                    client_hello,
914                    sni.as_ref(),
915                    &client_hello.session_id,
916                    maybe_resume.unwrap(),
917                );
918            }
919        }
920
921        // Now we have chosen a ciphersuite, we can make kx decisions.
922        let sigschemes = sess
923            .common
924            .get_suite_assert()
925            .resolve_sig_schemes(&sigschemes_ext);
926
927        if sigschemes.is_empty() {
928            return Err(incompatible(sess, "no supported sig scheme"));
929        }
930
931        let group = suites::KeyExchange::supported_groups()
932            .iter()
933            .filter(|group| groups_ext.contains(group))
934            .nth(0)
935            .cloned()
936            .ok_or_else(|| incompatible(sess, "no supported group"))?;
937
938        let ecpoint = ECPointFormatList::supported()
939            .iter()
940            .filter(|format| ecpoints_ext.contains(format))
941            .nth(0)
942            .cloned()
943            .ok_or_else(|| incompatible(sess, "no supported point format"))?;
944
945        debug_assert_eq!(ecpoint, ECPointFormat::Uncompressed);
946
947        self.emit_server_hello(sess, Some(&mut certkey), client_hello, None)?;
948        self.emit_certificate(sess, &mut certkey);
949        self.emit_cert_status(sess, &mut certkey);
950        let kx = self.emit_server_kx(sess, sigschemes, group, &mut certkey)?;
951        let doing_client_auth = self.emit_certificate_req(sess)?;
952        self.emit_server_hello_done(sess);
953
954        if doing_client_auth {
955            Ok(self.into_expect_tls12_certificate(kx))
956        } else {
957            Ok(self.into_expect_tls12_client_kx(kx))
958        }
959    }
960}