rustls/server/
tls13.rs

1use crate::check::check_message;
2use crate::cipher;
3use crate::error::TLSError;
4use crate::key_schedule::{
5    KeyScheduleEarly, KeyScheduleHandshake, KeyScheduleNonSecret, KeyScheduleTraffic,
6    KeyScheduleTrafficWithClientFinishedPending,
7};
8#[cfg(feature = "logging")]
9use crate::log::{debug, trace, warn};
10use crate::msgs::base::{Payload, PayloadU8};
11use crate::msgs::ccs::ChangeCipherSpecPayload;
12use crate::msgs::codec::Codec;
13use crate::msgs::enums::KeyUpdateRequest;
14use crate::msgs::enums::{AlertDescription, NamedGroup, SignatureScheme};
15use crate::msgs::enums::{Compression, PSKKeyExchangeMode};
16use crate::msgs::enums::{ContentType, HandshakeType, ProtocolVersion};
17use crate::msgs::handshake::CertReqExtension;
18use crate::msgs::handshake::CertificateEntry;
19use crate::msgs::handshake::CertificateExtension;
20use crate::msgs::handshake::CertificatePayloadTLS13;
21use crate::msgs::handshake::CertificateRequestPayloadTLS13;
22use crate::msgs::handshake::CertificateStatus;
23use crate::msgs::handshake::ClientHelloPayload;
24use crate::msgs::handshake::DigitallySignedStruct;
25use crate::msgs::handshake::HandshakeMessagePayload;
26use crate::msgs::handshake::HandshakePayload;
27use crate::msgs::handshake::HelloRetryExtension;
28use crate::msgs::handshake::HelloRetryRequest;
29use crate::msgs::handshake::KeyShareEntry;
30use crate::msgs::handshake::NewSessionTicketPayloadTLS13;
31use crate::msgs::handshake::Random;
32use crate::msgs::handshake::ServerExtension;
33use crate::msgs::handshake::ServerHelloPayload;
34use crate::msgs::handshake::SessionID;
35use crate::msgs::message::{Message, MessagePayload};
36use crate::msgs::persist;
37use crate::rand;
38use crate::server::ServerSessionImpl;
39use crate::sign;
40use crate::suites;
41use crate::verify;
42#[cfg(feature = "quic")]
43use crate::{msgs::handshake::NewSessionTicketExtension, quic, session::Protocol};
44
45use crate::server::common::{ClientCertDetails, HandshakeDetails};
46use crate::server::hs;
47
48use ring::constant_time;
49
50pub struct CompleteClientHelloHandling {
51    pub handshake: HandshakeDetails,
52    pub done_retry: bool,
53    pub send_cert_status: bool,
54    pub send_sct: bool,
55    pub send_ticket: bool,
56}
57
58impl CompleteClientHelloHandling {
59    fn check_binder(
60        &self,
61        sess: &mut ServerSessionImpl,
62        client_hello: &Message,
63        psk: &[u8],
64        binder: &[u8],
65    ) -> bool {
66        let binder_plaintext = match client_hello.payload {
67            MessagePayload::Handshake(ref hmp) => hmp.get_encoding_for_binder_signing(),
68            _ => unreachable!(),
69        };
70
71        let suite = sess.common.get_suite_assert();
72        let suite_hash = suite.get_hash();
73        let handshake_hash = self
74            .handshake
75            .transcript
76            .get_hash_given(suite_hash, &binder_plaintext);
77
78        let key_schedule = KeyScheduleEarly::new(suite.hkdf_algorithm, &psk);
79        let real_binder =
80            key_schedule.resumption_psk_binder_key_and_sign_verify_data(&handshake_hash);
81
82        constant_time::verify_slices_are_equal(&real_binder, binder).is_ok()
83    }
84
85    fn into_expect_retried_client_hello(self) -> hs::NextState {
86        Box::new(hs::ExpectClientHello {
87            handshake: self.handshake,
88            done_retry: true,
89            send_cert_status: self.send_cert_status,
90            send_sct: self.send_sct,
91            send_ticket: self.send_ticket,
92        })
93    }
94
95    fn into_expect_certificate(
96        self,
97        key_schedule: KeyScheduleTrafficWithClientFinishedPending,
98    ) -> hs::NextState {
99        Box::new(ExpectCertificate {
100            handshake: self.handshake,
101            key_schedule,
102            send_ticket: self.send_ticket,
103        })
104    }
105
106    fn into_expect_finished(
107        self,
108        key_schedule: KeyScheduleTrafficWithClientFinishedPending,
109    ) -> hs::NextState {
110        Box::new(ExpectFinished {
111            handshake: self.handshake,
112            key_schedule,
113            send_ticket: self.send_ticket,
114        })
115    }
116
117    fn emit_server_hello(
118        &mut self,
119        sess: &mut ServerSessionImpl,
120        session_id: &SessionID,
121        share: &KeyShareEntry,
122        chosen_psk_idx: Option<usize>,
123        resuming_psk: Option<&[u8]>,
124    ) -> Result<KeyScheduleHandshake, TLSError> {
125        let mut extensions = Vec::new();
126
127        // Do key exchange
128        let kxr = suites::KeyExchange::start_ecdhe(share.group)
129            .and_then(|kx| kx.complete(&share.payload.0))
130            .ok_or_else(|| TLSError::PeerMisbehavedError("key exchange failed".to_string()))?;
131
132        let kse = KeyShareEntry::new(share.group, kxr.pubkey.as_ref());
133        extensions.push(ServerExtension::KeyShare(kse));
134        extensions.push(ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_3));
135
136        if let Some(psk_idx) = chosen_psk_idx {
137            extensions.push(ServerExtension::PresharedKey(psk_idx as u16));
138        }
139
140        let sh = Message {
141            typ: ContentType::Handshake,
142            version: ProtocolVersion::TLSv1_2,
143            payload: MessagePayload::Handshake(HandshakeMessagePayload {
144                typ: HandshakeType::ServerHello,
145                payload: HandshakePayload::ServerHello(ServerHelloPayload {
146                    legacy_version: ProtocolVersion::TLSv1_2,
147                    random: Random::from_slice(&self.handshake.randoms.server),
148                    session_id: *session_id,
149                    cipher_suite: sess.common.get_suite_assert().suite,
150                    compression_method: Compression::Null,
151                    extensions,
152                }),
153            }),
154        };
155
156        hs::check_aligned_handshake(sess)?;
157
158        #[cfg(feature = "quic")]
159        let client_hello_hash = self
160            .handshake
161            .transcript
162            .get_hash_given(
163                sess.common
164                    .get_suite_assert()
165                    .get_hash(),
166                &[],
167            );
168
169        trace!("sending server hello {:?}", sh);
170        self.handshake
171            .transcript
172            .add_message(&sh);
173        sess.common.send_msg(sh, false);
174
175        // Start key schedule
176        let suite = sess.common.get_suite_assert();
177        let mut key_schedule = if let Some(psk) = resuming_psk {
178            let early_key_schedule = KeyScheduleEarly::new(suite.hkdf_algorithm, psk);
179
180            #[cfg(feature = "quic")]
181            {
182                if sess.common.protocol == Protocol::Quic {
183                    let client_early_traffic_secret = early_key_schedule
184                        .client_early_traffic_secret(
185                            &client_hello_hash,
186                            &*sess.config.key_log,
187                            &self.handshake.randoms.client,
188                        );
189                    // If 0-RTT should be rejected, this will be clobbered by ExtensionProcessing
190                    // before the application can see.
191                    sess.common.quic.early_secret = Some(client_early_traffic_secret);
192                }
193            }
194
195            early_key_schedule.into_handshake(&kxr.shared_secret)
196        } else {
197            KeyScheduleNonSecret::new(suite.hkdf_algorithm).into_handshake(&kxr.shared_secret)
198        };
199
200        let handshake_hash = self
201            .handshake
202            .transcript
203            .get_current_hash();
204        let write_key = key_schedule.server_handshake_traffic_secret(
205            &handshake_hash,
206            &*sess.config.key_log,
207            &self.handshake.randoms.client,
208        );
209        sess.common
210            .record_layer
211            .set_message_encrypter(cipher::new_tls13_write(suite, &write_key));
212
213        let read_key = key_schedule.client_handshake_traffic_secret(
214            &handshake_hash,
215            &*sess.config.key_log,
216            &self.handshake.randoms.client,
217        );
218        sess.common
219            .record_layer
220            .set_message_decrypter(cipher::new_tls13_read(suite, &read_key));
221
222        #[cfg(feature = "quic")]
223        {
224            sess.common.quic.hs_secrets = Some(quic::Secrets {
225                client: read_key,
226                server: write_key,
227            });
228        }
229
230        Ok(key_schedule)
231    }
232
233    fn emit_fake_ccs(&mut self, sess: &mut ServerSessionImpl) {
234        if sess.common.is_quic() {
235            return;
236        }
237        let m = Message {
238            typ: ContentType::ChangeCipherSpec,
239            version: ProtocolVersion::TLSv1_2,
240            payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}),
241        };
242        sess.common.send_msg(m, false);
243    }
244
245    fn emit_hello_retry_request(&mut self, sess: &mut ServerSessionImpl, group: NamedGroup) {
246        let mut req = HelloRetryRequest {
247            legacy_version: ProtocolVersion::TLSv1_2,
248            session_id: SessionID::empty(),
249            cipher_suite: sess.common.get_suite_assert().suite,
250            extensions: Vec::new(),
251        };
252
253        req.extensions
254            .push(HelloRetryExtension::KeyShare(group));
255        req.extensions
256            .push(HelloRetryExtension::SupportedVersions(
257                ProtocolVersion::TLSv1_3,
258            ));
259
260        let m = Message {
261            typ: ContentType::Handshake,
262            version: ProtocolVersion::TLSv1_2,
263            payload: MessagePayload::Handshake(HandshakeMessagePayload {
264                typ: HandshakeType::HelloRetryRequest,
265                payload: HandshakePayload::HelloRetryRequest(req),
266            }),
267        };
268
269        trace!("Requesting retry {:?}", m);
270        self.handshake
271            .transcript
272            .rollup_for_hrr();
273        self.handshake
274            .transcript
275            .add_message(&m);
276        sess.common.send_msg(m, false);
277    }
278
279    fn emit_encrypted_extensions(
280        &mut self,
281        sess: &mut ServerSessionImpl,
282        server_key: &mut sign::CertifiedKey,
283        hello: &ClientHelloPayload,
284        resumedata: Option<&persist::ServerSessionValue>,
285    ) -> Result<(), TLSError> {
286        let mut ep = hs::ExtensionProcessing::new();
287        ep.process_common(sess, Some(server_key), hello, resumedata, &self.handshake)?;
288
289        self.send_cert_status = ep.send_cert_status;
290        self.send_sct = ep.send_sct;
291
292        let ee = Message {
293            typ: ContentType::Handshake,
294            version: ProtocolVersion::TLSv1_3,
295            payload: MessagePayload::Handshake(HandshakeMessagePayload {
296                typ: HandshakeType::EncryptedExtensions,
297                payload: HandshakePayload::EncryptedExtensions(ep.exts),
298            }),
299        };
300
301        trace!("sending encrypted extensions {:?}", ee);
302        self.handshake
303            .transcript
304            .add_message(&ee);
305        sess.common.send_msg(ee, true);
306        Ok(())
307    }
308
309    fn emit_certificate_req_tls13(
310        &mut self,
311        sess: &mut ServerSessionImpl,
312    ) -> Result<bool, TLSError> {
313        if !sess.config.verifier.offer_client_auth() {
314            return Ok(false);
315        }
316
317        let mut cr = CertificateRequestPayloadTLS13 {
318            context: PayloadU8::empty(),
319            extensions: Vec::new(),
320        };
321
322        let schemes = sess
323            .config
324            .get_verifier()
325            .supported_verify_schemes();
326        cr.extensions
327            .push(CertReqExtension::SignatureAlgorithms(schemes.to_vec()));
328
329        let names = sess
330            .config
331            .verifier
332            .client_auth_root_subjects(sess.get_sni())
333            .ok_or_else(|| {
334                debug!("could not determine root subjects based on SNI");
335                sess.common
336                    .send_fatal_alert(AlertDescription::AccessDenied);
337                TLSError::General("client rejected by client_auth_root_subjects".into())
338            })?;
339
340        if !names.is_empty() {
341            cr.extensions
342                .push(CertReqExtension::AuthorityNames(names));
343        }
344
345        let m = Message {
346            typ: ContentType::Handshake,
347            version: ProtocolVersion::TLSv1_3,
348            payload: MessagePayload::Handshake(HandshakeMessagePayload {
349                typ: HandshakeType::CertificateRequest,
350                payload: HandshakePayload::CertificateRequestTLS13(cr),
351            }),
352        };
353
354        trace!("Sending CertificateRequest {:?}", m);
355        self.handshake
356            .transcript
357            .add_message(&m);
358        sess.common.send_msg(m, true);
359        Ok(true)
360    }
361
362    fn emit_certificate_tls13(
363        &mut self,
364        sess: &mut ServerSessionImpl,
365        server_key: &mut sign::CertifiedKey,
366    ) {
367        let mut cert_entries = vec![];
368        for cert in server_key.take_cert() {
369            let entry = CertificateEntry {
370                cert,
371                exts: Vec::new(),
372            };
373
374            cert_entries.push(entry);
375        }
376
377        if let Some(end_entity_cert) = cert_entries.first_mut() {
378            // Apply OCSP response to first certificate (we don't support OCSP
379            // except for leaf certs).
380            if self.send_cert_status {
381                if let Some(ocsp) = server_key.take_ocsp() {
382                    let cst = CertificateStatus::new(ocsp);
383                    end_entity_cert
384                        .exts
385                        .push(CertificateExtension::CertificateStatus(cst));
386                }
387            }
388
389            // Likewise, SCT
390            if self.send_sct {
391                if let Some(sct_list) = server_key.take_sct_list() {
392                    end_entity_cert
393                        .exts
394                        .push(CertificateExtension::make_sct(sct_list));
395                }
396            }
397        }
398
399        let cert_body = CertificatePayloadTLS13::new(cert_entries);
400        let c = Message {
401            typ: ContentType::Handshake,
402            version: ProtocolVersion::TLSv1_3,
403            payload: MessagePayload::Handshake(HandshakeMessagePayload {
404                typ: HandshakeType::Certificate,
405                payload: HandshakePayload::CertificateTLS13(cert_body),
406            }),
407        };
408
409        trace!("sending certificate {:?}", c);
410        self.handshake
411            .transcript
412            .add_message(&c);
413        sess.common.send_msg(c, true);
414    }
415
416    fn emit_certificate_verify_tls13(
417        &mut self,
418        sess: &mut ServerSessionImpl,
419        server_key: &mut sign::CertifiedKey,
420        schemes: &[SignatureScheme],
421    ) -> Result<(), TLSError> {
422        let message = verify::construct_tls13_server_verify_message(
423            &self
424                .handshake
425                .transcript
426                .get_current_hash(),
427        );
428
429        let signing_key = &server_key.key;
430        let signer = signing_key
431            .choose_scheme(schemes)
432            .ok_or_else(|| hs::incompatible(sess, "no overlapping sigschemes"))?;
433
434        let scheme = signer.get_scheme();
435        let sig = signer.sign(&message)?;
436
437        let cv = DigitallySignedStruct::new(scheme, sig);
438
439        let m = Message {
440            typ: ContentType::Handshake,
441            version: ProtocolVersion::TLSv1_3,
442            payload: MessagePayload::Handshake(HandshakeMessagePayload {
443                typ: HandshakeType::CertificateVerify,
444                payload: HandshakePayload::CertificateVerify(cv),
445            }),
446        };
447
448        trace!("sending certificate-verify {:?}", m);
449        self.handshake
450            .transcript
451            .add_message(&m);
452        sess.common.send_msg(m, true);
453        Ok(())
454    }
455
456    fn emit_finished_tls13(
457        &mut self,
458        sess: &mut ServerSessionImpl,
459        key_schedule: KeyScheduleHandshake,
460    ) -> KeyScheduleTrafficWithClientFinishedPending {
461        let handshake_hash = self
462            .handshake
463            .transcript
464            .get_current_hash();
465        let verify_data = key_schedule.sign_server_finish(&handshake_hash);
466        let verify_data_payload = Payload::new(verify_data);
467
468        let m = Message {
469            typ: ContentType::Handshake,
470            version: ProtocolVersion::TLSv1_3,
471            payload: MessagePayload::Handshake(HandshakeMessagePayload {
472                typ: HandshakeType::Finished,
473                payload: HandshakePayload::Finished(verify_data_payload),
474            }),
475        };
476
477        trace!("sending finished {:?}", m);
478        self.handshake
479            .transcript
480            .add_message(&m);
481        self.handshake.hash_at_server_fin = self
482            .handshake
483            .transcript
484            .get_current_hash();
485        sess.common.send_msg(m, true);
486
487        // Now move to application data keys.  Read key change is deferred until
488        // the Finish message is received & validated.
489        let mut key_schedule_traffic = key_schedule.into_traffic_with_client_finished_pending();
490        let suite = sess.common.get_suite_assert();
491        let write_key = key_schedule_traffic.server_application_traffic_secret(
492            &self.handshake.hash_at_server_fin,
493            &*sess.config.key_log,
494            &self.handshake.randoms.client,
495        );
496        sess.common
497            .record_layer
498            .set_message_encrypter(cipher::new_tls13_write(suite, &write_key));
499
500        key_schedule_traffic.exporter_master_secret(
501            &self.handshake.hash_at_server_fin,
502            &*sess.config.key_log,
503            &self.handshake.randoms.client,
504        );
505
506        let _read_key = key_schedule_traffic.client_application_traffic_secret(
507            &self.handshake.hash_at_server_fin,
508            &*sess.config.key_log,
509            &self.handshake.randoms.client,
510        );
511
512        #[cfg(feature = "quic")]
513        {
514            sess.common.quic.traffic_secrets = Some(quic::Secrets {
515                client: _read_key,
516                server: write_key,
517            });
518        }
519
520        key_schedule_traffic
521    }
522
523    fn attempt_tls13_ticket_decryption(
524        &mut self,
525        sess: &mut ServerSessionImpl,
526        ticket: &[u8],
527    ) -> Option<persist::ServerSessionValue> {
528        if sess.config.ticketer.enabled() {
529            sess.config
530                .ticketer
531                .decrypt(ticket)
532                .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain))
533        } else {
534            sess.config
535                .session_storage
536                .take(ticket)
537                .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain))
538        }
539    }
540
541    pub fn handle_client_hello(
542        mut self,
543        sess: &mut ServerSessionImpl,
544        mut server_key: sign::CertifiedKey,
545        chm: &Message,
546    ) -> hs::NextStateOrError {
547        let client_hello = require_handshake_msg!(
548            chm,
549            HandshakeType::ClientHello,
550            HandshakePayload::ClientHello
551        )?;
552
553        if client_hello.compression_methods.len() != 1 {
554            return Err(hs::illegal_param(sess, "client offered wrong compressions"));
555        }
556
557        let groups_ext = client_hello
558            .get_namedgroups_extension()
559            .ok_or_else(|| hs::incompatible(sess, "client didn't describe groups"))?;
560
561        let mut sigschemes_ext = client_hello
562            .get_sigalgs_extension()
563            .ok_or_else(|| hs::incompatible(sess, "client didn't describe sigschemes"))?
564            .clone();
565
566        let tls13_schemes = sign::supported_sign_tls13();
567        sigschemes_ext.retain(|scheme| tls13_schemes.contains(scheme));
568
569        let shares_ext = client_hello
570            .get_keyshare_extension()
571            .ok_or_else(|| hs::incompatible(sess, "client didn't send keyshares"))?;
572
573        if client_hello.has_keyshare_extension_with_duplicates() {
574            return Err(hs::illegal_param(sess, "client sent duplicate keyshares"));
575        }
576
577        let share_groups: Vec<NamedGroup> = shares_ext
578            .iter()
579            .map(|share| share.group)
580            .collect();
581
582        let supported_groups = suites::KeyExchange::supported_groups();
583        let chosen_group = supported_groups
584            .iter()
585            .filter(|group| share_groups.contains(group))
586            .nth(0)
587            .cloned();
588
589        if chosen_group.is_none() {
590            // We don't have a suitable key share.  Choose a suitable group and
591            // send a HelloRetryRequest.
592            let retry_group_maybe = supported_groups
593                .iter()
594                .filter(|group| groups_ext.contains(group))
595                .nth(0)
596                .cloned();
597            self.handshake
598                .transcript
599                .add_message(chm);
600
601            if let Some(group) = retry_group_maybe {
602                if self.done_retry {
603                    return Err(hs::illegal_param(sess, "did not follow retry request"));
604                }
605
606                self.emit_hello_retry_request(sess, group);
607                self.emit_fake_ccs(sess);
608                return Ok(self.into_expect_retried_client_hello());
609            }
610
611            return Err(hs::incompatible(sess, "no kx group overlap with client"));
612        }
613
614        let chosen_group = chosen_group.unwrap();
615        let chosen_share = shares_ext
616            .iter()
617            .find(|share| share.group == chosen_group)
618            .unwrap();
619
620        let mut chosen_psk_index = None;
621        let mut resumedata = None;
622        if let Some(psk_offer) = client_hello.get_psk() {
623            if !client_hello.check_psk_ext_is_last() {
624                return Err(hs::illegal_param(sess, "psk extension in wrong position"));
625            }
626
627            if psk_offer.binders.is_empty() {
628                return Err(hs::decode_error(sess, "psk extension missing binder"));
629            }
630
631            if psk_offer.binders.len() != psk_offer.identities.len() {
632                return Err(hs::illegal_param(
633                    sess,
634                    "psk extension mismatched ids/binders",
635                ));
636            }
637
638            for (i, psk_id) in psk_offer.identities.iter().enumerate() {
639                let maybe_resume = self.attempt_tls13_ticket_decryption(sess, &psk_id.identity.0);
640
641                if !hs::can_resume(sess, &self.handshake, &maybe_resume) {
642                    continue;
643                }
644
645                let resume = maybe_resume.unwrap();
646
647                if !self.check_binder(sess, chm, &resume.master_secret.0, &psk_offer.binders[i].0) {
648                    sess.common
649                        .send_fatal_alert(AlertDescription::DecryptError);
650                    return Err(TLSError::PeerMisbehavedError(
651                        "client sent wrong binder".to_string(),
652                    ));
653                }
654
655                chosen_psk_index = Some(i);
656                resumedata = Some(resume);
657                break;
658            }
659        }
660
661        if !client_hello.psk_mode_offered(PSKKeyExchangeMode::PSK_DHE_KE) {
662            debug!("Client unwilling to resume, DHE_KE not offered");
663            self.send_ticket = false;
664            chosen_psk_index = None;
665            resumedata = None;
666        } else {
667            self.send_ticket = true;
668        }
669
670        if let Some(ref resume) = resumedata {
671            sess.received_resumption_data = Some(resume.application_data.0.clone());
672            sess.client_cert_chain = resume.client_cert_chain.clone();
673        }
674
675        let full_handshake = resumedata.is_none();
676        self.handshake
677            .transcript
678            .add_message(chm);
679        let key_schedule = self.emit_server_hello(
680            sess,
681            &client_hello.session_id,
682            chosen_share,
683            chosen_psk_index,
684            resumedata
685                .as_ref()
686                .map(|x| &x.master_secret.0[..]),
687        )?;
688        if !self.done_retry {
689            self.emit_fake_ccs(sess);
690        }
691        self.emit_encrypted_extensions(sess, &mut server_key, client_hello, resumedata.as_ref())?;
692
693        let doing_client_auth = if full_handshake {
694            let client_auth = self.emit_certificate_req_tls13(sess)?;
695            self.emit_certificate_tls13(sess, &mut server_key);
696            self.emit_certificate_verify_tls13(sess, &mut server_key, &sigschemes_ext)?;
697            client_auth
698        } else {
699            false
700        };
701
702        hs::check_aligned_handshake(sess)?;
703        let key_schedule_traffic = self.emit_finished_tls13(sess, key_schedule);
704
705        if doing_client_auth {
706            Ok(self.into_expect_certificate(key_schedule_traffic))
707        } else {
708            Ok(self.into_expect_finished(key_schedule_traffic))
709        }
710    }
711}
712
713pub struct ExpectCertificate {
714    pub handshake: HandshakeDetails,
715    pub key_schedule: KeyScheduleTrafficWithClientFinishedPending,
716    pub send_ticket: bool,
717}
718
719impl ExpectCertificate {
720    fn into_expect_finished(self) -> hs::NextState {
721        Box::new(ExpectFinished {
722            key_schedule: self.key_schedule,
723            handshake: self.handshake,
724            send_ticket: self.send_ticket,
725        })
726    }
727
728    fn into_expect_certificate_verify(self, cert: ClientCertDetails) -> hs::NextState {
729        Box::new(ExpectCertificateVerify {
730            handshake: self.handshake,
731            key_schedule: self.key_schedule,
732            client_cert: cert,
733            send_ticket: self.send_ticket,
734        })
735    }
736}
737
738impl hs::State for ExpectCertificate {
739    fn handle(
740        mut self: Box<Self>,
741        sess: &mut ServerSessionImpl,
742        m: Message,
743    ) -> hs::NextStateOrError {
744        let certp = require_handshake_msg!(
745            m,
746            HandshakeType::Certificate,
747            HandshakePayload::CertificateTLS13
748        )?;
749        self.handshake
750            .transcript
751            .add_message(&m);
752
753        // We don't send any CertificateRequest extensions, so any extensions
754        // here are illegal.
755        if certp.any_entry_has_extension() {
756            return Err(TLSError::PeerMisbehavedError(
757                "client sent unsolicited cert extension".to_string(),
758            ));
759        }
760
761        let cert_chain = certp.convert();
762
763        let mandatory = sess
764            .config
765            .verifier
766            .client_auth_mandatory(sess.get_sni())
767            .ok_or_else(|| {
768                debug!("could not determine if client auth is mandatory based on SNI");
769                sess.common
770                    .send_fatal_alert(AlertDescription::AccessDenied);
771                TLSError::General("client rejected by client_auth_mandatory".into())
772            })?;
773
774        if cert_chain.is_empty() {
775            if !mandatory {
776                debug!("client auth requested but no certificate supplied");
777                self.handshake
778                    .transcript
779                    .abandon_client_auth();
780                return Ok(self.into_expect_finished());
781            }
782
783            sess.common
784                .send_fatal_alert(AlertDescription::CertificateRequired);
785            return Err(TLSError::NoCertificatesPresented);
786        }
787
788        sess.config
789            .get_verifier()
790            .verify_client_cert(&cert_chain, sess.get_sni())
791            .or_else(|err| {
792                hs::incompatible(sess, "certificate invalid");
793                Err(err)
794            })?;
795
796        let cert = ClientCertDetails::new(cert_chain);
797        Ok(self.into_expect_certificate_verify(cert))
798    }
799}
800
801pub struct ExpectCertificateVerify {
802    handshake: HandshakeDetails,
803    key_schedule: KeyScheduleTrafficWithClientFinishedPending,
804    client_cert: ClientCertDetails,
805    send_ticket: bool,
806}
807
808impl ExpectCertificateVerify {
809    fn into_expect_finished(self) -> hs::NextState {
810        Box::new(ExpectFinished {
811            key_schedule: self.key_schedule,
812            handshake: self.handshake,
813            send_ticket: self.send_ticket,
814        })
815    }
816}
817
818impl hs::State for ExpectCertificateVerify {
819    fn handle(
820        mut self: Box<Self>,
821        sess: &mut ServerSessionImpl,
822        m: Message,
823    ) -> hs::NextStateOrError {
824        let rc = {
825            let sig = require_handshake_msg!(
826                m,
827                HandshakeType::CertificateVerify,
828                HandshakePayload::CertificateVerify
829            )?;
830            let handshake_hash = self
831                .handshake
832                .transcript
833                .get_current_hash();
834            self.handshake
835                .transcript
836                .abandon_client_auth();
837            let certs = &self.client_cert.cert_chain;
838            let msg = verify::construct_tls13_client_verify_message(&handshake_hash);
839
840            sess.config
841                .get_verifier()
842                .verify_tls13_signature(&msg, &certs[0], sig)
843        };
844
845        if let Err(e) = rc {
846            sess.common
847                .send_fatal_alert(AlertDescription::AccessDenied);
848            return Err(e);
849        }
850
851        trace!("client CertificateVerify OK");
852        sess.client_cert_chain = Some(self.client_cert.take_chain());
853
854        self.handshake
855            .transcript
856            .add_message(&m);
857        Ok(self.into_expect_finished())
858    }
859}
860
861// --- Process client's Finished ---
862fn get_server_session_value(
863    handshake: &mut HandshakeDetails,
864    key_schedule: &KeyScheduleTraffic,
865    sess: &ServerSessionImpl,
866    nonce: &[u8],
867) -> persist::ServerSessionValue {
868    let scs = sess.common.get_suite_assert();
869    let version = ProtocolVersion::TLSv1_3;
870
871    let handshake_hash = handshake.transcript.get_current_hash();
872    let secret =
873        key_schedule.resumption_master_secret_and_derive_ticket_psk(&handshake_hash, nonce);
874
875    persist::ServerSessionValue::new(
876        sess.get_sni(),
877        version,
878        scs.suite,
879        secret,
880        &sess.client_cert_chain,
881        sess.alpn_protocol.clone(),
882        sess.resumption_data.clone(),
883    )
884}
885
886pub struct ExpectFinished {
887    pub handshake: HandshakeDetails,
888    pub key_schedule: KeyScheduleTrafficWithClientFinishedPending,
889    pub send_ticket: bool,
890}
891
892impl ExpectFinished {
893    fn into_expect_traffic(
894        fin: verify::FinishedMessageVerified,
895        ks: KeyScheduleTraffic,
896    ) -> hs::NextState {
897        Box::new(ExpectTraffic {
898            key_schedule: ks,
899            want_write_key_update: false,
900            _fin_verified: fin,
901        })
902    }
903
904    fn emit_stateless_ticket(
905        handshake: &mut HandshakeDetails,
906        sess: &mut ServerSessionImpl,
907        key_schedule: &KeyScheduleTraffic,
908    ) {
909        let nonce = rand::random_vec(32);
910        let plain = get_server_session_value(handshake, key_schedule, sess, &nonce).get_encoding();
911        let maybe_ticket = sess.config.ticketer.encrypt(&plain);
912        let ticket_lifetime = sess.config.ticketer.get_lifetime();
913
914        if maybe_ticket.is_none() {
915            return;
916        }
917
918        let ticket = maybe_ticket.unwrap();
919        let age_add = rand::random_u32(); // nb, we don't do 0-RTT data, so whatever
920        #[allow(unused_mut)]
921        let mut payload =
922            NewSessionTicketPayloadTLS13::new(ticket_lifetime, age_add, nonce, ticket);
923        #[cfg(feature = "quic")]
924        {
925            if sess.config.max_early_data_size > 0 && sess.common.protocol == Protocol::Quic {
926                payload
927                    .exts
928                    .push(NewSessionTicketExtension::EarlyData(
929                        sess.config.max_early_data_size,
930                    ));
931            }
932        }
933        let m = Message {
934            typ: ContentType::Handshake,
935            version: ProtocolVersion::TLSv1_3,
936            payload: MessagePayload::Handshake(HandshakeMessagePayload {
937                typ: HandshakeType::NewSessionTicket,
938                payload: HandshakePayload::NewSessionTicketTLS13(payload),
939            }),
940        };
941
942        trace!("sending new ticket {:?}", m);
943        handshake.transcript.add_message(&m);
944        sess.common.send_msg(m, true);
945    }
946
947    fn emit_stateful_ticket(
948        handshake: &mut HandshakeDetails,
949        sess: &mut ServerSessionImpl,
950        key_schedule: &KeyScheduleTraffic,
951    ) {
952        let nonce = rand::random_vec(32);
953        let id = rand::random_vec(32);
954        let plain = get_server_session_value(handshake, key_schedule, sess, &nonce).get_encoding();
955
956        if sess
957            .config
958            .session_storage
959            .put(id.clone(), plain)
960        {
961            let stateful_lifetime = 24 * 60 * 60; // this is a bit of a punt
962            let age_add = rand::random_u32();
963            #[allow(unused_mut)]
964            let mut payload =
965                NewSessionTicketPayloadTLS13::new(stateful_lifetime, age_add, nonce, id);
966            #[cfg(feature = "quic")]
967            {
968                if sess.config.max_early_data_size > 0 && sess.common.protocol == Protocol::Quic {
969                    payload
970                        .exts
971                        .push(NewSessionTicketExtension::EarlyData(
972                            sess.config.max_early_data_size,
973                        ));
974                }
975            }
976            let m = Message {
977                typ: ContentType::Handshake,
978                version: ProtocolVersion::TLSv1_3,
979                payload: MessagePayload::Handshake(HandshakeMessagePayload {
980                    typ: HandshakeType::NewSessionTicket,
981                    payload: HandshakePayload::NewSessionTicketTLS13(payload),
982                }),
983            };
984
985            trace!("sending new stateful ticket {:?}", m);
986            handshake.transcript.add_message(&m);
987            sess.common.send_msg(m, true);
988        } else {
989            trace!("resumption not available; not issuing ticket");
990        }
991    }
992}
993
994impl hs::State for ExpectFinished {
995    fn handle(
996        mut self: Box<Self>,
997        sess: &mut ServerSessionImpl,
998        m: Message,
999    ) -> hs::NextStateOrError {
1000        let finished =
1001            require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?;
1002
1003        let handshake_hash = self
1004            .handshake
1005            .transcript
1006            .get_current_hash();
1007        let expect_verify_data = self
1008            .key_schedule
1009            .sign_client_finish(&handshake_hash);
1010
1011        let fin = constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0)
1012            .map_err(|_| {
1013                sess.common
1014                    .send_fatal_alert(AlertDescription::DecryptError);
1015                warn!("Finished wrong");
1016                TLSError::DecryptError
1017            })
1018            .map(|_| verify::FinishedMessageVerified::assertion())?;
1019
1020        // nb. future derivations include Client Finished, but not the
1021        // main application data keying.
1022        self.handshake
1023            .transcript
1024            .add_message(&m);
1025
1026        hs::check_aligned_handshake(sess)?;
1027
1028        let suite = sess.common.get_suite_assert();
1029
1030        // Install keying to read future messages.
1031        let read_key = self
1032            .key_schedule
1033            .client_application_traffic_secret(
1034                &self.handshake.hash_at_server_fin,
1035                &*sess.config.key_log,
1036                &self.handshake.randoms.client,
1037            );
1038        sess.common
1039            .record_layer
1040            .set_message_decrypter(cipher::new_tls13_read(suite, &read_key));
1041
1042        let key_schedule_traffic = self.key_schedule.into_traffic();
1043
1044        if self.send_ticket {
1045            if sess.config.ticketer.enabled() {
1046                Self::emit_stateless_ticket(&mut self.handshake, sess, &key_schedule_traffic);
1047            } else {
1048                Self::emit_stateful_ticket(&mut self.handshake, sess, &key_schedule_traffic);
1049            }
1050        }
1051
1052        sess.common.start_traffic();
1053
1054        #[cfg(feature = "quic")]
1055        {
1056            if sess.common.protocol == Protocol::Quic {
1057                return Ok(Box::new(ExpectQUICTraffic {
1058                    key_schedule: key_schedule_traffic,
1059                    _fin_verified: fin,
1060                }));
1061            }
1062        }
1063
1064        Ok(Self::into_expect_traffic(fin, key_schedule_traffic))
1065    }
1066}
1067
1068// --- Process traffic ---
1069pub struct ExpectTraffic {
1070    key_schedule: KeyScheduleTraffic,
1071    want_write_key_update: bool,
1072    _fin_verified: verify::FinishedMessageVerified,
1073}
1074
1075impl ExpectTraffic {
1076    fn handle_traffic(&self, sess: &mut ServerSessionImpl, mut m: Message) -> Result<(), TLSError> {
1077        sess.common
1078            .take_received_plaintext(m.take_opaque_payload().unwrap());
1079        Ok(())
1080    }
1081
1082    fn handle_key_update(
1083        &mut self,
1084        sess: &mut ServerSessionImpl,
1085        kur: &KeyUpdateRequest,
1086    ) -> Result<(), TLSError> {
1087        #[cfg(feature = "quic")]
1088        {
1089            if let Protocol::Quic = sess.common.protocol {
1090                sess.common
1091                    .send_fatal_alert(AlertDescription::UnexpectedMessage);
1092                let msg = "KeyUpdate received in QUIC connection".to_string();
1093                warn!("{}", msg);
1094                return Err(TLSError::PeerMisbehavedError(msg));
1095            }
1096        }
1097
1098        hs::check_aligned_handshake(sess)?;
1099
1100        match kur {
1101            KeyUpdateRequest::UpdateNotRequested => {}
1102            KeyUpdateRequest::UpdateRequested => {
1103                self.want_write_key_update = true;
1104            }
1105            _ => {
1106                sess.common
1107                    .send_fatal_alert(AlertDescription::IllegalParameter);
1108                return Err(TLSError::CorruptMessagePayload(ContentType::Handshake));
1109            }
1110        }
1111
1112        // Update our read-side keys.
1113        let new_read_key = self
1114            .key_schedule
1115            .next_client_application_traffic_secret();
1116        let suite = sess.common.get_suite_assert();
1117        sess.common
1118            .record_layer
1119            .set_message_decrypter(cipher::new_tls13_read(suite, &new_read_key));
1120
1121        Ok(())
1122    }
1123}
1124
1125impl hs::State for ExpectTraffic {
1126    fn handle(
1127        mut self: Box<Self>,
1128        sess: &mut ServerSessionImpl,
1129        m: Message,
1130    ) -> hs::NextStateOrError {
1131        if m.is_content_type(ContentType::ApplicationData) {
1132            self.handle_traffic(sess, m)?;
1133        } else if let Ok(key_update) =
1134            require_handshake_msg!(m, HandshakeType::KeyUpdate, HandshakePayload::KeyUpdate)
1135        {
1136            self.handle_key_update(sess, key_update)?;
1137        } else {
1138            check_message(
1139                &m,
1140                &[ContentType::ApplicationData, ContentType::Handshake],
1141                &[HandshakeType::KeyUpdate],
1142            )?;
1143        }
1144
1145        Ok(self)
1146    }
1147
1148    fn export_keying_material(
1149        &self,
1150        output: &mut [u8],
1151        label: &[u8],
1152        context: Option<&[u8]>,
1153    ) -> Result<(), TLSError> {
1154        self.key_schedule
1155            .export_keying_material(output, label, context)
1156    }
1157
1158    fn perhaps_write_key_update(&mut self, sess: &mut ServerSessionImpl) {
1159        if self.want_write_key_update {
1160            self.want_write_key_update = false;
1161            sess.common
1162                .send_msg_encrypt(Message::build_key_update_notify());
1163
1164            let write_key = self
1165                .key_schedule
1166                .next_server_application_traffic_secret();
1167            let scs = sess.common.get_suite_assert();
1168            sess.common
1169                .record_layer
1170                .set_message_encrypter(cipher::new_tls13_write(scs, &write_key));
1171        }
1172    }
1173}
1174
1175#[cfg(feature = "quic")]
1176pub struct ExpectQUICTraffic {
1177    key_schedule: KeyScheduleTraffic,
1178    _fin_verified: verify::FinishedMessageVerified,
1179}
1180
1181#[cfg(feature = "quic")]
1182impl hs::State for ExpectQUICTraffic {
1183    fn handle(self: Box<Self>, _: &mut ServerSessionImpl, m: Message) -> hs::NextStateOrError {
1184        // reject all messages
1185        check_message(&m, &[], &[])?;
1186        unreachable!();
1187    }
1188
1189    fn export_keying_material(
1190        &self,
1191        output: &mut [u8],
1192        label: &[u8],
1193        context: Option<&[u8]>,
1194    ) -> Result<(), TLSError> {
1195        self.key_schedule
1196            .export_keying_material(output, label, context)
1197    }
1198}