blob: ac97165fa96a59b406c10eba819d60c05f2a8e76 [file] [log] [blame]
David Benjaminc895d6b2016-08-11 13:26:41 -04001/* Copyright (c) 2016, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15#include <openssl/ssl.h>
16
17#include <assert.h>
Robert Sloan4d1ac502017-02-06 08:36:14 -080018#include <limits.h>
David Benjaminc895d6b2016-08-11 13:26:41 -040019#include <string.h>
20
Robert Sloanb6d070c2017-07-24 08:40:01 -070021#include <utility>
22
David Benjaminc895d6b2016-08-11 13:26:41 -040023#include <openssl/bytestring.h>
24#include <openssl/digest.h>
25#include <openssl/err.h>
26#include <openssl/mem.h>
Robert Sloan726e9d12018-09-11 11:45:04 -070027#include <openssl/sha.h>
David Benjaminc895d6b2016-08-11 13:26:41 -040028#include <openssl/stack.h>
David Benjaminc895d6b2016-08-11 13:26:41 -040029
Steven Valdez909b19f2016-11-21 15:35:44 -050030#include "../crypto/internal.h"
David Benjaminc895d6b2016-08-11 13:26:41 -040031#include "internal.h"
32
33
Robert Sloan726e9d12018-09-11 11:45:04 -070034BSSL_NAMESPACE_BEGIN
Robert Sloanb6d070c2017-07-24 08:40:01 -070035
David Benjaminc895d6b2016-08-11 13:26:41 -040036enum client_hs_state_t {
Robert Sloan84377092017-08-14 09:33:19 -070037 state_read_hello_retry_request = 0,
David Benjaminc895d6b2016-08-11 13:26:41 -040038 state_send_second_client_hello,
Robert Sloan84377092017-08-14 09:33:19 -070039 state_read_server_hello,
Robert Sloan84377092017-08-14 09:33:19 -070040 state_read_encrypted_extensions,
41 state_read_certificate_request,
42 state_read_server_certificate,
43 state_read_server_certificate_verify,
Robert Sloand9e572d2018-08-27 12:27:00 -070044 state_server_certificate_reverify,
Robert Sloan84377092017-08-14 09:33:19 -070045 state_read_server_finished,
Robert Sloan6d0d00e2017-03-27 07:13:07 -070046 state_send_end_of_early_data,
David Benjaminc895d6b2016-08-11 13:26:41 -040047 state_send_client_certificate,
48 state_send_client_certificate_verify,
Robert Sloan4d1ac502017-02-06 08:36:14 -080049 state_complete_second_flight,
David Benjaminc895d6b2016-08-11 13:26:41 -040050 state_done,
51};
52
David Benjamin1b249672016-12-06 18:25:50 -050053static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
54
Robert Sloan84377092017-08-14 09:33:19 -070055static enum ssl_hs_wait_t do_read_hello_retry_request(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -050056 SSL *const ssl = hs->ssl;
Robert Sloan99319a12017-11-27 10:32:46 -080057 assert(ssl->s3->have_version);
Robert Sloan84377092017-08-14 09:33:19 -070058 SSLMessage msg;
59 if (!ssl->method->get_message(ssl, &msg)) {
60 return ssl_hs_read_message;
61 }
David Benjaminc895d6b2016-08-11 13:26:41 -040062
Robert Sloan8542c082018-02-05 09:07:34 -080063 // Queue up a ChangeCipherSpec for whenever we next send something. This
64 // will be before the second ClientHello. If we offered early data, this was
65 // already done.
66 if (!hs->early_data_offered &&
67 !ssl->method->add_change_cipher_spec(ssl)) {
68 return ssl_hs_error;
David Benjaminc895d6b2016-08-11 13:26:41 -040069 }
70
Robert Sloan8542c082018-02-05 09:07:34 -080071 if (!ssl_check_message_type(ssl, msg, SSL3_MT_SERVER_HELLO)) {
72 return ssl_hs_error;
73 }
Robert Sloanb1b54b82017-11-06 13:50:02 -080074
Robert Sloan8542c082018-02-05 09:07:34 -080075 CBS body = msg.body, extensions, server_random, session_id;
76 uint16_t server_version, cipher_suite;
77 uint8_t compression_method;
78 if (!CBS_get_u16(&body, &server_version) ||
79 !CBS_get_bytes(&body, &server_random, SSL3_RANDOM_SIZE) ||
80 !CBS_get_u8_length_prefixed(&body, &session_id) ||
81 !CBS_mem_equal(&session_id, hs->session_id, hs->session_id_len) ||
82 !CBS_get_u16(&body, &cipher_suite) ||
83 !CBS_get_u8(&body, &compression_method) ||
84 compression_method != 0 ||
85 !CBS_get_u16_length_prefixed(&body, &extensions) ||
86 CBS_len(&extensions) == 0 ||
87 CBS_len(&body) != 0) {
88 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
89 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
90 return ssl_hs_error;
91 }
Robert Sloanb1b54b82017-11-06 13:50:02 -080092
Robert Sloan8542c082018-02-05 09:07:34 -080093 if (!CBS_mem_equal(&server_random, kHelloRetryRequest, SSL3_RANDOM_SIZE)) {
94 hs->tls13_state = state_read_server_hello;
95 return ssl_hs_ok;
96 }
97
98 const SSL_CIPHER *cipher = SSL_get_cipher_by_value(cipher_suite);
99 // Check if the cipher is a TLS 1.3 cipher.
100 if (cipher == NULL ||
101 SSL_CIPHER_get_min_version(cipher) > ssl_protocol_version(ssl) ||
102 SSL_CIPHER_get_max_version(cipher) < ssl_protocol_version(ssl)) {
103 OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
104 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
105 return ssl_hs_error;
106 }
107
108 hs->new_cipher = cipher;
109
110 if (!hs->transcript.InitHash(ssl_protocol_version(ssl), hs->new_cipher) ||
111 !hs->transcript.UpdateForHelloRetryRequest()) {
112 return ssl_hs_error;
Robert Sloanb1b54b82017-11-06 13:50:02 -0800113 }
114
115
Robert Sloand5c22152017-11-13 09:22:12 -0800116 bool have_cookie, have_key_share, have_supported_versions;
117 CBS cookie, key_share, supported_versions;
Robert Sloan0db7f542018-01-16 15:48:33 -0800118 SSL_EXTENSION_TYPE ext_types[] = {
Robert Sloan8542c082018-02-05 09:07:34 -0800119 {TLSEXT_TYPE_key_share, &have_key_share, &key_share},
Steven Valdez909b19f2016-11-21 15:35:44 -0500120 {TLSEXT_TYPE_cookie, &have_cookie, &cookie},
Robert Sloand5c22152017-11-13 09:22:12 -0800121 {TLSEXT_TYPE_supported_versions, &have_supported_versions,
122 &supported_versions},
Steven Valdez909b19f2016-11-21 15:35:44 -0500123 };
124
Robert Sloan5d625782017-02-13 09:55:39 -0800125 uint8_t alert = SSL_AD_DECODE_ERROR;
Steven Valdez909b19f2016-11-21 15:35:44 -0500126 if (!ssl_parse_extensions(&extensions, &alert, ext_types,
Robert Sloan69939df2017-01-09 10:53:07 -0800127 OPENSSL_ARRAY_SIZE(ext_types),
128 0 /* reject unknown */)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700129 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
Steven Valdez909b19f2016-11-21 15:35:44 -0500130 return ssl_hs_error;
131 }
132
Robert Sloan99319a12017-11-27 10:32:46 -0800133 if (!have_cookie && !have_key_share) {
134 OPENSSL_PUT_ERROR(SSL, SSL_R_EMPTY_HELLO_RETRY_REQUEST);
135 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
136 return ssl_hs_error;
137 }
Steven Valdez909b19f2016-11-21 15:35:44 -0500138 if (have_cookie) {
139 CBS cookie_value;
140 if (!CBS_get_u16_length_prefixed(&cookie, &cookie_value) ||
141 CBS_len(&cookie_value) == 0 ||
142 CBS_len(&cookie) != 0) {
David Benjamin95add822016-10-19 01:09:12 -0400143 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700144 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
David Benjamin95add822016-10-19 01:09:12 -0400145 return ssl_hs_error;
146 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400147
Robert Sloan4562e9d2017-10-02 10:26:51 -0700148 if (!hs->cookie.CopyFrom(cookie_value)) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500149 return ssl_hs_error;
David Benjaminc895d6b2016-08-11 13:26:41 -0400150 }
151 }
152
Steven Valdez909b19f2016-11-21 15:35:44 -0500153 if (have_key_share) {
154 uint16_t group_id;
155 if (!CBS_get_u16(&key_share, &group_id) || CBS_len(&key_share) != 0) {
156 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700157 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Steven Valdez909b19f2016-11-21 15:35:44 -0500158 return ssl_hs_error;
159 }
160
Robert Sloana27a6a42017-09-05 08:39:28 -0700161 // The group must be supported.
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100162 if (!tls1_check_group_id(hs, group_id)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700163 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
Steven Valdez909b19f2016-11-21 15:35:44 -0500164 OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
165 return ssl_hs_error;
166 }
167
Robert Sloan11c28bd2018-12-17 12:09:20 -0800168 // Check that the HelloRetryRequest does not request a key share that was
169 // provided in the initial ClientHello.
170 if (hs->key_shares[0]->GroupID() == group_id ||
171 (hs->key_shares[1] && hs->key_shares[1]->GroupID() == group_id)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700172 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
Steven Valdez909b19f2016-11-21 15:35:44 -0500173 OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
174 return ssl_hs_error;
175 }
176
Robert Sloan11c28bd2018-12-17 12:09:20 -0800177 hs->key_shares[0].reset();
178 hs->key_shares[1].reset();
Steven Valdez909b19f2016-11-21 15:35:44 -0500179 hs->retry_group = group_id;
180 }
181
Robert Sloan84377092017-08-14 09:33:19 -0700182 if (!ssl_hash_message(hs, msg)) {
Robert Sloan4d1ac502017-02-06 08:36:14 -0800183 return ssl_hs_error;
184 }
185
Robert Sloan84377092017-08-14 09:33:19 -0700186 ssl->method->next_message(ssl);
Robert Sloana27a6a42017-09-05 08:39:28 -0700187 hs->received_hello_retry_request = true;
Steven Valdeze7531f02016-12-14 13:29:57 -0500188 hs->tls13_state = state_send_second_client_hello;
Robert Sloana27a6a42017-09-05 08:39:28 -0700189 // 0-RTT is rejected if we receive a HelloRetryRequest.
Robert Sloane56da3e2017-06-26 08:26:42 -0700190 if (hs->in_early_data) {
191 return ssl_hs_early_data_rejected;
192 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400193 return ssl_hs_ok;
194}
195
David Benjamin1b249672016-12-06 18:25:50 -0500196static enum ssl_hs_wait_t do_send_second_client_hello(SSL_HANDSHAKE *hs) {
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700197 SSL *const ssl = hs->ssl;
Robert Sloana27a6a42017-09-05 08:39:28 -0700198 // Restore the null cipher. We may have switched due to 0-RTT.
Robert Sloandb4251a2017-09-18 09:38:15 -0700199 bssl::UniquePtr<SSLAEADContext> null_ctx =
200 SSLAEADContext::CreateNullCipher(SSL_is_dtls(ssl));
Robert Sloanb6d070c2017-07-24 08:40:01 -0700201 if (!null_ctx ||
Robert Sloandb4251a2017-09-18 09:38:15 -0700202 !ssl->method->set_write_state(ssl, std::move(null_ctx))) {
203 return ssl_hs_error;
204 }
205
206 ssl->s3->aead_write_ctx->SetVersionIfNullCipher(ssl->version);
207
208 if (!ssl_write_client_hello(hs)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400209 return ssl_hs_error;
210 }
211
Robert Sloan84377092017-08-14 09:33:19 -0700212 hs->tls13_state = state_read_server_hello;
213 return ssl_hs_flush;
David Benjaminc895d6b2016-08-11 13:26:41 -0400214}
215
Robert Sloan84377092017-08-14 09:33:19 -0700216static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500217 SSL *const ssl = hs->ssl;
Robert Sloan84377092017-08-14 09:33:19 -0700218 SSLMessage msg;
219 if (!ssl->method->get_message(ssl, &msg)) {
220 return ssl_hs_read_message;
221 }
222 if (!ssl_check_message_type(ssl, msg, SSL3_MT_SERVER_HELLO)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400223 return ssl_hs_error;
224 }
225
Robert Sloan84377092017-08-14 09:33:19 -0700226 CBS body = msg.body, server_random, session_id, extensions;
Robert Sloana12bf462017-07-17 07:08:26 -0700227 uint16_t server_version;
David Benjaminc895d6b2016-08-11 13:26:41 -0400228 uint16_t cipher_suite;
Robert Sloana12bf462017-07-17 07:08:26 -0700229 uint8_t compression_method;
Robert Sloan84377092017-08-14 09:33:19 -0700230 if (!CBS_get_u16(&body, &server_version) ||
231 !CBS_get_bytes(&body, &server_random, SSL3_RANDOM_SIZE) ||
Robert Sloan0da43952018-01-03 15:13:14 -0800232 !CBS_get_u8_length_prefixed(&body, &session_id) ||
233 !CBS_mem_equal(&session_id, hs->session_id, hs->session_id_len) ||
Robert Sloan84377092017-08-14 09:33:19 -0700234 !CBS_get_u16(&body, &cipher_suite) ||
Robert Sloan0da43952018-01-03 15:13:14 -0800235 !CBS_get_u8(&body, &compression_method) ||
236 compression_method != 0 ||
Robert Sloan84377092017-08-14 09:33:19 -0700237 !CBS_get_u16_length_prefixed(&body, &extensions) ||
238 CBS_len(&body) != 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700239 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400240 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
241 return ssl_hs_error;
242 }
243
Robert Sloan0da43952018-01-03 15:13:14 -0800244 if (server_version != TLS1_2_VERSION) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700245 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400246 OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_VERSION_NUMBER);
247 return ssl_hs_error;
248 }
249
Robert Sloan99319a12017-11-27 10:32:46 -0800250 // Forbid a second HelloRetryRequest.
Robert Sloan8542c082018-02-05 09:07:34 -0800251 if (CBS_mem_equal(&server_random, kHelloRetryRequest, SSL3_RANDOM_SIZE)) {
Robert Sloan99319a12017-11-27 10:32:46 -0800252 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
253 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
254 return ssl_hs_error;
255 }
256
Robert Sloan69939df2017-01-09 10:53:07 -0800257 OPENSSL_memcpy(ssl->s3->server_random, CBS_data(&server_random),
258 SSL3_RANDOM_SIZE);
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400259
Robert Sloanb1b54b82017-11-06 13:50:02 -0800260 // Check if the cipher is a TLS 1.3 cipher.
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400261 const SSL_CIPHER *cipher = SSL_get_cipher_by_value(cipher_suite);
Robert Sloanb1b54b82017-11-06 13:50:02 -0800262 if (cipher == nullptr ||
263 SSL_CIPHER_get_min_version(cipher) > ssl_protocol_version(ssl) ||
264 SSL_CIPHER_get_max_version(cipher) < ssl_protocol_version(ssl)) {
265 OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700266 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400267 return ssl_hs_error;
268 }
269
Robert Sloanb1b54b82017-11-06 13:50:02 -0800270 // Check that the cipher matches the one in the HelloRetryRequest.
Robert Sloan8542c082018-02-05 09:07:34 -0800271 if (hs->received_hello_retry_request &&
Robert Sloanb1b54b82017-11-06 13:50:02 -0800272 hs->new_cipher != cipher) {
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400273 OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700274 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400275 return ssl_hs_error;
276 }
277
Robert Sloana27a6a42017-09-05 08:39:28 -0700278 // Parse out the extensions.
279 bool have_key_share = false, have_pre_shared_key = false,
280 have_supported_versions = false;
Robert Sloana12bf462017-07-17 07:08:26 -0700281 CBS key_share, pre_shared_key, supported_versions;
Robert Sloan0db7f542018-01-16 15:48:33 -0800282 SSL_EXTENSION_TYPE ext_types[] = {
Robert Sloan8542c082018-02-05 09:07:34 -0800283 {TLSEXT_TYPE_key_share, &have_key_share, &key_share},
Steven Valdez909b19f2016-11-21 15:35:44 -0500284 {TLSEXT_TYPE_pre_shared_key, &have_pre_shared_key, &pre_shared_key},
Robert Sloana12bf462017-07-17 07:08:26 -0700285 {TLSEXT_TYPE_supported_versions, &have_supported_versions,
286 &supported_versions},
Steven Valdez909b19f2016-11-21 15:35:44 -0500287 };
David Benjaminc895d6b2016-08-11 13:26:41 -0400288
Robert Sloan5d625782017-02-13 09:55:39 -0800289 uint8_t alert = SSL_AD_DECODE_ERROR;
Steven Valdez909b19f2016-11-21 15:35:44 -0500290 if (!ssl_parse_extensions(&extensions, &alert, ext_types,
Robert Sloan69939df2017-01-09 10:53:07 -0800291 OPENSSL_ARRAY_SIZE(ext_types),
292 0 /* reject unknown */)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700293 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
Steven Valdez909b19f2016-11-21 15:35:44 -0500294 return ssl_hs_error;
David Benjaminc895d6b2016-08-11 13:26:41 -0400295 }
296
Robert Sloan4c22c5f2019-03-01 15:53:37 -0800297 // Recheck supported_versions, in case this is the second ServerHello.
298 uint16_t version;
299 if (!have_supported_versions ||
300 !CBS_get_u16(&supported_versions, &version) ||
301 version != ssl->version) {
302 OPENSSL_PUT_ERROR(SSL, SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH);
303 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
304 return ssl_hs_error;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100305 }
306
Steven Valdez909b19f2016-11-21 15:35:44 -0500307 alert = SSL_AD_DECODE_ERROR;
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400308 if (have_pre_shared_key) {
309 if (ssl->session == NULL) {
310 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700311 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400312 return ssl_hs_error;
313 }
314
David Benjamin1b249672016-12-06 18:25:50 -0500315 if (!ssl_ext_pre_shared_key_parse_serverhello(hs, &alert,
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400316 &pre_shared_key)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700317 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400318 return ssl_hs_error;
319 }
320
321 if (ssl->session->ssl_version != ssl->version) {
322 OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_VERSION_NOT_RETURNED);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700323 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400324 return ssl_hs_error;
325 }
326
Steven Valdez909b19f2016-11-21 15:35:44 -0500327 if (ssl->session->cipher->algorithm_prf != cipher->algorithm_prf) {
328 OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_PRF_HASH_MISMATCH);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700329 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400330 return ssl_hs_error;
331 }
332
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100333 if (!ssl_session_is_context_valid(hs, ssl->session.get())) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700334 // This is actually a client application bug.
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400335 OPENSSL_PUT_ERROR(SSL,
336 SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700337 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400338 return ssl_hs_error;
339 }
340
Robert Sloana27a6a42017-09-05 08:39:28 -0700341 ssl->s3->session_reused = true;
342 // Only authentication information carries over in TLS 1.3.
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100343 hs->new_session =
344 SSL_SESSION_dup(ssl->session.get(), SSL_SESSION_DUP_AUTH_ONLY);
Robert Sloanb6d070c2017-07-24 08:40:01 -0700345 if (!hs->new_session) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700346 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400347 return ssl_hs_error;
348 }
Robert Sloane56da3e2017-06-26 08:26:42 -0700349 ssl_set_session(ssl, NULL);
Robert Sloan4d1ac502017-02-06 08:36:14 -0800350
Robert Sloana27a6a42017-09-05 08:39:28 -0700351 // Resumption incorporates fresh key material, so refresh the timeout.
Robert Sloanb6d070c2017-07-24 08:40:01 -0700352 ssl_session_renew_timeout(ssl, hs->new_session.get(),
Robert Sloan1c9db532017-03-13 08:03:59 -0700353 ssl->session_ctx->session_psk_dhe_timeout);
David Benjamin1b249672016-12-06 18:25:50 -0500354 } else if (!ssl_get_new_session(hs, 0)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700355 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400356 return ssl_hs_error;
357 }
358
Robert Sloana94fe052017-02-21 08:49:28 -0800359 hs->new_session->cipher = cipher;
360 hs->new_cipher = cipher;
361
Robert Sloanb1b54b82017-11-06 13:50:02 -0800362 size_t hash_len =
363 EVP_MD_size(ssl_get_handshake_digest(ssl_protocol_version(ssl), cipher));
David Benjaminc895d6b2016-08-11 13:26:41 -0400364
Robert Sloanb1b54b82017-11-06 13:50:02 -0800365 // Set up the key schedule and incorporate the PSK into the running secret.
David Benjamin1b249672016-12-06 18:25:50 -0500366 if (ssl->s3->session_reused) {
Robert Sloanb1b54b82017-11-06 13:50:02 -0800367 if (!tls13_init_key_schedule(hs, hs->new_session->master_key,
368 hs->new_session->master_key_length)) {
David Benjamin1b249672016-12-06 18:25:50 -0500369 return ssl_hs_error;
370 }
Robert Sloanb1b54b82017-11-06 13:50:02 -0800371 } else if (!tls13_init_key_schedule(hs, kZeroes, hash_len)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400372 return ssl_hs_error;
373 }
374
Steven Valdeze7531f02016-12-14 13:29:57 -0500375 if (!have_key_share) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700376 // We do not support psk_ke and thus always require a key share.
Steven Valdeze7531f02016-12-14 13:29:57 -0500377 OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700378 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
Steven Valdeze7531f02016-12-14 13:29:57 -0500379 return ssl_hs_error;
380 }
381
Robert Sloana27a6a42017-09-05 08:39:28 -0700382 // Resolve ECDHE and incorporate it into the secret.
Robert Sloan4562e9d2017-10-02 10:26:51 -0700383 Array<uint8_t> dhe_secret;
Robert Sloan5d625782017-02-13 09:55:39 -0800384 alert = SSL_AD_DECODE_ERROR;
Robert Sloan4562e9d2017-10-02 10:26:51 -0700385 if (!ssl_ext_key_share_parse_serverhello(hs, &dhe_secret, &alert,
386 &key_share)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700387 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400388 return ssl_hs_error;
389 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400390
Robert Sloan4562e9d2017-10-02 10:26:51 -0700391 if (!tls13_advance_key_schedule(hs, dhe_secret.data(), dhe_secret.size()) ||
Robert Sloancbf5ea62018-11-05 11:56:34 -0800392 !ssl_hash_message(hs, msg) || !tls13_derive_handshake_secrets(hs) ||
393 !tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open,
394 hs->server_handshake_secret, hs->hash_len)) {
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700395 return ssl_hs_error;
396 }
397
Robert Sloana12bf462017-07-17 07:08:26 -0700398 if (!hs->early_data_offered) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700399 // If not sending early data, set client traffic keys now so that alerts are
400 // encrypted.
Robert Sloancbf5ea62018-11-05 11:56:34 -0800401 if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
402 hs->client_handshake_secret, hs->hash_len)) {
Robert Sloana12bf462017-07-17 07:08:26 -0700403 return ssl_hs_error;
404 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400405 }
406
Robert Sloand5c22152017-11-13 09:22:12 -0800407 ssl->method->next_message(ssl);
Robert Sloan84377092017-08-14 09:33:19 -0700408 hs->tls13_state = state_read_encrypted_extensions;
409 return ssl_hs_ok;
David Benjaminc895d6b2016-08-11 13:26:41 -0400410}
411
Robert Sloan84377092017-08-14 09:33:19 -0700412static enum ssl_hs_wait_t do_read_encrypted_extensions(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500413 SSL *const ssl = hs->ssl;
Robert Sloan84377092017-08-14 09:33:19 -0700414 SSLMessage msg;
415 if (!ssl->method->get_message(ssl, &msg)) {
416 return ssl_hs_read_message;
417 }
418 if (!ssl_check_message_type(ssl, msg, SSL3_MT_ENCRYPTED_EXTENSIONS)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400419 return ssl_hs_error;
420 }
421
Robert Sloan84377092017-08-14 09:33:19 -0700422 CBS body = msg.body;
423 if (!ssl_parse_serverhello_tlsext(hs, &body)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400424 OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
425 return ssl_hs_error;
426 }
Robert Sloan84377092017-08-14 09:33:19 -0700427 if (CBS_len(&body) != 0) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400428 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700429 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400430 return ssl_hs_error;
431 }
432
Robert Sloana27a6a42017-09-05 08:39:28 -0700433 // Store the negotiated ALPN in the session.
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100434 if (!hs->new_session->early_alpn.CopyFrom(ssl->s3->alpn_selected)) {
435 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
436 return ssl_hs_error;
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700437 }
438
Robert Sloan0da43952018-01-03 15:13:14 -0800439 if (ssl->s3->early_data_accepted) {
Robert Sloane56da3e2017-06-26 08:26:42 -0700440 if (hs->early_session->cipher != hs->new_session->cipher ||
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100441 MakeConstSpan(hs->early_session->early_alpn) !=
Robert Sloan29c1d2c2017-10-30 14:10:28 -0700442 ssl->s3->alpn_selected) {
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700443 OPENSSL_PUT_ERROR(SSL, SSL_R_ALPN_MISMATCH_ON_EARLY_DATA);
444 return ssl_hs_error;
445 }
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100446 if (ssl->s3->channel_id_valid || ssl->s3->token_binding_negotiated) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700447 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA);
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700448 return ssl_hs_error;
449 }
450 }
451
Robert Sloan84377092017-08-14 09:33:19 -0700452 if (!ssl_hash_message(hs, msg)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400453 return ssl_hs_error;
454 }
455
Robert Sloan84377092017-08-14 09:33:19 -0700456 ssl->method->next_message(ssl);
457 hs->tls13_state = state_read_certificate_request;
Robert Sloan0da43952018-01-03 15:13:14 -0800458 if (hs->in_early_data && !ssl->s3->early_data_accepted) {
Robert Sloane56da3e2017-06-26 08:26:42 -0700459 return ssl_hs_early_data_rejected;
460 }
461 return ssl_hs_ok;
462}
463
Robert Sloan84377092017-08-14 09:33:19 -0700464static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500465 SSL *const ssl = hs->ssl;
Robert Sloana27a6a42017-09-05 08:39:28 -0700466 // CertificateRequest may only be sent in non-resumption handshakes.
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400467 if (ssl->s3->session_reused) {
Robert Sloanc9abfe42018-11-26 12:19:07 -0800468 if (ssl->ctx->reverify_on_resume && !ssl->s3->early_data_accepted) {
Robert Sloand9e572d2018-08-27 12:27:00 -0700469 hs->tls13_state = state_server_certificate_reverify;
470 return ssl_hs_ok;
471 }
Robert Sloan84377092017-08-14 09:33:19 -0700472 hs->tls13_state = state_read_server_finished;
David Benjaminc895d6b2016-08-11 13:26:41 -0400473 return ssl_hs_ok;
474 }
475
Robert Sloan84377092017-08-14 09:33:19 -0700476 SSLMessage msg;
477 if (!ssl->method->get_message(ssl, &msg)) {
478 return ssl_hs_read_message;
479 }
480
Robert Sloana27a6a42017-09-05 08:39:28 -0700481 // CertificateRequest is optional.
Robert Sloan84377092017-08-14 09:33:19 -0700482 if (msg.type != SSL3_MT_CERTIFICATE_REQUEST) {
483 hs->tls13_state = state_read_server_certificate;
David Benjaminc895d6b2016-08-11 13:26:41 -0400484 return ssl_hs_ok;
485 }
486
David Benjaminc895d6b2016-08-11 13:26:41 -0400487
Robert Sloan8542c082018-02-05 09:07:34 -0800488 bool have_sigalgs = false, have_ca = false;
489 CBS sigalgs, ca;
490 const SSL_EXTENSION_TYPE ext_types[] = {
491 {TLSEXT_TYPE_signature_algorithms, &have_sigalgs, &sigalgs},
492 {TLSEXT_TYPE_certificate_authorities, &have_ca, &ca},
493 };
David Benjaminc895d6b2016-08-11 13:26:41 -0400494
Robert Sloan8542c082018-02-05 09:07:34 -0800495 CBS body = msg.body, context, extensions, supported_signature_algorithms;
496 uint8_t alert = SSL_AD_DECODE_ERROR;
497 if (!CBS_get_u8_length_prefixed(&body, &context) ||
498 // The request context is always empty during the handshake.
499 CBS_len(&context) != 0 ||
500 !CBS_get_u16_length_prefixed(&body, &extensions) ||
501 CBS_len(&body) != 0 ||
502 !ssl_parse_extensions(&extensions, &alert, ext_types,
503 OPENSSL_ARRAY_SIZE(ext_types),
504 1 /* accept unknown */) ||
505 (have_ca && CBS_len(&ca) == 0) ||
506 !have_sigalgs ||
507 !CBS_get_u16_length_prefixed(&sigalgs,
508 &supported_signature_algorithms) ||
Robert Sloan8542c082018-02-05 09:07:34 -0800509 !tls1_parse_peer_sigalgs(hs, &supported_signature_algorithms)) {
510 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
511 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
512 return ssl_hs_error;
513 }
Robert Sloanb1b54b82017-11-06 13:50:02 -0800514
Robert Sloan8542c082018-02-05 09:07:34 -0800515 if (have_ca) {
516 hs->ca_names = ssl_parse_client_CA_list(ssl, &alert, &ca);
Robert Sloanb1b54b82017-11-06 13:50:02 -0800517 if (!hs->ca_names) {
518 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
519 return ssl_hs_error;
520 }
Robert Sloan8542c082018-02-05 09:07:34 -0800521 } else {
522 hs->ca_names.reset(sk_CRYPTO_BUFFER_new_null());
523 if (!hs->ca_names) {
524 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
525 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Robert Sloanb1b54b82017-11-06 13:50:02 -0800526 return ssl_hs_error;
527 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400528 }
529
Robert Sloana27a6a42017-09-05 08:39:28 -0700530 hs->cert_request = true;
Robert Sloan7d422bc2017-03-06 10:04:29 -0800531 ssl->ctx->x509_method->hs_flush_cached_ca_names(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400532
Robert Sloan84377092017-08-14 09:33:19 -0700533 if (!ssl_hash_message(hs, msg)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400534 return ssl_hs_error;
535 }
536
Robert Sloan84377092017-08-14 09:33:19 -0700537 ssl->method->next_message(ssl);
538 hs->tls13_state = state_read_server_certificate;
539 return ssl_hs_ok;
David Benjaminc895d6b2016-08-11 13:26:41 -0400540}
541
Robert Sloan84377092017-08-14 09:33:19 -0700542static enum ssl_hs_wait_t do_read_server_certificate(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500543 SSL *const ssl = hs->ssl;
Robert Sloan84377092017-08-14 09:33:19 -0700544 SSLMessage msg;
545 if (!ssl->method->get_message(ssl, &msg)) {
546 return ssl_hs_read_message;
547 }
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100548
549 if (msg.type != SSL3_MT_COMPRESSED_CERTIFICATE &&
550 !ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE)) {
551 return ssl_hs_error;
552 }
553
Robert Sloan726e9d12018-09-11 11:45:04 -0700554 if (!tls13_process_certificate(hs, msg, false /* certificate required */) ||
Robert Sloan84377092017-08-14 09:33:19 -0700555 !ssl_hash_message(hs, msg)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400556 return ssl_hs_error;
557 }
558
Robert Sloan84377092017-08-14 09:33:19 -0700559 ssl->method->next_message(ssl);
560 hs->tls13_state = state_read_server_certificate_verify;
561 return ssl_hs_ok;
David Benjaminc895d6b2016-08-11 13:26:41 -0400562}
563
Robert Sloan84377092017-08-14 09:33:19 -0700564static enum ssl_hs_wait_t do_read_server_certificate_verify(
David Benjamin1b249672016-12-06 18:25:50 -0500565 SSL_HANDSHAKE *hs) {
566 SSL *const ssl = hs->ssl;
Robert Sloan84377092017-08-14 09:33:19 -0700567 SSLMessage msg;
568 if (!ssl->method->get_message(ssl, &msg)) {
569 return ssl_hs_read_message;
570 }
Robert Sloanb6d070c2017-07-24 08:40:01 -0700571 switch (ssl_verify_peer_cert(hs)) {
572 case ssl_verify_ok:
573 break;
574 case ssl_verify_invalid:
575 return ssl_hs_error;
576 case ssl_verify_retry:
Robert Sloan84377092017-08-14 09:33:19 -0700577 hs->tls13_state = state_read_server_certificate_verify;
Robert Sloanb6d070c2017-07-24 08:40:01 -0700578 return ssl_hs_certificate_verify;
579 }
580
Robert Sloan84377092017-08-14 09:33:19 -0700581 if (!ssl_check_message_type(ssl, msg, SSL3_MT_CERTIFICATE_VERIFY) ||
582 !tls13_process_certificate_verify(hs, msg) ||
583 !ssl_hash_message(hs, msg)) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500584 return ssl_hs_error;
David Benjaminc895d6b2016-08-11 13:26:41 -0400585 }
586
Robert Sloan84377092017-08-14 09:33:19 -0700587 ssl->method->next_message(ssl);
588 hs->tls13_state = state_read_server_finished;
589 return ssl_hs_ok;
David Benjaminc895d6b2016-08-11 13:26:41 -0400590}
591
Robert Sloand9e572d2018-08-27 12:27:00 -0700592static enum ssl_hs_wait_t do_server_certificate_reverify(
593 SSL_HANDSHAKE *hs) {
594 switch (ssl_reverify_peer_cert(hs)) {
595 case ssl_verify_ok:
596 break;
597 case ssl_verify_invalid:
598 return ssl_hs_error;
599 case ssl_verify_retry:
600 hs->tls13_state = state_server_certificate_reverify;
601 return ssl_hs_certificate_verify;
602 }
603 hs->tls13_state = state_read_server_finished;
604 return ssl_hs_ok;
605}
606
Robert Sloan84377092017-08-14 09:33:19 -0700607static enum ssl_hs_wait_t do_read_server_finished(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500608 SSL *const ssl = hs->ssl;
Robert Sloan84377092017-08-14 09:33:19 -0700609 SSLMessage msg;
610 if (!ssl->method->get_message(ssl, &msg)) {
611 return ssl_hs_read_message;
612 }
613 if (!ssl_check_message_type(ssl, msg, SSL3_MT_FINISHED) ||
Robert Sloan726e9d12018-09-11 11:45:04 -0700614 !tls13_process_finished(hs, msg, false /* don't use saved value */) ||
Robert Sloan84377092017-08-14 09:33:19 -0700615 !ssl_hash_message(hs, msg) ||
Robert Sloana27a6a42017-09-05 08:39:28 -0700616 // Update the secret to the master secret and derive traffic keys.
David Benjamin1b249672016-12-06 18:25:50 -0500617 !tls13_advance_key_schedule(hs, kZeroes, hs->hash_len) ||
618 !tls13_derive_application_secrets(hs)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400619 return ssl_hs_error;
620 }
621
Robert Sloan84377092017-08-14 09:33:19 -0700622 ssl->method->next_message(ssl);
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700623 hs->tls13_state = state_send_end_of_early_data;
624 return ssl_hs_ok;
625}
626
627static enum ssl_hs_wait_t do_send_end_of_early_data(SSL_HANDSHAKE *hs) {
628 SSL *const ssl = hs->ssl;
Robert Sloane56da3e2017-06-26 08:26:42 -0700629
Robert Sloan0da43952018-01-03 15:13:14 -0800630 if (ssl->s3->early_data_accepted) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700631 hs->can_early_write = false;
Robert Sloan8542c082018-02-05 09:07:34 -0800632 ScopedCBB cbb;
633 CBB body;
634 if (!ssl->method->init_message(ssl, cbb.get(), &body,
635 SSL3_MT_END_OF_EARLY_DATA) ||
636 !ssl_add_message_cbb(ssl, cbb.get())) {
637 return ssl_hs_error;
Robert Sloane56da3e2017-06-26 08:26:42 -0700638 }
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700639 }
640
Robert Sloana12bf462017-07-17 07:08:26 -0700641 if (hs->early_data_offered) {
Robert Sloancbf5ea62018-11-05 11:56:34 -0800642 if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal,
643 hs->client_handshake_secret, hs->hash_len)) {
Robert Sloana12bf462017-07-17 07:08:26 -0700644 return ssl_hs_error;
645 }
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700646 }
647
Steven Valdeze7531f02016-12-14 13:29:57 -0500648 hs->tls13_state = state_send_client_certificate;
David Benjaminc895d6b2016-08-11 13:26:41 -0400649 return ssl_hs_ok;
650}
651
Steven Valdeze7531f02016-12-14 13:29:57 -0500652static enum ssl_hs_wait_t do_send_client_certificate(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500653 SSL *const ssl = hs->ssl;
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700654
Robert Sloana27a6a42017-09-05 08:39:28 -0700655 // The peer didn't request a certificate.
David Benjamin1b249672016-12-06 18:25:50 -0500656 if (!hs->cert_request) {
Robert Sloan4d1ac502017-02-06 08:36:14 -0800657 hs->tls13_state = state_complete_second_flight;
David Benjaminc895d6b2016-08-11 13:26:41 -0400658 return ssl_hs_ok;
659 }
660
Robert Sloana27a6a42017-09-05 08:39:28 -0700661 // Call cert_cb to update the certificate.
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100662 if (hs->config->cert->cert_cb != NULL) {
663 int rv = hs->config->cert->cert_cb(ssl, hs->config->cert->cert_cb_arg);
David Benjaminc895d6b2016-08-11 13:26:41 -0400664 if (rv == 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700665 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400666 OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
667 return ssl_hs_error;
668 }
669 if (rv < 0) {
Steven Valdeze7531f02016-12-14 13:29:57 -0500670 hs->tls13_state = state_send_client_certificate;
David Benjaminc895d6b2016-08-11 13:26:41 -0400671 return ssl_hs_x509_lookup;
672 }
673 }
674
Robert Sloan572a4e22017-04-17 10:52:19 -0700675 if (!ssl_on_certificate_selected(hs) ||
Robert Sloan4d1ac502017-02-06 08:36:14 -0800676 !tls13_add_certificate(hs)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400677 return ssl_hs_error;
678 }
679
Steven Valdeze7531f02016-12-14 13:29:57 -0500680 hs->tls13_state = state_send_client_certificate_verify;
Robert Sloan4d1ac502017-02-06 08:36:14 -0800681 return ssl_hs_ok;
David Benjaminc895d6b2016-08-11 13:26:41 -0400682}
683
Robert Sloane56da3e2017-06-26 08:26:42 -0700684static enum ssl_hs_wait_t do_send_client_certificate_verify(SSL_HANDSHAKE *hs) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700685 // Don't send CertificateVerify if there is no certificate.
Robert Sloan4c22c5f2019-03-01 15:53:37 -0800686 if (!ssl_has_certificate(hs)) {
Robert Sloan4d1ac502017-02-06 08:36:14 -0800687 hs->tls13_state = state_complete_second_flight;
David Benjaminc895d6b2016-08-11 13:26:41 -0400688 return ssl_hs_ok;
689 }
690
Robert Sloane56da3e2017-06-26 08:26:42 -0700691 switch (tls13_add_certificate_verify(hs)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400692 case ssl_private_key_success:
Robert Sloan4d1ac502017-02-06 08:36:14 -0800693 hs->tls13_state = state_complete_second_flight;
694 return ssl_hs_ok;
David Benjaminc895d6b2016-08-11 13:26:41 -0400695
696 case ssl_private_key_retry:
Robert Sloane56da3e2017-06-26 08:26:42 -0700697 hs->tls13_state = state_send_client_certificate_verify;
David Benjaminc895d6b2016-08-11 13:26:41 -0400698 return ssl_hs_private_key_operation;
699
700 case ssl_private_key_failure:
701 return ssl_hs_error;
702 }
703
704 assert(0);
705 return ssl_hs_error;
706}
707
Robert Sloan4d1ac502017-02-06 08:36:14 -0800708static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500709 SSL *const ssl = hs->ssl;
Robert Sloan4d1ac502017-02-06 08:36:14 -0800710
Robert Sloana27a6a42017-09-05 08:39:28 -0700711 // Send a Channel ID assertion if necessary.
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100712 if (ssl->s3->channel_id_valid) {
713 if (!ssl_do_channel_id_callback(hs)) {
Robert Sloan4d1ac502017-02-06 08:36:14 -0800714 hs->tls13_state = state_complete_second_flight;
715 return ssl_hs_error;
716 }
717
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100718 if (hs->config->channel_id_private == NULL) {
Robert Sloan4d1ac502017-02-06 08:36:14 -0800719 return ssl_hs_channel_id_lookup;
720 }
721
Robert Sloanb6d070c2017-07-24 08:40:01 -0700722 ScopedCBB cbb;
723 CBB body;
724 if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_CHANNEL_ID) ||
Robert Sloan5d625782017-02-13 09:55:39 -0800725 !tls1_write_channel_id(hs, &body) ||
Robert Sloanb6d070c2017-07-24 08:40:01 -0700726 !ssl_add_message_cbb(ssl, cbb.get())) {
Robert Sloan4d1ac502017-02-06 08:36:14 -0800727 return ssl_hs_error;
728 }
Steven Valdez909b19f2016-11-21 15:35:44 -0500729 }
730
Robert Sloana27a6a42017-09-05 08:39:28 -0700731 // Send a Finished message.
Robert Sloan4d1ac502017-02-06 08:36:14 -0800732 if (!tls13_add_finished(hs)) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500733 return ssl_hs_error;
734 }
735
Robert Sloana27a6a42017-09-05 08:39:28 -0700736 // Derive the final keys and enable them.
Robert Sloancbf5ea62018-11-05 11:56:34 -0800737 if (!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_open,
738 hs->server_traffic_secret_0, hs->hash_len) ||
739 !tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal,
740 hs->client_traffic_secret_0, hs->hash_len) ||
David Benjamin1b249672016-12-06 18:25:50 -0500741 !tls13_derive_resumption_secret(hs)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400742 return ssl_hs_error;
743 }
744
Steven Valdeze7531f02016-12-14 13:29:57 -0500745 hs->tls13_state = state_done;
David Benjaminc895d6b2016-08-11 13:26:41 -0400746 return ssl_hs_flush;
747}
748
David Benjamin1b249672016-12-06 18:25:50 -0500749enum ssl_hs_wait_t tls13_client_handshake(SSL_HANDSHAKE *hs) {
Steven Valdeze7531f02016-12-14 13:29:57 -0500750 while (hs->tls13_state != state_done) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400751 enum ssl_hs_wait_t ret = ssl_hs_error;
Robert Sloana12bf462017-07-17 07:08:26 -0700752 enum client_hs_state_t state =
753 static_cast<enum client_hs_state_t>(hs->tls13_state);
David Benjaminc895d6b2016-08-11 13:26:41 -0400754 switch (state) {
Robert Sloan84377092017-08-14 09:33:19 -0700755 case state_read_hello_retry_request:
756 ret = do_read_hello_retry_request(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400757 break;
758 case state_send_second_client_hello:
David Benjamin1b249672016-12-06 18:25:50 -0500759 ret = do_send_second_client_hello(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400760 break;
Robert Sloan84377092017-08-14 09:33:19 -0700761 case state_read_server_hello:
762 ret = do_read_server_hello(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400763 break;
Robert Sloan84377092017-08-14 09:33:19 -0700764 case state_read_encrypted_extensions:
765 ret = do_read_encrypted_extensions(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400766 break;
Robert Sloan84377092017-08-14 09:33:19 -0700767 case state_read_certificate_request:
768 ret = do_read_certificate_request(hs);
Robert Sloane56da3e2017-06-26 08:26:42 -0700769 break;
Robert Sloan84377092017-08-14 09:33:19 -0700770 case state_read_server_certificate:
771 ret = do_read_server_certificate(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400772 break;
Robert Sloan84377092017-08-14 09:33:19 -0700773 case state_read_server_certificate_verify:
774 ret = do_read_server_certificate_verify(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400775 break;
Robert Sloand9e572d2018-08-27 12:27:00 -0700776 case state_server_certificate_reverify:
777 ret = do_server_certificate_reverify(hs);
778 break;
Robert Sloan84377092017-08-14 09:33:19 -0700779 case state_read_server_finished:
780 ret = do_read_server_finished(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400781 break;
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700782 case state_send_end_of_early_data:
783 ret = do_send_end_of_early_data(hs);
784 break;
David Benjaminc895d6b2016-08-11 13:26:41 -0400785 case state_send_client_certificate:
David Benjamin1b249672016-12-06 18:25:50 -0500786 ret = do_send_client_certificate(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400787 break;
788 case state_send_client_certificate_verify:
Robert Sloane56da3e2017-06-26 08:26:42 -0700789 ret = do_send_client_certificate_verify(hs);
Steven Valdez909b19f2016-11-21 15:35:44 -0500790 break;
Robert Sloan4d1ac502017-02-06 08:36:14 -0800791 case state_complete_second_flight:
792 ret = do_complete_second_flight(hs);
David Benjaminc895d6b2016-08-11 13:26:41 -0400793 break;
794 case state_done:
795 ret = ssl_hs_ok;
796 break;
797 }
798
Robert Sloana27a6a42017-09-05 08:39:28 -0700799 if (hs->tls13_state != state) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700800 ssl_do_info_callback(hs->ssl, SSL_CB_CONNECT_LOOP, 1);
801 }
802
David Benjaminc895d6b2016-08-11 13:26:41 -0400803 if (ret != ssl_hs_ok) {
804 return ret;
805 }
806 }
807
808 return ssl_hs_ok;
809}
810
Robert Sloan8f860b12017-08-28 07:37:06 -0700811const char *tls13_client_handshake_state(SSL_HANDSHAKE *hs) {
812 enum client_hs_state_t state =
813 static_cast<enum client_hs_state_t>(hs->tls13_state);
814 switch (state) {
815 case state_read_hello_retry_request:
816 return "TLS 1.3 client read_hello_retry_request";
817 case state_send_second_client_hello:
818 return "TLS 1.3 client send_second_client_hello";
819 case state_read_server_hello:
820 return "TLS 1.3 client read_server_hello";
Robert Sloan8f860b12017-08-28 07:37:06 -0700821 case state_read_encrypted_extensions:
822 return "TLS 1.3 client read_encrypted_extensions";
823 case state_read_certificate_request:
824 return "TLS 1.3 client read_certificate_request";
825 case state_read_server_certificate:
826 return "TLS 1.3 client read_server_certificate";
827 case state_read_server_certificate_verify:
828 return "TLS 1.3 client read_server_certificate_verify";
Robert Sloand9e572d2018-08-27 12:27:00 -0700829 case state_server_certificate_reverify:
830 return "TLS 1.3 client server_certificate_reverify";
Robert Sloan8f860b12017-08-28 07:37:06 -0700831 case state_read_server_finished:
832 return "TLS 1.3 client read_server_finished";
833 case state_send_end_of_early_data:
834 return "TLS 1.3 client send_end_of_early_data";
835 case state_send_client_certificate:
836 return "TLS 1.3 client send_client_certificate";
837 case state_send_client_certificate_verify:
838 return "TLS 1.3 client send_client_certificate_verify";
839 case state_complete_second_flight:
840 return "TLS 1.3 client complete_second_flight";
841 case state_done:
842 return "TLS 1.3 client done";
843 }
844
845 return "TLS 1.3 client unknown";
846}
847
Robert Sloan726e9d12018-09-11 11:45:04 -0700848bool tls13_process_new_session_ticket(SSL *ssl, const SSLMessage &msg) {
Robert Sloan36272962017-10-23 10:28:39 -0700849 if (ssl->s3->write_shutdown != ssl_shutdown_none) {
850 // Ignore tickets on shutdown. Callers tend to indiscriminately call
851 // |SSL_shutdown| before destroying an |SSL|, at which point calling the new
852 // session callback may be confusing.
Robert Sloan726e9d12018-09-11 11:45:04 -0700853 return true;
Robert Sloan36272962017-10-23 10:28:39 -0700854 }
855
Robert Sloan29c1d2c2017-10-30 14:10:28 -0700856 UniquePtr<SSL_SESSION> session = SSL_SESSION_dup(
857 ssl->s3->established_session.get(), SSL_SESSION_INCLUDE_NONAUTH);
Robert Sloana12bf462017-07-17 07:08:26 -0700858 if (!session) {
Robert Sloan726e9d12018-09-11 11:45:04 -0700859 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400860 }
861
Robert Sloana12bf462017-07-17 07:08:26 -0700862 ssl_session_rebase_time(ssl, session.get());
Steven Valdez909b19f2016-11-21 15:35:44 -0500863
Robert Sloan4d1ac502017-02-06 08:36:14 -0800864 uint32_t server_timeout;
Robert Sloanb1b54b82017-11-06 13:50:02 -0800865 CBS body = msg.body, ticket_nonce, ticket, extensions;
Robert Sloan84377092017-08-14 09:33:19 -0700866 if (!CBS_get_u32(&body, &server_timeout) ||
867 !CBS_get_u32(&body, &session->ticket_age_add) ||
Robert Sloan8542c082018-02-05 09:07:34 -0800868 !CBS_get_u8_length_prefixed(&body, &ticket_nonce) ||
Robert Sloan84377092017-08-14 09:33:19 -0700869 !CBS_get_u16_length_prefixed(&body, &ticket) ||
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100870 !session->ticket.CopyFrom(ticket) ||
Robert Sloan84377092017-08-14 09:33:19 -0700871 !CBS_get_u16_length_prefixed(&body, &extensions) ||
872 CBS_len(&body) != 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700873 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400874 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700875 return false;
Robert Sloan69939df2017-01-09 10:53:07 -0800876 }
877
Robert Sloana27a6a42017-09-05 08:39:28 -0700878 // Cap the renewable lifetime by the server advertised value. This avoids
879 // wasting bandwidth on 0-RTT when we know the server will reject it.
Robert Sloan7d422bc2017-03-06 10:04:29 -0800880 if (session->timeout > server_timeout) {
881 session->timeout = server_timeout;
Robert Sloan4d1ac502017-02-06 08:36:14 -0800882 }
883
Robert Sloan4c22c5f2019-03-01 15:53:37 -0800884 if (!tls13_derive_session_psk(session.get(), ticket_nonce)) {
Robert Sloan726e9d12018-09-11 11:45:04 -0700885 return false;
Robert Sloanb1b54b82017-11-06 13:50:02 -0800886 }
887
Robert Sloana27a6a42017-09-05 08:39:28 -0700888 // Parse out the extensions.
889 bool have_early_data_info = false;
Robert Sloan69939df2017-01-09 10:53:07 -0800890 CBS early_data_info;
891 const SSL_EXTENSION_TYPE ext_types[] = {
Robert Sloan8542c082018-02-05 09:07:34 -0800892 {TLSEXT_TYPE_early_data, &have_early_data_info, &early_data_info},
Robert Sloan69939df2017-01-09 10:53:07 -0800893 };
894
Robert Sloan5d625782017-02-13 09:55:39 -0800895 uint8_t alert = SSL_AD_DECODE_ERROR;
Robert Sloan69939df2017-01-09 10:53:07 -0800896 if (!ssl_parse_extensions(&extensions, &alert, ext_types,
897 OPENSSL_ARRAY_SIZE(ext_types),
898 1 /* ignore unknown */)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700899 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
Robert Sloan726e9d12018-09-11 11:45:04 -0700900 return false;
Robert Sloan69939df2017-01-09 10:53:07 -0800901 }
902
Srinivas Paladugudd42a612019-08-09 19:30:39 +0000903 if (have_early_data_info && ssl->enable_early_data) {
Robert Sloan69939df2017-01-09 10:53:07 -0800904 if (!CBS_get_u32(&early_data_info, &session->ticket_max_early_data) ||
905 CBS_len(&early_data_info) != 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700906 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Robert Sloan69939df2017-01-09 10:53:07 -0800907 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700908 return false;
Robert Sloan69939df2017-01-09 10:53:07 -0800909 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400910 }
911
Robert Sloan726e9d12018-09-11 11:45:04 -0700912 // Generate a session ID for this session. Some callers expect all sessions to
913 // have a session ID.
914 SHA256(CBS_data(&ticket), CBS_len(&ticket), session->session_id);
915 session->session_id_length = SHA256_DIGEST_LENGTH;
916
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100917 session->ticket_age_add_valid = true;
918 session->not_resumable = false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400919
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100920 if ((ssl->session_ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) &&
921 ssl->session_ctx->new_session_cb != NULL &&
922 ssl->session_ctx->new_session_cb(ssl, session.get())) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700923 // |new_session_cb|'s return value signals that it took ownership.
Robert Sloana12bf462017-07-17 07:08:26 -0700924 session.release();
David Benjaminc895d6b2016-08-11 13:26:41 -0400925 }
926
Robert Sloan726e9d12018-09-11 11:45:04 -0700927 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400928}
David Benjamin7c0d06c2016-08-11 13:26:41 -0400929
Robert Sloan726e9d12018-09-11 11:45:04 -0700930BSSL_NAMESPACE_END