• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2016, Google Inc.
2  *
3  * Permission to use, copy, modify, and/or distribute this software for any
4  * purpose with or without fee is hereby granted, provided that the above
5  * copyright notice and this permission notice appear in all copies.
6  *
7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14 
15 #include <openssl/ssl.h>
16 
17 #include <assert.h>
18 #include <limits.h>
19 #include <string.h>
20 
21 #include <utility>
22 
23 #include <openssl/bytestring.h>
24 #include <openssl/digest.h>
25 #include <openssl/err.h>
26 #include <openssl/mem.h>
27 #include <openssl/sha.h>
28 #include <openssl/stack.h>
29 
30 #include "../crypto/internal.h"
31 #include "internal.h"
32 
33 
34 BSSL_NAMESPACE_BEGIN
35 
36 enum client_hs_state_t {
37   state_read_hello_retry_request = 0,
38   state_send_second_client_hello,
39   state_read_server_hello,
40   state_read_encrypted_extensions,
41   state_read_certificate_request,
42   state_read_server_certificate,
43   state_read_server_certificate_verify,
44   state_server_certificate_reverify,
45   state_read_server_finished,
46   state_send_end_of_early_data,
47   state_send_client_encrypted_extensions,
48   state_send_client_certificate,
49   state_send_client_certificate_verify,
50   state_complete_second_flight,
51   state_done,
52 };
53 
54 static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
55 
56 // end_of_early_data closes the early data stream for |hs| and switches the
57 // encryption level to |level|. It returns true on success and false on error.
close_early_data(SSL_HANDSHAKE * hs,ssl_encryption_level_t level)58 static bool close_early_data(SSL_HANDSHAKE *hs, ssl_encryption_level_t level) {
59   SSL *const ssl = hs->ssl;
60   assert(hs->in_early_data);
61 
62   // Note |can_early_write| may already be false if |SSL_write| exceeded the
63   // early data write limit.
64   hs->can_early_write = false;
65 
66   // 0-RTT write states on the client differ between TLS 1.3, DTLS 1.3, and
67   // QUIC. TLS 1.3 has one write encryption level at a time. 0-RTT write keys
68   // overwrite the null cipher and defer handshake write keys. While a
69   // HelloRetryRequest can cause us to rewind back to the null cipher, sequence
70   // numbers have no effect, so we can install a "new" null cipher.
71   //
72   // In QUIC and DTLS 1.3, 0-RTT write state cannot override or defer the normal
73   // write state. The two ClientHello sequence numbers must align, and handshake
74   // write keys must be installed early to ACK the EncryptedExtensions.
75   //
76   // TODO(crbug.com/42290594): We do not support 0-RTT in DTLS 1.3 and, in
77   // QUIC, the caller handles 0-RTT data, so we can skip installing 0-RTT keys
78   // and act as if there is one write level. Now that we're implementing
79   // DTLS 1.3, switch the abstraction to the DTLS/QUIC model where handshake
80   // keys write keys are installed immediately, but the TLS record layer
81   // internally waits to activate that epoch until the 0-RTT channel is closed.
82   if (ssl->quic_method == nullptr) {
83     if (level == ssl_encryption_initial) {
84       bssl::UniquePtr<SSLAEADContext> null_ctx =
85           SSLAEADContext::CreateNullCipher();
86       if (!null_ctx ||  //
87           !ssl->method->set_write_state(ssl, ssl_encryption_initial,
88                                         std::move(null_ctx),
89                                         /*traffic_secret=*/{})) {
90         return false;
91       }
92     } else {
93       assert(level == ssl_encryption_handshake);
94       if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
95                                  hs->new_session.get(),
96                                  hs->client_handshake_secret)) {
97         return false;
98       }
99     }
100   } else {
101     assert(ssl->s3->quic_write_level == level);
102   }
103 
104   return true;
105 }
106 
parse_server_hello_tls13(const SSL_HANDSHAKE * hs,ParsedServerHello * out,uint8_t * out_alert,const SSLMessage & msg)107 static bool parse_server_hello_tls13(const SSL_HANDSHAKE *hs,
108                                      ParsedServerHello *out, uint8_t *out_alert,
109                                      const SSLMessage &msg) {
110   if (!ssl_parse_server_hello(out, out_alert, msg)) {
111     return false;
112   }
113   uint16_t expected_version =
114       SSL_is_dtls(hs->ssl) ? DTLS1_2_VERSION : TLS1_2_VERSION;
115   // DTLS 1.3 disables "compatibility mode" (RFC 8446, appendix D.4). When
116   // disabled, servers MUST NOT echo the legacy_session_id (RFC 9147, section
117   // 5). The client could have sent a session ID indicating its willingness to
118   // resume a DTLS 1.2 session, so just checking that the session IDs match is
119   // incorrect.
120   Span<const uint8_t> expected_session_id = SSL_is_dtls(hs->ssl)
121                                                 ? Span<const uint8_t>()
122                                                 : MakeConstSpan(hs->session_id);
123 
124   // RFC 8446 fixes some legacy values. Check them.
125   if (out->legacy_version != expected_version ||  //
126       out->compression_method != 0 ||
127       Span<const uint8_t>(out->session_id) != expected_session_id ||
128       CBS_len(&out->extensions) == 0) {
129     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
130     *out_alert = SSL_AD_DECODE_ERROR;
131     return false;
132   }
133   return true;
134 }
135 
is_hello_retry_request(const ParsedServerHello & server_hello)136 static bool is_hello_retry_request(const ParsedServerHello &server_hello) {
137   return Span<const uint8_t>(server_hello.random) == kHelloRetryRequest;
138 }
139 
check_ech_confirmation(const SSL_HANDSHAKE * hs,bool * out_accepted,uint8_t * out_alert,const ParsedServerHello & server_hello)140 static bool check_ech_confirmation(const SSL_HANDSHAKE *hs, bool *out_accepted,
141                                    uint8_t *out_alert,
142                                    const ParsedServerHello &server_hello) {
143   const bool is_hrr = is_hello_retry_request(server_hello);
144   size_t offset;
145   if (is_hrr) {
146     // We check for an unsolicited extension when parsing all of them.
147     SSLExtension ech(TLSEXT_TYPE_encrypted_client_hello);
148     if (!ssl_parse_extensions(&server_hello.extensions, out_alert, {&ech},
149                               /*ignore_unknown=*/true)) {
150       return false;
151     }
152     if (!ech.present) {
153       *out_accepted = false;
154       return true;
155     }
156     if (CBS_len(&ech.data) != ECH_CONFIRMATION_SIGNAL_LEN) {
157       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
158       *out_alert = SSL_AD_DECODE_ERROR;
159       return false;
160     }
161     offset = CBS_data(&ech.data) - CBS_data(&server_hello.raw);
162   } else {
163     offset = ssl_ech_confirmation_signal_hello_offset(hs->ssl);
164   }
165 
166   if (!hs->selected_ech_config) {
167     *out_accepted = false;
168     return true;
169   }
170 
171   uint8_t expected[ECH_CONFIRMATION_SIGNAL_LEN];
172   if (!ssl_ech_accept_confirmation(hs, expected, hs->inner_client_random,
173                                    hs->inner_transcript, is_hrr,
174                                    server_hello.raw, offset)) {
175     *out_alert = SSL_AD_INTERNAL_ERROR;
176     return false;
177   }
178 
179   *out_accepted = CRYPTO_memcmp(CBS_data(&server_hello.raw) + offset, expected,
180                                 sizeof(expected)) == 0;
181   return true;
182 }
183 
do_read_hello_retry_request(SSL_HANDSHAKE * hs)184 static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) {
185   SSL *const ssl = hs->ssl;
186   assert(ssl->s3->version != 0);
187   SSLMessage msg;
188   if (!ssl->method->get_message(ssl, &msg)) {
189     return ssl_hs_read_message;
190   }
191 
192   // Queue up a ChangeCipherSpec for whenever we next send something. This
193   // will be before the second ClientHello. If we offered early data, this was
194   // already done.
195   if (!hs->early_data_offered &&  //
196       !ssl->method->add_change_cipher_spec(ssl)) {
197     return ssl_hs_error;
198   }
199 
200   ParsedServerHello server_hello;
201   uint8_t alert = SSL_AD_DECODE_ERROR;
202   if (!parse_server_hello_tls13(hs, &server_hello, &alert, msg)) {
203     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
204     return ssl_hs_error;
205   }
206 
207   // The cipher suite must be one we offered. We currently offer all supported
208   // TLS 1.3 ciphers unless policy controls limited it. So we check the version
209   // and that it's ok per policy.
210   const SSL_CIPHER *cipher = SSL_get_cipher_by_value(server_hello.cipher_suite);
211   if (cipher == nullptr ||
212       SSL_CIPHER_get_min_version(cipher) > ssl_protocol_version(ssl) ||
213       SSL_CIPHER_get_max_version(cipher) < ssl_protocol_version(ssl) ||
214       !ssl_tls13_cipher_meets_policy(SSL_CIPHER_get_protocol_id(cipher),
215                                      ssl->config->tls13_cipher_policy)) {
216     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
217     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
218     return ssl_hs_error;
219   }
220 
221   hs->new_cipher = cipher;
222 
223   const bool is_hrr = is_hello_retry_request(server_hello);
224   if (!hs->transcript.InitHash(ssl_protocol_version(ssl), hs->new_cipher) ||
225       (is_hrr && !hs->transcript.UpdateForHelloRetryRequest())) {
226     return ssl_hs_error;
227   }
228   if (hs->selected_ech_config) {
229     if (!hs->inner_transcript.InitHash(ssl_protocol_version(ssl),
230                                        hs->new_cipher) ||
231         (is_hrr && !hs->inner_transcript.UpdateForHelloRetryRequest())) {
232       return ssl_hs_error;
233     }
234   }
235 
236   // Determine which ClientHello the server is responding to. Run
237   // |check_ech_confirmation| unconditionally, so we validate the extension
238   // contents.
239   bool ech_accepted;
240   if (!check_ech_confirmation(hs, &ech_accepted, &alert, server_hello)) {
241     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
242     return ssl_hs_error;
243   }
244   if (hs->selected_ech_config) {
245     ssl->s3->ech_status = ech_accepted ? ssl_ech_accepted : ssl_ech_rejected;
246   }
247 
248   if (!is_hrr) {
249     hs->tls13_state = state_read_server_hello;
250     return ssl_hs_ok;
251   }
252 
253   // The ECH extension, if present, was already parsed by
254   // |check_ech_confirmation|.
255   SSLExtension cookie(TLSEXT_TYPE_cookie), key_share(TLSEXT_TYPE_key_share),
256       supported_versions(TLSEXT_TYPE_supported_versions),
257       ech_unused(TLSEXT_TYPE_encrypted_client_hello,
258                  hs->selected_ech_config || hs->config->ech_grease_enabled);
259   if (!ssl_parse_extensions(
260           &server_hello.extensions, &alert,
261           {&cookie, &key_share, &supported_versions, &ech_unused},
262           /*ignore_unknown=*/false)) {
263     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
264     return ssl_hs_error;
265   }
266 
267   if (!cookie.present && !key_share.present) {
268     OPENSSL_PUT_ERROR(SSL, SSL_R_EMPTY_HELLO_RETRY_REQUEST);
269     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
270     return ssl_hs_error;
271   }
272   if (cookie.present) {
273     CBS cookie_value;
274     if (!CBS_get_u16_length_prefixed(&cookie.data, &cookie_value) ||  //
275         CBS_len(&cookie_value) == 0 ||                                //
276         CBS_len(&cookie.data) != 0) {
277       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
278       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
279       return ssl_hs_error;
280     }
281 
282     if (!hs->cookie.CopyFrom(cookie_value)) {
283       return ssl_hs_error;
284     }
285   }
286 
287   if (key_share.present) {
288     uint16_t group_id;
289     if (!CBS_get_u16(&key_share.data, &group_id) ||
290         CBS_len(&key_share.data) != 0) {
291       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
292       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
293       return ssl_hs_error;
294     }
295 
296     // The group must be supported.
297     if (!tls1_check_group_id(hs, group_id)) {
298       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
299       OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
300       return ssl_hs_error;
301     }
302 
303     // Check that the HelloRetryRequest does not request a key share that was
304     // provided in the initial ClientHello.
305     if (hs->key_shares[0]->GroupID() == group_id ||
306         (hs->key_shares[1] && hs->key_shares[1]->GroupID() == group_id)) {
307       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
308       OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
309       return ssl_hs_error;
310     }
311 
312     if (!ssl_setup_key_shares(hs, group_id)) {
313       return ssl_hs_error;
314     }
315   }
316 
317   // Although we now know whether ClientHelloInner was used, we currently
318   // maintain both transcripts up to ServerHello. We could swap transcripts
319   // early, but then ClientHello construction and |check_ech_confirmation|
320   // become more complex.
321   if (!ssl_hash_message(hs, msg)) {
322     return ssl_hs_error;
323   }
324   if (ssl->s3->ech_status == ssl_ech_accepted &&
325       !hs->inner_transcript.Update(msg.raw)) {
326     return ssl_hs_error;
327   }
328 
329   // HelloRetryRequest should be the end of the flight.
330   if (ssl->method->has_unprocessed_handshake_data(ssl)) {
331     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
332     OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESS_HANDSHAKE_DATA);
333     return ssl_hs_error;
334   }
335 
336   ssl->method->next_message(ssl);
337   ssl->s3->used_hello_retry_request = true;
338   hs->tls13_state = state_send_second_client_hello;
339   // 0-RTT is rejected if we receive a HelloRetryRequest.
340   if (hs->in_early_data) {
341     ssl->s3->early_data_reason = ssl_early_data_hello_retry_request;
342     if (!close_early_data(hs, ssl_encryption_initial)) {
343       return ssl_hs_error;
344     }
345     return ssl_hs_early_data_rejected;
346   }
347   return ssl_hs_ok;
348 }
349 
do_send_second_client_hello(SSL_HANDSHAKE * hs)350 static enum ssl_hs_wait_t do_send_second_client_hello(SSL_HANDSHAKE *hs) {
351   // Build the second ClientHelloInner, if applicable. The second ClientHello
352   // uses an empty string for |enc|.
353   if (hs->ssl->s3->ech_status == ssl_ech_accepted &&
354       !ssl_encrypt_client_hello(hs, {})) {
355     return ssl_hs_error;
356   }
357 
358   if (!ssl_add_client_hello(hs)) {
359     return ssl_hs_error;
360   }
361 
362   ssl_done_writing_client_hello(hs);
363   hs->tls13_state = state_read_server_hello;
364   return ssl_hs_flush;
365 }
366 
do_read_server_hello(SSL_HANDSHAKE * hs)367 static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
368   SSL *const ssl = hs->ssl;
369   SSLMessage msg;
370   if (!ssl->method->get_message(ssl, &msg)) {
371     return ssl_hs_read_message;
372   }
373   ParsedServerHello server_hello;
374   uint8_t alert = SSL_AD_DECODE_ERROR;
375   if (!parse_server_hello_tls13(hs, &server_hello, &alert, msg)) {
376     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
377     return ssl_hs_error;
378   }
379 
380   // Forbid a second HelloRetryRequest.
381   if (is_hello_retry_request(server_hello)) {
382     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
383     OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
384     return ssl_hs_error;
385   }
386 
387   // Check the cipher suite, in case this is after HelloRetryRequest.
388   if (SSL_CIPHER_get_protocol_id(hs->new_cipher) != server_hello.cipher_suite) {
389     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
390     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
391     return ssl_hs_error;
392   }
393 
394   if (ssl->s3->ech_status == ssl_ech_accepted) {
395     if (ssl->s3->used_hello_retry_request) {
396       // HelloRetryRequest and ServerHello must accept ECH consistently.
397       bool ech_accepted;
398       if (!check_ech_confirmation(hs, &ech_accepted, &alert, server_hello)) {
399         ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
400         return ssl_hs_error;
401       }
402       if (!ech_accepted) {
403         OPENSSL_PUT_ERROR(SSL, SSL_R_INCONSISTENT_ECH_NEGOTIATION);
404         ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
405         return ssl_hs_error;
406       }
407     }
408 
409     hs->transcript = std::move(hs->inner_transcript);
410     hs->extensions.sent = hs->inner_extensions_sent;
411     // Report the inner random value through |SSL_get_client_random|.
412     OPENSSL_memcpy(ssl->s3->client_random, hs->inner_client_random,
413                    SSL3_RANDOM_SIZE);
414   }
415 
416   OPENSSL_memcpy(ssl->s3->server_random, CBS_data(&server_hello.random),
417                  SSL3_RANDOM_SIZE);
418 
419   // When offering ECH, |ssl->session| is only offered in ClientHelloInner.
420   const bool pre_shared_key_allowed =
421       ssl->session != nullptr &&
422       ssl_session_get_type(ssl->session.get()) ==
423           SSLSessionType::kPreSharedKey &&
424       ssl->s3->ech_status != ssl_ech_rejected;
425   SSLExtension key_share(TLSEXT_TYPE_key_share),
426       pre_shared_key(TLSEXT_TYPE_pre_shared_key, pre_shared_key_allowed),
427       supported_versions(TLSEXT_TYPE_supported_versions);
428   if (!ssl_parse_extensions(&server_hello.extensions, &alert,
429                             {&key_share, &pre_shared_key, &supported_versions},
430                             /*ignore_unknown=*/false)) {
431     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
432     return ssl_hs_error;
433   }
434 
435   // Recheck supported_versions, in case this is after HelloRetryRequest.
436   uint16_t version;
437   if (!supported_versions.present ||                       //
438       !CBS_get_u16(&supported_versions.data, &version) ||  //
439       CBS_len(&supported_versions.data) != 0 ||            //
440       version != ssl->s3->version) {
441     OPENSSL_PUT_ERROR(SSL, SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH);
442     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
443     return ssl_hs_error;
444   }
445 
446   alert = SSL_AD_DECODE_ERROR;
447   if (pre_shared_key.present) {
448     if (!ssl_ext_pre_shared_key_parse_serverhello(hs, &alert,
449                                                   &pre_shared_key.data)) {
450       ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
451       return ssl_hs_error;
452     }
453 
454     if (ssl->session->ssl_version != ssl->s3->version) {
455       OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_VERSION_NOT_RETURNED);
456       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
457       return ssl_hs_error;
458     }
459 
460     if (ssl->session->cipher->algorithm_prf != hs->new_cipher->algorithm_prf) {
461       OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_PRF_HASH_MISMATCH);
462       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
463       return ssl_hs_error;
464     }
465 
466     if (!ssl_session_is_context_valid(hs, ssl->session.get())) {
467       // This is actually a client application bug.
468       OPENSSL_PUT_ERROR(SSL,
469                         SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
470       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
471       return ssl_hs_error;
472     }
473 
474     ssl->s3->session_reused = true;
475     hs->can_release_private_key = true;
476     // Only authentication information carries over in TLS 1.3.
477     hs->new_session =
478         SSL_SESSION_dup(ssl->session.get(), SSL_SESSION_DUP_AUTH_ONLY);
479     if (!hs->new_session) {
480       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
481       return ssl_hs_error;
482     }
483     ssl_set_session(ssl, NULL);
484 
485     // Resumption incorporates fresh key material, so refresh the timeout.
486     ssl_session_renew_timeout(ssl, hs->new_session.get(),
487                               ssl->session_ctx->session_psk_dhe_timeout);
488   } else if (!ssl_get_new_session(hs)) {
489     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
490     return ssl_hs_error;
491   }
492 
493   hs->new_session->cipher = hs->new_cipher;
494 
495   // Set up the key schedule and incorporate the PSK into the running secret.
496   size_t hash_len = EVP_MD_size(
497       ssl_get_handshake_digest(ssl_protocol_version(ssl), hs->new_cipher));
498   if (!tls13_init_key_schedule(hs, ssl->s3->session_reused
499                                        ? MakeConstSpan(hs->new_session->secret)
500                                        : MakeConstSpan(kZeroes, hash_len))) {
501     return ssl_hs_error;
502   }
503 
504   if (!key_share.present) {
505     // We do not support psk_ke and thus always require a key share.
506     OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
507     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
508     return ssl_hs_error;
509   }
510 
511   // Resolve ECDHE and incorporate it into the secret.
512   Array<uint8_t> dhe_secret;
513   alert = SSL_AD_DECODE_ERROR;
514   if (!ssl_ext_key_share_parse_serverhello(hs, &dhe_secret, &alert,
515                                            &key_share.data)) {
516     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
517     return ssl_hs_error;
518   }
519 
520   if (!tls13_advance_key_schedule(hs, dhe_secret) ||  //
521       !ssl_hash_message(hs, msg) ||                   //
522       !tls13_derive_handshake_secrets(hs)) {
523     return ssl_hs_error;
524   }
525 
526   // If currently sending early data over TCP, we defer installing client
527   // traffic keys to when the early data stream is closed. See
528   // |close_early_data|. Note if the server has already rejected 0-RTT via
529   // HelloRetryRequest, |in_early_data| is already false.
530   if (!hs->in_early_data || ssl->quic_method != nullptr) {
531     if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
532                                hs->new_session.get(),
533                                hs->client_handshake_secret)) {
534       return ssl_hs_error;
535     }
536   }
537 
538   if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open,
539                              hs->new_session.get(),
540                              hs->server_handshake_secret)) {
541     return ssl_hs_error;
542   }
543 
544   ssl->method->next_message(ssl);
545   hs->tls13_state = state_read_encrypted_extensions;
546   return ssl_hs_ok;
547 }
548 
do_read_encrypted_extensions(SSL_HANDSHAKE * hs)549 static enum ssl_hs_wait_t do_read_encrypted_extensions(SSL_HANDSHAKE *hs) {
550   SSL *const ssl = hs->ssl;
551   SSLMessage msg;
552   if (!ssl->method->get_message(ssl, &msg)) {
553     return ssl_hs_read_message;
554   }
555   if (!ssl_check_message_type(ssl, msg, SSL3_MT_ENCRYPTED_EXTENSIONS)) {
556     return ssl_hs_error;
557   }
558 
559   CBS body = msg.body, extensions;
560   if (!CBS_get_u16_length_prefixed(&body, &extensions) ||  //
561       CBS_len(&body) != 0) {
562     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
563     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
564     return ssl_hs_error;
565   }
566 
567   if (!ssl_parse_serverhello_tlsext(hs, &extensions)) {
568     OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
569     return ssl_hs_error;
570   }
571 
572   if (ssl->s3->early_data_accepted) {
573     // The extension parser checks the server resumed the session.
574     assert(ssl->s3->session_reused);
575     // If offering ECH, the server may not accept early data with
576     // ClientHelloOuter. We do not offer sessions with ClientHelloOuter, so this
577     // this should be implied by checking |session_reused|.
578     assert(ssl->s3->ech_status != ssl_ech_rejected);
579 
580     if (hs->early_session->cipher != hs->new_session->cipher) {
581       OPENSSL_PUT_ERROR(SSL, SSL_R_CIPHER_MISMATCH_ON_EARLY_DATA);
582       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
583       return ssl_hs_error;
584     }
585     if (MakeConstSpan(hs->early_session->early_alpn) !=
586         ssl->s3->alpn_selected) {
587       OPENSSL_PUT_ERROR(SSL, SSL_R_ALPN_MISMATCH_ON_EARLY_DATA);
588       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
589       return ssl_hs_error;
590     }
591     // Channel ID is incompatible with 0-RTT. The ALPS extension should be
592     // negotiated implicitly.
593     if (hs->channel_id_negotiated ||
594         hs->new_session->has_application_settings) {
595       OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA);
596       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
597       return ssl_hs_error;
598     }
599     hs->new_session->has_application_settings =
600         hs->early_session->has_application_settings;
601     if (!hs->new_session->local_application_settings.CopyFrom(
602             hs->early_session->local_application_settings) ||
603         !hs->new_session->peer_application_settings.CopyFrom(
604             hs->early_session->peer_application_settings)) {
605       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
606       return ssl_hs_error;
607     }
608   }
609 
610   // Store the negotiated ALPN in the session.
611   if (!hs->new_session->early_alpn.CopyFrom(ssl->s3->alpn_selected)) {
612     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
613     return ssl_hs_error;
614   }
615 
616   if (!ssl_hash_message(hs, msg)) {
617     return ssl_hs_error;
618   }
619 
620   ssl->method->next_message(ssl);
621   hs->tls13_state = state_read_certificate_request;
622   if (hs->in_early_data && !ssl->s3->early_data_accepted) {
623     if (!close_early_data(hs, ssl_encryption_handshake)) {
624       return ssl_hs_error;
625     }
626     return ssl_hs_early_data_rejected;
627   }
628   return ssl_hs_ok;
629 }
630 
do_read_certificate_request(SSL_HANDSHAKE * hs)631 static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) {
632   SSL *const ssl = hs->ssl;
633   // CertificateRequest may only be sent in non-resumption handshakes.
634   if (ssl->s3->session_reused) {
635     if (ssl->ctx->reverify_on_resume && !ssl->s3->early_data_accepted) {
636       hs->tls13_state = state_server_certificate_reverify;
637       return ssl_hs_ok;
638     }
639     hs->tls13_state = state_read_server_finished;
640     return ssl_hs_ok;
641   }
642 
643   SSLMessage msg;
644   if (!ssl->method->get_message(ssl, &msg)) {
645     return ssl_hs_read_message;
646   }
647 
648   // CertificateRequest is optional.
649   if (msg.type != SSL3_MT_CERTIFICATE_REQUEST) {
650     hs->tls13_state = state_read_server_certificate;
651     return ssl_hs_ok;
652   }
653 
654 
655   SSLExtension sigalgs(TLSEXT_TYPE_signature_algorithms),
656       ca(TLSEXT_TYPE_certificate_authorities);
657   CBS body = msg.body, context, extensions, supported_signature_algorithms;
658   uint8_t alert = SSL_AD_DECODE_ERROR;
659   if (!CBS_get_u8_length_prefixed(&body, &context) ||
660       // The request context is always empty during the handshake.
661       CBS_len(&context) != 0 ||
662       !CBS_get_u16_length_prefixed(&body, &extensions) ||  //
663       CBS_len(&body) != 0 ||
664       !ssl_parse_extensions(&extensions, &alert, {&sigalgs, &ca},
665                             /*ignore_unknown=*/true) ||
666       !sigalgs.present ||
667       !CBS_get_u16_length_prefixed(&sigalgs.data,
668                                    &supported_signature_algorithms) ||
669       !tls1_parse_peer_sigalgs(hs, &supported_signature_algorithms)) {
670     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
671     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
672     return ssl_hs_error;
673   }
674 
675   if (ca.present) {
676     hs->ca_names = SSL_parse_CA_list(ssl, &alert, &ca.data);
677     if (!hs->ca_names) {
678       ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
679       return ssl_hs_error;
680     }
681   } else {
682     hs->ca_names.reset(sk_CRYPTO_BUFFER_new_null());
683     if (!hs->ca_names) {
684       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
685       return ssl_hs_error;
686     }
687   }
688 
689   hs->cert_request = true;
690   ssl->ctx->x509_method->hs_flush_cached_ca_names(hs);
691 
692   if (!ssl_hash_message(hs, msg)) {
693     return ssl_hs_error;
694   }
695 
696   ssl->method->next_message(ssl);
697   hs->tls13_state = state_read_server_certificate;
698   return ssl_hs_ok;
699 }
700 
do_read_server_certificate(SSL_HANDSHAKE * hs)701 static enum ssl_hs_wait_t do_read_server_certificate(SSL_HANDSHAKE *hs) {
702   SSL *const ssl = hs->ssl;
703   SSLMessage msg;
704   if (!ssl->method->get_message(ssl, &msg)) {
705     return ssl_hs_read_message;
706   }
707 
708   if (msg.type != SSL3_MT_COMPRESSED_CERTIFICATE &&
709       !ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE)) {
710     return ssl_hs_error;
711   }
712 
713   if (!tls13_process_certificate(hs, msg, false /* certificate required */) ||
714       !ssl_hash_message(hs, msg)) {
715     return ssl_hs_error;
716   }
717 
718   ssl->method->next_message(ssl);
719   hs->tls13_state = state_read_server_certificate_verify;
720   return ssl_hs_ok;
721 }
722 
do_read_server_certificate_verify(SSL_HANDSHAKE * hs)723 static enum ssl_hs_wait_t do_read_server_certificate_verify(SSL_HANDSHAKE *hs) {
724   SSL *const ssl = hs->ssl;
725   SSLMessage msg;
726   if (!ssl->method->get_message(ssl, &msg)) {
727     return ssl_hs_read_message;
728   }
729   switch (ssl_verify_peer_cert(hs)) {
730     case ssl_verify_ok:
731       break;
732     case ssl_verify_invalid:
733       return ssl_hs_error;
734     case ssl_verify_retry:
735       hs->tls13_state = state_read_server_certificate_verify;
736       return ssl_hs_certificate_verify;
737   }
738 
739   if (!ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE_VERIFY) ||
740       !tls13_process_certificate_verify(hs, msg) ||
741       !ssl_hash_message(hs, msg)) {
742     return ssl_hs_error;
743   }
744 
745   ssl->method->next_message(ssl);
746   hs->tls13_state = state_read_server_finished;
747   return ssl_hs_ok;
748 }
749 
do_server_certificate_reverify(SSL_HANDSHAKE * hs)750 static enum ssl_hs_wait_t do_server_certificate_reverify(SSL_HANDSHAKE *hs) {
751   switch (ssl_reverify_peer_cert(hs, /*send_alert=*/true)) {
752     case ssl_verify_ok:
753       break;
754     case ssl_verify_invalid:
755       return ssl_hs_error;
756     case ssl_verify_retry:
757       hs->tls13_state = state_server_certificate_reverify;
758       return ssl_hs_certificate_verify;
759   }
760   hs->tls13_state = state_read_server_finished;
761   return ssl_hs_ok;
762 }
763 
do_read_server_finished(SSL_HANDSHAKE * hs)764 static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) {
765   SSL *const ssl = hs->ssl;
766   SSLMessage msg;
767   if (!ssl->method->get_message(ssl, &msg)) {
768     return ssl_hs_read_message;
769   }
770   if (!ssl_check_message_type(ssl, msg, SSL3_MT_FINISHED) ||
771       !tls13_process_finished(hs, msg, false /* don't use saved value */) ||
772       !ssl_hash_message(hs, msg) ||
773       // Update the secret to the master secret and derive traffic keys.
774       !tls13_advance_key_schedule(
775           hs, MakeConstSpan(kZeroes, hs->transcript.DigestLen())) ||
776       !tls13_derive_application_secrets(hs)) {
777     return ssl_hs_error;
778   }
779 
780   // Finished should be the end of the flight.
781   if (ssl->method->has_unprocessed_handshake_data(ssl)) {
782     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
783     OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESS_HANDSHAKE_DATA);
784     return ssl_hs_error;
785   }
786 
787   ssl->method->next_message(ssl);
788   hs->tls13_state = state_send_end_of_early_data;
789   return ssl_hs_ok;
790 }
791 
do_send_end_of_early_data(SSL_HANDSHAKE * hs)792 static enum ssl_hs_wait_t do_send_end_of_early_data(SSL_HANDSHAKE *hs) {
793   SSL *const ssl = hs->ssl;
794 
795   if (ssl->s3->early_data_accepted) {
796     // DTLS and QUIC omit the EndOfEarlyData message. See RFC 9001, section 8.3,
797     // and RFC 9147, section 5.6.
798     if (ssl->quic_method == nullptr && !SSL_is_dtls(ssl)) {
799       ScopedCBB cbb;
800       CBB body;
801       if (!ssl->method->init_message(ssl, cbb.get(), &body,
802                                      SSL3_MT_END_OF_EARLY_DATA) ||
803           !ssl_add_message_cbb(ssl, cbb.get())) {
804         return ssl_hs_error;
805       }
806     }
807 
808     if (!close_early_data(hs, ssl_encryption_handshake)) {
809       return ssl_hs_error;
810     }
811   }
812 
813   hs->tls13_state = state_send_client_encrypted_extensions;
814   return ssl_hs_ok;
815 }
816 
do_send_client_encrypted_extensions(SSL_HANDSHAKE * hs)817 static enum ssl_hs_wait_t do_send_client_encrypted_extensions(
818     SSL_HANDSHAKE *hs) {
819   SSL *const ssl = hs->ssl;
820   // For now, only one extension uses client EncryptedExtensions. This function
821   // may be generalized if others use it in the future.
822   if (hs->new_session->has_application_settings &&
823       !ssl->s3->early_data_accepted) {
824     ScopedCBB cbb;
825     CBB body, extensions, extension;
826     uint16_t extension_type = TLSEXT_TYPE_application_settings_old;
827     if (hs->config->alps_use_new_codepoint) {
828       extension_type = TLSEXT_TYPE_application_settings;
829     }
830     if (!ssl->method->init_message(ssl, cbb.get(), &body,
831                                    SSL3_MT_ENCRYPTED_EXTENSIONS) ||
832         !CBB_add_u16_length_prefixed(&body, &extensions) ||
833         !CBB_add_u16(&extensions, extension_type) ||
834         !CBB_add_u16_length_prefixed(&extensions, &extension) ||
835         !CBB_add_bytes(&extension,
836                        hs->new_session->local_application_settings.data(),
837                        hs->new_session->local_application_settings.size()) ||
838         !ssl_add_message_cbb(ssl, cbb.get())) {
839       return ssl_hs_error;
840     }
841   }
842 
843   hs->tls13_state = state_send_client_certificate;
844   return ssl_hs_ok;
845 }
846 
check_credential(SSL_HANDSHAKE * hs,const SSL_CREDENTIAL * cred,uint16_t * out_sigalg)847 static bool check_credential(SSL_HANDSHAKE *hs, const SSL_CREDENTIAL *cred,
848                              uint16_t *out_sigalg) {
849   if (cred->type != SSLCredentialType::kX509) {
850     OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
851     return false;
852   }
853 
854   // All currently supported credentials require a signature.
855   if (!tls1_choose_signature_algorithm(hs, cred, out_sigalg)) {
856     return false;
857   }
858   // Use this credential if it either matches a requested issuer,
859   // or does not require issuer matching.
860   return ssl_credential_matches_requested_issuers(hs, cred);
861 }
862 
do_send_client_certificate(SSL_HANDSHAKE * hs)863 static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs) {
864   SSL *const ssl = hs->ssl;
865 
866   // The peer didn't request a certificate.
867   if (!hs->cert_request) {
868     hs->tls13_state = state_complete_second_flight;
869     return ssl_hs_ok;
870   }
871 
872   if (ssl->s3->ech_status == ssl_ech_rejected) {
873     // Do not send client certificates on ECH reject. We have not authenticated
874     // the server for the name that can learn the certificate.
875     SSL_certs_clear(ssl);
876   } else if (hs->config->cert->cert_cb != nullptr) {
877     // Call cert_cb to update the certificate.
878     int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
879     if (rv == 0) {
880       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
881       OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
882       return ssl_hs_error;
883     }
884     if (rv < 0) {
885       hs->tls13_state = state_send_client_certificate;
886       return ssl_hs_x509_lookup;
887     }
888   }
889 
890   Array<SSL_CREDENTIAL *> creds;
891   if (!ssl_get_credential_list(hs, &creds)) {
892     return ssl_hs_error;
893   }
894 
895   if (!creds.empty()) {
896     // Select the credential to use.
897     for (SSL_CREDENTIAL *cred : creds) {
898       ERR_clear_error();
899       uint16_t sigalg;
900       if (check_credential(hs, cred, &sigalg)) {
901         hs->credential = UpRef(cred);
902         hs->signature_algorithm = sigalg;
903         break;
904       }
905     }
906     if (hs->credential == nullptr) {
907       // The error from the last attempt is in the error queue.
908       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
909       return ssl_hs_error;
910     }
911   }
912 
913   if (!tls13_add_certificate(hs)) {
914     return ssl_hs_error;
915   }
916 
917   hs->tls13_state = state_send_client_certificate_verify;
918   return ssl_hs_ok;
919 }
920 
do_send_client_certificate_verify(SSL_HANDSHAKE * hs)921 static enum ssl_hs_wait_t do_send_client_certificate_verify(SSL_HANDSHAKE *hs) {
922   // Don't send CertificateVerify if there is no certificate.
923   if (hs->credential == nullptr) {
924     hs->tls13_state = state_complete_second_flight;
925     return ssl_hs_ok;
926   }
927 
928   switch (tls13_add_certificate_verify(hs)) {
929     case ssl_private_key_success:
930       hs->tls13_state = state_complete_second_flight;
931       return ssl_hs_ok;
932 
933     case ssl_private_key_retry:
934       hs->tls13_state = state_send_client_certificate_verify;
935       return ssl_hs_private_key_operation;
936 
937     case ssl_private_key_failure:
938       return ssl_hs_error;
939   }
940 
941   assert(0);
942   return ssl_hs_error;
943 }
944 
do_complete_second_flight(SSL_HANDSHAKE * hs)945 static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) {
946   SSL *const ssl = hs->ssl;
947   hs->can_release_private_key = true;
948 
949   // Send a Channel ID assertion if necessary.
950   if (hs->channel_id_negotiated) {
951     ScopedCBB cbb;
952     CBB body;
953     if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_CHANNEL_ID) ||
954         !tls1_write_channel_id(hs, &body) ||
955         !ssl_add_message_cbb(ssl, cbb.get())) {
956       return ssl_hs_error;
957     }
958   }
959 
960   // Send a Finished message.
961   if (!tls13_add_finished(hs)) {
962     return ssl_hs_error;
963   }
964 
965   // Derive the final keys and enable them.
966   if (!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal,
967                              hs->new_session.get(),
968                              hs->client_traffic_secret_0) ||
969       !tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_open,
970                              hs->new_session.get(),
971                              hs->server_traffic_secret_0) ||
972       !tls13_derive_resumption_secret(hs)) {
973     return ssl_hs_error;
974   }
975 
976   hs->tls13_state = state_done;
977   return ssl_hs_flush;
978 }
979 
tls13_client_handshake(SSL_HANDSHAKE * hs)980 enum ssl_hs_wait_t tls13_client_handshake(SSL_HANDSHAKE *hs) {
981   while (hs->tls13_state != state_done) {
982     enum ssl_hs_wait_t ret = ssl_hs_error;
983     enum client_hs_state_t state =
984         static_cast<enum client_hs_state_t>(hs->tls13_state);
985     switch (state) {
986       case state_read_hello_retry_request:
987         ret = do_read_hello_retry_request(hs);
988         break;
989       case state_send_second_client_hello:
990         ret = do_send_second_client_hello(hs);
991         break;
992       case state_read_server_hello:
993         ret = do_read_server_hello(hs);
994         break;
995       case state_read_encrypted_extensions:
996         ret = do_read_encrypted_extensions(hs);
997         break;
998       case state_read_certificate_request:
999         ret = do_read_certificate_request(hs);
1000         break;
1001       case state_read_server_certificate:
1002         ret = do_read_server_certificate(hs);
1003         break;
1004       case state_read_server_certificate_verify:
1005         ret = do_read_server_certificate_verify(hs);
1006         break;
1007       case state_server_certificate_reverify:
1008         ret = do_server_certificate_reverify(hs);
1009         break;
1010       case state_read_server_finished:
1011         ret = do_read_server_finished(hs);
1012         break;
1013       case state_send_end_of_early_data:
1014         ret = do_send_end_of_early_data(hs);
1015         break;
1016       case state_send_client_certificate:
1017         ret = do_send_client_certificate(hs);
1018         break;
1019       case state_send_client_encrypted_extensions:
1020         ret = do_send_client_encrypted_extensions(hs);
1021         break;
1022       case state_send_client_certificate_verify:
1023         ret = do_send_client_certificate_verify(hs);
1024         break;
1025       case state_complete_second_flight:
1026         ret = do_complete_second_flight(hs);
1027         break;
1028       case state_done:
1029         ret = ssl_hs_ok;
1030         break;
1031     }
1032 
1033     if (hs->tls13_state != state) {
1034       ssl_do_info_callback(hs->ssl, SSL_CB_CONNECT_LOOP, 1);
1035     }
1036 
1037     if (ret != ssl_hs_ok) {
1038       return ret;
1039     }
1040   }
1041 
1042   return ssl_hs_ok;
1043 }
1044 
tls13_client_handshake_state(SSL_HANDSHAKE * hs)1045 const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs) {
1046   enum client_hs_state_t state =
1047       static_cast<enum client_hs_state_t>(hs->tls13_state);
1048   switch (state) {
1049     case state_read_hello_retry_request:
1050       return "TLS 1.3 client read_hello_retry_request";
1051     case state_send_second_client_hello:
1052       return "TLS 1.3 client send_second_client_hello";
1053     case state_read_server_hello:
1054       return "TLS 1.3 client read_server_hello";
1055     case state_read_encrypted_extensions:
1056       return "TLS 1.3 client read_encrypted_extensions";
1057     case state_read_certificate_request:
1058       return "TLS 1.3 client read_certificate_request";
1059     case state_read_server_certificate:
1060       return "TLS 1.3 client read_server_certificate";
1061     case state_read_server_certificate_verify:
1062       return "TLS 1.3 client read_server_certificate_verify";
1063     case state_server_certificate_reverify:
1064       return "TLS 1.3 client server_certificate_reverify";
1065     case state_read_server_finished:
1066       return "TLS 1.3 client read_server_finished";
1067     case state_send_end_of_early_data:
1068       return "TLS 1.3 client send_end_of_early_data";
1069     case state_send_client_encrypted_extensions:
1070       return "TLS 1.3 client send_client_encrypted_extensions";
1071     case state_send_client_certificate:
1072       return "TLS 1.3 client send_client_certificate";
1073     case state_send_client_certificate_verify:
1074       return "TLS 1.3 client send_client_certificate_verify";
1075     case state_complete_second_flight:
1076       return "TLS 1.3 client complete_second_flight";
1077     case state_done:
1078       return "TLS 1.3 client done";
1079   }
1080 
1081   return "TLS 1.3 client unknown";
1082 }
1083 
tls13_process_new_session_ticket(SSL * ssl,const SSLMessage & msg)1084 bool tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
1085   if (ssl->s3->write_shutdown != ssl_shutdown_none) {
1086     // Ignore tickets on shutdown. Callers tend to indiscriminately call
1087     // |SSL_shutdown| before destroying an |SSL|, at which point calling the new
1088     // session callback may be confusing.
1089     return true;
1090   }
1091 
1092   CBS body = msg.body;
1093   UniquePtr<SSL_SESSION> session = tls13_create_session_with_ticket(ssl, &body);
1094   if (!session) {
1095     return false;
1096   }
1097 
1098   if ((ssl->session_ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) &&
1099       ssl->session_ctx->new_session_cb != NULL &&
1100       ssl->session_ctx->new_session_cb(ssl, session.get())) {
1101     // |new_session_cb|'s return value signals that it took ownership.
1102     session.release();
1103   }
1104 
1105   return true;
1106 }
1107 
tls13_create_session_with_ticket(SSL * ssl,CBS * body)1108 UniquePtr<SSL_SESSION> tls13_create_session_with_ticket(SSL *ssl, CBS *body) {
1109   UniquePtr<SSL_SESSION> session = SSL_SESSION_dup(
1110       ssl->s3->established_session.get(), SSL_SESSION_INCLUDE_NONAUTH);
1111   if (!session) {
1112     return nullptr;
1113   }
1114 
1115   ssl_session_rebase_time(ssl, session.get());
1116 
1117   uint32_t server_timeout;
1118   CBS ticket_nonce, ticket, extensions;
1119   if (!CBS_get_u32(body, &server_timeout) ||
1120       !CBS_get_u32(body, &session->ticket_age_add) ||
1121       !CBS_get_u8_length_prefixed(body, &ticket_nonce) ||
1122       !CBS_get_u16_length_prefixed(body, &ticket) ||
1123       CBS_len(&ticket) == 0 ||  //
1124       !session->ticket.CopyFrom(ticket) ||
1125       !CBS_get_u16_length_prefixed(body, &extensions) ||  //
1126       CBS_len(body) != 0) {
1127     ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1128     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
1129     return nullptr;
1130   }
1131 
1132   // Cap the renewable lifetime by the server advertised value. This avoids
1133   // wasting bandwidth on 0-RTT when we know the server will reject it.
1134   if (session->timeout > server_timeout) {
1135     session->timeout = server_timeout;
1136   }
1137 
1138   if (!tls13_derive_session_psk(session.get(), ticket_nonce,
1139                                 SSL_is_dtls(ssl))) {
1140     return nullptr;
1141   }
1142 
1143   SSLExtension early_data(TLSEXT_TYPE_early_data);
1144   uint8_t alert = SSL_AD_DECODE_ERROR;
1145   if (!ssl_parse_extensions(&extensions, &alert, {&early_data},
1146                             /*ignore_unknown=*/true)) {
1147     ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
1148     return nullptr;
1149   }
1150 
1151   if (early_data.present) {
1152     if (!CBS_get_u32(&early_data.data, &session->ticket_max_early_data) ||
1153         CBS_len(&early_data.data) != 0) {
1154       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1155       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
1156       return nullptr;
1157     }
1158 
1159     // QUIC does not use the max_early_data_size parameter and always sets it to
1160     // a fixed value. See RFC 9001, section 4.6.1.
1161     if (ssl->quic_method != nullptr &&
1162         session->ticket_max_early_data != 0xffffffff) {
1163       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
1164       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
1165       return nullptr;
1166     }
1167   }
1168 
1169   // Historically, OpenSSL filled in fake session IDs for ticket-based sessions.
1170   // Envoy's tests depend on this, although perhaps they shouldn't.
1171   session->session_id.ResizeForOverwrite(SHA256_DIGEST_LENGTH);
1172   SHA256(CBS_data(&ticket), CBS_len(&ticket), session->session_id.data());
1173 
1174   session->ticket_age_add_valid = true;
1175   session->not_resumable = false;
1176 
1177   return session;
1178 }
1179 
1180 BSSL_NAMESPACE_END
1181