handshake_client.cc
Go to the documentation of this file.
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to. The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  * notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  * notice, this list of conditions and the following disclaimer in the
29  * documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  * must display the following acknowledgement:
32  * "This product includes cryptographic software written by
33  * Eric Young (eay@cryptsoft.com)"
34  * The word 'cryptographic' can be left out if the rouines from the library
35  * being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  * the apps directory (application code) you must include an acknowledgement:
38  * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed. i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57 /* ====================================================================
58  * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
59  *
60  * Redistribution and use in source and binary forms, with or without
61  * modification, are permitted provided that the following conditions
62  * are met:
63  *
64  * 1. Redistributions of source code must retain the above copyright
65  * notice, this list of conditions and the following disclaimer.
66  *
67  * 2. Redistributions in binary form must reproduce the above copyright
68  * notice, this list of conditions and the following disclaimer in
69  * the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3. All advertising materials mentioning features or use of this
73  * software must display the following acknowledgment:
74  * "This product includes software developed by the OpenSSL Project
75  * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76  *
77  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78  * endorse or promote products derived from this software without
79  * prior written permission. For written permission, please contact
80  * openssl-core@openssl.org.
81  *
82  * 5. Products derived from this software may not be called "OpenSSL"
83  * nor may "OpenSSL" appear in their names without prior written
84  * permission of the OpenSSL Project.
85  *
86  * 6. Redistributions of any form whatsoever must retain the following
87  * acknowledgment:
88  * "This product includes software developed by the OpenSSL Project
89  * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90  *
91  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
95  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102  * OF THE POSSIBILITY OF SUCH DAMAGE.
103  * ====================================================================
104  *
105  * This product includes cryptographic software written by Eric Young
106  * (eay@cryptsoft.com). This product includes software written by Tim
107  * Hudson (tjh@cryptsoft.com).
108  *
109  */
110 /* ====================================================================
111  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
112  *
113  * Portions of the attached software ("Contribution") are developed by
114  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
115  *
116  * The Contribution is licensed pursuant to the OpenSSL open source
117  * license provided above.
118  *
119  * ECC cipher suite support in OpenSSL originally written by
120  * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
121  *
122  */
123 /* ====================================================================
124  * Copyright 2005 Nokia. All rights reserved.
125  *
126  * The portions of the attached software ("Contribution") is developed by
127  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
128  * license.
129  *
130  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
131  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
132  * support (see RFC 4279) to OpenSSL.
133  *
134  * No patent licenses or other rights except those expressly stated in
135  * the OpenSSL open source license shall be deemed granted or received
136  * expressly, by implication, estoppel, or otherwise.
137  *
138  * No assurances are provided by Nokia that the Contribution does not
139  * infringe the patent or other intellectual property rights of any third
140  * party or that the license provides you with all the necessary rights
141  * to make use of the Contribution.
142  *
143  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
144  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
145  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
146  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
147  * OTHERWISE.
148  */
149 
150 #include <openssl/ssl.h>
151 
152 #include <assert.h>
153 #include <limits.h>
154 #include <string.h>
155 
156 #include <utility>
157 
158 #include <openssl/aead.h>
159 #include <openssl/bn.h>
160 #include <openssl/bytestring.h>
161 #include <openssl/ec_key.h>
162 #include <openssl/ecdsa.h>
163 #include <openssl/err.h>
164 #include <openssl/evp.h>
165 #include <openssl/hpke.h>
166 #include <openssl/md5.h>
167 #include <openssl/mem.h>
168 #include <openssl/rand.h>
169 #include <openssl/sha.h>
170 
171 #include "../crypto/internal.h"
172 #include "internal.h"
173 
174 
176 
201 };
202 
203 // ssl_get_client_disabled sets |*out_mask_a| and |*out_mask_k| to masks of
204 // disabled algorithms.
206  uint32_t *out_mask_a,
207  uint32_t *out_mask_k) {
208  *out_mask_a = 0;
209  *out_mask_k = 0;
210 
211  // PSK requires a client callback.
212  if (hs->config->psk_client_callback == NULL) {
213  *out_mask_a |= SSL_aPSK;
214  *out_mask_k |= SSL_kPSK;
215  }
216 }
217 
220  const SSL *const ssl = hs->ssl;
221  uint32_t mask_a, mask_k;
222  ssl_get_client_disabled(hs, &mask_a, &mask_k);
223 
224  CBB child;
226  return false;
227  }
228 
229  // Add a fake cipher suite. See RFC 8701.
230  if (ssl->ctx->grease_enabled &&
232  return false;
233  }
234 
235  // Add TLS 1.3 ciphers. Order ChaCha20-Poly1305 relative to AES-GCM based on
236  // hardware support.
237  if (hs->max_version >= TLS1_3_VERSION) {
238  if (!EVP_has_aes_hardware() &&
240  return false;
241  }
242  if (!CBB_add_u16(&child, TLS1_CK_AES_128_GCM_SHA256 & 0xffff) ||
244  return false;
245  }
246  if (EVP_has_aes_hardware() &&
248  return false;
249  }
250  }
251 
253  bool any_enabled = false;
254  for (const SSL_CIPHER *cipher : SSL_get_ciphers(ssl)) {
255  // Skip disabled ciphers
256  if ((cipher->algorithm_mkey & mask_k) ||
257  (cipher->algorithm_auth & mask_a)) {
258  continue;
259  }
260  if (SSL_CIPHER_get_min_version(cipher) > hs->max_version ||
261  SSL_CIPHER_get_max_version(cipher) < hs->min_version) {
262  continue;
263  }
264  any_enabled = true;
265  if (!CBB_add_u16(&child, SSL_CIPHER_get_protocol_id(cipher))) {
266  return false;
267  }
268  }
269 
270  // If all ciphers were disabled, return the error to the caller.
271  if (!any_enabled && hs->max_version < TLS1_3_VERSION) {
273  return false;
274  }
275  }
276 
277  if (ssl->mode & SSL_MODE_SEND_FALLBACK_SCSV) {
278  if (!CBB_add_u16(&child, SSL3_CK_FALLBACK_SCSV & 0xffff)) {
279  return false;
280  }
281  }
282 
283  return CBB_flush(out);
284 }
285 
287  CBB *cbb,
289  bool empty_session_id) {
290  const SSL *const ssl = hs->ssl;
291  CBB child;
292  if (!CBB_add_u16(cbb, hs->client_version) ||
293  !CBB_add_bytes(cbb,
295  : ssl->s3->client_random,
296  SSL3_RANDOM_SIZE) ||
298  return false;
299  }
300 
301  // Do not send a session ID on renegotiation.
302  if (!ssl->s3->initial_handshake_complete &&
303  !empty_session_id &&
305  return false;
306  }
307 
308  if (SSL_is_dtls(ssl)) {
309  if (!CBB_add_u8_length_prefixed(cbb, &child) ||
310  !CBB_add_bytes(&child, ssl->d1->cookie, ssl->d1->cookie_len)) {
311  return false;
312  }
313  }
314 
315  if (!ssl_write_client_cipher_list(hs, cbb, type) ||
316  !CBB_add_u8(cbb, 1 /* one compression method */) ||
317  !CBB_add_u8(cbb, 0 /* null compression */)) {
318  return false;
319  }
320  return true;
321 }
322 
324  SSL *const ssl = hs->ssl;
325  ScopedCBB cbb;
326  CBB body;
330  bool needs_psk_binder;
332  if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_CLIENT_HELLO) ||
334  /*empty_session_id*/ false) ||
335  !ssl_add_clienthello_tlsext(hs, &body, /*out_encoded=*/nullptr,
336  &needs_psk_binder, type, CBB_len(&body)) ||
337  !ssl->method->finish_message(ssl, cbb.get(), &msg)) {
338  return false;
339  }
340 
341  // Now that the length prefixes have been computed, fill in the placeholder
342  // PSK binder.
343  if (needs_psk_binder) {
344  // ClientHelloOuter cannot have a PSK binder. Otherwise the
345  // ClientHellOuterAAD computation would break.
346  assert(type != ssl_client_hello_outer);
348  /*out_binder_len=*/0)) {
349  return false;
350  }
351  }
352 
353  return ssl->method->add_message(ssl, std::move(msg));
354 }
355 
356 static bool parse_server_version(const SSL_HANDSHAKE *hs, uint16_t *out_version,
357  uint8_t *out_alert,
358  const ParsedServerHello &server_hello) {
359  // If the outer version is not TLS 1.2, use it.
360  // TODO(davidben): This function doesn't quite match the RFC8446 formulation.
361  if (server_hello.legacy_version != TLS1_2_VERSION) {
362  *out_version = server_hello.legacy_version;
363  return true;
364  }
365 
367  CBS extensions = server_hello.extensions;
369  /*ignore_unknown=*/true)) {
370  return false;
371  }
372 
373  if (!supported_versions.present) {
374  *out_version = server_hello.legacy_version;
375  return true;
376  }
377 
378  if (!CBS_get_u16(&supported_versions.data, out_version) ||
379  CBS_len(&supported_versions.data) != 0) {
380  *out_alert = SSL_AD_DECODE_ERROR;
381  return false;
382  }
383 
384  return true;
385 }
386 
387 // should_offer_early_data returns |ssl_early_data_accepted| if |hs| should
388 // offer early data, and some other reason code otherwise.
389 static ssl_early_data_reason_t should_offer_early_data(
390  const SSL_HANDSHAKE *hs) {
391  const SSL *const ssl = hs->ssl;
392  assert(!ssl->server);
393  if (!ssl->enable_early_data) {
395  }
396 
397  if (hs->max_version < TLS1_3_VERSION) {
398  // We discard inapplicable sessions, so this is redundant with the session
399  // checks below, but reporting that TLS 1.3 was disabled is more useful.
401  }
402 
403  if (ssl->session == nullptr) {
405  }
406 
408  ssl->session->ticket_max_early_data == 0) {
410  }
411 
412  if (!ssl->session->early_alpn.empty()) {
413  if (!ssl_is_alpn_protocol_allowed(hs, ssl->session->early_alpn)) {
414  // Avoid reporting a confusing value in |SSL_get0_alpn_selected|.
416  }
417 
418  // If the previous connection negotiated ALPS, only offer 0-RTT when the
419  // local are settings are consistent with what we'd offer for this
420  // connection.
421  if (ssl->session->has_application_settings) {
424  ssl->session->early_alpn) ||
425  settings != ssl->session->local_application_settings) {
427  }
428  }
429  }
430 
431  // Early data has not yet been accepted, but we use it as a success code.
433 }
434 
436  hs->ech_client_outer.Reset();
437  hs->cookie.Reset();
438  hs->key_share_bytes.Reset();
439 }
440 
442  SSL *const ssl = hs->ssl;
443 
445  // |session_reused| must be reset in case this is a renegotiation.
446  ssl->s3->session_reused = false;
447 
448  // Freeze the version range.
449  if (!ssl_get_version_range(hs, &hs->min_version, &hs->max_version)) {
450  return ssl_hs_error;
451  }
452 
454  size_t ech_enc_len;
455  if (!ssl_select_ech_config(hs, ech_enc, &ech_enc_len)) {
456  return ssl_hs_error;
457  }
458 
459  // Always advertise the ClientHello version from the original maximum version,
460  // even on renegotiation. The static RSA key exchange uses this field, and
461  // some servers fail when it changes across handshakes.
462  if (SSL_is_dtls(hs->ssl)) {
463  hs->client_version =
465  } else {
466  hs->client_version =
468  }
469 
470  // If the configured session has expired or is not usable, drop it. We also do
471  // not offer sessions on renegotiation.
472  if (ssl->session != nullptr) {
473  if (ssl->session->is_server ||
474  !ssl_supports_version(hs, ssl->session->ssl_version) ||
475  // Do not offer TLS 1.2 sessions with ECH. ClientHelloInner does not
476  // offer TLS 1.2, and the cleartext session ID may leak the server
477  // identity.
478  (hs->selected_ech_config &&
480  !SSL_SESSION_is_resumable(ssl->session.get()) ||
481  !ssl_session_is_time_valid(ssl, ssl->session.get()) ||
482  (ssl->quic_method != nullptr) != ssl->session->is_quic ||
483  ssl->s3->initial_handshake_complete) {
484  ssl_set_session(ssl, nullptr);
485  }
486  }
487 
488  if (!RAND_bytes(ssl->s3->client_random, sizeof(ssl->s3->client_random))) {
489  return ssl_hs_error;
490  }
491  if (hs->selected_ech_config &&
493  return ssl_hs_error;
494  }
495 
496  // Never send a session ID in QUIC. QUIC uses TLS 1.3 at a minimum and
497  // disables TLS 1.3 middlebox compatibility mode.
498  if (ssl->quic_method == nullptr) {
499  const bool has_id_session = ssl->session != nullptr &&
500  ssl->session->session_id_length > 0 &&
501  ssl->session->ticket.empty();
502  const bool has_ticket_session =
503  ssl->session != nullptr && !ssl->session->ticket.empty();
504  if (has_id_session) {
505  hs->session_id_len = ssl->session->session_id_length;
506  OPENSSL_memcpy(hs->session_id, ssl->session->session_id,
507  hs->session_id_len);
508  } else if (has_ticket_session || hs->max_version >= TLS1_3_VERSION) {
509  // Send a random session ID. TLS 1.3 always sends one, and TLS 1.2 session
510  // tickets require a placeholder value to signal resumption.
511  hs->session_id_len = sizeof(hs->session_id);
512  if (!RAND_bytes(hs->session_id, hs->session_id_len)) {
513  return ssl_hs_error;
514  }
515  }
516  }
517 
518  ssl_early_data_reason_t reason = should_offer_early_data(hs);
519  if (reason != ssl_early_data_accepted) {
520  ssl->s3->early_data_reason = reason;
521  } else {
522  hs->early_data_offered = true;
523  }
524 
525  if (!ssl_setup_key_shares(hs, /*override_group_id=*/0) ||
527  !ssl_encrypt_client_hello(hs, MakeConstSpan(ech_enc, ech_enc_len)) ||
528  !ssl_add_client_hello(hs)) {
529  return ssl_hs_error;
530  }
531 
533  return ssl_hs_flush;
534 }
535 
537  SSL *const ssl = hs->ssl;
538 
539  if (SSL_is_dtls(ssl)) {
541  return ssl_hs_ok;
542  }
543 
544  if (!hs->early_data_offered) {
546  return ssl_hs_ok;
547  }
548 
549  ssl->s3->aead_write_ctx->SetVersionIfNullCipher(ssl->session->ssl_version);
550  if (!ssl->method->add_change_cipher_spec(ssl)) {
551  return ssl_hs_error;
552  }
553 
554  if (!tls13_init_early_key_schedule(hs, ssl->session.get()) ||
556  return ssl_hs_error;
557  }
558 
559  // Stash the early data session, so connection properties may be queried out
560  // of it.
561  hs->early_session = UpRef(ssl->session);
563  return ssl_hs_ok;
564 }
565 
567  if (hs->ssl->ctx->reverify_on_resume) {
568  // Don't send an alert on error. The alert be in early data, which the
569  // server may not accept anyway. It would also be a mismatch between QUIC
570  // and TCP because the QUIC early keys are deferred below.
571  //
572  // TODO(davidben): The client behavior should be to verify the certificate
573  // before deciding whether to offer the session and, if invalid, decline to
574  // send the session.
575  switch (ssl_reverify_peer_cert(hs, /*send_alert=*/false)) {
576  case ssl_verify_ok:
577  break;
578  case ssl_verify_invalid:
579  return ssl_hs_error;
580  case ssl_verify_retry:
583  }
584  }
585 
586  // Defer releasing the 0-RTT key to after certificate reverification, so the
587  // QUIC implementation does not accidentally write data too early.
589  hs->early_session.get(),
590  hs->early_traffic_secret())) {
591  return ssl_hs_error;
592  }
593 
594  hs->in_early_data = true;
595  hs->can_early_write = true;
597  return ssl_hs_early_return;
598 }
599 
601  SSL *const ssl = hs->ssl;
602 
603  assert(SSL_is_dtls(ssl));
604 
605  // When implementing DTLS 1.3, we need to handle the interactions between
606  // HelloVerifyRequest, DTLS 1.3's HelloVerifyRequest removal, and ECH.
607  assert(hs->max_version < TLS1_3_VERSION);
608 
609  SSLMessage msg;
610  if (!ssl->method->get_message(ssl, &msg)) {
611  return ssl_hs_read_message;
612  }
613 
614  if (msg.type != DTLS1_MT_HELLO_VERIFY_REQUEST) {
616  return ssl_hs_ok;
617  }
618 
619  CBS hello_verify_request = msg.body, cookie;
620  uint16_t server_version;
621  if (!CBS_get_u16(&hello_verify_request, &server_version) ||
622  !CBS_get_u8_length_prefixed(&hello_verify_request, &cookie) ||
623  CBS_len(&cookie) > sizeof(ssl->d1->cookie) ||
624  CBS_len(&hello_verify_request) != 0) {
627  return ssl_hs_error;
628  }
629 
630  OPENSSL_memcpy(ssl->d1->cookie, CBS_data(&cookie), CBS_len(&cookie));
631  ssl->d1->cookie_len = CBS_len(&cookie);
632 
633  ssl->method->next_message(ssl);
634 
635  // DTLS resets the handshake buffer after HelloVerifyRequest.
636  if (!hs->transcript.Init()) {
637  return ssl_hs_error;
638  }
639 
640  if (!ssl_add_client_hello(hs)) {
641  return ssl_hs_error;
642  }
643 
645  return ssl_hs_flush;
646 }
647 
649  const SSLMessage &msg) {
650  if (msg.type != SSL3_MT_SERVER_HELLO) {
652  *out_alert = SSL_AD_UNEXPECTED_MESSAGE;
653  return false;
654  }
655  out->raw = msg.raw;
656  CBS body = msg.body;
657  if (!CBS_get_u16(&body, &out->legacy_version) ||
658  !CBS_get_bytes(&body, &out->random, SSL3_RANDOM_SIZE) ||
659  !CBS_get_u8_length_prefixed(&body, &out->session_id) ||
660  CBS_len(&out->session_id) > SSL3_SESSION_ID_SIZE ||
661  !CBS_get_u16(&body, &out->cipher_suite) ||
662  !CBS_get_u8(&body, &out->compression_method)) {
664  *out_alert = SSL_AD_DECODE_ERROR;
665  return false;
666  }
667  // In TLS 1.2 and below, empty extensions blocks may be omitted. In TLS 1.3,
668  // ServerHellos always have extensions, so this can be applied generically.
669  CBS_init(&out->extensions, nullptr, 0);
670  if ((CBS_len(&body) != 0 &&
671  !CBS_get_u16_length_prefixed(&body, &out->extensions)) ||
672  CBS_len(&body) != 0) {
674  *out_alert = SSL_AD_DECODE_ERROR;
675  return false;
676  }
677  return true;
678 }
679 
681  SSL *const ssl = hs->ssl;
682  SSLMessage msg;
683  if (!ssl->method->get_message(ssl, &msg)) {
685  }
686 
687  ParsedServerHello server_hello;
688  uint16_t server_version;
690  if (!ssl_parse_server_hello(&server_hello, &alert, msg) ||
691  !parse_server_version(hs, &server_version, &alert, server_hello)) {
692  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
693  return ssl_hs_error;
694  }
695 
696  if (!ssl_supports_version(hs, server_version)) {
699  return ssl_hs_error;
700  }
701 
702  assert(ssl->s3->have_version == ssl->s3->initial_handshake_complete);
703  if (!ssl->s3->have_version) {
704  ssl->version = server_version;
705  // At this point, the connection's version is known and ssl->version is
706  // fixed. Begin enforcing the record-layer version.
707  ssl->s3->have_version = true;
708  ssl->s3->aead_write_ctx->SetVersionIfNullCipher(ssl->version);
709  } else if (server_version != ssl->version) {
712  return ssl_hs_error;
713  }
714 
715  if (ssl_protocol_version(ssl) >= TLS1_3_VERSION) {
716  hs->state = state_tls13;
717  return ssl_hs_ok;
718  }
719 
720  // Clear some TLS 1.3 state that no longer needs to be retained.
721  hs->key_shares[0].reset();
722  hs->key_shares[1].reset();
724 
725  // A TLS 1.2 server would not know to skip the early data we offered. Report
726  // an error code sooner. The caller may use this error code to implement the
727  // fallback described in RFC 8446 appendix D.3.
728  if (hs->early_data_offered) {
729  // Disconnect early writes. This ensures subsequent |SSL_write| calls query
730  // the handshake which, in turn, will replay the error code rather than fail
731  // at the |write_shutdown| check. See https://crbug.com/1078515.
732  // TODO(davidben): Should all handshake errors do this? What about record
733  // decryption failures?
734  hs->can_early_write = false;
737  return ssl_hs_error;
738  }
739 
740  // TLS 1.2 handshakes cannot accept ECH.
741  if (hs->selected_ech_config) {
742  ssl->s3->ech_status = ssl_ech_rejected;
743  }
744 
745  // Copy over the server random.
746  OPENSSL_memcpy(ssl->s3->server_random, CBS_data(&server_hello.random),
748 
749  // Enforce the TLS 1.3 anti-downgrade feature.
750  if (!ssl->s3->initial_handshake_complete &&
752  static_assert(
753  sizeof(kTLS12DowngradeRandom) == sizeof(kTLS13DowngradeRandom),
754  "downgrade signals have different size");
755  static_assert(
756  sizeof(kJDK11DowngradeRandom) == sizeof(kTLS13DowngradeRandom),
757  "downgrade signals have different size");
758  auto suffix =
759  MakeConstSpan(ssl->s3->server_random, sizeof(ssl->s3->server_random))
760  .subspan(SSL3_RANDOM_SIZE - sizeof(kTLS13DowngradeRandom));
765  return ssl_hs_error;
766  }
767  }
768 
769  // The cipher must be allowed in the selected version and enabled.
770  const SSL_CIPHER *cipher = SSL_get_cipher_by_value(server_hello.cipher_suite);
771  uint32_t mask_a, mask_k;
772  ssl_get_client_disabled(hs, &mask_a, &mask_k);
773  if (cipher == nullptr ||
774  (cipher->algorithm_mkey & mask_k) ||
775  (cipher->algorithm_auth & mask_a) ||
778  !sk_SSL_CIPHER_find(SSL_get_ciphers(ssl), nullptr, cipher)) {
781  return ssl_hs_error;
782  }
783 
784  hs->new_cipher = cipher;
785 
786  if (hs->session_id_len != 0 &&
787  CBS_mem_equal(&server_hello.session_id, hs->session_id,
788  hs->session_id_len)) {
789  // Echoing the ClientHello session ID in TLS 1.2, whether from the session
790  // or a synthetic one, indicates resumption. If there was no session (or if
791  // the session was only offered in ECH ClientHelloInner), this was the
792  // TLS 1.3 compatibility mode session ID. As we know this is not a session
793  // the server knows about, any server resuming it is in error. Reject the
794  // first connection deterministicly, rather than installing an invalid
795  // session into the session cache. https://crbug.com/796910
796  if (ssl->session == nullptr || ssl->s3->ech_status == ssl_ech_rejected) {
799  return ssl_hs_error;
800  }
801  if (ssl->session->ssl_version != ssl->version) {
804  return ssl_hs_error;
805  }
806  if (ssl->session->cipher != hs->new_cipher) {
809  return ssl_hs_error;
810  }
811  if (!ssl_session_is_context_valid(hs, ssl->session.get())) {
812  // This is actually a client application bug.
816  return ssl_hs_error;
817  }
818  // We never offer sessions on renegotiation.
819  assert(!ssl->s3->initial_handshake_complete);
820  ssl->s3->session_reused = true;
821  } else {
822  // The session wasn't resumed. Create a fresh SSL_SESSION to fill out.
823  ssl_set_session(ssl, NULL);
824  if (!ssl_get_new_session(hs)) {
826  return ssl_hs_error;
827  }
828  // Note: session_id could be empty.
829  hs->new_session->session_id_length = CBS_len(&server_hello.session_id);
830  OPENSSL_memcpy(hs->new_session->session_id,
831  CBS_data(&server_hello.session_id),
832  CBS_len(&server_hello.session_id));
833  hs->new_session->cipher = hs->new_cipher;
834  }
835 
836  // Now that the cipher is known, initialize the handshake hash and hash the
837  // ServerHello.
838  if (!hs->transcript.InitHash(ssl_protocol_version(ssl), hs->new_cipher) ||
839  !ssl_hash_message(hs, msg)) {
841  return ssl_hs_error;
842  }
843 
844  // If doing a full handshake, the server may request a client certificate
845  // which requires hashing the handshake transcript. Otherwise, the handshake
846  // buffer may be released.
847  if (ssl->session != NULL ||
849  hs->transcript.FreeBuffer();
850  }
851 
852  // Only the NULL compression algorithm is supported.
853  if (server_hello.compression_method != 0) {
856  return ssl_hs_error;
857  }
858 
859  if (!ssl_parse_serverhello_tlsext(hs, &server_hello.extensions)) {
861  return ssl_hs_error;
862  }
863 
864  if (ssl->session != NULL &&
865  hs->extended_master_secret != ssl->session->extended_master_secret) {
866  if (ssl->session->extended_master_secret) {
868  } else {
870  }
872  return ssl_hs_error;
873  }
874 
875  ssl->method->next_message(ssl);
876 
877  if (ssl->session != NULL) {
878  if (ssl->ctx->reverify_on_resume &&
881  } else {
883  }
884  return ssl_hs_ok;
885  }
886 
888  return ssl_hs_ok;
889 }
890 
893  if (wait == ssl_hs_ok) {
895  return ssl_hs_ok;
896  }
897 
898  return wait;
899 }
900 
902  SSL *const ssl = hs->ssl;
903 
906  return ssl_hs_ok;
907  }
908 
909  SSLMessage msg;
910  if (!ssl->method->get_message(ssl, &msg)) {
911  return ssl_hs_read_message;
912  }
913 
915  !ssl_hash_message(hs, msg)) {
916  return ssl_hs_error;
917  }
918 
919  CBS body = msg.body;
921  if (!ssl_parse_cert_chain(&alert, &hs->new_session->certs, &hs->peer_pubkey,
922  NULL, &body, ssl->ctx->pool)) {
923  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
924  return ssl_hs_error;
925  }
926 
927  if (sk_CRYPTO_BUFFER_num(hs->new_session->certs.get()) == 0 ||
928  CBS_len(&body) != 0 ||
929  !ssl->ctx->x509_method->session_cache_objects(hs->new_session.get())) {
932  return ssl_hs_error;
933  }
934 
936  hs, hs->peer_pubkey.get(),
937  sk_CRYPTO_BUFFER_value(hs->new_session->certs.get(), 0))) {
939  return ssl_hs_error;
940  }
941 
942  ssl->method->next_message(ssl);
943 
945  return ssl_hs_ok;
946 }
947 
949  SSL *const ssl = hs->ssl;
950 
951  if (!hs->certificate_status_expected) {
953  return ssl_hs_ok;
954  }
955 
956  SSLMessage msg;
957  if (!ssl->method->get_message(ssl, &msg)) {
958  return ssl_hs_read_message;
959  }
960 
961  if (msg.type != SSL3_MT_CERTIFICATE_STATUS) {
962  // A server may send status_request in ServerHello and then change its mind
963  // about sending CertificateStatus.
965  return ssl_hs_ok;
966  }
967 
968  if (!ssl_hash_message(hs, msg)) {
969  return ssl_hs_error;
970  }
971 
972  CBS certificate_status = msg.body, ocsp_response;
973  uint8_t status_type;
974  if (!CBS_get_u8(&certificate_status, &status_type) ||
975  status_type != TLSEXT_STATUSTYPE_ocsp ||
976  !CBS_get_u24_length_prefixed(&certificate_status, &ocsp_response) ||
977  CBS_len(&ocsp_response) == 0 ||
978  CBS_len(&certificate_status) != 0) {
981  return ssl_hs_error;
982  }
983 
984  hs->new_session->ocsp_response.reset(
985  CRYPTO_BUFFER_new_from_CBS(&ocsp_response, ssl->ctx->pool));
986  if (hs->new_session->ocsp_response == nullptr) {
988  return ssl_hs_error;
989  }
990 
991  ssl->method->next_message(ssl);
992 
994  return ssl_hs_ok;
995 }
996 
1000  return ssl_hs_ok;
1001  }
1002 
1003  switch (ssl_verify_peer_cert(hs)) {
1004  case ssl_verify_ok:
1005  break;
1006  case ssl_verify_invalid:
1007  return ssl_hs_error;
1008  case ssl_verify_retry:
1011  }
1012 
1014  return ssl_hs_ok;
1015 }
1016 
1018  assert(hs->ssl->ctx->reverify_on_resume);
1019 
1020  switch (ssl_reverify_peer_cert(hs, /*send_alert=*/true)) {
1021  case ssl_verify_ok:
1022  break;
1023  case ssl_verify_invalid:
1024  return ssl_hs_error;
1025  case ssl_verify_retry:
1028  }
1029 
1031  return ssl_hs_ok;
1032 }
1033 
1035  SSL *const ssl = hs->ssl;
1036  SSLMessage msg;
1037  if (!ssl->method->get_message(ssl, &msg)) {
1038  return ssl_hs_read_message;
1039  }
1040 
1041  if (msg.type != SSL3_MT_SERVER_KEY_EXCHANGE) {
1042  // Some ciphers (pure PSK) have an optional ServerKeyExchange message.
1046  return ssl_hs_error;
1047  }
1048 
1050  return ssl_hs_ok;
1051  }
1052 
1053  if (!ssl_hash_message(hs, msg)) {
1054  return ssl_hs_error;
1055  }
1056 
1057  uint32_t alg_k = hs->new_cipher->algorithm_mkey;
1058  uint32_t alg_a = hs->new_cipher->algorithm_auth;
1059  CBS server_key_exchange = msg.body;
1060  if (alg_a & SSL_aPSK) {
1061  CBS psk_identity_hint;
1062 
1063  // Each of the PSK key exchanges begins with a psk_identity_hint.
1064  if (!CBS_get_u16_length_prefixed(&server_key_exchange,
1065  &psk_identity_hint)) {
1068  return ssl_hs_error;
1069  }
1070 
1071  // Store the PSK identity hint for the ClientKeyExchange. Assume that the
1072  // maximum length of a PSK identity hint can be as long as the maximum
1073  // length of a PSK identity. Also do not allow NULL characters; identities
1074  // are saved as C strings.
1075  //
1076  // TODO(davidben): Should invalid hints be ignored? It's a hint rather than
1077  // a specific identity.
1078  if (CBS_len(&psk_identity_hint) > PSK_MAX_IDENTITY_LEN ||
1079  CBS_contains_zero_byte(&psk_identity_hint)) {
1082  return ssl_hs_error;
1083  }
1084 
1085  // Save non-empty identity hints as a C string. Empty identity hints we
1086  // treat as missing. Plain PSK makes it possible to send either no hint
1087  // (omit ServerKeyExchange) or an empty hint, while ECDHE_PSK can only spell
1088  // empty hint. Having different capabilities is odd, so we interpret empty
1089  // and missing as identical.
1090  char *raw = nullptr;
1091  if (CBS_len(&psk_identity_hint) != 0 &&
1092  !CBS_strdup(&psk_identity_hint, &raw)) {
1095  return ssl_hs_error;
1096  }
1097  hs->peer_psk_identity_hint.reset(raw);
1098  }
1099 
1100  if (alg_k & SSL_kECDHE) {
1101  // Parse the server parameters.
1102  uint8_t group_type;
1103  uint16_t group_id;
1104  CBS point;
1105  if (!CBS_get_u8(&server_key_exchange, &group_type) ||
1106  group_type != NAMED_CURVE_TYPE ||
1107  !CBS_get_u16(&server_key_exchange, &group_id) ||
1108  !CBS_get_u8_length_prefixed(&server_key_exchange, &point)) {
1111  return ssl_hs_error;
1112  }
1113  hs->new_session->group_id = group_id;
1114 
1115  // Ensure the group is consistent with preferences.
1116  if (!tls1_check_group_id(hs, group_id)) {
1119  return ssl_hs_error;
1120  }
1121 
1122  // Initialize ECDH and save the peer public key for later.
1123  hs->key_shares[0] = SSLKeyShare::Create(group_id);
1124  if (!hs->key_shares[0] ||
1125  !hs->peer_key.CopyFrom(point)) {
1126  return ssl_hs_error;
1127  }
1128  } else if (!(alg_k & SSL_kPSK)) {
1131  return ssl_hs_error;
1132  }
1133 
1134  // At this point, |server_key_exchange| contains the signature, if any, while
1135  // |msg.body| contains the entire message. From that, derive a CBS containing
1136  // just the parameter.
1137  CBS parameter;
1138  CBS_init(&parameter, CBS_data(&msg.body),
1139  CBS_len(&msg.body) - CBS_len(&server_key_exchange));
1140 
1141  // ServerKeyExchange should be signed by the server's public key.
1144  if (ssl_protocol_version(ssl) >= TLS1_2_VERSION) {
1145  if (!CBS_get_u16(&server_key_exchange, &signature_algorithm)) {
1148  return ssl_hs_error;
1149  }
1150  uint8_t alert = SSL_AD_DECODE_ERROR;
1151  if (!tls12_check_peer_sigalg(hs, &alert, signature_algorithm)) {
1152  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
1153  return ssl_hs_error;
1154  }
1155  hs->new_session->peer_signature_algorithm = signature_algorithm;
1157  hs->peer_pubkey.get())) {
1160  return ssl_hs_error;
1161  }
1162 
1163  // The last field in |server_key_exchange| is the signature.
1164  CBS signature;
1165  if (!CBS_get_u16_length_prefixed(&server_key_exchange, &signature) ||
1166  CBS_len(&server_key_exchange) != 0) {
1169  return ssl_hs_error;
1170  }
1171 
1172  ScopedCBB transcript;
1173  Array<uint8_t> transcript_data;
1174  if (!CBB_init(transcript.get(),
1175  2 * SSL3_RANDOM_SIZE + CBS_len(&parameter)) ||
1176  !CBB_add_bytes(transcript.get(), ssl->s3->client_random,
1177  SSL3_RANDOM_SIZE) ||
1178  !CBB_add_bytes(transcript.get(), ssl->s3->server_random,
1179  SSL3_RANDOM_SIZE) ||
1180  !CBB_add_bytes(transcript.get(), CBS_data(&parameter),
1181  CBS_len(&parameter)) ||
1182  !CBBFinishArray(transcript.get(), &transcript_data)) {
1185  return ssl_hs_error;
1186  }
1187 
1188  if (!ssl_public_key_verify(ssl, signature, signature_algorithm,
1189  hs->peer_pubkey.get(), transcript_data)) {
1190  // bad signature
1193  return ssl_hs_error;
1194  }
1195  } else {
1196  // PSK ciphers are the only supported certificate-less ciphers.
1197  assert(alg_a == SSL_aPSK);
1198 
1199  if (CBS_len(&server_key_exchange) > 0) {
1202  return ssl_hs_error;
1203  }
1204  }
1205 
1206  ssl->method->next_message(ssl);
1208  return ssl_hs_ok;
1209 }
1210 
1212  SSL *const ssl = hs->ssl;
1213 
1216  return ssl_hs_ok;
1217  }
1218 
1219  SSLMessage msg;
1220  if (!ssl->method->get_message(ssl, &msg)) {
1221  return ssl_hs_read_message;
1222  }
1223 
1224  if (msg.type == SSL3_MT_SERVER_HELLO_DONE) {
1225  // If we get here we don't need the handshake buffer as we won't be doing
1226  // client auth.
1227  hs->transcript.FreeBuffer();
1229  return ssl_hs_ok;
1230  }
1231 
1233  !ssl_hash_message(hs, msg)) {
1234  return ssl_hs_error;
1235  }
1236 
1237  // Get the certificate types.
1238  CBS body = msg.body, certificate_types;
1239  if (!CBS_get_u8_length_prefixed(&body, &certificate_types)) {
1242  return ssl_hs_error;
1243  }
1244 
1245  if (!hs->certificate_types.CopyFrom(certificate_types)) {
1247  return ssl_hs_error;
1248  }
1249 
1250  if (ssl_protocol_version(ssl) >= TLS1_2_VERSION) {
1251  CBS supported_signature_algorithms;
1252  if (!CBS_get_u16_length_prefixed(&body, &supported_signature_algorithms) ||
1253  !tls1_parse_peer_sigalgs(hs, &supported_signature_algorithms)) {
1256  return ssl_hs_error;
1257  }
1258  }
1259 
1260  uint8_t alert = SSL_AD_DECODE_ERROR;
1261  UniquePtr<STACK_OF(CRYPTO_BUFFER)> ca_names =
1262  ssl_parse_client_CA_list(ssl, &alert, &body);
1263  if (!ca_names) {
1264  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
1265  return ssl_hs_error;
1266  }
1267 
1268  if (CBS_len(&body) != 0) {
1271  return ssl_hs_error;
1272  }
1273 
1274  hs->cert_request = true;
1275  hs->ca_names = std::move(ca_names);
1276  ssl->ctx->x509_method->hs_flush_cached_ca_names(hs);
1277 
1278  ssl->method->next_message(ssl);
1280  return ssl_hs_ok;
1281 }
1282 
1284  SSL *const ssl = hs->ssl;
1285  SSLMessage msg;
1286  if (!ssl->method->get_message(ssl, &msg)) {
1287  return ssl_hs_read_message;
1288  }
1289 
1291  !ssl_hash_message(hs, msg)) {
1292  return ssl_hs_error;
1293  }
1294 
1295  // ServerHelloDone is empty.
1296  if (CBS_len(&msg.body) != 0) {
1299  return ssl_hs_error;
1300  }
1301 
1302  // ServerHelloDone should be the end of the flight.
1303  if (ssl->method->has_unprocessed_handshake_data(ssl)) {
1306  return ssl_hs_error;
1307  }
1308 
1309  ssl->method->next_message(ssl);
1311  return ssl_hs_ok;
1312 }
1313 
1315  SSL *const ssl = hs->ssl;
1316 
1317  // The peer didn't request a certificate.
1318  if (!hs->cert_request) {
1320  return ssl_hs_ok;
1321  }
1322 
1323  if (ssl->s3->ech_status == ssl_ech_rejected) {
1324  // Do not send client certificates on ECH reject. We have not authenticated
1325  // the server for the name that can learn the certificate.
1326  SSL_certs_clear(ssl);
1327  } else if (hs->config->cert->cert_cb != nullptr) {
1328  // Call cert_cb to update the certificate.
1329  int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
1330  if (rv == 0) {
1333  return ssl_hs_error;
1334  }
1335  if (rv < 0) {
1337  return ssl_hs_x509_lookup;
1338  }
1339  }
1340 
1341  if (!ssl_has_certificate(hs)) {
1342  // Without a client certificate, the handshake buffer may be released.
1343  hs->transcript.FreeBuffer();
1344  }
1345 
1346  if (!ssl_on_certificate_selected(hs) ||
1347  !ssl_output_cert_chain(hs)) {
1348  return ssl_hs_error;
1349  }
1350 
1351 
1353  return ssl_hs_ok;
1354 }
1355 
1356 static_assert(sizeof(size_t) >= sizeof(unsigned),
1357  "size_t is smaller than unsigned");
1358 
1360  SSL *const ssl = hs->ssl;
1361  ScopedCBB cbb;
1362  CBB body;
1363  if (!ssl->method->init_message(ssl, cbb.get(), &body,
1365  return ssl_hs_error;
1366  }
1367 
1368  Array<uint8_t> pms;
1369  uint32_t alg_k = hs->new_cipher->algorithm_mkey;
1370  uint32_t alg_a = hs->new_cipher->algorithm_auth;
1372  const CRYPTO_BUFFER *leaf =
1373  sk_CRYPTO_BUFFER_value(hs->new_session->certs.get(), 0);
1374  CBS leaf_cbs;
1375  CRYPTO_BUFFER_init_CBS(leaf, &leaf_cbs);
1376 
1377  // Check the key usage matches the cipher suite. We do this unconditionally
1378  // for non-RSA certificates. In particular, it's needed to distinguish ECDH
1379  // certificates, which we do not support, from ECDSA certificates.
1380  // Historically, we have not checked RSA key usages, so it is controlled by
1381  // a flag for now. See https://crbug.com/795089.
1382  ssl_key_usage_t intended_use = (alg_k & SSL_kRSA)
1385  if (hs->config->enforce_rsa_key_usage ||
1386  EVP_PKEY_id(hs->peer_pubkey.get()) != EVP_PKEY_RSA) {
1387  if (!ssl_cert_check_key_usage(&leaf_cbs, intended_use)) {
1388  return ssl_hs_error;
1389  }
1390  }
1391  }
1392 
1393  // If using a PSK key exchange, prepare the pre-shared key.
1394  unsigned psk_len = 0;
1395  uint8_t psk[PSK_MAX_PSK_LEN];
1396  if (alg_a & SSL_aPSK) {
1397  if (hs->config->psk_client_callback == NULL) {
1399  return ssl_hs_error;
1400  }
1401 
1402  char identity[PSK_MAX_IDENTITY_LEN + 1];
1403  OPENSSL_memset(identity, 0, sizeof(identity));
1404  psk_len = hs->config->psk_client_callback(
1405  ssl, hs->peer_psk_identity_hint.get(), identity, sizeof(identity), psk,
1406  sizeof(psk));
1407  if (psk_len == 0) {
1410  return ssl_hs_error;
1411  }
1412  assert(psk_len <= PSK_MAX_PSK_LEN);
1413 
1414  hs->new_session->psk_identity.reset(OPENSSL_strdup(identity));
1415  if (hs->new_session->psk_identity == nullptr) {
1417  return ssl_hs_error;
1418  }
1419 
1420  // Write out psk_identity.
1421  CBB child;
1422  if (!CBB_add_u16_length_prefixed(&body, &child) ||
1423  !CBB_add_bytes(&child, (const uint8_t *)identity,
1424  OPENSSL_strnlen(identity, sizeof(identity))) ||
1425  !CBB_flush(&body)) {
1426  return ssl_hs_error;
1427  }
1428  }
1429 
1430  // Depending on the key exchange method, compute |pms|.
1431  if (alg_k & SSL_kRSA) {
1432  if (!pms.Init(SSL_MAX_MASTER_KEY_LENGTH)) {
1433  return ssl_hs_error;
1434  }
1435 
1436  RSA *rsa = EVP_PKEY_get0_RSA(hs->peer_pubkey.get());
1437  if (rsa == NULL) {
1439  return ssl_hs_error;
1440  }
1441 
1442  pms[0] = hs->client_version >> 8;
1443  pms[1] = hs->client_version & 0xff;
1444  if (!RAND_bytes(&pms[2], SSL_MAX_MASTER_KEY_LENGTH - 2)) {
1445  return ssl_hs_error;
1446  }
1447 
1448  CBB enc_pms;
1449  uint8_t *ptr;
1450  size_t enc_pms_len;
1451  if (!CBB_add_u16_length_prefixed(&body, &enc_pms) ||
1452  !CBB_reserve(&enc_pms, &ptr, RSA_size(rsa)) ||
1453  !RSA_encrypt(rsa, &enc_pms_len, ptr, RSA_size(rsa), pms.data(),
1454  pms.size(), RSA_PKCS1_PADDING) ||
1455  !CBB_did_write(&enc_pms, enc_pms_len) ||
1456  !CBB_flush(&body)) {
1457  return ssl_hs_error;
1458  }
1459  } else if (alg_k & SSL_kECDHE) {
1460  // Generate a keypair and serialize the public half.
1461  CBB child;
1462  if (!CBB_add_u8_length_prefixed(&body, &child)) {
1463  return ssl_hs_error;
1464  }
1465 
1466  // Compute the premaster.
1467  uint8_t alert = SSL_AD_DECODE_ERROR;
1468  if (!hs->key_shares[0]->Accept(&child, &pms, &alert, hs->peer_key)) {
1469  ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
1470  return ssl_hs_error;
1471  }
1472  if (!CBB_flush(&body)) {
1473  return ssl_hs_error;
1474  }
1475 
1476  // The key exchange state may now be discarded.
1477  hs->key_shares[0].reset();
1478  hs->key_shares[1].reset();
1479  hs->peer_key.Reset();
1480  } else if (alg_k & SSL_kPSK) {
1481  // For plain PSK, other_secret is a block of 0s with the same length as
1482  // the pre-shared key.
1483  if (!pms.Init(psk_len)) {
1484  return ssl_hs_error;
1485  }
1486  OPENSSL_memset(pms.data(), 0, pms.size());
1487  } else {
1490  return ssl_hs_error;
1491  }
1492 
1493  // For a PSK cipher suite, other_secret is combined with the pre-shared
1494  // key.
1495  if (alg_a & SSL_aPSK) {
1496  ScopedCBB pms_cbb;
1497  CBB child;
1498  if (!CBB_init(pms_cbb.get(), 2 + psk_len + 2 + pms.size()) ||
1499  !CBB_add_u16_length_prefixed(pms_cbb.get(), &child) ||
1500  !CBB_add_bytes(&child, pms.data(), pms.size()) ||
1501  !CBB_add_u16_length_prefixed(pms_cbb.get(), &child) ||
1502  !CBB_add_bytes(&child, psk, psk_len) ||
1503  !CBBFinishArray(pms_cbb.get(), &pms)) {
1505  return ssl_hs_error;
1506  }
1507  }
1508 
1509  // The message must be added to the finished hash before calculating the
1510  // master secret.
1511  if (!ssl_add_message_cbb(ssl, cbb.get())) {
1512  return ssl_hs_error;
1513  }
1514 
1515  hs->new_session->secret_length =
1516  tls1_generate_master_secret(hs, hs->new_session->secret, pms);
1517  if (hs->new_session->secret_length == 0) {
1518  return ssl_hs_error;
1519  }
1520  hs->new_session->extended_master_secret = hs->extended_master_secret;
1521 
1523  return ssl_hs_ok;
1524 }
1525 
1527  SSL *const ssl = hs->ssl;
1528 
1529  if (!hs->cert_request || !ssl_has_certificate(hs)) {
1531  return ssl_hs_ok;
1532  }
1533 
1534  assert(ssl_has_private_key(hs));
1535  ScopedCBB cbb;
1536  CBB body, child;
1537  if (!ssl->method->init_message(ssl, cbb.get(), &body,
1539  return ssl_hs_error;
1540  }
1541 
1545  return ssl_hs_error;
1546  }
1547  if (ssl_protocol_version(ssl) >= TLS1_2_VERSION) {
1548  // Write out the digest type in TLS 1.2.
1549  if (!CBB_add_u16(&body, signature_algorithm)) {
1551  return ssl_hs_error;
1552  }
1553  }
1554 
1555  // Set aside space for the signature.
1556  const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey.get());
1557  uint8_t *ptr;
1558  if (!CBB_add_u16_length_prefixed(&body, &child) ||
1559  !CBB_reserve(&child, &ptr, max_sig_len)) {
1560  return ssl_hs_error;
1561  }
1562 
1563  size_t sig_len = max_sig_len;
1564  switch (ssl_private_key_sign(hs, ptr, &sig_len, max_sig_len,
1566  hs->transcript.buffer())) {
1568  break;
1570  return ssl_hs_error;
1571  case ssl_private_key_retry:
1574  }
1575 
1576  if (!CBB_did_write(&child, sig_len) ||
1577  !ssl_add_message_cbb(ssl, cbb.get())) {
1578  return ssl_hs_error;
1579  }
1580 
1581  // The handshake buffer is no longer necessary.
1582  hs->transcript.FreeBuffer();
1583 
1585  return ssl_hs_ok;
1586 }
1587 
1589  SSL *const ssl = hs->ssl;
1590  hs->can_release_private_key = true;
1591  if (!ssl->method->add_change_cipher_spec(ssl) ||
1593  return ssl_hs_error;
1594  }
1595 
1596  if (hs->next_proto_neg_seen) {
1597  static const uint8_t kZero[32] = {0};
1598  size_t padding_len =
1599  32 - ((ssl->s3->next_proto_negotiated.size() + 2) % 32);
1600 
1601  ScopedCBB cbb;
1602  CBB body, child;
1603  if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_NEXT_PROTO) ||
1604  !CBB_add_u8_length_prefixed(&body, &child) ||
1605  !CBB_add_bytes(&child, ssl->s3->next_proto_negotiated.data(),
1606  ssl->s3->next_proto_negotiated.size()) ||
1607  !CBB_add_u8_length_prefixed(&body, &child) ||
1608  !CBB_add_bytes(&child, kZero, padding_len) ||
1609  !ssl_add_message_cbb(ssl, cbb.get())) {
1611  return ssl_hs_error;
1612  }
1613  }
1614 
1615  if (hs->channel_id_negotiated) {
1616  ScopedCBB cbb;
1617  CBB body;
1618  if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_CHANNEL_ID) ||
1619  !tls1_write_channel_id(hs, &body) ||
1620  !ssl_add_message_cbb(ssl, cbb.get())) {
1622  return ssl_hs_error;
1623  }
1624  }
1625 
1626  if (!ssl_send_finished(hs)) {
1627  return ssl_hs_error;
1628  }
1629 
1630  hs->state = state_finish_flight;
1631  return ssl_hs_flush;
1632 }
1633 
1634 static bool can_false_start(const SSL_HANDSHAKE *hs) {
1635  const SSL *const ssl = hs->ssl;
1636 
1637  // False Start bypasses the Finished check's downgrade protection. This can
1638  // enable attacks where we send data under weaker settings than supported
1639  // (e.g. the Logjam attack). Thus we require TLS 1.2 with an ECDHE+AEAD
1640  // cipher, our strongest settings before TLS 1.3.
1641  //
1642  // Now that TLS 1.3 exists, we would like to avoid similar attacks between
1643  // TLS 1.2 and TLS 1.3, but there are too many TLS 1.2 deployments to
1644  // sacrifice False Start on them. Instead, we rely on the ServerHello.random
1645  // downgrade signal, which we unconditionally enforce.
1646  if (SSL_is_dtls(ssl) ||
1647  SSL_version(ssl) != TLS1_2_VERSION ||
1649  hs->new_cipher->algorithm_mac != SSL_AEAD) {
1650  return false;
1651  }
1652 
1653  // If ECH was rejected, disable False Start. We run the handshake to
1654  // completion, including the Finished downgrade check, to authenticate the
1655  // recovery flow.
1656  if (ssl->s3->ech_status == ssl_ech_rejected) {
1657  return false;
1658  }
1659 
1660  // Additionally require ALPN or NPN by default.
1661  //
1662  // TODO(davidben): Can this constraint be relaxed globally now that cipher
1663  // suite requirements have been tightened?
1664  if (!ssl->ctx->false_start_allowed_without_alpn &&
1665  ssl->s3->alpn_selected.empty() &&
1666  ssl->s3->next_proto_negotiated.empty()) {
1667  return false;
1668  }
1669 
1670  return true;
1671 }
1672 
1674  SSL *const ssl = hs->ssl;
1675  if (ssl->session != NULL) {
1677  return ssl_hs_ok;
1678  }
1679 
1680  // This is a full handshake. If it involves ChannelID, then record the
1681  // handshake hashes at this point in the session so that any resumption of
1682  // this session with ChannelID can sign those hashes.
1684  return ssl_hs_error;
1685  }
1686 
1688 
1690  can_false_start(hs) &&
1691  // No False Start on renegotiation (would complicate the state machine).
1692  !ssl->s3->initial_handshake_complete) {
1693  hs->in_false_start = true;
1694  hs->can_early_write = true;
1695  return ssl_hs_early_return;
1696  }
1697 
1698  return ssl_hs_ok;
1699 }
1700 
1702  SSL *const ssl = hs->ssl;
1703 
1704  if (!hs->ticket_expected) {
1707  }
1708 
1709  SSLMessage msg;
1710  if (!ssl->method->get_message(ssl, &msg)) {
1711  return ssl_hs_read_message;
1712  }
1713 
1715  !ssl_hash_message(hs, msg)) {
1716  return ssl_hs_error;
1717  }
1718 
1719  CBS new_session_ticket = msg.body, ticket;
1720  uint32_t ticket_lifetime_hint;
1721  if (!CBS_get_u32(&new_session_ticket, &ticket_lifetime_hint) ||
1722  !CBS_get_u16_length_prefixed(&new_session_ticket, &ticket) ||
1723  CBS_len(&new_session_ticket) != 0) {
1726  return ssl_hs_error;
1727  }
1728 
1729  if (CBS_len(&ticket) == 0) {
1730  // RFC 5077 allows a server to change its mind and send no ticket after
1731  // negotiating the extension. The value of |ticket_expected| is checked in
1732  // |ssl_update_cache| so is cleared here to avoid an unnecessary update.
1733  hs->ticket_expected = false;
1734  ssl->method->next_message(ssl);
1737  }
1738 
1739  if (ssl->session != nullptr) {
1740  // The server is sending a new ticket for an existing session. Sessions are
1741  // immutable once established, so duplicate all but the ticket of the
1742  // existing session.
1743  assert(!hs->new_session);
1744  hs->new_session =
1746  if (!hs->new_session) {
1747  return ssl_hs_error;
1748  }
1749  }
1750 
1751  // |ticket_lifetime_hint| is measured from when the ticket was issued.
1752  ssl_session_rebase_time(ssl, hs->new_session.get());
1753 
1754  if (!hs->new_session->ticket.CopyFrom(ticket)) {
1755  return ssl_hs_error;
1756  }
1757  hs->new_session->ticket_lifetime_hint = ticket_lifetime_hint;
1758 
1759  // Historically, OpenSSL filled in fake session IDs for ticket-based sessions.
1760  // TODO(davidben): Are external callers relying on this? Try removing this.
1761  SHA256(CBS_data(&ticket), CBS_len(&ticket), hs->new_session->session_id);
1762  hs->new_session->session_id_length = SHA256_DIGEST_LENGTH;
1763 
1764  ssl->method->next_message(ssl);
1767 }
1768 
1771  return ssl_hs_error;
1772  }
1773 
1775  return ssl_hs_ok;
1776 }
1777 
1779  SSL *const ssl = hs->ssl;
1780  enum ssl_hs_wait_t wait = ssl_get_finished(hs);
1781  if (wait != ssl_hs_ok) {
1782  return wait;
1783  }
1784 
1785  if (ssl->session != NULL) {
1787  return ssl_hs_ok;
1788  }
1789 
1791  return ssl_hs_ok;
1792 }
1793 
1795  SSL *const ssl = hs->ssl;
1796  if (ssl->s3->ech_status == ssl_ech_rejected) {
1797  // Release the retry configs.
1798  hs->ech_authenticated_reject = true;
1801  return ssl_hs_error;
1802  }
1803 
1804  ssl->method->on_handshake_complete(ssl);
1805 
1806  // Note TLS 1.2 resumptions with ticket renewal have both |ssl->session| (the
1807  // resumed session) and |hs->new_session| (the session with the new ticket).
1808  bool has_new_session = hs->new_session != nullptr;
1809  if (has_new_session) {
1810  // When False Start is enabled, the handshake reports completion early. The
1811  // caller may then have passed the (then unresuable) |hs->new_session| to
1812  // another thread via |SSL_get0_session| for resumption. To avoid potential
1813  // race conditions in such callers, we duplicate the session before
1814  // clearing |not_resumable|.
1815  ssl->s3->established_session =
1817  if (!ssl->s3->established_session) {
1818  return ssl_hs_error;
1819  }
1820  // Renegotiations do not participate in session resumption.
1821  if (!ssl->s3->initial_handshake_complete) {
1822  ssl->s3->established_session->not_resumable = false;
1823  }
1824 
1825  hs->new_session.reset();
1826  } else {
1827  assert(ssl->session != nullptr);
1828  ssl->s3->established_session = UpRef(ssl->session);
1829  }
1830 
1831  hs->handshake_finalized = true;
1832  ssl->s3->initial_handshake_complete = true;
1833  if (has_new_session) {
1834  ssl_update_cache(ssl);
1835  }
1836 
1837  hs->state = state_done;
1838  return ssl_hs_ok;
1839 }
1840 
1842  while (hs->state != state_done) {
1845  static_cast<enum ssl_client_hs_state_t>(hs->state);
1846  switch (state) {
1847  case state_start_connect:
1848  ret = do_start_connect(hs);
1849  break;
1851  ret = do_enter_early_data(hs);
1852  break;
1855  break;
1858  break;
1860  ret = do_read_server_hello(hs);
1861  break;
1862  case state_tls13:
1863  ret = do_tls13(hs);
1864  break;
1867  break;
1870  break;
1873  break;
1876  break;
1879  break;
1882  break;
1885  break;
1888  break;
1891  break;
1894  break;
1897  break;
1898  case state_finish_flight:
1899  ret = do_finish_flight(hs);
1900  break;
1903  break;
1906  break;
1909  break;
1912  break;
1913  case state_done:
1914  ret = ssl_hs_ok;
1915  break;
1916  }
1917 
1918  if (hs->state != state) {
1920  }
1921 
1922  if (ret != ssl_hs_ok) {
1923  return ret;
1924  }
1925  }
1926 
1928  return ssl_hs_ok;
1929 }
1930 
1933  static_cast<enum ssl_client_hs_state_t>(hs->state);
1934  switch (state) {
1935  case state_start_connect:
1936  return "TLS client start_connect";
1938  return "TLS client enter_early_data";
1940  return "TLS client early_reverify_server_certificate";
1942  return "TLS client read_hello_verify_request";
1944  return "TLS client read_server_hello";
1945  case state_tls13:
1946  return tls13_client_handshake_state(hs);
1948  return "TLS client read_server_certificate";
1950  return "TLS client read_certificate_status";
1952  return "TLS client verify_server_certificate";
1954  return "TLS client reverify_server_certificate";
1956  return "TLS client read_server_key_exchange";
1958  return "TLS client read_certificate_request";
1960  return "TLS client read_server_hello_done";
1962  return "TLS client send_client_certificate";
1964  return "TLS client send_client_key_exchange";
1966  return "TLS client send_client_certificate_verify";
1968  return "TLS client send_client_finished";
1969  case state_finish_flight:
1970  return "TLS client finish_flight";
1972  return "TLS client read_session_ticket";
1974  return "TLS client process_change_cipher_spec";
1976  return "TLS client read_server_finished";
1978  return "TLS client finish_client_handshake";
1979  case state_done:
1980  return "TLS client done";
1981  }
1982 
1983  return "TLS client unknown";
1984 }
1985 
SSL_CB_HANDSHAKE_START
#define SSL_CB_HANDSHAKE_START
Definition: ssl.h:4291
SSL_HANDSHAKE::inner_client_random
uint8_t inner_client_random[SSL3_RANDOM_SIZE]
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1830
ssl_select_ech_config
bool ssl_select_ech_config(SSL_HANDSHAKE *hs, Span< uint8_t > out_enc, size_t *out_enc_len)
Definition: encrypted_client_hello.cc:618
ssl_send_alert
void ssl_send_alert(SSL *ssl, int level, int desc)
Definition: s3_pkt.cc:379
SSL_AEAD
#define SSL_AEAD
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:568
ssl_hs_read_change_cipher_spec
@ ssl_hs_read_change_cipher_spec
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1625
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
ssl_st::server
bool server
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3777
ssl_st::enable_early_data
bool enable_early_data
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3784
ssl_check_leaf_certificate
bool ssl_check_leaf_certificate(SSL_HANDSHAKE *hs, EVP_PKEY *pkey, const CRYPTO_BUFFER *leaf)
Definition: ssl_cert.cc:700
SSL_R_WRONG_VERSION_ON_EARLY_DATA
#define SSL_R_WRONG_VERSION_ON_EARLY_DATA
Definition: ssl.h:5545
state_read_server_key_exchange
@ state_read_server_key_exchange
Definition: handshake_client.cc:188
NAMED_CURVE_TYPE
#define NAMED_CURVE_TYPE
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2343
ssl_cipher_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:520
bn.h
ssl_has_certificate
bool ssl_has_certificate(const SSL_HANDSHAKE *hs)
Definition: ssl_cert.cc:340
SSL_AD_UNEXPECTED_MESSAGE
#define SSL_AD_UNEXPECTED_MESSAGE
Definition: ssl.h:3795
CBS_get_u24_length_prefixed
#define CBS_get_u24_length_prefixed
Definition: boringssl_prefix_symbols.h:1077
EVP_PKEY_id
#define EVP_PKEY_id
Definition: boringssl_prefix_symbols.h:1638
ssl_parse_client_CA_list
UniquePtr< STACK_OF(CRYPTO_BUFFER)> ssl_parse_client_CA_list(SSL *ssl, uint8_t *out_alert, CBS *cbs)
Definition: ssl_cert.cc:618
CBB_flush
#define CBB_flush
Definition: boringssl_prefix_symbols.h:1045
Array::Init
bool Init(size_t new_size)
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:314
sk_SSL_CIPHER_find
#define sk_SSL_CIPHER_find
Definition: boringssl_prefix_symbols.h:568
CBB_init
#define CBB_init
Definition: boringssl_prefix_symbols.h:1047
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
RAND_bytes
#define RAND_bytes
Definition: boringssl_prefix_symbols.h:2060
SSL3_MT_CLIENT_KEY_EXCHANGE
#define SSL3_MT_CLIENT_KEY_EXCHANGE
Definition: ssl3.h:309
tls13_client_handshake_state
const char * tls13_client_handshake_state(SSL_HANDSHAKE *hs)
Definition: tls13_client.cc:989
CBS_get_u16
#define CBS_get_u16
Definition: boringssl_prefix_symbols.h:1073
SSL_SESSION_DUP_ALL
#define SSL_SESSION_DUP_ALL
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3173
state_read_certificate_status
@ state_read_certificate_status
Definition: handshake_client.cc:185
SSLTranscript::InitHash
bool InitHash(uint16_t version, const SSL_CIPHER *cipher)
Definition: ssl_transcript.cc:161
cbs_st
Definition: bytestring.h:39
SSL3_MT_SERVER_HELLO
#define SSL3_MT_SERVER_HELLO
Definition: ssl3.h:300
ssl_send_finished
bool ssl_send_finished(SSL_HANDSHAKE *hs)
Definition: handshake.cc:523
do_reverify_server_certificate
static enum ssl_hs_wait_t do_reverify_server_certificate(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1017
do_read_server_hello
static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:680
SSL_get_mode
#define SSL_get_mode
Definition: boringssl_prefix_symbols.h:353
do_read_server_certificate
static enum ssl_hs_wait_t do_read_server_certificate(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:901
SSL3_SESSION_ID_SIZE
#define SSL3_SESSION_ID_SIZE
Definition: ssl3.h:205
SSL_HANDSHAKE::client_version
uint16_t client_version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2044
ParsedServerHello::cipher_suite
uint16_t cipher_suite
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2170
SSL_CONFIG::enforce_rsa_key_usage
bool enforce_rsa_key_usage
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3064
ssl_parse_cert_chain
bool ssl_parse_cert_chain(uint8_t *out_alert, UniquePtr< STACK_OF(CRYPTO_BUFFER)> *out_chain, UniquePtr< EVP_PKEY > *out_pubkey, uint8_t *out_leaf_sha256, CBS *cbs, CRYPTO_BUFFER_POOL *pool)
Definition: ssl_cert.cc:346
SSL_HANDSHAKE::extended_master_secret
bool extended_master_secret
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2011
state_send_client_certificate_verify
@ state_send_client_certificate_verify
Definition: handshake_client.cc:193
DTLS1_2_VERSION
#define DTLS1_2_VERSION
Definition: ssl.h:656
state_read_session_ticket
@ state_read_session_ticket
Definition: handshake_client.cc:196
SSL_CB_CONNECT_LOOP
#define SSL_CB_CONNECT_LOOP
Definition: ssl.h:4289
Array::data
const T * data() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:274
tls1_write_channel_id
bool tls1_write_channel_id(SSL_HANDSHAKE *hs, CBB *cbb)
Definition: extensions.cc:4179
evp.h
SSL_HANDSHAKE::session_id_len
uint8_t session_id_len
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2059
SSL_HANDSHAKE::local_pubkey
UniquePtr< EVP_PKEY > local_pubkey
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1909
SSL_CB_HANDSHAKE_DONE
#define SSL_CB_HANDSHAKE_DONE
Definition: ssl.h:4292
ssl_verify_ok
ssl_verify_ok
Definition: ssl.h:2412
CBS_data
#define CBS_data
Definition: boringssl_prefix_symbols.h:1057
SSL3_CK_FALLBACK_SCSV
#define SSL3_CK_FALLBACK_SCSV
Definition: ssl3.h:136
state_start_connect
@ state_start_connect
Definition: handshake_client.cc:178
RSA_size
#define RSA_size
Definition: boringssl_prefix_symbols.h:2139
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
state_read_server_certificate
@ state_read_server_certificate
Definition: handshake_client.cc:184
ecdsa.h
EVP_PKEY_get0_RSA
#define EVP_PKEY_get0_RSA
Definition: boringssl_prefix_symbols.h:1630
SSL_HANDSHAKE::new_cipher
const SSL_CIPHER * new_cipher
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1933
do_start_connect
static enum ssl_hs_wait_t do_start_connect(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:441
ssl_done_writing_client_hello
void ssl_done_writing_client_hello(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:435
SSL3_MT_SERVER_KEY_EXCHANGE
#define SSL3_MT_SERVER_KEY_EXCHANGE
Definition: ssl3.h:305
ssl_early_data_no_session_offered
ssl_early_data_no_session_offered
Definition: ssl.h:3565
ssl_hs_early_return
@ ssl_hs_early_return
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1622
ssl_public_key_verify
bool ssl_public_key_verify(SSL *ssl, Span< const uint8_t > signature, uint16_t sigalg, EVP_PKEY *pkey, Span< const uint8_t > in)
Definition: ssl_privkey.cc:236
SSL_R_PARSE_TLSEXT
#define SSL_R_PARSE_TLSEXT
Definition: ssl.h:5457
SSL3_MT_CERTIFICATE_VERIFY
#define SSL3_MT_CERTIFICATE_VERIFY
Definition: ssl3.h:308
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
internal.h
CRYPTO_BUFFER_new_from_CBS
#define CRYPTO_BUFFER_new_from_CBS
Definition: boringssl_prefix_symbols.h:1120
SSL_R_SERVER_ECHOED_INVALID_SESSION_ID
#define SSL_R_SERVER_ECHOED_INVALID_SESSION_ID
Definition: ssl.h:5553
ssl_output_cert_chain
bool ssl_output_cert_chain(SSL_HANDSHAKE *hs)
Definition: handshake.cc:567
parse_server_version
static bool parse_server_version(const SSL_HANDSHAKE *hs, uint16_t *out_version, uint8_t *out_alert, const ParsedServerHello &server_hello)
Definition: handshake_client.cc:356
ssl_private_key_failure
ssl_private_key_failure
Definition: ssl.h:1236
SSL_HANDSHAKE::early_traffic_secret
Span< uint8_t > early_traffic_secret()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1779
string.h
CBS_get_u32
#define CBS_get_u32
Definition: boringssl_prefix_symbols.h:1078
CBB_add_u16_length_prefixed
#define CBB_add_u16_length_prefixed
Definition: boringssl_prefix_symbols.h:1028
CBB_add_u8
#define CBB_add_u8
Definition: boringssl_prefix_symbols.h:1036
tls1_parse_peer_sigalgs
bool tls1_parse_peer_sigalgs(SSL_HANDSHAKE *hs, const CBS *in_sigalgs)
Definition: extensions.cc:4029
do_enter_early_data
static enum ssl_hs_wait_t do_enter_early_data(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:536
SSL_HANDSHAKE::ssl
SSL * ssl
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1726
ssl_hs_x509_lookup
@ ssl_hs_x509_lookup
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1618
CBS_mem_equal
#define CBS_mem_equal
Definition: boringssl_prefix_symbols.h:1090
ssl_cipher_uses_certificate_auth
bool ssl_cipher_uses_certificate_auth(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1295
hpke.h
SSL_AD_INTERNAL_ERROR
#define SSL_AD_INTERNAL_ERROR
Definition: ssl.h:3815
SSL_R_EXCESS_HANDSHAKE_DATA
#define SSL_R_EXCESS_HANDSHAKE_DATA
Definition: ssl.h:5522
ssl_verify_retry
ssl_verify_retry
Definition: ssl.h:2414
CBS_get_u8_length_prefixed
#define CBS_get_u8_length_prefixed
Definition: boringssl_prefix_symbols.h:1083
ssl_early_data_alps_mismatch
ssl_early_data_alps_mismatch
Definition: ssl.h:3582
ssl_hs_ok
@ ssl_hs_ok
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1611
ssl_parse_server_hello
bool ssl_parse_server_hello(ParsedServerHello *out, uint8_t *out_alert, const SSLMessage &msg)
Definition: handshake_client.cc:648
SSL_MODE_ENABLE_FALSE_START
#define SSL_MODE_ENABLE_FALSE_START
Definition: ssl.h:787
SSL_version
#define SSL_version
Definition: boringssl_prefix_symbols.h:531
ParsedServerHello::random
CBS random
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2168
ssl_parse_serverhello_tlsext
bool ssl_parse_serverhello_tlsext(SSL_HANDSHAKE *hs, const CBS *cbs)
Definition: extensions.cc:3793
tls13_write_psk_binder
bool tls13_write_psk_binder(const SSL_HANDSHAKE *hs, const SSLTranscript &transcript, Span< uint8_t > msg, size_t *out_binder_len)
Definition: tls13_enc.cc:473
CBS_len
#define CBS_len
Definition: boringssl_prefix_symbols.h:1089
SSL_CONFIG::cert
UniquePtr< CERT > cert
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2986
tls1_check_group_id
bool tls1_check_group_id(const SSL_HANDSHAKE *hs, uint16_t group_id)
Definition: extensions.cc:408
SSL3_MT_SERVER_HELLO_DONE
#define SSL3_MT_SERVER_HELLO_DONE
Definition: ssl3.h:307
SSL_HANDSHAKE::early_session
UniquePtr< SSL_SESSION > early_session
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1920
ssl_is_alpn_protocol_allowed
bool ssl_is_alpn_protocol_allowed(const SSL_HANDSHAKE *hs, Span< const uint8_t > protocol)
Definition: extensions.cc:1510
ssl_early_data_alpn_mismatch
ssl_early_data_alpn_mismatch
Definition: ssl.h:3573
ssl_early_data_disabled
ssl_early_data_disabled
Definition: ssl.h:3557
SSL_HANDSHAKE::selected_ech_config
UniquePtr< ECHConfig > selected_ech_config
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1930
ssl_write_client_hello_without_extensions
bool ssl_write_client_hello_without_extensions(const SSL_HANDSHAKE *hs, CBB *cbb, ssl_client_hello_type_t type, bool empty_session_id)
Definition: handshake_client.cc:286
SSL_R_RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION
#define SSL_R_RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION
Definition: ssl.h:5472
crypto_buffer_st
Definition: third_party/boringssl-with-bazel/src/crypto/pool/internal.h:31
do_process_change_cipher_spec
static enum ssl_hs_wait_t do_process_change_cipher_spec(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1769
EVP_PKEY_RSA
#define EVP_PKEY_RSA
Definition: evp.h:175
SSL_kRSA
#define SSL_kRSA
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:539
SSL_R_NO_CIPHERS_AVAILABLE
#define SSL_R_NO_CIPHERS_AVAILABLE
Definition: ssl.h:5442
SSL3_MT_CERTIFICATE
#define SSL3_MT_CERTIFICATE
Definition: ssl3.h:304
state_send_client_certificate
@ state_send_client_certificate
Definition: handshake_client.cc:191
SSL_HANDSHAKE::min_version
uint16_t min_version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1745
ssl_add_client_hello
bool ssl_add_client_hello(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:323
SSL_AD_ILLEGAL_PARAMETER
#define SSL_AD_ILLEGAL_PARAMETER
Definition: ssl.h:3807
SSL_HANDSHAKE::new_session
UniquePtr< SSL_SESSION > new_session
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1916
ParsedServerHello::session_id
CBS session_id
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2169
SSL_R_UNSUPPORTED_PROTOCOL
#define SSL_R_UNSUPPORTED_PROTOCOL
Definition: ssl.h:5507
SSL3_RANDOM_SIZE
#define SSL3_RANDOM_SIZE
Definition: ssl3.h:204
CBS_init
#define CBS_init
Definition: boringssl_prefix_symbols.h:1085
SSL_HANDSHAKE::peer_psk_identity_hint
UniquePtr< char > peer_psk_identity_hint
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1893
SSL_HANDSHAKE::state
int state
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1737
ssl_early_data_protocol_version
ssl_early_data_protocol_version
Definition: ssl.h:3561
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
SSL_SESSION_is_resumable
#define SSL_SESSION_is_resumable
Definition: boringssl_prefix_symbols.h:262
do_early_reverify_server_certificate
static enum ssl_hs_wait_t do_early_reverify_server_certificate(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:566
SSL3_MT_CLIENT_HELLO
#define SSL3_MT_CLIENT_HELLO
Definition: ssl3.h:299
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:835
Array::CopyFrom
bool CopyFrom(Span< const T > in)
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:338
ssl_st::mode
uint32_t mode
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3764
ssl_st::quic_method
const SSL_QUIC_METHOD * quic_method
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3769
SSLExtension
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2222
SSL_HANDSHAKE::peer_key
Array< uint8_t > peer_key
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1869
tls1_record_handshake_hashes_for_channel_id
bool tls1_record_handshake_hashes_for_channel_id(SSL_HANDSHAKE *hs)
Definition: extensions.cc:4260
ssl_st::session
bssl::UniquePtr< SSL_SESSION > session
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3750
TLS1_CK_CHACHA20_POLY1305_SHA256
#define TLS1_CK_CHACHA20_POLY1305_SHA256
Definition: tls1.h:457
SSL3_MT_CHANNEL_ID
#define SSL3_MT_CHANNEL_ID
Definition: ssl3.h:316
ssl_session_protocol_version
uint16_t ssl_session_protocol_version(const SSL_SESSION *session)
Definition: ssl_session.cc:335
SSL_HANDSHAKE::ech_client_outer
Array< uint8_t > ech_client_outer
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1837
SSL_R_UNEXPECTED_MESSAGE
#define SSL_R_UNEXPECTED_MESSAGE
Definition: ssl.h:5490
key_usage_digital_signature
@ key_usage_digital_signature
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1321
ssl_set_session
void ssl_set_session(SSL *ssl, SSL_SESSION *session)
Definition: ssl_session.cc:788
should_offer_early_data
static ssl_early_data_reason_t should_offer_early_data(const SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:389
SSL_HANDSHAKE::peer_pubkey
UniquePtr< EVP_PKEY > peer_pubkey
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1912
SSL_HANDSHAKE::can_early_write
bool can_early_write
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2000
CBB_reserve
#define CBB_reserve
Definition: boringssl_prefix_symbols.h:1050
ParsedServerHello::compression_method
uint8_t compression_method
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2171
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
RSA_PKCS1_PADDING
#define RSA_PKCS1_PADDING
Definition: rsa.h:210
ssl_cipher_requires_server_key_exchange
bool ssl_cipher_requires_server_key_exchange(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1299
can_false_start
static bool can_false_start(const SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1634
TLSEXT_TYPE_supported_versions
#define TLSEXT_TYPE_supported_versions
Definition: tls1.h:232
CBB_did_write
#define CBB_did_write
Definition: boringssl_prefix_symbols.h:1041
bytestring.h
ssl_add_clienthello_tlsext
bool ssl_add_clienthello_tlsext(SSL_HANDSHAKE *hs, CBB *out, CBB *out_encoded, bool *out_needs_psk_binder, ssl_client_hello_type_t type, size_t header_len)
Definition: extensions.cc:3426
do_read_server_hello_done
static enum ssl_hs_wait_t do_read_server_hello_done(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1283
SSL_HANDSHAKE::ech_authenticated_reject
bool ech_authenticated_reject
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1951
SSL_R_ECH_REJECTED
#define SSL_R_ECH_REJECTED
Definition: ssl.h:5586
SSL_HANDSHAKE::session_id
uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2058
SSL_R_BAD_SIGNATURE
#define SSL_R_BAD_SIGNATURE
Definition: ssl.h:5382
CBB_add_u16
#define CBB_add_u16
Definition: boringssl_prefix_symbols.h:1027
state_send_client_key_exchange
@ state_send_client_key_exchange
Definition: handshake_client.cc:192
ssl_hs_read_server_hello
@ ssl_hs_read_server_hello
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1612
SSL_HANDSHAKE::certificate_types
Array< uint8_t > certificate_types
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1906
SSL_HANDSHAKE
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1720
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
Array< uint8_t >
ssl_hash_message
bool ssl_hash_message(SSL_HANDSHAKE *hs, const SSLMessage &msg)
Definition: handshake.cc:260
SSL_aPSK
#define SSL_aPSK
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:549
ssl_cipher_st::algorithm_mkey
uint32_t algorithm_mkey
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:529
STACK_OF
#define STACK_OF(type)
Definition: stack.h:125
Array::size
size_t size() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:276
ssl_key_usage_t
ssl_key_usage_t
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1320
SSL_HANDSHAKE::channel_id_negotiated
bool channel_id_negotiated
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2041
CBB_add_u8_length_prefixed
#define CBB_add_u8_length_prefixed
Definition: boringssl_prefix_symbols.h:1037
ssl_hs_certificate_verify
@ ssl_hs_certificate_verify
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1626
ssl_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3698
ssl_setup_extension_permutation
bool ssl_setup_extension_permutation(SSL_HANDSHAKE *hs)
Definition: extensions.cc:3270
SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM
#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM
Definition: ssl.h:5505
CBS_strdup
#define CBS_strdup
Definition: boringssl_prefix_symbols.h:1094
ssl_hs_wait_t
ssl_hs_wait_t
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1609
ssl_early_data_unsupported_for_session
ssl_early_data_unsupported_for_session
Definition: ssl.h:3569
SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE
#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE
Definition: ssl.h:5460
SSL_HANDSHAKE::next_proto_neg_seen
bool next_proto_neg_seen
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2003
ssl_client_hello_type_t
ssl_client_hello_type_t
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1485
SSL3_MT_NEW_SESSION_TICKET
#define SSL3_MT_NEW_SESSION_TICKET
Definition: ssl3.h:301
sha.h
SSL_is_dtls
#define SSL_is_dtls
Definition: boringssl_prefix_symbols.h:402
ssl_get_grease_value
uint16_t ssl_get_grease_value(const SSL_HANDSHAKE *hs, enum ssl_grease_index_t index)
Definition: handshake.cc:454
SSL_AD_ECH_REQUIRED
#define SSL_AD_ECH_REQUIRED
Definition: ssl.h:3829
ssl_private_key_sign
enum ssl_private_key_result_t ssl_private_key_sign(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, size_t max_out, uint16_t sigalg, Span< const uint8_t > in)
Definition: ssl_privkey.cc:200
OPENSSL_memcpy
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:819
tls12_check_peer_sigalg
bool tls12_check_peer_sigalg(const SSL_HANDSHAKE *hs, uint8_t *out_alert, uint16_t sigalg)
Definition: extensions.cc:490
BSSL_NAMESPACE_END
#define BSSL_NAMESPACE_END
Definition: base.h:480
tls13_derive_early_secret
bool tls13_derive_early_secret(SSL_HANDSHAKE *hs)
Definition: tls13_enc.cc:245
CBS_get_u8
#define CBS_get_u8
Definition: boringssl_prefix_symbols.h:1082
ssl_verify_invalid
ssl_verify_invalid
Definition: ssl.h:2413
SSL_HANDSHAKE::ca_names
UniquePtr< STACK_OF(CRYPTO_BUFFER)> ca_names
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1897
state_tls13
@ state_tls13
Definition: handshake_client.cc:183
err.h
SSL_R_PSK_NO_CLIENT_CB
#define SSL_R_PSK_NO_CLIENT_CB
Definition: ssl.h:5463
SSL_R_WRONG_CURVE
#define SSL_R_WRONG_CURVE
Definition: ssl.h:5510
ssl_client_handshake
enum ssl_hs_wait_t ssl_client_handshake(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1841
ERR_R_INTERNAL_ERROR
#define ERR_R_INTERNAL_ERROR
Definition: err.h:374
ssl_protocol_version
uint16_t ssl_protocol_version(const SSL *ssl)
Definition: ssl_versions.cc:251
ssl_session_is_time_valid
int ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session)
Definition: ssl_session.cc:594
do_finish_client_handshake
static enum ssl_hs_wait_t do_finish_client_handshake(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1794
SSL_CIPHER_get_min_version
#define SSL_CIPHER_get_min_version
Definition: boringssl_prefix_symbols.h:52
state_reverify_server_certificate
@ state_reverify_server_certificate
Definition: handshake_client.cc:187
tls1_choose_signature_algorithm
bool tls1_choose_signature_algorithm(SSL_HANDSHAKE *hs, uint16_t *out)
Definition: extensions.cc:4054
SSL_MAX_MASTER_KEY_LENGTH
#define SSL_MAX_MASTER_KEY_LENGTH
Definition: ssl.h:1795
evp_aead_open
@ evp_aead_open
Definition: aead.h:430
evp_aead_seal
@ evp_aead_seal
Definition: aead.h:431
googletest-filter-unittest.child
child
Definition: bloaty/third_party/googletest/googletest/test/googletest-filter-unittest.py:62
ec_key.h
ssl_on_certificate_selected
bool ssl_on_certificate_selected(SSL_HANDSHAKE *hs)
Definition: ssl_cert.cc:726
SSL_AD_PROTOCOL_VERSION
#define SSL_AD_PROTOCOL_VERSION
Definition: ssl.h:3813
PSK_MAX_PSK_LEN
#define PSK_MAX_PSK_LEN
Definition: ssl.h:3111
tls1_get_legacy_signature_algorithm
bool tls1_get_legacy_signature_algorithm(uint16_t *out, const EVP_PKEY *pkey)
Definition: extensions.cc:4041
conf.extensions
list extensions
Definition: doc/python/sphinx/conf.py:54
ssl_client_hello_unencrypted
@ ssl_client_hello_unencrypted
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1486
do_send_client_finished
static enum ssl_hs_wait_t do_send_client_finished(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1588
SSL_SESSION_dup
OPENSSL_EXPORT UniquePtr< SSL_SESSION > SSL_SESSION_dup(SSL_SESSION *session, int dup_flags)
Definition: ssl_session.cc:191
SSL_HANDSHAKE::max_version
uint16_t max_version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1749
EVP_PKEY_size
#define EVP_PKEY_size
Definition: boringssl_prefix_symbols.h:1658
state_enter_early_data
@ state_enter_early_data
Definition: handshake_client.cc:179
SSL_CONFIG::psk_client_callback
unsigned(* psk_client_callback)(SSL *ssl, const char *hint, char *identity, unsigned max_identity_len, uint8_t *psk, unsigned max_psk_len)
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2998
aead.h
ssl_cipher_st::algorithm_mac
uint32_t algorithm_mac
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:532
ssl_cipher_st::algorithm_auth
uint32_t algorithm_auth
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:530
Span< const uint8_t >
do_tls13
static enum ssl_hs_wait_t do_tls13(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:891
ssl_client_handshake_state
const char * ssl_client_handshake_state(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1931
grpc_core::UniquePtr
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
Definition: src/core/lib/gprpp/memory.h:43
kTLS12DowngradeRandom
const uint8_t kTLS12DowngradeRandom[8]
Definition: tls13_both.cc:47
SSL_HANDSHAKE::can_release_private_key
bool can_release_private_key
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2037
SSL_AD_UNSUPPORTED_CERTIFICATE
#define SSL_AD_UNSUPPORTED_CERTIFICATE
Definition: ssl.h:3803
SSL_get_ciphers
#define SSL_get_ciphers
Definition: boringssl_prefix_symbols.h:330
SSL_HANDSHAKE::transcript
SSLTranscript transcript
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1821
ssl_hs_read_message
@ ssl_hs_read_message
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1613
ssl_early_data_accepted
ssl_early_data_accepted
Definition: ssl.h:3559
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
SSL3_AL_FATAL
#define SSL3_AL_FATAL
Definition: ssl3.h:280
state_verify_server_certificate
@ state_verify_server_certificate
Definition: handshake_client.cc:186
do_send_client_certificate_verify
static enum ssl_hs_wait_t do_send_client_certificate_verify(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1526
SSL_HANDSHAKE::early_data_offered
bool early_data_offered
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1992
ssl.h
ssl_has_private_key
bool ssl_has_private_key(const SSL_HANDSHAKE *hs)
Definition: ssl_privkey.cc:136
SSL_HANDSHAKE::cert_request
bool cert_request
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1965
ssl_supports_version
bool ssl_supports_version(const SSL_HANDSHAKE *hs, uint16_t version)
Definition: ssl_versions.cc:263
ssl_session_is_context_valid
int ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, const SSL_SESSION *session)
Definition: ssl_session.cc:583
SHA256
#define SHA256
Definition: boringssl_prefix_symbols.h:2154
point
Definition: bloaty/third_party/zlib/examples/zran.c:67
do_read_server_finished
static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1778
state_done
@ state_done
Definition: handshake_client.cc:200
ssl_grease_cipher
@ ssl_grease_cipher
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1631
SSLMessage
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1140
SSL_R_WRONG_SSL_VERSION
#define SSL_R_WRONG_SSL_VERSION
Definition: ssl.h:5513
ssl_get_version_range
bool ssl_get_version_range(const SSL_HANDSHAKE *hs, uint16_t *out_min_version, uint16_t *out_max_version)
Definition: ssl_versions.cc:170
TLS1_3_VERSION
#define TLS1_3_VERSION
Definition: ssl.h:653
sk_CRYPTO_BUFFER_value
#define sk_CRYPTO_BUFFER_value
Definition: boringssl_prefix_symbols.h:561
EVP_has_aes_hardware
#define EVP_has_aes_hardware
Definition: boringssl_prefix_symbols.h:1729
CBB_add_bytes
#define CBB_add_bytes
Definition: boringssl_prefix_symbols.h:1025
TLS1_2_VERSION
#define TLS1_2_VERSION
Definition: ssl.h:652
CBBFinishArray
OPENSSL_EXPORT bool CBBFinishArray(CBB *cbb, Array< uint8_t > *out)
Definition: ssl_lib.cc:190
SSL_HANDSHAKE::handshake_finalized
bool handshake_finalized
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1958
kTLS13DowngradeRandom
const uint8_t kTLS13DowngradeRandom[8]
Definition: tls13_both.cc:49
state_finish_client_handshake
@ state_finish_client_handshake
Definition: handshake_client.cc:199
BSSL_NAMESPACE_BEGIN
Definition: trust_token_test.cc:45
ssl_st::s3
bssl::SSL3_STATE * s3
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3730
rand.h
SSLKeyShare::Create
static HAS_VIRTUAL_DESTRUCTOR UniquePtr< SSLKeyShare > Create(uint16_t group_id)
Definition: ssl_key_share.cc:308
do_read_hello_verify_request
static enum ssl_hs_wait_t do_read_hello_verify_request(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:600
ssl_hs_flush
@ ssl_hs_flush
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1614
ssl_get_new_session
bool ssl_get_new_session(SSL_HANDSHAKE *hs)
Definition: ssl_session.cc:352
SSL_HANDSHAKE::config
SSL_CONFIG * config
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1729
ssl_reverify_peer_cert
enum ssl_verify_result_t ssl_reverify_peer_cert(SSL_HANDSHAKE *hs, bool send_alert)
Definition: handshake.cc:423
state_read_server_hello
@ state_read_server_hello
Definition: handshake_client.cc:182
suffix
unsigned char suffix[65536]
Definition: bloaty/third_party/zlib/examples/gun.c:164
OPENSSL_strdup
#define OPENSSL_strdup
Definition: boringssl_prefix_symbols.h:1891
SSL_MODE_SEND_FALLBACK_SCSV
#define SSL_MODE_SEND_FALLBACK_SCSV
Definition: ssl.h:806
check_version.settings
settings
Definition: check_version.py:61
ssl_hs_private_key_operation
@ ssl_hs_private_key_operation
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1619
md5.h
CRYPTO_BUFFER_init_CBS
#define CRYPTO_BUFFER_init_CBS
Definition: boringssl_prefix_symbols.h:1117
SSL_AD_DECODE_ERROR
#define SSL_AD_DECODE_ERROR
Definition: ssl.h:3810
OPENSSL_strnlen
#define OPENSSL_strnlen
Definition: boringssl_prefix_symbols.h:1897
SSL_kECDHE
#define SSL_kECDHE
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:540
state_early_reverify_server_certificate
@ state_early_reverify_server_certificate
Definition: handshake_client.cc:180
tls1_generate_master_secret
int tls1_generate_master_secret(SSL_HANDSHAKE *hs, uint8_t *out, Span< const uint8_t > premaster)
Definition: t1_enc.cc:270
ParsedServerHello::legacy_version
uint16_t legacy_version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2167
ssl_st::d1
bssl::DTLS1_STATE * d1
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3731
SSL_certs_clear
#define SSL_certs_clear
Definition: boringssl_prefix_symbols.h:288
ssl_private_key_success
ssl_private_key_success
Definition: ssl.h:1234
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
SSL3_MT_NEXT_PROTO
#define SSL3_MT_NEXT_PROTO
Definition: ssl3.h:315
SSL_HANDSHAKE::cookie
Array< uint8_t > cookie
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1833
SSL_kPSK
#define SSL_kPSK
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:542
CBS_get_u16_length_prefixed
#define CBS_get_u16_length_prefixed
Definition: boringssl_prefix_symbols.h:1074
SSL_HANDSHAKE::key_shares
UniquePtr< SSLKeyShare > key_shares[2]
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1818
SHA256_DIGEST_LENGTH
#define SHA256_DIGEST_LENGTH
Definition: sha.h:155
ssl_client_hello_inner
@ ssl_client_hello_inner
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1487
SSL_R_EXTRA_DATA_IN_MESSAGE
#define SSL_R_EXTRA_DATA_IN_MESSAGE
Definition: ssl.h:5419
ssl_check_message_type
bool ssl_check_message_type(SSL *ssl, const SSLMessage &msg, int type)
Definition: handshake.cc:209
Array::Reset
void Reset()
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:287
ssl_setup_key_shares
bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id)
Definition: extensions.cc:2263
ssl_session_rebase_time
void ssl_session_rebase_time(SSL *ssl, SSL_SESSION *session)
Definition: ssl_session.cc:290
state_send_client_finished
@ state_send_client_finished
Definition: handshake_client.cc:194
ssl_client_hello_outer
@ ssl_client_hello_outer
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1488
ssl_get_client_disabled
static void ssl_get_client_disabled(const SSL_HANDSHAKE *hs, uint32_t *out_mask_a, uint32_t *out_mask_k)
Definition: handshake_client.cc:205
SSL_AD_HANDSHAKE_FAILURE
#define SSL_AD_HANDSHAKE_FAILURE
Definition: ssl.h:3800
ssl_add_message_cbb
bool ssl_add_message_cbb(SSL *ssl, CBB *cbb)
Definition: handshake.cc:220
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
ParsedServerHello
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2165
ssl_ech_rejected
@ ssl_ech_rejected
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2616
SSL3_MT_CERTIFICATE_STATUS
#define SSL3_MT_CERTIFICATE_STATUS
Definition: ssl3.h:311
TLS1_CK_AES_128_GCM_SHA256
#define TLS1_CK_AES_128_GCM_SHA256
Definition: tls1.h:455
ssl_write_client_cipher_list
static bool ssl_write_client_cipher_list(const SSL_HANDSHAKE *hs, CBB *out, ssl_client_hello_type_t type)
Definition: handshake_client.cc:218
wait
static void wait(notification *n)
Definition: alts_tsi_handshaker_test.cc:114
TLSEXT_STATUSTYPE_ocsp
#define TLSEXT_STATUSTYPE_ocsp
Definition: tls1.h:265
state_read_server_hello_done
@ state_read_server_hello_done
Definition: handshake_client.cc:190
CBS_get_bytes
#define CBS_get_bytes
Definition: boringssl_prefix_symbols.h:1067
ParsedServerHello::extensions
CBS extensions
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2172
SSL_get_cipher_by_value
#define SSL_get_cipher_by_value
Definition: boringssl_prefix_symbols.h:328
ssl_st::method
const bssl::SSL_PROTOCOL_METHOD * method
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3706
ssl_get_finished
enum ssl_hs_wait_t ssl_get_finished(SSL_HANDSHAKE *hs)
Definition: handshake.cc:467
state_read_certificate_request
@ state_read_certificate_request
Definition: handshake_client.cc:189
SSLTranscript::Init
bool Init()
Definition: ssl_transcript.cc:151
do_send_client_certificate
static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1314
ssl_parse_extensions
bool ssl_parse_extensions(const CBS *cbs, uint8_t *out_alert, std::initializer_list< SSLExtension * > extensions, bool ignore_unknown)
Definition: handshake.cc:269
ssl_verify_peer_cert
enum ssl_verify_result_t ssl_verify_peer_cert(SSL_HANDSHAKE *hs)
Definition: handshake.cc:323
TLS1_CK_AES_256_GCM_SHA384
#define TLS1_CK_AES_256_GCM_SHA384
Definition: tls1.h:456
SSL_HANDSHAKE::in_false_start
bool in_false_start
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1985
ssl_update_cache
void ssl_update_cache(SSL *ssl)
Definition: ssl_session.cc:888
ssl_encryption_early_data
ssl_encryption_early_data
Definition: ssl.h:3283
SSL_HANDSHAKE::certificate_status_expected
bool certificate_status_expected
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1970
ssl_encrypt_client_hello
bool ssl_encrypt_client_hello(SSL_HANDSHAKE *hs, Span< const uint8_t > enc)
Definition: encrypted_client_hello.cc:748
SSLTranscript::FreeBuffer
void FreeBuffer()
Definition: ssl_transcript.cc:171
SSL_R_WRONG_CIPHER_RETURNED
#define SSL_R_WRONG_CIPHER_RETURNED
Definition: ssl.h:5509
SSL_HANDSHAKE::ticket_expected
bool ticket_expected
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:2007
state_read_hello_verify_request
@ state_read_hello_verify_request
Definition: handshake_client.cc:181
ssl_client_hs_state_t
ssl_client_hs_state_t
Definition: handshake_client.cc:177
CBB_len
#define CBB_len
Definition: boringssl_prefix_symbols.h:1049
SSL_R_DECODE_ERROR
#define SSL_R_DECODE_ERROR
Definition: ssl.h:5405
kJDK11DowngradeRandom
const uint8_t kJDK11DowngradeRandom[8]
Definition: tls13_both.cc:53
mem.h
EVP_HPKE_MAX_ENC_LENGTH
#define EVP_HPKE_MAX_ENC_LENGTH
Definition: hpke.h:187
ssl_do_info_callback
void ssl_do_info_callback(const SSL *ssl, int type, int value)
Definition: ssl_lib.cc:316
tls1_change_cipher_state
bool tls1_change_cipher_state(SSL_HANDSHAKE *hs, evp_aead_direction_t direction)
Definition: t1_enc.cc:264
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
rsa_st
Definition: rsa.h:732
SSL_R_DATA_LENGTH_TOO_LONG
#define SSL_R_DATA_LENGTH_TOO_LONG
Definition: ssl.h:5404
do_finish_flight
static enum ssl_hs_wait_t do_finish_flight(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1673
SSL_R_OLD_SESSION_VERSION_NOT_RETURNED
#define SSL_R_OLD_SESSION_VERSION_NOT_RETURNED
Definition: ssl.h:5455
state_read_server_finished
@ state_read_server_finished
Definition: handshake_client.cc:198
ssl_cert_check_key_usage
bool ssl_cert_check_key_usage(const CBS *in, enum ssl_key_usage_t bit)
Definition: ssl_cert.cc:542
ssl_hs_error
@ ssl_hs_error
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1610
DTLS1_VERSION
#define DTLS1_VERSION
Definition: ssl.h:655
tls13_set_traffic_key
bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level, enum evp_aead_direction_t direction, const SSL_SESSION *session, Span< const uint8_t > traffic_secret)
Definition: tls13_enc.cc:156
SSL_SESSION_INCLUDE_NONAUTH
#define SSL_SESSION_INCLUDE_NONAUTH
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3172
SSL_HANDSHAKE::key_share_bytes
Array< uint8_t > key_share_bytes
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1848
state_process_change_cipher_spec
@ state_process_change_cipher_spec
Definition: handshake_client.cc:197
SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT
#define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT
Definition: ssl.h:5369
ssl_st::version
uint16_t version
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3715
SSL_CIPHER_get_protocol_id
#define SSL_CIPHER_get_protocol_id
Definition: boringssl_prefix_symbols.h:55
do_read_session_ticket
static enum ssl_hs_wait_t do_read_session_ticket(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1701
SSL_HANDSHAKE::in_early_data
bool in_early_data
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1989
ssl_st::ctx
bssl::UniquePtr< SSL_CTX > ctx
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3754
SSL_AD_DECRYPT_ERROR
#define SSL_AD_DECRYPT_ERROR
Definition: ssl.h:3811
tls13_init_early_key_schedule
bool tls13_init_early_key_schedule(SSL_HANDSHAKE *hs, const SSL_SESSION *session)
Definition: tls13_enc.cc:75
SSL_R_PSK_IDENTITY_NOT_FOUND
#define SSL_R_PSK_IDENTITY_NOT_FOUND
Definition: ssl.h:5462
PSK_MAX_IDENTITY_LEN
#define PSK_MAX_IDENTITY_LEN
Definition: ssl.h:3108
tls13_client_handshake
enum ssl_hs_wait_t tls13_client_handshake(SSL_HANDSHAKE *hs)
Definition: tls13_client.cc:924
do_read_certificate_request
static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1211
absl::MakeSpan
constexpr Span< T > MakeSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:661
SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED
#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED
Definition: ssl.h:5454
sk_CRYPTO_BUFFER_num
#define sk_CRYPTO_BUFFER_num
Definition: boringssl_prefix_symbols.h:558
SSL_CIPHER_get_max_version
#define SSL_CIPHER_get_max_version
Definition: boringssl_prefix_symbols.h:51
CBS_contains_zero_byte
#define CBS_contains_zero_byte
Definition: boringssl_prefix_symbols.h:1055
key_usage_encipherment
@ key_usage_encipherment
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:1322
ssl_get_local_application_settings
bool ssl_get_local_application_settings(const SSL_HANDSHAKE *hs, Span< const uint8_t > *out_settings, Span< const uint8_t > protocol)
Definition: extensions.cc:2937
do_send_client_key_exchange
static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1359
SSL_R_CERT_CB_ERROR
#define SSL_R_CERT_CB_ERROR
Definition: ssl.h:5394
ERR_R_MALLOC_FAILURE
#define ERR_R_MALLOC_FAILURE
Definition: err.h:371
RSA_encrypt
#define RSA_encrypt
Definition: boringssl_prefix_symbols.h:2088
signature_algorithm
uint16_t signature_algorithm
Definition: ssl_privkey.cc:439
DTLS1_MT_HELLO_VERIFY_REQUEST
#define DTLS1_MT_HELLO_VERIFY_REQUEST
Definition: ssl3.h:318
SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION
#define SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION
Definition: ssl.h:5471
do_verify_server_certificate
static enum ssl_hs_wait_t do_verify_server_certificate(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:997
SSL_R_TLS13_DOWNGRADE
#define SSL_R_TLS13_DOWNGRADE
Definition: ssl.h:5564
SSL3_MT_CERTIFICATE_REQUEST
#define SSL3_MT_CERTIFICATE_REQUEST
Definition: ssl3.h:306
SSLTranscript::buffer
Span< const uint8_t > buffer() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:713
do_read_server_key_exchange
static enum ssl_hs_wait_t do_read_server_key_exchange(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:1034
ssl_private_key_retry
ssl_private_key_retry
Definition: ssl.h:1235
state_finish_flight
@ state_finish_flight
Definition: handshake_client.cc:195
absl::MakeConstSpan
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:707
cbb_st
Definition: bytestring.h:375
do_read_certificate_status
static enum ssl_hs_wait_t do_read_certificate_status(SSL_HANDSHAKE *hs)
Definition: handshake_client.cc:948
supported_versions
static const char *const supported_versions[]
Definition: src/core/ext/transport/chttp2/alpn/alpn.cc:28


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:10