blob: a02d35d778ad0732b2f23aa39154f5bec6108e6d [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>
18#include <string.h>
19
Robert Sloanb6d070c2017-07-24 08:40:01 -070020#include <utility>
21
David Benjaminc895d6b2016-08-11 13:26:41 -040022#include <openssl/bytestring.h>
23#include <openssl/err.h>
24#include <openssl/hkdf.h>
25#include <openssl/mem.h>
26#include <openssl/stack.h>
27#include <openssl/x509.h>
David Benjaminc895d6b2016-08-11 13:26:41 -040028
Steven Valdez909b19f2016-11-21 15:35:44 -050029#include "../crypto/internal.h"
David Benjaminc895d6b2016-08-11 13:26:41 -040030#include "internal.h"
31
32
Robert Sloan726e9d12018-09-11 11:45:04 -070033BSSL_NAMESPACE_BEGIN
Robert Sloanb6d070c2017-07-24 08:40:01 -070034
Robert Sloana27a6a42017-09-05 08:39:28 -070035// kMaxKeyUpdates is the number of consecutive KeyUpdates that will be
36// processed. Without this limit an attacker could force unbounded processing
37// without being able to return application data.
David Benjaminf0c4a6c2016-08-11 13:26:41 -040038static const uint8_t kMaxKeyUpdates = 32;
David Benjaminc895d6b2016-08-11 13:26:41 -040039
Robert Sloand5c22152017-11-13 09:22:12 -080040const uint8_t kHelloRetryRequest[SSL3_RANDOM_SIZE] = {
41 0xcf, 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c,
42 0x02, 0x1e, 0x65, 0xb8, 0x91, 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb,
43 0x8c, 0x5e, 0x07, 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c,
44};
45
Robert Sloand9e572d2018-08-27 12:27:00 -070046const uint8_t kTLS12DowngradeRandom[8] = {0x44, 0x4f, 0x57, 0x4e,
47 0x47, 0x52, 0x44, 0x00};
48
49const uint8_t kTLS13DowngradeRandom[8] = {0x44, 0x4f, 0x57, 0x4e,
50 0x47, 0x52, 0x44, 0x01};
Robert Sloan0da43952018-01-03 15:13:14 -080051
52
Robert Sloan921ef2c2017-10-17 09:02:20 -070053bool tls13_get_cert_verify_signature_input(
54 SSL_HANDSHAKE *hs, Array<uint8_t> *out,
Steven Valdez909b19f2016-11-21 15:35:44 -050055 enum ssl_cert_verify_context_t cert_verify_context) {
Robert Sloanb6d070c2017-07-24 08:40:01 -070056 ScopedCBB cbb;
57 if (!CBB_init(cbb.get(), 64 + 33 + 1 + 2 * EVP_MAX_MD_SIZE)) {
58 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan921ef2c2017-10-17 09:02:20 -070059 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -040060 }
61
62 for (size_t i = 0; i < 64; i++) {
Robert Sloanb6d070c2017-07-24 08:40:01 -070063 if (!CBB_add_u8(cbb.get(), 0x20)) {
64 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan921ef2c2017-10-17 09:02:20 -070065 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -040066 }
67 }
68
Robert Sloan921ef2c2017-10-17 09:02:20 -070069 Span<const char> context;
Steven Valdez909b19f2016-11-21 15:35:44 -050070 if (cert_verify_context == ssl_cert_verify_server) {
David Benjaminc895d6b2016-08-11 13:26:41 -040071 static const char kContext[] = "TLS 1.3, server CertificateVerify";
Robert Sloan921ef2c2017-10-17 09:02:20 -070072 context = kContext;
Steven Valdez909b19f2016-11-21 15:35:44 -050073 } else if (cert_verify_context == ssl_cert_verify_client) {
David Benjaminc895d6b2016-08-11 13:26:41 -040074 static const char kContext[] = "TLS 1.3, client CertificateVerify";
Robert Sloan921ef2c2017-10-17 09:02:20 -070075 context = kContext;
Steven Valdez909b19f2016-11-21 15:35:44 -050076 } else if (cert_verify_context == ssl_cert_verify_channel_id) {
77 static const char kContext[] = "TLS 1.3, Channel ID";
Robert Sloan921ef2c2017-10-17 09:02:20 -070078 context = kContext;
Steven Valdez909b19f2016-11-21 15:35:44 -050079 } else {
Robert Sloanb6d070c2017-07-24 08:40:01 -070080 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan921ef2c2017-10-17 09:02:20 -070081 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -040082 }
83
Robert Sloan921ef2c2017-10-17 09:02:20 -070084 // Note |context| includes the NUL byte separator.
85 if (!CBB_add_bytes(cbb.get(),
86 reinterpret_cast<const uint8_t *>(context.data()),
87 context.size())) {
Robert Sloanb6d070c2017-07-24 08:40:01 -070088 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan921ef2c2017-10-17 09:02:20 -070089 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -050090 }
91
92 uint8_t context_hash[EVP_MAX_MD_SIZE];
93 size_t context_hash_len;
Robert Sloanb6d070c2017-07-24 08:40:01 -070094 if (!hs->transcript.GetHash(context_hash, &context_hash_len) ||
95 !CBB_add_bytes(cbb.get(), context_hash, context_hash_len) ||
Robert Sloan921ef2c2017-10-17 09:02:20 -070096 !CBBFinishArray(cbb.get(), out)) {
Robert Sloanb6d070c2017-07-24 08:40:01 -070097 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan921ef2c2017-10-17 09:02:20 -070098 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -040099 }
100
Robert Sloan921ef2c2017-10-17 09:02:20 -0700101 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400102}
103
Robert Sloan726e9d12018-09-11 11:45:04 -0700104bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg,
105 bool allow_anonymous) {
Steven Valdeze7531f02016-12-14 13:29:57 -0500106 SSL *const ssl = hs->ssl;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100107 CBS body = msg.body;
108 bssl::UniquePtr<CRYPTO_BUFFER> decompressed;
109
110 if (msg.type == SSL3_MT_COMPRESSED_CERTIFICATE) {
111 CBS compressed;
112 uint16_t alg_id;
113 uint32_t uncompressed_len;
114
115 if (!CBS_get_u16(&body, &alg_id) ||
116 !CBS_get_u24(&body, &uncompressed_len) ||
117 !CBS_get_u24_length_prefixed(&body, &compressed) ||
118 CBS_len(&body) != 0) {
119 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
120 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700121 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100122 }
123
124 if (uncompressed_len > ssl->max_cert_list) {
125 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
126 OPENSSL_PUT_ERROR(SSL, SSL_R_UNCOMPRESSED_CERT_TOO_LARGE);
127 ERR_add_error_dataf("requested=%u",
128 static_cast<unsigned>(uncompressed_len));
Robert Sloan726e9d12018-09-11 11:45:04 -0700129 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100130 }
131
132 ssl_cert_decompression_func_t decompress = nullptr;
133 for (const auto* alg : ssl->ctx->cert_compression_algs.get()) {
134 if (alg->alg_id == alg_id) {
135 decompress = alg->decompress;
136 break;
137 }
138 }
139
140 if (decompress == nullptr) {
141 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
142 OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERT_COMPRESSION_ALG);
143 ERR_add_error_dataf("alg=%d", static_cast<int>(alg_id));
Robert Sloan726e9d12018-09-11 11:45:04 -0700144 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100145 }
146
147 CRYPTO_BUFFER *decompressed_ptr = nullptr;
148 if (!decompress(ssl, &decompressed_ptr, uncompressed_len,
149 CBS_data(&compressed), CBS_len(&compressed))) {
150 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
151 OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_DECOMPRESSION_FAILED);
152 ERR_add_error_dataf("alg=%d", static_cast<int>(alg_id));
Robert Sloan726e9d12018-09-11 11:45:04 -0700153 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100154 }
155 decompressed.reset(decompressed_ptr);
156
157 if (CRYPTO_BUFFER_len(decompressed_ptr) != uncompressed_len) {
158 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
159 OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_DECOMPRESSION_FAILED);
160 ERR_add_error_dataf(
161 "alg=%d got=%u expected=%u", static_cast<int>(alg_id),
162 static_cast<unsigned>(CRYPTO_BUFFER_len(decompressed_ptr)),
163 static_cast<unsigned>(uncompressed_len));
Robert Sloan726e9d12018-09-11 11:45:04 -0700164 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100165 }
166
167 CBS_init(&body, CRYPTO_BUFFER_data(decompressed_ptr),
168 CRYPTO_BUFFER_len(decompressed_ptr));
169 } else {
170 assert(msg.type == SSL3_MT_CERTIFICATE);
171 }
172
173 CBS context, certificate_list;
Robert Sloan84377092017-08-14 09:33:19 -0700174 if (!CBS_get_u8_length_prefixed(&body, &context) ||
Robert Sloanfe7cd212017-08-07 09:03:39 -0700175 CBS_len(&context) != 0 ||
Robert Sloan84377092017-08-14 09:33:19 -0700176 !CBS_get_u24_length_prefixed(&body, &certificate_list) ||
177 CBS_len(&body) != 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700178 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400179 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700180 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400181 }
182
Robert Sloanb6d070c2017-07-24 08:40:01 -0700183 UniquePtr<STACK_OF(CRYPTO_BUFFER)> certs(sk_CRYPTO_BUFFER_new_null());
184 if (!certs) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700185 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Steven Valdez909b19f2016-11-21 15:35:44 -0500186 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan726e9d12018-09-11 11:45:04 -0700187 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400188 }
189
Robert Sloanb6d070c2017-07-24 08:40:01 -0700190 const bool retain_sha256 =
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100191 ssl->server && hs->config->retain_only_sha256_of_client_certs;
Robert Sloanb6d070c2017-07-24 08:40:01 -0700192 UniquePtr<EVP_PKEY> pkey;
Steven Valdez909b19f2016-11-21 15:35:44 -0500193 while (CBS_len(&certificate_list) > 0) {
194 CBS certificate, extensions;
195 if (!CBS_get_u24_length_prefixed(&certificate_list, &certificate) ||
Steven Valdeze7531f02016-12-14 13:29:57 -0500196 !CBS_get_u16_length_prefixed(&certificate_list, &extensions) ||
197 CBS_len(&certificate) == 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700198 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Steven Valdez909b19f2016-11-21 15:35:44 -0500199 OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_LENGTH_MISMATCH);
Robert Sloan726e9d12018-09-11 11:45:04 -0700200 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500201 }
202
Robert Sloanb6d070c2017-07-24 08:40:01 -0700203 if (sk_CRYPTO_BUFFER_num(certs.get()) == 0) {
Steven Valdeze7531f02016-12-14 13:29:57 -0500204 pkey = ssl_cert_parse_pubkey(&certificate);
Robert Sloanb6d070c2017-07-24 08:40:01 -0700205 if (!pkey) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700206 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Steven Valdeze7531f02016-12-14 13:29:57 -0500207 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700208 return false;
Steven Valdeze7531f02016-12-14 13:29:57 -0500209 }
Robert Sloana27a6a42017-09-05 08:39:28 -0700210 // TLS 1.3 always uses certificate keys for signing thus the correct
211 // keyUsage is enforced.
Steven Valdeze7531f02016-12-14 13:29:57 -0500212 if (!ssl_cert_check_digital_signature_key_usage(&certificate)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700213 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
Robert Sloan726e9d12018-09-11 11:45:04 -0700214 return false;
Steven Valdeze7531f02016-12-14 13:29:57 -0500215 }
216
217 if (retain_sha256) {
Robert Sloana27a6a42017-09-05 08:39:28 -0700218 // Retain the hash of the leaf certificate if requested.
Steven Valdeze7531f02016-12-14 13:29:57 -0500219 SHA256(CBS_data(&certificate), CBS_len(&certificate),
Robert Sloana94fe052017-02-21 08:49:28 -0800220 hs->new_session->peer_sha256);
Steven Valdeze7531f02016-12-14 13:29:57 -0500221 }
Steven Valdez909b19f2016-11-21 15:35:44 -0500222 }
223
Robert Sloanfe7cd212017-08-07 09:03:39 -0700224 UniquePtr<CRYPTO_BUFFER> buf(
225 CRYPTO_BUFFER_new_from_CBS(&certificate, ssl->ctx->pool));
226 if (!buf ||
227 !PushToStack(certs.get(), std::move(buf))) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700228 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Steven Valdez909b19f2016-11-21 15:35:44 -0500229 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Robert Sloan726e9d12018-09-11 11:45:04 -0700230 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500231 }
232
Robert Sloana27a6a42017-09-05 08:39:28 -0700233 // Parse out the extensions.
234 bool have_status_request = false, have_sct = false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500235 CBS status_request, sct;
236 const SSL_EXTENSION_TYPE ext_types[] = {
237 {TLSEXT_TYPE_status_request, &have_status_request, &status_request},
238 {TLSEXT_TYPE_certificate_timestamp, &have_sct, &sct},
239 };
240
Robert Sloan5d625782017-02-13 09:55:39 -0800241 uint8_t alert = SSL_AD_DECODE_ERROR;
Steven Valdez909b19f2016-11-21 15:35:44 -0500242 if (!ssl_parse_extensions(&extensions, &alert, ext_types,
Robert Sloan69939df2017-01-09 10:53:07 -0800243 OPENSSL_ARRAY_SIZE(ext_types),
244 0 /* reject unknown */)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700245 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
Robert Sloan726e9d12018-09-11 11:45:04 -0700246 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500247 }
248
Robert Sloana27a6a42017-09-05 08:39:28 -0700249 // All Certificate extensions are parsed, but only the leaf extensions are
250 // stored.
Steven Valdez909b19f2016-11-21 15:35:44 -0500251 if (have_status_request) {
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100252 if (ssl->server || !hs->config->ocsp_stapling_enabled) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500253 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700254 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
Robert Sloan726e9d12018-09-11 11:45:04 -0700255 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500256 }
257
258 uint8_t status_type;
259 CBS ocsp_response;
260 if (!CBS_get_u8(&status_request, &status_type) ||
261 status_type != TLSEXT_STATUSTYPE_ocsp ||
262 !CBS_get_u24_length_prefixed(&status_request, &ocsp_response) ||
263 CBS_len(&ocsp_response) == 0 ||
264 CBS_len(&status_request) != 0) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700265 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700266 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500267 }
268
Robert Sloan8f860b12017-08-28 07:37:06 -0700269 if (sk_CRYPTO_BUFFER_num(certs.get()) == 1) {
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100270 hs->new_session->ocsp_response.reset(
271 CRYPTO_BUFFER_new_from_CBS(&ocsp_response, ssl->ctx->pool));
Robert Sloan8f860b12017-08-28 07:37:06 -0700272 if (hs->new_session->ocsp_response == nullptr) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700273 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700274 return false;
Robert Sloan8f860b12017-08-28 07:37:06 -0700275 }
Steven Valdez909b19f2016-11-21 15:35:44 -0500276 }
277 }
278
279 if (have_sct) {
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100280 if (ssl->server || !hs->config->signed_cert_timestamps_enabled) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500281 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700282 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
Robert Sloan726e9d12018-09-11 11:45:04 -0700283 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500284 }
285
286 if (!ssl_is_sct_list_valid(&sct)) {
287 OPENSSL_PUT_ERROR(SSL, SSL_R_ERROR_PARSING_EXTENSION);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700288 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700289 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500290 }
291
Robert Sloan8f860b12017-08-28 07:37:06 -0700292 if (sk_CRYPTO_BUFFER_num(certs.get()) == 1) {
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100293 hs->new_session->signed_cert_timestamp_list.reset(
294 CRYPTO_BUFFER_new_from_CBS(&sct, ssl->ctx->pool));
Robert Sloan8f860b12017-08-28 07:37:06 -0700295 if (hs->new_session->signed_cert_timestamp_list == nullptr) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700296 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700297 return false;
Robert Sloan8f860b12017-08-28 07:37:06 -0700298 }
Steven Valdez909b19f2016-11-21 15:35:44 -0500299 }
300 }
301 }
302
Robert Sloana27a6a42017-09-05 08:39:28 -0700303 // Store a null certificate list rather than an empty one if the peer didn't
304 // send certificates.
Robert Sloanfe7cd212017-08-07 09:03:39 -0700305 if (sk_CRYPTO_BUFFER_num(certs.get()) == 0) {
306 certs.reset();
David Benjaminc895d6b2016-08-11 13:26:41 -0400307 }
308
Robert Sloanb6d070c2017-07-24 08:40:01 -0700309 hs->peer_pubkey = std::move(pkey);
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100310 hs->new_session->certs = std::move(certs);
Steven Valdeze7531f02016-12-14 13:29:57 -0500311
Robert Sloanb6d070c2017-07-24 08:40:01 -0700312 if (!ssl->ctx->x509_method->session_cache_objects(hs->new_session.get())) {
Steven Valdeze7531f02016-12-14 13:29:57 -0500313 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700314 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700315 return false;
Steven Valdeze7531f02016-12-14 13:29:57 -0500316 }
317
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100318 if (sk_CRYPTO_BUFFER_num(hs->new_session->certs.get()) == 0) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400319 if (!allow_anonymous) {
320 OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700321 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_CERTIFICATE_REQUIRED);
Robert Sloan726e9d12018-09-11 11:45:04 -0700322 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400323 }
324
Robert Sloana27a6a42017-09-05 08:39:28 -0700325 // OpenSSL returns X509_V_OK when no certificates are requested. This is
326 // classed by them as a bug, but it's assumed by at least NGINX.
Robert Sloana94fe052017-02-21 08:49:28 -0800327 hs->new_session->verify_result = X509_V_OK;
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400328
Robert Sloana27a6a42017-09-05 08:39:28 -0700329 // No certificate, so nothing more to do.
Robert Sloan726e9d12018-09-11 11:45:04 -0700330 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400331 }
332
Robert Sloana94fe052017-02-21 08:49:28 -0800333 hs->new_session->peer_sha256_valid = retain_sha256;
Robert Sloan726e9d12018-09-11 11:45:04 -0700334 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400335}
336
Robert Sloan726e9d12018-09-11 11:45:04 -0700337bool tls13_process_certificate_verify(SSL_HANDSHAKE *hs, const SSLMessage &msg) {
Steven Valdeze7531f02016-12-14 13:29:57 -0500338 SSL *const ssl = hs->ssl;
Steven Valdeze7531f02016-12-14 13:29:57 -0500339 if (hs->peer_pubkey == NULL) {
Robert Sloana12bf462017-07-17 07:08:26 -0700340 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700341 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400342 }
343
Robert Sloan84377092017-08-14 09:33:19 -0700344 CBS body = msg.body, signature;
David Benjaminc895d6b2016-08-11 13:26:41 -0400345 uint16_t signature_algorithm;
Robert Sloan84377092017-08-14 09:33:19 -0700346 if (!CBS_get_u16(&body, &signature_algorithm) ||
347 !CBS_get_u16_length_prefixed(&body, &signature) ||
348 CBS_len(&body) != 0) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400349 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700350 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700351 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400352 }
353
Robert Sloane56da3e2017-06-26 08:26:42 -0700354 uint8_t alert = SSL_AD_DECODE_ERROR;
355 if (!tls12_check_peer_sigalg(ssl, &alert, signature_algorithm)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700356 ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
Robert Sloan726e9d12018-09-11 11:45:04 -0700357 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400358 }
Robert Sloana94fe052017-02-21 08:49:28 -0800359 hs->new_session->peer_signature_algorithm = signature_algorithm;
David Benjaminc895d6b2016-08-11 13:26:41 -0400360
Robert Sloan921ef2c2017-10-17 09:02:20 -0700361 Array<uint8_t> input;
Steven Valdez909b19f2016-11-21 15:35:44 -0500362 if (!tls13_get_cert_verify_signature_input(
Robert Sloan921ef2c2017-10-17 09:02:20 -0700363 hs, &input,
Steven Valdez909b19f2016-11-21 15:35:44 -0500364 ssl->server ? ssl_cert_verify_client : ssl_cert_verify_server)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700365 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700366 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400367 }
368
Robert Sloan921ef2c2017-10-17 09:02:20 -0700369 bool sig_ok = ssl_public_key_verify(ssl, signature, signature_algorithm,
370 hs->peer_pubkey.get(), input);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400371#if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
Robert Sloan921ef2c2017-10-17 09:02:20 -0700372 sig_ok = true;
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400373 ERR_clear_error();
374#endif
David Benjaminc895d6b2016-08-11 13:26:41 -0400375 if (!sig_ok) {
376 OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_SIGNATURE);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700377 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700378 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400379 }
380
Robert Sloan726e9d12018-09-11 11:45:04 -0700381 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400382}
383
Robert Sloan726e9d12018-09-11 11:45:04 -0700384bool tls13_process_finished(SSL_HANDSHAKE *hs, const SSLMessage &msg,
385 bool use_saved_value) {
David Benjamin1b249672016-12-06 18:25:50 -0500386 SSL *const ssl = hs->ssl;
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700387 uint8_t verify_data_buf[EVP_MAX_MD_SIZE];
388 const uint8_t *verify_data;
David Benjaminc895d6b2016-08-11 13:26:41 -0400389 size_t verify_data_len;
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700390 if (use_saved_value) {
391 assert(ssl->server);
392 verify_data = hs->expected_client_finished;
393 verify_data_len = hs->hash_len;
394 } else {
395 if (!tls13_finished_mac(hs, verify_data_buf, &verify_data_len,
396 !ssl->server)) {
Robert Sloan726e9d12018-09-11 11:45:04 -0700397 return false;
Robert Sloan6d0d00e2017-03-27 07:13:07 -0700398 }
399 verify_data = verify_data_buf;
David Benjaminc895d6b2016-08-11 13:26:41 -0400400 }
401
Robert Sloan726e9d12018-09-11 11:45:04 -0700402 bool finished_ok = CBS_mem_equal(&msg.body, verify_data, verify_data_len);
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400403#if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
Robert Sloan726e9d12018-09-11 11:45:04 -0700404 finished_ok = true;
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400405#endif
406 if (!finished_ok) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700407 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400408 OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
Robert Sloan726e9d12018-09-11 11:45:04 -0700409 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400410 }
411
Robert Sloan726e9d12018-09-11 11:45:04 -0700412 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400413}
414
Robert Sloan726e9d12018-09-11 11:45:04 -0700415bool tls13_add_certificate(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500416 SSL *const ssl = hs->ssl;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100417 CERT *const cert = hs->config->cert.get();
418
Robert Sloanb6d070c2017-07-24 08:40:01 -0700419 ScopedCBB cbb;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100420 CBB *body, body_storage, certificate_list;
421
422 if (hs->cert_compression_negotiated) {
423 if (!CBB_init(cbb.get(), 1024)) {
424 return false;
425 }
426 body = cbb.get();
427 } else {
428 body = &body_storage;
429 if (!ssl->method->init_message(ssl, cbb.get(), body, SSL3_MT_CERTIFICATE)) {
430 return false;
431 }
432 }
433
434 if (// The request context is always empty in the handshake.
435 !CBB_add_u8(body, 0) ||
436 !CBB_add_u24_length_prefixed(body, &certificate_list)) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500437 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700438 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500439 }
440
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100441 if (!ssl_has_certificate(hs->config)) {
Robert Sloana12bf462017-07-17 07:08:26 -0700442 return ssl_add_message_cbb(ssl, cbb.get());
Steven Valdez909b19f2016-11-21 15:35:44 -0500443 }
444
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700445 CRYPTO_BUFFER *leaf_buf = sk_CRYPTO_BUFFER_value(cert->chain.get(), 0);
Steven Valdez909b19f2016-11-21 15:35:44 -0500446 CBB leaf, extensions;
447 if (!CBB_add_u24_length_prefixed(&certificate_list, &leaf) ||
Robert Sloan4d1ac502017-02-06 08:36:14 -0800448 !CBB_add_bytes(&leaf, CRYPTO_BUFFER_data(leaf_buf),
449 CRYPTO_BUFFER_len(leaf_buf)) ||
Steven Valdez909b19f2016-11-21 15:35:44 -0500450 !CBB_add_u16_length_prefixed(&certificate_list, &extensions)) {
451 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700452 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500453 }
454
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100455 if (hs->scts_requested && cert->signed_cert_timestamp_list != nullptr) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500456 CBB contents;
457 if (!CBB_add_u16(&extensions, TLSEXT_TYPE_certificate_timestamp) ||
458 !CBB_add_u16_length_prefixed(&extensions, &contents) ||
Robert Sloana94fe052017-02-21 08:49:28 -0800459 !CBB_add_bytes(
460 &contents,
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100461 CRYPTO_BUFFER_data(cert->signed_cert_timestamp_list.get()),
462 CRYPTO_BUFFER_len(cert->signed_cert_timestamp_list.get())) ||
Steven Valdez909b19f2016-11-21 15:35:44 -0500463 !CBB_flush(&extensions)) {
464 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700465 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500466 }
467 }
468
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100469 if (hs->ocsp_stapling_requested && cert->ocsp_response != NULL) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500470 CBB contents, ocsp_response;
471 if (!CBB_add_u16(&extensions, TLSEXT_TYPE_status_request) ||
472 !CBB_add_u16_length_prefixed(&extensions, &contents) ||
473 !CBB_add_u8(&contents, TLSEXT_STATUSTYPE_ocsp) ||
474 !CBB_add_u24_length_prefixed(&contents, &ocsp_response) ||
Robert Sloana94fe052017-02-21 08:49:28 -0800475 !CBB_add_bytes(&ocsp_response,
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100476 CRYPTO_BUFFER_data(cert->ocsp_response.get()),
477 CRYPTO_BUFFER_len(cert->ocsp_response.get())) ||
Steven Valdez909b19f2016-11-21 15:35:44 -0500478 !CBB_flush(&extensions)) {
479 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700480 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500481 }
482 }
483
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700484 for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(cert->chain.get()); i++) {
485 CRYPTO_BUFFER *cert_buf = sk_CRYPTO_BUFFER_value(cert->chain.get(), i);
Steven Valdez909b19f2016-11-21 15:35:44 -0500486 CBB child;
487 if (!CBB_add_u24_length_prefixed(&certificate_list, &child) ||
Robert Sloan4d1ac502017-02-06 08:36:14 -0800488 !CBB_add_bytes(&child, CRYPTO_BUFFER_data(cert_buf),
489 CRYPTO_BUFFER_len(cert_buf)) ||
Steven Valdez909b19f2016-11-21 15:35:44 -0500490 !CBB_add_u16(&certificate_list, 0 /* no extensions */)) {
491 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700492 return false;
Steven Valdez909b19f2016-11-21 15:35:44 -0500493 }
494 }
495
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100496 if (!hs->cert_compression_negotiated) {
497 return ssl_add_message_cbb(ssl, cbb.get());
498 }
499
500 Array<uint8_t> msg;
501 if (!CBBFinishArray(cbb.get(), &msg)) {
502 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700503 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100504 }
505
506 const CertCompressionAlg *alg = nullptr;
507 for (const auto *candidate : ssl->ctx->cert_compression_algs.get()) {
508 if (candidate->alg_id == hs->cert_compression_alg_id) {
509 alg = candidate;
510 break;
511 }
512 }
513
514 if (alg == nullptr || alg->compress == nullptr) {
515 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700516 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100517 }
518
519 CBB compressed;
520 body = &body_storage;
521 if (!ssl->method->init_message(ssl, cbb.get(), body,
522 SSL3_MT_COMPRESSED_CERTIFICATE) ||
523 !CBB_add_u16(body, hs->cert_compression_alg_id) ||
524 !CBB_add_u24(body, msg.size()) ||
525 !CBB_add_u24_length_prefixed(body, &compressed) ||
526 !alg->compress(ssl, &compressed, msg.data(), msg.size()) ||
527 !ssl_add_message_cbb(ssl, cbb.get())) {
528 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700529 return false;
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100530 }
531
Robert Sloan726e9d12018-09-11 11:45:04 -0700532 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400533}
534
Robert Sloane56da3e2017-06-26 08:26:42 -0700535enum ssl_private_key_result_t tls13_add_certificate_verify(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500536 SSL *const ssl = hs->ssl;
David Benjaminc895d6b2016-08-11 13:26:41 -0400537 uint16_t signature_algorithm;
David Benjamin1b249672016-12-06 18:25:50 -0500538 if (!tls1_choose_signature_algorithm(hs, &signature_algorithm)) {
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100539 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
Robert Sloana12bf462017-07-17 07:08:26 -0700540 return ssl_private_key_failure;
David Benjaminc895d6b2016-08-11 13:26:41 -0400541 }
Robert Sloana12bf462017-07-17 07:08:26 -0700542
Robert Sloanb6d070c2017-07-24 08:40:01 -0700543 ScopedCBB cbb;
Robert Sloana12bf462017-07-17 07:08:26 -0700544 CBB body;
545 if (!ssl->method->init_message(ssl, cbb.get(), &body,
David Benjaminc895d6b2016-08-11 13:26:41 -0400546 SSL3_MT_CERTIFICATE_VERIFY) ||
547 !CBB_add_u16(&body, signature_algorithm)) {
548 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Robert Sloana12bf462017-07-17 07:08:26 -0700549 return ssl_private_key_failure;
David Benjaminc895d6b2016-08-11 13:26:41 -0400550 }
551
Robert Sloana27a6a42017-09-05 08:39:28 -0700552 // Sign the digest.
David Benjaminc895d6b2016-08-11 13:26:41 -0400553 CBB child;
Robert Sloanb6d070c2017-07-24 08:40:01 -0700554 const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey.get());
David Benjaminc895d6b2016-08-11 13:26:41 -0400555 uint8_t *sig;
556 size_t sig_len;
557 if (!CBB_add_u16_length_prefixed(&body, &child) ||
558 !CBB_reserve(&child, &sig, max_sig_len)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700559 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Robert Sloana12bf462017-07-17 07:08:26 -0700560 return ssl_private_key_failure;
David Benjaminc895d6b2016-08-11 13:26:41 -0400561 }
562
Robert Sloan921ef2c2017-10-17 09:02:20 -0700563 Array<uint8_t> msg;
Robert Sloane56da3e2017-06-26 08:26:42 -0700564 if (!tls13_get_cert_verify_signature_input(
Robert Sloan921ef2c2017-10-17 09:02:20 -0700565 hs, &msg,
Robert Sloane56da3e2017-06-26 08:26:42 -0700566 ssl->server ? ssl_cert_verify_server : ssl_cert_verify_client)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700567 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Robert Sloana12bf462017-07-17 07:08:26 -0700568 return ssl_private_key_failure;
David Benjaminc895d6b2016-08-11 13:26:41 -0400569 }
570
Robert Sloane56da3e2017-06-26 08:26:42 -0700571 enum ssl_private_key_result_t sign_result = ssl_private_key_sign(
Robert Sloan921ef2c2017-10-17 09:02:20 -0700572 hs, sig, &sig_len, max_sig_len, signature_algorithm, msg);
David Benjaminc895d6b2016-08-11 13:26:41 -0400573 if (sign_result != ssl_private_key_success) {
Robert Sloana12bf462017-07-17 07:08:26 -0700574 return sign_result;
David Benjaminc895d6b2016-08-11 13:26:41 -0400575 }
576
577 if (!CBB_did_write(&child, sig_len) ||
Robert Sloana12bf462017-07-17 07:08:26 -0700578 !ssl_add_message_cbb(ssl, cbb.get())) {
579 return ssl_private_key_failure;
David Benjaminc895d6b2016-08-11 13:26:41 -0400580 }
581
Robert Sloana12bf462017-07-17 07:08:26 -0700582 return ssl_private_key_success;
David Benjaminc895d6b2016-08-11 13:26:41 -0400583}
584
Robert Sloan726e9d12018-09-11 11:45:04 -0700585bool tls13_add_finished(SSL_HANDSHAKE *hs) {
David Benjamin1b249672016-12-06 18:25:50 -0500586 SSL *const ssl = hs->ssl;
David Benjaminc895d6b2016-08-11 13:26:41 -0400587 size_t verify_data_len;
588 uint8_t verify_data[EVP_MAX_MD_SIZE];
589
David Benjamin1b249672016-12-06 18:25:50 -0500590 if (!tls13_finished_mac(hs, verify_data, &verify_data_len, ssl->server)) {
Robert Sloan921ef2c2017-10-17 09:02:20 -0700591 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -0400592 OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
Robert Sloan726e9d12018-09-11 11:45:04 -0700593 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400594 }
595
Robert Sloanb6d070c2017-07-24 08:40:01 -0700596 ScopedCBB cbb;
597 CBB body;
598 if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_FINISHED) ||
David Benjaminc895d6b2016-08-11 13:26:41 -0400599 !CBB_add_bytes(&body, verify_data, verify_data_len) ||
Robert Sloanb6d070c2017-07-24 08:40:01 -0700600 !ssl_add_message_cbb(ssl, cbb.get())) {
Robert Sloan726e9d12018-09-11 11:45:04 -0700601 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400602 }
603
Robert Sloan726e9d12018-09-11 11:45:04 -0700604 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400605}
606
Robert Sloan726e9d12018-09-11 11:45:04 -0700607static bool tls13_receive_key_update(SSL *ssl, const SSLMessage &msg) {
Robert Sloan84377092017-08-14 09:33:19 -0700608 CBS body = msg.body;
David Benjamin95add822016-10-19 01:09:12 -0400609 uint8_t key_update_request;
Robert Sloan84377092017-08-14 09:33:19 -0700610 if (!CBS_get_u8(&body, &key_update_request) ||
611 CBS_len(&body) != 0 ||
David Benjamin95add822016-10-19 01:09:12 -0400612 (key_update_request != SSL_KEY_UPDATE_NOT_REQUESTED &&
613 key_update_request != SSL_KEY_UPDATE_REQUESTED)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400614 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700615 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
Robert Sloan726e9d12018-09-11 11:45:04 -0700616 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400617 }
618
Robert Sloan572a4e22017-04-17 10:52:19 -0700619 if (!tls13_rotate_traffic_key(ssl, evp_aead_open)) {
Robert Sloan726e9d12018-09-11 11:45:04 -0700620 return false;
Robert Sloan572a4e22017-04-17 10:52:19 -0700621 }
622
Robert Sloana27a6a42017-09-05 08:39:28 -0700623 // Acknowledge the KeyUpdate
Robert Sloan572a4e22017-04-17 10:52:19 -0700624 if (key_update_request == SSL_KEY_UPDATE_REQUESTED &&
625 !ssl->s3->key_update_pending) {
Robert Sloanb6d070c2017-07-24 08:40:01 -0700626 ScopedCBB cbb;
Robert Sloan84377092017-08-14 09:33:19 -0700627 CBB body_cbb;
628 if (!ssl->method->init_message(ssl, cbb.get(), &body_cbb,
629 SSL3_MT_KEY_UPDATE) ||
630 !CBB_add_u8(&body_cbb, SSL_KEY_UPDATE_NOT_REQUESTED) ||
Robert Sloanb6d070c2017-07-24 08:40:01 -0700631 !ssl_add_message_cbb(ssl, cbb.get()) ||
Robert Sloan572a4e22017-04-17 10:52:19 -0700632 !tls13_rotate_traffic_key(ssl, evp_aead_seal)) {
Robert Sloan726e9d12018-09-11 11:45:04 -0700633 return false;
Robert Sloan572a4e22017-04-17 10:52:19 -0700634 }
635
Robert Sloana27a6a42017-09-05 08:39:28 -0700636 // Suppress KeyUpdate acknowledgments until this change is written to the
637 // wire. This prevents us from accumulating write obligations when read and
Robert Sloand9e572d2018-08-27 12:27:00 -0700638 // write progress at different rates. See RFC 8446, section 4.6.3.
Robert Sloana27a6a42017-09-05 08:39:28 -0700639 ssl->s3->key_update_pending = true;
Robert Sloan572a4e22017-04-17 10:52:19 -0700640 }
641
Robert Sloan726e9d12018-09-11 11:45:04 -0700642 return true;
David Benjaminc895d6b2016-08-11 13:26:41 -0400643}
644
Robert Sloan726e9d12018-09-11 11:45:04 -0700645bool tls13_post_handshake(SSL *ssl, const SSLMessage &msg) {
Robert Sloan84377092017-08-14 09:33:19 -0700646 if (msg.type == SSL3_MT_KEY_UPDATE) {
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400647 ssl->s3->key_update_count++;
648 if (ssl->s3->key_update_count > kMaxKeyUpdates) {
649 OPENSSL_PUT_ERROR(SSL, SSL_R_TOO_MANY_KEY_UPDATES);
Robert Sloan921ef2c2017-10-17 09:02:20 -0700650 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
Robert Sloan726e9d12018-09-11 11:45:04 -0700651 return false;
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400652 }
653
Robert Sloan84377092017-08-14 09:33:19 -0700654 return tls13_receive_key_update(ssl, msg);
David Benjaminc895d6b2016-08-11 13:26:41 -0400655 }
656
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400657 ssl->s3->key_update_count = 0;
658
Robert Sloan84377092017-08-14 09:33:19 -0700659 if (msg.type == SSL3_MT_NEW_SESSION_TICKET && !ssl->server) {
660 return tls13_process_new_session_ticket(ssl, msg);
David Benjaminc895d6b2016-08-11 13:26:41 -0400661 }
662
Robert Sloan921ef2c2017-10-17 09:02:20 -0700663 ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
David Benjaminc895d6b2016-08-11 13:26:41 -0400664 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
Robert Sloan726e9d12018-09-11 11:45:04 -0700665 return false;
David Benjaminc895d6b2016-08-11 13:26:41 -0400666}
Robert Sloanb6d070c2017-07-24 08:40:01 -0700667
Robert Sloan726e9d12018-09-11 11:45:04 -0700668BSSL_NAMESPACE_END