blob: 3b66ab7d6923fa7e98d8bc0a192d0f4ab327e54d [file] [log] [blame]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001/* 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
Kenny Rootb8494592015-09-25 02:29:14 +0000149#include <openssl/ssl.h>
150
Adam Langleyd9e397b2015-01-22 14:27:53 -0800151#include <assert.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -0800152#include <string.h>
153
154#include <openssl/bn.h>
155#include <openssl/buf.h>
156#include <openssl/bytestring.h>
157#include <openssl/cipher.h>
158#include <openssl/dh.h>
159#include <openssl/ec.h>
160#include <openssl/ecdsa.h>
Adam Langleye9ada862015-05-11 17:20:37 -0700161#include <openssl/err.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -0800162#include <openssl/evp.h>
163#include <openssl/hmac.h>
164#include <openssl/md5.h>
165#include <openssl/mem.h>
David Benjamin4969cc92016-04-22 15:02:23 -0400166#include <openssl/nid.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -0800167#include <openssl/rand.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -0800168#include <openssl/x509.h>
169
Adam Langleye9ada862015-05-11 17:20:37 -0700170#include "internal.h"
Adam Langleyd9e397b2015-01-22 14:27:53 -0800171#include "../crypto/internal.h"
Adam Langleyd9e397b2015-01-22 14:27:53 -0800172
173
David Benjamin6e899c72016-06-09 18:02:18 -0400174static int ssl3_get_client_hello(SSL *ssl);
175static int ssl3_send_server_hello(SSL *ssl);
176static int ssl3_send_server_certificate(SSL *ssl);
177static int ssl3_send_certificate_status(SSL *ssl);
178static int ssl3_send_server_key_exchange(SSL *ssl);
179static int ssl3_send_certificate_request(SSL *ssl);
180static int ssl3_send_server_hello_done(SSL *ssl);
181static int ssl3_get_client_certificate(SSL *ssl);
182static int ssl3_get_client_key_exchange(SSL *ssl);
183static int ssl3_get_cert_verify(SSL *ssl);
184static int ssl3_get_next_proto(SSL *ssl);
185static int ssl3_get_channel_id(SSL *ssl);
186static int ssl3_send_new_session_ticket(SSL *ssl);
187
Adam Langley4139edb2016-01-13 15:00:54 -0800188int ssl3_accept(SSL *ssl) {
Adam Langleye9ada862015-05-11 17:20:37 -0700189 uint32_t alg_a;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800190 int ret = -1;
David Benjamin6e899c72016-06-09 18:02:18 -0400191 int state, skip = 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800192
Adam Langley4139edb2016-01-13 15:00:54 -0800193 assert(ssl->handshake_func == ssl3_accept);
194 assert(ssl->server);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800195
196 for (;;) {
Adam Langley4139edb2016-01-13 15:00:54 -0800197 state = ssl->state;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800198
Adam Langley4139edb2016-01-13 15:00:54 -0800199 switch (ssl->state) {
David Benjamin7c0d06c2016-08-11 13:26:41 -0400200 case SSL_ST_INIT:
201 ssl->state = SSL_ST_ACCEPT;
202 skip = 1;
203 break;
204
Adam Langleyd9e397b2015-01-22 14:27:53 -0800205 case SSL_ST_ACCEPT:
David Benjamin6e899c72016-06-09 18:02:18 -0400206 ssl_do_info_callback(ssl, SSL_CB_HANDSHAKE_START, 1);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800207
David Benjaminc895d6b2016-08-11 13:26:41 -0400208 ssl->s3->hs = ssl_handshake_new(tls13_server_handshake);
209 if (ssl->s3->hs == NULL) {
210 ret = -1;
211 goto end;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800212 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800213
Adam Langleye9ada862015-05-11 17:20:37 -0700214 /* Enable a write buffer. This groups handshake messages within a flight
215 * into a single write. */
David Benjamind316cba2016-06-02 16:17:39 -0400216 if (!ssl_init_wbio_buffer(ssl)) {
Adam Langleye9ada862015-05-11 17:20:37 -0700217 ret = -1;
218 goto end;
219 }
220
Adam Langley4139edb2016-01-13 15:00:54 -0800221 if (!ssl3_init_handshake_buffer(ssl)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000222 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800223 ret = -1;
224 goto end;
225 }
226
Adam Langley4139edb2016-01-13 15:00:54 -0800227 ssl->state = SSL3_ST_SR_CLNT_HELLO_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800228 break;
229
230 case SSL3_ST_SR_CLNT_HELLO_A:
231 case SSL3_ST_SR_CLNT_HELLO_B:
232 case SSL3_ST_SR_CLNT_HELLO_C:
David Benjaminc895d6b2016-08-11 13:26:41 -0400233 case SSL3_ST_SR_CLNT_HELLO_D:
Steven Valdez909b19f2016-11-21 15:35:44 -0500234 case SSL3_ST_SR_CLNT_HELLO_E:
Adam Langley4139edb2016-01-13 15:00:54 -0800235 ret = ssl3_get_client_hello(ssl);
David Benjaminc895d6b2016-08-11 13:26:41 -0400236 if (ssl->state == SSL_ST_TLS13) {
237 break;
238 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800239 if (ret <= 0) {
240 goto end;
241 }
David Benjamin6e899c72016-06-09 18:02:18 -0400242 ssl->method->received_flight(ssl);
Adam Langley4139edb2016-01-13 15:00:54 -0800243 ssl->state = SSL3_ST_SW_SRVR_HELLO_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800244 break;
245
246 case SSL3_ST_SW_SRVR_HELLO_A:
247 case SSL3_ST_SW_SRVR_HELLO_B:
Adam Langley4139edb2016-01-13 15:00:54 -0800248 ret = ssl3_send_server_hello(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800249 if (ret <= 0) {
250 goto end;
251 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400252 if (ssl->session != NULL) {
253 ssl->state = SSL3_ST_SW_SESSION_TICKET_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800254 } else {
Adam Langley4139edb2016-01-13 15:00:54 -0800255 ssl->state = SSL3_ST_SW_CERT_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800256 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800257 break;
258
259 case SSL3_ST_SW_CERT_A:
260 case SSL3_ST_SW_CERT_B:
David Benjamind316cba2016-06-02 16:17:39 -0400261 if (ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
Adam Langley4139edb2016-01-13 15:00:54 -0800262 ret = ssl3_send_server_certificate(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800263 if (ret <= 0) {
264 goto end;
265 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800266 } else {
267 skip = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800268 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400269 ssl->state = SSL3_ST_SW_CERT_STATUS_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800270 break;
271
Kenny Rootb8494592015-09-25 02:29:14 +0000272 case SSL3_ST_SW_CERT_STATUS_A:
273 case SSL3_ST_SW_CERT_STATUS_B:
David Benjamin95add822016-10-19 01:09:12 -0400274 if (ssl->s3->hs->certificate_status_expected) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400275 ret = ssl3_send_certificate_status(ssl);
276 if (ret <= 0) {
277 goto end;
278 }
279 } else {
280 skip = 1;
Kenny Rootb8494592015-09-25 02:29:14 +0000281 }
Adam Langley4139edb2016-01-13 15:00:54 -0800282 ssl->state = SSL3_ST_SW_KEY_EXCH_A;
Kenny Rootb8494592015-09-25 02:29:14 +0000283 break;
284
Adam Langleyd9e397b2015-01-22 14:27:53 -0800285 case SSL3_ST_SW_KEY_EXCH_A:
286 case SSL3_ST_SW_KEY_EXCH_B:
Kenny Rootb8494592015-09-25 02:29:14 +0000287 case SSL3_ST_SW_KEY_EXCH_C:
Adam Langley4139edb2016-01-13 15:00:54 -0800288 alg_a = ssl->s3->tmp.new_cipher->algorithm_auth;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800289
David Benjamin6e899c72016-06-09 18:02:18 -0400290 /* PSK ciphers send ServerKeyExchange if there is an identity hint. */
Adam Langley4139edb2016-01-13 15:00:54 -0800291 if (ssl_cipher_requires_server_key_exchange(ssl->s3->tmp.new_cipher) ||
292 ((alg_a & SSL_aPSK) && ssl->psk_identity_hint)) {
293 ret = ssl3_send_server_key_exchange(ssl);
Adam Langleye9ada862015-05-11 17:20:37 -0700294 if (ret <= 0) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800295 goto end;
Adam Langleye9ada862015-05-11 17:20:37 -0700296 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800297 } else {
298 skip = 1;
299 }
300
Adam Langley4139edb2016-01-13 15:00:54 -0800301 ssl->state = SSL3_ST_SW_CERT_REQ_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800302 break;
303
304 case SSL3_ST_SW_CERT_REQ_A:
305 case SSL3_ST_SW_CERT_REQ_B:
David Benjamin95add822016-10-19 01:09:12 -0400306 if (ssl->s3->hs->cert_request) {
Adam Langley4139edb2016-01-13 15:00:54 -0800307 ret = ssl3_send_certificate_request(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800308 if (ret <= 0) {
309 goto end;
310 }
Adam Langleyf4e42722015-06-04 17:45:09 -0700311 } else {
312 skip = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800313 }
Adam Langley4139edb2016-01-13 15:00:54 -0800314 ssl->state = SSL3_ST_SW_SRVR_DONE_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800315 break;
316
317 case SSL3_ST_SW_SRVR_DONE_A:
318 case SSL3_ST_SW_SRVR_DONE_B:
David Benjamin6e899c72016-06-09 18:02:18 -0400319 ret = ssl3_send_server_hello_done(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800320 if (ret <= 0) {
321 goto end;
322 }
Adam Langley4139edb2016-01-13 15:00:54 -0800323 ssl->s3->tmp.next_state = SSL3_ST_SR_CERT_A;
324 ssl->state = SSL3_ST_SW_FLUSH;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800325 break;
326
Adam Langleyd9e397b2015-01-22 14:27:53 -0800327 case SSL3_ST_SR_CERT_A:
David Benjamin95add822016-10-19 01:09:12 -0400328 if (ssl->s3->hs->cert_request) {
Adam Langley4139edb2016-01-13 15:00:54 -0800329 ret = ssl3_get_client_certificate(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800330 if (ret <= 0) {
331 goto end;
332 }
333 }
Adam Langley4139edb2016-01-13 15:00:54 -0800334 ssl->state = SSL3_ST_SR_KEY_EXCH_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800335 break;
336
337 case SSL3_ST_SR_KEY_EXCH_A:
338 case SSL3_ST_SR_KEY_EXCH_B:
Adam Langley4139edb2016-01-13 15:00:54 -0800339 ret = ssl3_get_client_key_exchange(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800340 if (ret <= 0) {
341 goto end;
342 }
Adam Langley4139edb2016-01-13 15:00:54 -0800343 ssl->state = SSL3_ST_SR_CERT_VRFY_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800344 break;
345
346 case SSL3_ST_SR_CERT_VRFY_A:
Adam Langley4139edb2016-01-13 15:00:54 -0800347 ret = ssl3_get_cert_verify(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800348 if (ret <= 0) {
349 goto end;
350 }
351
Adam Langley4139edb2016-01-13 15:00:54 -0800352 ssl->state = SSL3_ST_SR_CHANGE;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800353 break;
354
Adam Langley4139edb2016-01-13 15:00:54 -0800355 case SSL3_ST_SR_CHANGE:
David Benjaminc895d6b2016-08-11 13:26:41 -0400356 ret = ssl->method->read_change_cipher_spec(ssl);
Adam Langley4139edb2016-01-13 15:00:54 -0800357 if (ret <= 0) {
358 goto end;
359 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800360
David Benjamin4969cc92016-04-22 15:02:23 -0400361 if (!tls1_change_cipher_state(ssl, SSL3_CHANGE_CIPHER_SERVER_READ)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800362 ret = -1;
363 goto end;
364 }
Adam Langley4139edb2016-01-13 15:00:54 -0800365
David Benjaminc895d6b2016-08-11 13:26:41 -0400366 ssl->state = SSL3_ST_SR_NEXT_PROTO_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800367 break;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800368
369 case SSL3_ST_SR_NEXT_PROTO_A:
David Benjamin95add822016-10-19 01:09:12 -0400370 if (ssl->s3->hs->next_proto_neg_seen) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400371 ret = ssl3_get_next_proto(ssl);
372 if (ret <= 0) {
373 goto end;
374 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800375 } else {
David Benjaminc895d6b2016-08-11 13:26:41 -0400376 skip = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800377 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400378 ssl->state = SSL3_ST_SR_CHANNEL_ID_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800379 break;
380
381 case SSL3_ST_SR_CHANNEL_ID_A:
David Benjaminc895d6b2016-08-11 13:26:41 -0400382 if (ssl->s3->tlsext_channel_id_valid) {
383 ret = ssl3_get_channel_id(ssl);
384 if (ret <= 0) {
385 goto end;
386 }
387 } else {
388 skip = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800389 }
Adam Langley4139edb2016-01-13 15:00:54 -0800390 ssl->state = SSL3_ST_SR_FINISHED_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800391 break;
392
393 case SSL3_ST_SR_FINISHED_A:
David Benjamind316cba2016-06-02 16:17:39 -0400394 ret = ssl3_get_finished(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800395 if (ret <= 0) {
396 goto end;
397 }
398
David Benjamin6e899c72016-06-09 18:02:18 -0400399 ssl->method->received_flight(ssl);
David Benjaminc895d6b2016-08-11 13:26:41 -0400400 if (ssl->session != NULL) {
Adam Langley4139edb2016-01-13 15:00:54 -0800401 ssl->state = SSL_ST_OK;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800402 } else {
David Benjaminc895d6b2016-08-11 13:26:41 -0400403 ssl->state = SSL3_ST_SW_SESSION_TICKET_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800404 }
David Benjamin6e899c72016-06-09 18:02:18 -0400405
David Benjaminc895d6b2016-08-11 13:26:41 -0400406 /* If this is a full handshake with ChannelID then record the handshake
407 * hashes in |ssl->s3->new_session| in case we need them to verify a
408 * ChannelID signature on a resumption of this session in the future. */
409 if (ssl->session == NULL && ssl->s3->tlsext_channel_id_valid) {
Adam Langley4139edb2016-01-13 15:00:54 -0800410 ret = tls1_record_handshake_hashes_for_channel_id(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800411 if (ret <= 0) {
412 goto end;
413 }
414 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800415 break;
416
417 case SSL3_ST_SW_SESSION_TICKET_A:
418 case SSL3_ST_SW_SESSION_TICKET_B:
Steven Valdez909b19f2016-11-21 15:35:44 -0500419 if (ssl->s3->hs->ticket_expected) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400420 ret = ssl3_send_new_session_ticket(ssl);
421 if (ret <= 0) {
422 goto end;
423 }
424 } else {
425 skip = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800426 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400427 ssl->state = SSL3_ST_SW_CHANGE;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800428 break;
429
David Benjaminc895d6b2016-08-11 13:26:41 -0400430 case SSL3_ST_SW_CHANGE:
431 ret = ssl->method->send_change_cipher_spec(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800432 if (ret <= 0) {
433 goto end;
434 }
Adam Langley4139edb2016-01-13 15:00:54 -0800435 ssl->state = SSL3_ST_SW_FINISHED_A;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800436
David Benjamin4969cc92016-04-22 15:02:23 -0400437 if (!tls1_change_cipher_state(ssl, SSL3_CHANGE_CIPHER_SERVER_WRITE)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800438 ret = -1;
439 goto end;
440 }
441 break;
442
443 case SSL3_ST_SW_FINISHED_A:
444 case SSL3_ST_SW_FINISHED_B:
Adam Langley4139edb2016-01-13 15:00:54 -0800445 ret = ssl3_send_finished(ssl, SSL3_ST_SW_FINISHED_A,
David Benjamin4969cc92016-04-22 15:02:23 -0400446 SSL3_ST_SW_FINISHED_B);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800447 if (ret <= 0) {
448 goto end;
449 }
Adam Langley4139edb2016-01-13 15:00:54 -0800450 ssl->state = SSL3_ST_SW_FLUSH;
David Benjaminc895d6b2016-08-11 13:26:41 -0400451 if (ssl->session != NULL) {
Adam Langley4139edb2016-01-13 15:00:54 -0800452 ssl->s3->tmp.next_state = SSL3_ST_SR_CHANGE;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800453 } else {
Adam Langley4139edb2016-01-13 15:00:54 -0800454 ssl->s3->tmp.next_state = SSL_ST_OK;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800455 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800456 break;
457
David Benjamin6e899c72016-06-09 18:02:18 -0400458 case SSL3_ST_SW_FLUSH:
459 if (BIO_flush(ssl->wbio) <= 0) {
460 ssl->rwstate = SSL_WRITING;
461 ret = -1;
462 goto end;
463 }
464
465 ssl->state = ssl->s3->tmp.next_state;
466 if (ssl->state != SSL_ST_OK) {
467 ssl->method->expect_flight(ssl);
468 }
469 break;
470
David Benjaminc895d6b2016-08-11 13:26:41 -0400471 case SSL_ST_TLS13:
472 ret = tls13_handshake(ssl);
473 if (ret <= 0) {
474 goto end;
475 }
476 ssl->state = SSL_ST_OK;
477 break;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800478
David Benjaminc895d6b2016-08-11 13:26:41 -0400479 case SSL_ST_OK:
David Benjaminc895d6b2016-08-11 13:26:41 -0400480 ssl->method->release_current_message(ssl, 1 /* free_buffer */);
481
482 /* If we aren't retaining peer certificates then we can discard it
483 * now. */
484 if (ssl->s3->new_session != NULL &&
Steven Valdez909b19f2016-11-21 15:35:44 -0500485 ssl->retain_only_sha256_of_client_certs) {
486 X509_free(ssl->s3->new_session->x509_peer);
487 ssl->s3->new_session->x509_peer = NULL;
488 sk_X509_pop_free(ssl->s3->new_session->x509_chain, X509_free);
489 ssl->s3->new_session->x509_chain = NULL;
David Benjaminc895d6b2016-08-11 13:26:41 -0400490 }
491
492 SSL_SESSION_free(ssl->s3->established_session);
493 if (ssl->session != NULL) {
494 SSL_SESSION_up_ref(ssl->session);
495 ssl->s3->established_session = ssl->session;
496 } else {
497 ssl->s3->established_session = ssl->s3->new_session;
498 ssl->s3->established_session->not_resumable = 0;
499 ssl->s3->new_session = NULL;
David Benjamin6e899c72016-06-09 18:02:18 -0400500 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800501
502 /* remove buffering on output */
Adam Langley4139edb2016-01-13 15:00:54 -0800503 ssl_free_wbio_buffer(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800504
Steven Valdez909b19f2016-11-21 15:35:44 -0500505 ssl->s3->initial_handshake_complete = 1;
506 ssl_update_cache(ssl, SSL_SESS_CACHE_SERVER);
507
David Benjaminc895d6b2016-08-11 13:26:41 -0400508 ssl_handshake_free(ssl->s3->hs);
509 ssl->s3->hs = NULL;
David Benjamin6e899c72016-06-09 18:02:18 -0400510
David Benjamin6e899c72016-06-09 18:02:18 -0400511 ssl_do_info_callback(ssl, SSL_CB_HANDSHAKE_DONE, 1);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800512 ret = 1;
513 goto end;
514
515 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000516 OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_STATE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800517 ret = -1;
518 goto end;
519 }
520
David Benjamin6e899c72016-06-09 18:02:18 -0400521 if (!ssl->s3->tmp.reuse_message && !skip && ssl->state != state) {
522 int new_state = ssl->state;
Adam Langley4139edb2016-01-13 15:00:54 -0800523 ssl->state = state;
David Benjamin6e899c72016-06-09 18:02:18 -0400524 ssl_do_info_callback(ssl, SSL_CB_ACCEPT_LOOP, 1);
Adam Langley4139edb2016-01-13 15:00:54 -0800525 ssl->state = new_state;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800526 }
527 skip = 0;
528 }
529
530end:
David Benjamin6e899c72016-06-09 18:02:18 -0400531 ssl_do_info_callback(ssl, SSL_CB_ACCEPT_EXIT, ret);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800532 return ret;
533}
534
David Benjaminc895d6b2016-08-11 13:26:41 -0400535int ssl_client_cipher_list_contains_cipher(
536 const struct ssl_early_callback_ctx *client_hello, uint16_t id) {
537 CBS cipher_suites;
538 CBS_init(&cipher_suites, client_hello->cipher_suites,
539 client_hello->cipher_suites_len);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800540
David Benjaminc895d6b2016-08-11 13:26:41 -0400541 while (CBS_len(&cipher_suites) > 0) {
542 uint16_t got_id;
543 if (!CBS_get_u16(&cipher_suites, &got_id)) {
544 return 0;
545 }
546
547 if (got_id == id) {
548 return 1;
549 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800550 }
551
David Benjaminc895d6b2016-08-11 13:26:41 -0400552 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800553}
554
David Benjaminc895d6b2016-08-11 13:26:41 -0400555static int negotiate_version(
Steven Valdez909b19f2016-11-21 15:35:44 -0500556 SSL *ssl, uint8_t *out_alert,
David Benjaminc895d6b2016-08-11 13:26:41 -0400557 const struct ssl_early_callback_ctx *client_hello) {
558 uint16_t min_version, max_version;
559 if (!ssl_get_version_range(ssl, &min_version, &max_version)) {
560 *out_alert = SSL_AD_PROTOCOL_VERSION;
561 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800562 }
563
David Benjamin7c0d06c2016-08-11 13:26:41 -0400564 uint16_t version = 0;
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400565 /* Check supported_versions extension if it is present. */
566 CBS supported_versions;
567 if (ssl_early_callback_get_extension(client_hello, &supported_versions,
568 TLSEXT_TYPE_supported_versions)) {
569 CBS versions;
570 if (!CBS_get_u8_length_prefixed(&supported_versions, &versions) ||
571 CBS_len(&supported_versions) != 0 ||
572 CBS_len(&versions) == 0) {
573 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
574 *out_alert = SSL_AD_DECODE_ERROR;
575 return 0;
576 }
577
Steven Valdez909b19f2016-11-21 15:35:44 -0500578 /* Choose the newest commonly-supported version advertised by the client.
579 * The client orders the versions according to its preferences, but we're
580 * not required to honor the client's preferences. */
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400581 int found_version = 0;
582 while (CBS_len(&versions) != 0) {
583 uint16_t ext_version;
584 if (!CBS_get_u16(&versions, &ext_version)) {
585 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
586 *out_alert = SSL_AD_DECODE_ERROR;
587 return 0;
588 }
589 if (!ssl->method->version_from_wire(&ext_version, ext_version)) {
590 continue;
591 }
592 if (min_version <= ext_version &&
Steven Valdez909b19f2016-11-21 15:35:44 -0500593 ext_version <= max_version &&
594 (!found_version || version < ext_version)) {
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400595 version = ext_version;
596 found_version = 1;
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400597 }
598 }
599
600 if (!found_version) {
601 goto unsupported_protocol;
David Benjamin7c0d06c2016-08-11 13:26:41 -0400602 }
603 } else {
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400604 /* Process ClientHello.version instead. Note that versions beyond (D)TLS 1.2
605 * do not use this mechanism. */
606 if (SSL_is_dtls(ssl)) {
607 if (client_hello->version <= DTLS1_2_VERSION) {
608 version = TLS1_2_VERSION;
609 } else if (client_hello->version <= DTLS1_VERSION) {
610 version = TLS1_1_VERSION;
611 } else {
612 goto unsupported_protocol;
613 }
614 } else {
615 if (client_hello->version >= TLS1_2_VERSION) {
616 version = TLS1_2_VERSION;
617 } else if (client_hello->version >= TLS1_1_VERSION) {
618 version = TLS1_1_VERSION;
619 } else if (client_hello->version >= TLS1_VERSION) {
620 version = TLS1_VERSION;
621 } else if (client_hello->version >= SSL3_VERSION) {
622 version = SSL3_VERSION;
623 } else {
624 goto unsupported_protocol;
625 }
David Benjamin7c0d06c2016-08-11 13:26:41 -0400626 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800627
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400628 /* Apply our minimum and maximum version. */
629 if (version > max_version) {
630 version = max_version;
631 }
David Benjamin6e899c72016-06-09 18:02:18 -0400632
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400633 if (version < min_version) {
634 goto unsupported_protocol;
635 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800636 }
637
David Benjaminc895d6b2016-08-11 13:26:41 -0400638 /* Handle FALLBACK_SCSV. */
639 if (ssl_client_cipher_list_contains_cipher(client_hello,
640 SSL3_CK_FALLBACK_SCSV & 0xffff) &&
641 version < max_version) {
642 OPENSSL_PUT_ERROR(SSL, SSL_R_INAPPROPRIATE_FALLBACK);
643 *out_alert = SSL3_AD_INAPPROPRIATE_FALLBACK;
644 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800645 }
646
David Benjamin7c0d06c2016-08-11 13:26:41 -0400647 ssl->client_version = client_hello->version;
David Benjaminc895d6b2016-08-11 13:26:41 -0400648 ssl->version = ssl->method->version_to_wire(version);
649 ssl->s3->enc_method = ssl3_get_enc_method(version);
650 assert(ssl->s3->enc_method != NULL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800651
David Benjaminc895d6b2016-08-11 13:26:41 -0400652 /* At this point, the connection's version is known and |ssl->version| is
653 * fixed. Begin enforcing the record-layer version. */
654 ssl->s3->have_version = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800655
656 return 1;
Steven Valdezbb1ceac2016-10-07 10:34:51 -0400657
658unsupported_protocol:
659 OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_PROTOCOL);
660 *out_alert = SSL_AD_PROTOCOL_VERSION;
661 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800662}
663
David Benjamin6e899c72016-06-09 18:02:18 -0400664static int ssl3_get_client_hello(SSL *ssl) {
Steven Valdez909b19f2016-11-21 15:35:44 -0500665 uint8_t al = SSL_AD_INTERNAL_ERROR;
666 int ret = -1;
Kenny Rootb8494592015-09-25 02:29:14 +0000667 SSL_SESSION *session = NULL;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800668
David Benjaminc895d6b2016-08-11 13:26:41 -0400669 if (ssl->state == SSL3_ST_SR_CLNT_HELLO_A) {
670 /* The first time around, read the ClientHello. */
671 int msg_ret = ssl->method->ssl_get_message(ssl, SSL3_MT_CLIENT_HELLO,
672 ssl_hash_message);
673 if (msg_ret <= 0) {
674 return msg_ret;
675 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800676
David Benjaminc895d6b2016-08-11 13:26:41 -0400677 ssl->state = SSL3_ST_SR_CLNT_HELLO_B;
678 }
679
680 struct ssl_early_callback_ctx client_hello;
681 if (!ssl_early_callback_init(ssl, &client_hello, ssl->init_msg,
682 ssl->init_num)) {
683 al = SSL_AD_DECODE_ERROR;
684 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
685 goto f_err;
686 }
687
688 if (ssl->state == SSL3_ST_SR_CLNT_HELLO_B) {
689 /* Unlike other callbacks, the early callback is not run a second time if
690 * paused. */
691 ssl->state = SSL3_ST_SR_CLNT_HELLO_C;
692
693 /* Run the early callback. */
694 if (ssl->ctx->select_certificate_cb != NULL) {
695 switch (ssl->ctx->select_certificate_cb(&client_hello)) {
696 case 0:
697 ssl->rwstate = SSL_CERTIFICATE_SELECTION_PENDING;
698 goto err;
699
700 case -1:
701 /* Connection rejected. */
David Benjamin7c0d06c2016-08-11 13:26:41 -0400702 al = SSL_AD_HANDSHAKE_FAILURE;
David Benjaminc895d6b2016-08-11 13:26:41 -0400703 OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED);
704 goto f_err;
705
706 default:
707 /* fallthrough */;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800708 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400709 }
710 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800711
David Benjaminc895d6b2016-08-11 13:26:41 -0400712 /* Negotiate the protocol version if we have not done so yet. */
713 if (!ssl->s3->have_version) {
714 if (!negotiate_version(ssl, &al, &client_hello)) {
715 goto f_err;
716 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800717
David Benjaminc895d6b2016-08-11 13:26:41 -0400718 if (ssl3_protocol_version(ssl) >= TLS1_3_VERSION) {
719 ssl->state = SSL_ST_TLS13;
720 return 1;
721 }
722 }
723
724 if (ssl->state == SSL3_ST_SR_CLNT_HELLO_C) {
725 /* Load the client random. */
726 if (client_hello.random_len != SSL3_RANDOM_SIZE) {
727 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
728 return -1;
729 }
730 memcpy(ssl->s3->client_random, client_hello.random,
731 client_hello.random_len);
732
David Benjaminc895d6b2016-08-11 13:26:41 -0400733 /* Only null compression is supported. */
734 if (memchr(client_hello.compression_methods, 0,
735 client_hello.compression_methods_len) == NULL) {
736 al = SSL_AD_ILLEGAL_PARAMETER;
737 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_COMPRESSION_SPECIFIED);
738 goto f_err;
739 }
740
741 /* TLS extensions. */
742 if (!ssl_parse_clienthello_tlsext(ssl, &client_hello)) {
743 OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
744 goto err;
745 }
746
David Benjaminc895d6b2016-08-11 13:26:41 -0400747 ssl->state = SSL3_ST_SR_CLNT_HELLO_D;
748 }
749
Steven Valdez909b19f2016-11-21 15:35:44 -0500750 if (ssl->state == SSL3_ST_SR_CLNT_HELLO_D) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400751 /* Call |cert_cb| to update server certificates if required. */
752 if (ssl->cert->cert_cb != NULL) {
Adam Langley4139edb2016-01-13 15:00:54 -0800753 int rv = ssl->cert->cert_cb(ssl, ssl->cert->cert_cb_arg);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800754 if (rv == 0) {
755 al = SSL_AD_INTERNAL_ERROR;
Kenny Rootb8494592015-09-25 02:29:14 +0000756 OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800757 goto f_err;
758 }
759 if (rv < 0) {
Adam Langley4139edb2016-01-13 15:00:54 -0800760 ssl->rwstate = SSL_X509_LOOKUP;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800761 goto err;
762 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800763 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800764
Steven Valdez909b19f2016-11-21 15:35:44 -0500765 /* Negotiate the cipher suite. This must be done after |cert_cb| so the
766 * certificate is finalized. */
767 ssl->s3->tmp.new_cipher =
David Benjaminc895d6b2016-08-11 13:26:41 -0400768 ssl3_choose_cipher(ssl, &client_hello, ssl_get_cipher_preferences(ssl));
Steven Valdez909b19f2016-11-21 15:35:44 -0500769 if (ssl->s3->tmp.new_cipher == NULL) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800770 al = SSL_AD_HANDSHAKE_FAILURE;
Kenny Rootb8494592015-09-25 02:29:14 +0000771 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SHARED_CIPHER);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800772 goto f_err;
773 }
David Benjaminc895d6b2016-08-11 13:26:41 -0400774
Steven Valdez909b19f2016-11-21 15:35:44 -0500775 ssl->state = SSL3_ST_SR_CLNT_HELLO_E;
776 }
777
778 assert(ssl->state == SSL3_ST_SR_CLNT_HELLO_E);
779
780 /* Determine whether we are doing session resumption. */
781 int tickets_supported = 0, renew_ticket = 0;
782 switch (ssl_get_prev_session(ssl, &session, &tickets_supported, &renew_ticket,
783 &client_hello)) {
784 case ssl_session_success:
785 break;
786 case ssl_session_error:
787 goto err;
788 case ssl_session_retry:
789 ssl->rwstate = SSL_PENDING_SESSION;
790 goto err;
791 }
792
793 if (session != NULL) {
794 if (session->extended_master_secret &&
795 !ssl->s3->tmp.extended_master_secret) {
796 /* A ClientHello without EMS that attempts to resume a session with EMS
797 * is fatal to the connection. */
798 al = SSL_AD_HANDSHAKE_FAILURE;
799 OPENSSL_PUT_ERROR(SSL, SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION);
800 goto f_err;
801 }
802
803 if (!ssl_session_is_resumable(ssl, session) ||
804 /* If the client offers the EMS extension, but the previous session
805 * didn't use it, then negotiate a new session. */
806 ssl->s3->tmp.extended_master_secret !=
807 session->extended_master_secret) {
808 SSL_SESSION_free(session);
809 session = NULL;
810 }
811 }
812
813 if (session != NULL) {
814 /* Use the old session. */
815 ssl->s3->hs->ticket_expected = renew_ticket;
816 ssl->session = session;
817 session = NULL;
818 ssl->s3->session_reused = 1;
819 } else {
820 ssl->s3->hs->ticket_expected = tickets_supported;
821 ssl_set_session(ssl, NULL);
822 if (!ssl_get_new_session(ssl, 1 /* server */)) {
823 goto err;
824 }
825
826 /* Clear the session ID if we want the session to be single-use. */
827 if (!(ssl->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER)) {
828 ssl->s3->new_session->session_id_length = 0;
829 }
830 }
831
832 if (ssl->ctx->dos_protection_cb != NULL &&
833 ssl->ctx->dos_protection_cb(&client_hello) == 0) {
834 /* Connection rejected for DOS reasons. */
835 al = SSL_AD_INTERNAL_ERROR;
836 OPENSSL_PUT_ERROR(SSL, SSL_R_CONNECTION_REJECTED);
837 goto f_err;
838 }
839
840 if (ssl->session == NULL) {
841 ssl->s3->new_session->cipher = ssl->s3->tmp.new_cipher;
842
843 /* On new sessions, stash the SNI value in the session. */
844 if (ssl->s3->hs->hostname != NULL) {
845 ssl->s3->new_session->tlsext_hostname = BUF_strdup(ssl->s3->hs->hostname);
846 if (ssl->s3->new_session->tlsext_hostname == NULL) {
847 al = SSL_AD_INTERNAL_ERROR;
848 goto f_err;
849 }
850 }
Adam Langleyf4e42722015-06-04 17:45:09 -0700851
852 /* Determine whether to request a client certificate. */
David Benjamin95add822016-10-19 01:09:12 -0400853 ssl->s3->hs->cert_request = !!(ssl->verify_mode & SSL_VERIFY_PEER);
Adam Langleyf4e42722015-06-04 17:45:09 -0700854 /* Only request a certificate if Channel ID isn't negotiated. */
Adam Langley4139edb2016-01-13 15:00:54 -0800855 if ((ssl->verify_mode & SSL_VERIFY_PEER_IF_NO_OBC) &&
856 ssl->s3->tlsext_channel_id_valid) {
David Benjamin95add822016-10-19 01:09:12 -0400857 ssl->s3->hs->cert_request = 0;
Adam Langleyf4e42722015-06-04 17:45:09 -0700858 }
David Benjamind316cba2016-06-02 16:17:39 -0400859 /* CertificateRequest may only be sent in certificate-based ciphers. */
860 if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
David Benjamin95add822016-10-19 01:09:12 -0400861 ssl->s3->hs->cert_request = 0;
Adam Langleyf4e42722015-06-04 17:45:09 -0700862 }
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400863
David Benjamin95add822016-10-19 01:09:12 -0400864 if (!ssl->s3->hs->cert_request) {
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400865 /* OpenSSL returns X509_V_OK when no certificates are requested. This is
866 * classed by them as a bug, but it's assumed by at least NGINX. */
867 ssl->s3->new_session->verify_result = X509_V_OK;
868 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800869 }
870
Steven Valdez909b19f2016-11-21 15:35:44 -0500871 /* HTTP/2 negotiation depends on the cipher suite, so ALPN negotiation was
872 * deferred. Complete it now. */
873 if (!ssl_negotiate_alpn(ssl, &al, &client_hello)) {
874 goto f_err;
875 }
876
877 /* Now that all parameters are known, initialize the handshake hash. */
Adam Langley4139edb2016-01-13 15:00:54 -0800878 if (!ssl3_init_handshake_hash(ssl)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000879 goto f_err;
880 }
881
David Benjaminc895d6b2016-08-11 13:26:41 -0400882 /* Release the handshake buffer if client authentication isn't required. */
David Benjamin95add822016-10-19 01:09:12 -0400883 if (!ssl->s3->hs->cert_request) {
Adam Langley4139edb2016-01-13 15:00:54 -0800884 ssl3_free_handshake_buffer(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800885 }
886
Adam Langley4139edb2016-01-13 15:00:54 -0800887 ret = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800888
889 if (0) {
890 f_err:
Adam Langley4139edb2016-01-13 15:00:54 -0800891 ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800892 }
893
894err:
Kenny Rootb8494592015-09-25 02:29:14 +0000895 SSL_SESSION_free(session);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800896 return ret;
897}
898
David Benjamin6e899c72016-06-09 18:02:18 -0400899static int ssl3_send_server_hello(SSL *ssl) {
Kenny Roote99801b2015-11-06 15:31:15 -0800900 if (ssl->state == SSL3_ST_SW_SRVR_HELLO_B) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400901 return ssl->method->write_message(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800902 }
903
Kenny Roote99801b2015-11-06 15:31:15 -0800904 assert(ssl->state == SSL3_ST_SW_SRVR_HELLO_A);
905
906 /* We only accept ChannelIDs on connections with ECDHE in order to avoid a
907 * known attack while we fix ChannelID itself. */
908 if (ssl->s3->tlsext_channel_id_valid &&
909 (ssl->s3->tmp.new_cipher->algorithm_mkey & SSL_kECDHE) == 0) {
910 ssl->s3->tlsext_channel_id_valid = 0;
911 }
912
913 /* If this is a resumption and the original handshake didn't support
914 * ChannelID then we didn't record the original handshake hashes in the
915 * session and so cannot resume with ChannelIDs. */
David Benjaminc895d6b2016-08-11 13:26:41 -0400916 if (ssl->session != NULL &&
917 ssl->session->original_handshake_hash_len == 0) {
Kenny Roote99801b2015-11-06 15:31:15 -0800918 ssl->s3->tlsext_channel_id_valid = 0;
919 }
920
David Benjaminc895d6b2016-08-11 13:26:41 -0400921 struct timeval now;
922 ssl_get_current_time(ssl, &now);
923 ssl->s3->server_random[0] = now.tv_sec >> 24;
924 ssl->s3->server_random[1] = now.tv_sec >> 16;
925 ssl->s3->server_random[2] = now.tv_sec >> 8;
926 ssl->s3->server_random[3] = now.tv_sec;
927 if (!RAND_bytes(ssl->s3->server_random + 4, SSL3_RANDOM_SIZE - 4)) {
Kenny Roote99801b2015-11-06 15:31:15 -0800928 return -1;
929 }
930
David Benjamin7c0d06c2016-08-11 13:26:41 -0400931 /* TODO(davidben): Implement the TLS 1.1 and 1.2 downgrade sentinels once TLS
932 * 1.3 is finalized and we are not implementing a draft version. */
David Benjaminc895d6b2016-08-11 13:26:41 -0400933
934 const SSL_SESSION *session = ssl->s3->new_session;
935 if (ssl->session != NULL) {
936 session = ssl->session;
937 }
938
939 CBB cbb, body, session_id;
940 if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_SERVER_HELLO) ||
941 !CBB_add_u16(&body, ssl->version) ||
942 !CBB_add_bytes(&body, ssl->s3->server_random, SSL3_RANDOM_SIZE) ||
943 !CBB_add_u8_length_prefixed(&body, &session_id) ||
944 !CBB_add_bytes(&session_id, session->session_id,
945 session->session_id_length) ||
946 !CBB_add_u16(&body, ssl_cipher_get_value(ssl->s3->tmp.new_cipher)) ||
947 !CBB_add_u8(&body, 0 /* no compression */) ||
948 !ssl_add_serverhello_tlsext(ssl, &body) ||
Steven Valdez909b19f2016-11-21 15:35:44 -0500949 !ssl_complete_message(ssl, &cbb)) {
Kenny Roote99801b2015-11-06 15:31:15 -0800950 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
951 CBB_cleanup(&cbb);
952 return -1;
953 }
954
955 ssl->state = SSL3_ST_SW_SRVR_HELLO_B;
David Benjaminc895d6b2016-08-11 13:26:41 -0400956 return ssl->method->write_message(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800957}
958
David Benjamin6e899c72016-06-09 18:02:18 -0400959static int ssl3_send_server_certificate(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400960 if (ssl->state == SSL3_ST_SW_CERT_B) {
961 return ssl->method->write_message(ssl);
David Benjamin6e899c72016-06-09 18:02:18 -0400962 }
963
David Benjaminc895d6b2016-08-11 13:26:41 -0400964 if (!ssl_has_certificate(ssl)) {
965 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
966 return 0;
967 }
968
969 if (!ssl3_output_cert_chain(ssl)) {
970 return 0;
971 }
972 ssl->state = SSL3_ST_SW_CERT_B;
973 return ssl->method->write_message(ssl);
David Benjamin6e899c72016-06-09 18:02:18 -0400974}
975
976static int ssl3_send_certificate_status(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400977 if (ssl->state == SSL3_ST_SW_CERT_STATUS_B) {
978 return ssl->method->write_message(ssl);
Kenny Rootb8494592015-09-25 02:29:14 +0000979 }
980
David Benjaminc895d6b2016-08-11 13:26:41 -0400981 CBB cbb, body, ocsp_response;
982 if (!ssl->method->init_message(ssl, &cbb, &body,
983 SSL3_MT_CERTIFICATE_STATUS) ||
984 !CBB_add_u8(&body, TLSEXT_STATUSTYPE_ocsp) ||
985 !CBB_add_u24_length_prefixed(&body, &ocsp_response) ||
986 !CBB_add_bytes(&ocsp_response, ssl->ctx->ocsp_response,
987 ssl->ctx->ocsp_response_length) ||
Steven Valdez909b19f2016-11-21 15:35:44 -0500988 !ssl_complete_message(ssl, &cbb)) {
David Benjaminc895d6b2016-08-11 13:26:41 -0400989 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
990 CBB_cleanup(&cbb);
991 return -1;
992 }
993
994 ssl->state = SSL3_ST_SW_CERT_STATUS_B;
995 return ssl->method->write_message(ssl);
Kenny Rootb8494592015-09-25 02:29:14 +0000996}
997
David Benjamin6e899c72016-06-09 18:02:18 -0400998static int ssl3_send_server_key_exchange(SSL *ssl) {
Adam Langley4139edb2016-01-13 15:00:54 -0800999 if (ssl->state == SSL3_ST_SW_KEY_EXCH_C) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001000 return ssl->method->write_message(ssl);
Kenny Rootb8494592015-09-25 02:29:14 +00001001 }
1002
Adam Langley4139edb2016-01-13 15:00:54 -08001003 CBB cbb, child;
David Benjaminc895d6b2016-08-11 13:26:41 -04001004 CBB_zero(&cbb);
Kenny Rootb8494592015-09-25 02:29:14 +00001005
David Benjaminc895d6b2016-08-11 13:26:41 -04001006 /* Put together the parameters. */
Adam Langley4139edb2016-01-13 15:00:54 -08001007 if (ssl->state == SSL3_ST_SW_KEY_EXCH_A) {
Adam Langley4139edb2016-01-13 15:00:54 -08001008 uint32_t alg_k = ssl->s3->tmp.new_cipher->algorithm_mkey;
1009 uint32_t alg_a = ssl->s3->tmp.new_cipher->algorithm_auth;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001010
David Benjaminc895d6b2016-08-11 13:26:41 -04001011 /* Pre-allocate enough room to comfortably fit an ECDHE public key. */
1012 if (!CBB_init(&cbb, 128)) {
1013 goto err;
1014 }
1015
Adam Langley4139edb2016-01-13 15:00:54 -08001016 /* PSK ciphers begin with an identity hint. */
Adam Langleyd9e397b2015-01-22 14:27:53 -08001017 if (alg_a & SSL_aPSK) {
Adam Langley4139edb2016-01-13 15:00:54 -08001018 size_t len =
1019 (ssl->psk_identity_hint == NULL) ? 0 : strlen(ssl->psk_identity_hint);
1020 if (!CBB_add_u16_length_prefixed(&cbb, &child) ||
1021 !CBB_add_bytes(&child, (const uint8_t *)ssl->psk_identity_hint,
1022 len)) {
1023 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001024 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001025 }
1026
Adam Langleye9ada862015-05-11 17:20:37 -07001027 if (alg_k & SSL_kDHE) {
Adam Langley4139edb2016-01-13 15:00:54 -08001028 /* Determine the group to use. */
1029 DH *params = ssl->cert->dh_tmp;
1030 if (params == NULL && ssl->cert->dh_tmp_cb != NULL) {
1031 params = ssl->cert->dh_tmp_cb(ssl, 0, 1024);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001032 }
Adam Langley4139edb2016-01-13 15:00:54 -08001033 if (params == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +00001034 OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_TMP_DH_KEY);
Adam Langley4139edb2016-01-13 15:00:54 -08001035 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001036 goto err;
1037 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001038 ssl->s3->new_session->key_exchange_info = DH_num_bits(params);
Adam Langley4139edb2016-01-13 15:00:54 -08001039
1040 /* Set up DH, generate a key, and emit the public half. */
1041 DH *dh = DHparams_dup(params);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001042 if (dh == NULL) {
Adam Langleye9ada862015-05-11 17:20:37 -07001043 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001044 }
1045
David Benjamin95add822016-10-19 01:09:12 -04001046 SSL_ECDH_CTX_init_for_dhe(&ssl->s3->hs->ecdh_ctx, dh);
Adam Langley4139edb2016-01-13 15:00:54 -08001047 if (!CBB_add_u16_length_prefixed(&cbb, &child) ||
1048 !BN_bn2cbb_padded(&child, BN_num_bytes(params->p), params->p) ||
1049 !CBB_add_u16_length_prefixed(&cbb, &child) ||
1050 !BN_bn2cbb_padded(&child, BN_num_bytes(params->g), params->g) ||
1051 !CBB_add_u16_length_prefixed(&cbb, &child) ||
David Benjamin95add822016-10-19 01:09:12 -04001052 !SSL_ECDH_CTX_offer(&ssl->s3->hs->ecdh_ctx, &child)) {
Adam Langley4139edb2016-01-13 15:00:54 -08001053 goto err;
1054 }
Adam Langleye9ada862015-05-11 17:20:37 -07001055 } else if (alg_k & SSL_kECDHE) {
David Benjamind316cba2016-06-02 16:17:39 -04001056 /* Determine the group to use. */
1057 uint16_t group_id;
1058 if (!tls1_get_shared_group(ssl, &group_id)) {
Kenny Rootb8494592015-09-25 02:29:14 +00001059 OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_TMP_ECDH_KEY);
Adam Langley4139edb2016-01-13 15:00:54 -08001060 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001061 goto err;
1062 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001063 ssl->s3->new_session->key_exchange_info = group_id;
Adam Langley4139edb2016-01-13 15:00:54 -08001064
1065 /* Set up ECDH, generate a key, and emit the public half. */
David Benjamin95add822016-10-19 01:09:12 -04001066 if (!SSL_ECDH_CTX_init(&ssl->s3->hs->ecdh_ctx, group_id) ||
Adam Langley4139edb2016-01-13 15:00:54 -08001067 !CBB_add_u8(&cbb, NAMED_CURVE_TYPE) ||
David Benjamind316cba2016-06-02 16:17:39 -04001068 !CBB_add_u16(&cbb, group_id) ||
Adam Langley4139edb2016-01-13 15:00:54 -08001069 !CBB_add_u8_length_prefixed(&cbb, &child) ||
David Benjamin95add822016-10-19 01:09:12 -04001070 !SSL_ECDH_CTX_offer(&ssl->s3->hs->ecdh_ctx, &child)) {
David Benjamind316cba2016-06-02 16:17:39 -04001071 goto err;
1072 }
1073 } else if (alg_k & SSL_kCECPQ1) {
David Benjamin95add822016-10-19 01:09:12 -04001074 SSL_ECDH_CTX_init_for_cecpq1(&ssl->s3->hs->ecdh_ctx);
David Benjaminc895d6b2016-08-11 13:26:41 -04001075 if (!CBB_add_u16_length_prefixed(&cbb, &child) ||
David Benjamin95add822016-10-19 01:09:12 -04001076 !SSL_ECDH_CTX_offer(&ssl->s3->hs->ecdh_ctx, &child)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001077 goto err;
1078 }
Adam Langley4139edb2016-01-13 15:00:54 -08001079 } else {
1080 assert(alg_k & SSL_kPSK);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001081 }
1082
David Benjamin95add822016-10-19 01:09:12 -04001083 if (!CBB_finish(&cbb, &ssl->s3->hs->server_params,
1084 &ssl->s3->hs->server_params_len)) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001085 goto err;
1086 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001087 }
1088
1089 /* Assemble the message. */
1090 CBB body;
1091 if (!ssl->method->init_message(ssl, &cbb, &body,
1092 SSL3_MT_SERVER_KEY_EXCHANGE) ||
David Benjamin95add822016-10-19 01:09:12 -04001093 !CBB_add_bytes(&body, ssl->s3->hs->server_params,
1094 ssl->s3->hs->server_params_len)) {
Adam Langley4139edb2016-01-13 15:00:54 -08001095 goto err;
1096 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001097
Adam Langley4139edb2016-01-13 15:00:54 -08001098 /* Add a signature. */
David Benjamind316cba2016-06-02 16:17:39 -04001099 if (ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
Adam Langley4139edb2016-01-13 15:00:54 -08001100 if (!ssl_has_private_key(ssl)) {
1101 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001102 goto err;
1103 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001104
David Benjaminc895d6b2016-08-11 13:26:41 -04001105 /* Determine the signature algorithm. */
1106 uint16_t signature_algorithm;
1107 if (!tls1_choose_signature_algorithm(ssl, &signature_algorithm)) {
1108 goto err;
1109 }
1110 if (ssl3_protocol_version(ssl) >= TLS1_2_VERSION) {
1111 if (!CBB_add_u16(&body, signature_algorithm)) {
1112 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
1113 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
1114 goto err;
1115 }
1116 }
1117
1118 /* Add space for the signature. */
Adam Langley4139edb2016-01-13 15:00:54 -08001119 const size_t max_sig_len = ssl_private_key_max_signature_len(ssl);
David Benjaminc895d6b2016-08-11 13:26:41 -04001120 uint8_t *ptr;
1121 if (!CBB_add_u16_length_prefixed(&body, &child) ||
1122 !CBB_reserve(&child, &ptr, max_sig_len)) {
1123 goto err;
1124 }
1125
Adam Langley4139edb2016-01-13 15:00:54 -08001126 size_t sig_len;
1127 enum ssl_private_key_result_t sign_result;
1128 if (ssl->state == SSL3_ST_SW_KEY_EXCH_A) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001129 CBB transcript;
1130 uint8_t *transcript_data;
1131 size_t transcript_len;
1132 if (!CBB_init(&transcript,
David Benjamin95add822016-10-19 01:09:12 -04001133 2*SSL3_RANDOM_SIZE + ssl->s3->hs->server_params_len) ||
David Benjaminc895d6b2016-08-11 13:26:41 -04001134 !CBB_add_bytes(&transcript, ssl->s3->client_random, SSL3_RANDOM_SIZE) ||
1135 !CBB_add_bytes(&transcript, ssl->s3->server_random, SSL3_RANDOM_SIZE) ||
David Benjamin95add822016-10-19 01:09:12 -04001136 !CBB_add_bytes(&transcript, ssl->s3->hs->server_params,
1137 ssl->s3->hs->server_params_len) ||
David Benjaminc895d6b2016-08-11 13:26:41 -04001138 !CBB_finish(&transcript, &transcript_data, &transcript_len)) {
1139 CBB_cleanup(&transcript);
1140 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
1141 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
Adam Langley4139edb2016-01-13 15:00:54 -08001142 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001143 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001144
David Benjaminc895d6b2016-08-11 13:26:41 -04001145 sign_result = ssl_private_key_sign(ssl, ptr, &sig_len, max_sig_len,
1146 signature_algorithm, transcript_data,
1147 transcript_len);
1148 OPENSSL_free(transcript_data);
Kenny Rootb8494592015-09-25 02:29:14 +00001149 } else {
Adam Langley4139edb2016-01-13 15:00:54 -08001150 assert(ssl->state == SSL3_ST_SW_KEY_EXCH_B);
David Benjaminc895d6b2016-08-11 13:26:41 -04001151 sign_result = ssl_private_key_complete(ssl, ptr, &sig_len, max_sig_len);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001152 }
Adam Langley4139edb2016-01-13 15:00:54 -08001153
1154 switch (sign_result) {
1155 case ssl_private_key_success:
Adam Langley4139edb2016-01-13 15:00:54 -08001156 if (!CBB_did_write(&child, sig_len)) {
1157 goto err;
1158 }
1159 break;
1160 case ssl_private_key_failure:
Adam Langley4139edb2016-01-13 15:00:54 -08001161 goto err;
1162 case ssl_private_key_retry:
Adam Langley4139edb2016-01-13 15:00:54 -08001163 ssl->rwstate = SSL_PRIVATE_KEY_OPERATION;
1164 ssl->state = SSL3_ST_SW_KEY_EXCH_B;
1165 goto err;
1166 }
Adam Langley1e4884f2015-09-24 10:57:52 -07001167 }
1168
Steven Valdez909b19f2016-11-21 15:35:44 -05001169 if (!ssl_complete_message(ssl, &cbb)) {
Kenny Rootb8494592015-09-25 02:29:14 +00001170 goto err;
1171 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001172
David Benjamin95add822016-10-19 01:09:12 -04001173 OPENSSL_free(ssl->s3->hs->server_params);
1174 ssl->s3->hs->server_params = NULL;
1175 ssl->s3->hs->server_params_len = 0;
David Benjaminc895d6b2016-08-11 13:26:41 -04001176
Adam Langley4139edb2016-01-13 15:00:54 -08001177 ssl->state = SSL3_ST_SW_KEY_EXCH_C;
David Benjaminc895d6b2016-08-11 13:26:41 -04001178 return ssl->method->write_message(ssl);
Kenny Rootb8494592015-09-25 02:29:14 +00001179
Adam Langleyd9e397b2015-01-22 14:27:53 -08001180err:
Adam Langley4139edb2016-01-13 15:00:54 -08001181 CBB_cleanup(&cbb);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001182 return -1;
1183}
1184
David Benjaminc895d6b2016-08-11 13:26:41 -04001185static int add_cert_types(SSL *ssl, CBB *cbb) {
1186 /* Get configured signature algorithms. */
1187 int have_rsa_sign = 0;
1188 int have_ecdsa_sign = 0;
1189 const uint16_t *sig_algs;
David Benjamin95add822016-10-19 01:09:12 -04001190 size_t num_sig_algs = tls12_get_verify_sigalgs(ssl, &sig_algs);
1191 for (size_t i = 0; i < num_sig_algs; i++) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001192 switch (sig_algs[i]) {
1193 case SSL_SIGN_RSA_PKCS1_SHA512:
1194 case SSL_SIGN_RSA_PKCS1_SHA384:
1195 case SSL_SIGN_RSA_PKCS1_SHA256:
1196 case SSL_SIGN_RSA_PKCS1_SHA1:
1197 have_rsa_sign = 1;
1198 break;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001199
David Benjaminc895d6b2016-08-11 13:26:41 -04001200 case SSL_SIGN_ECDSA_SECP521R1_SHA512:
1201 case SSL_SIGN_ECDSA_SECP384R1_SHA384:
1202 case SSL_SIGN_ECDSA_SECP256R1_SHA256:
1203 case SSL_SIGN_ECDSA_SHA1:
1204 have_ecdsa_sign = 1;
1205 break;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001206 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001207 }
1208
David Benjaminc895d6b2016-08-11 13:26:41 -04001209 if (have_rsa_sign && !CBB_add_u8(cbb, SSL3_CT_RSA_SIGN)) {
1210 return 0;
1211 }
1212
1213 /* ECDSA certs can be used with RSA cipher suites as well so we don't need to
1214 * check for SSL_kECDH or SSL_kECDHE. */
1215 if (ssl->version >= TLS1_VERSION && have_ecdsa_sign &&
1216 !CBB_add_u8(cbb, TLS_CT_ECDSA_SIGN)) {
1217 return 0;
1218 }
1219
1220 return 1;
1221}
1222
1223static int ssl3_send_certificate_request(SSL *ssl) {
1224 if (ssl->state == SSL3_ST_SW_CERT_REQ_B) {
1225 return ssl->method->write_message(ssl);
1226 }
1227
1228 CBB cbb, body, cert_types, sigalgs_cbb;
1229 if (!ssl->method->init_message(ssl, &cbb, &body,
1230 SSL3_MT_CERTIFICATE_REQUEST) ||
1231 !CBB_add_u8_length_prefixed(&body, &cert_types) ||
1232 !add_cert_types(ssl, &cert_types)) {
1233 goto err;
1234 }
1235
1236 if (ssl3_protocol_version(ssl) >= TLS1_2_VERSION) {
1237 const uint16_t *sigalgs;
David Benjamin95add822016-10-19 01:09:12 -04001238 size_t num_sigalgs = tls12_get_verify_sigalgs(ssl, &sigalgs);
David Benjaminc895d6b2016-08-11 13:26:41 -04001239 if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
1240 goto err;
1241 }
1242
David Benjaminf0c4a6c2016-08-11 13:26:41 -04001243 for (size_t i = 0; i < num_sigalgs; i++) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001244 if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
1245 goto err;
1246 }
1247 }
1248 }
1249
1250 if (!ssl_add_client_CA_list(ssl, &body) ||
Steven Valdez909b19f2016-11-21 15:35:44 -05001251 !ssl_complete_message(ssl, &cbb)) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001252 goto err;
1253 }
1254
1255 ssl->state = SSL3_ST_SW_CERT_REQ_B;
1256 return ssl->method->write_message(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001257
1258err:
David Benjaminc895d6b2016-08-11 13:26:41 -04001259 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
1260 CBB_cleanup(&cbb);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001261 return -1;
1262}
1263
David Benjamin6e899c72016-06-09 18:02:18 -04001264static int ssl3_send_server_hello_done(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001265 if (ssl->state == SSL3_ST_SW_SRVR_DONE_B) {
1266 return ssl->method->write_message(ssl);
David Benjamin6e899c72016-06-09 18:02:18 -04001267 }
1268
David Benjaminc895d6b2016-08-11 13:26:41 -04001269 CBB cbb, body;
1270 if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_SERVER_HELLO_DONE) ||
Steven Valdez909b19f2016-11-21 15:35:44 -05001271 !ssl_complete_message(ssl, &cbb)) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001272 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
1273 CBB_cleanup(&cbb);
1274 return -1;
1275 }
1276
1277 ssl->state = SSL3_ST_SW_SRVR_DONE_B;
1278 return ssl->method->write_message(ssl);
David Benjamin6e899c72016-06-09 18:02:18 -04001279}
1280
1281static int ssl3_get_client_certificate(SSL *ssl) {
David Benjamin95add822016-10-19 01:09:12 -04001282 assert(ssl->s3->hs->cert_request);
David Benjamin6e899c72016-06-09 18:02:18 -04001283
David Benjaminc895d6b2016-08-11 13:26:41 -04001284 int msg_ret = ssl->method->ssl_get_message(ssl, -1, ssl_hash_message);
1285 if (msg_ret <= 0) {
1286 return msg_ret;
David Benjamin6e899c72016-06-09 18:02:18 -04001287 }
1288
1289 if (ssl->s3->tmp.message_type != SSL3_MT_CERTIFICATE) {
1290 if (ssl->version == SSL3_VERSION &&
1291 ssl->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE) {
David Benjaminf0c4a6c2016-08-11 13:26:41 -04001292 /* In SSL 3.0, the Certificate message is omitted to signal no
1293 * certificate. */
David Benjaminc895d6b2016-08-11 13:26:41 -04001294 if (ssl->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
David Benjamin6e899c72016-06-09 18:02:18 -04001295 OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
David Benjaminc895d6b2016-08-11 13:26:41 -04001296 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
1297 return -1;
David Benjamin6e899c72016-06-09 18:02:18 -04001298 }
1299
David Benjaminf0c4a6c2016-08-11 13:26:41 -04001300 /* OpenSSL returns X509_V_OK when no certificates are received. This is
1301 * classed by them as a bug, but it's assumed by at least NGINX. */
1302 ssl->s3->new_session->verify_result = X509_V_OK;
David Benjamin6e899c72016-06-09 18:02:18 -04001303 ssl->s3->tmp.reuse_message = 1;
1304 return 1;
1305 }
1306
David Benjamin6e899c72016-06-09 18:02:18 -04001307 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
David Benjaminc895d6b2016-08-11 13:26:41 -04001308 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
1309 return -1;
David Benjamin6e899c72016-06-09 18:02:18 -04001310 }
1311
David Benjaminc895d6b2016-08-11 13:26:41 -04001312 CBS certificate_msg;
1313 CBS_init(&certificate_msg, ssl->init_msg, ssl->init_num);
1314 uint8_t alert;
1315 STACK_OF(X509) *chain = ssl_parse_cert_chain(
Steven Valdez909b19f2016-11-21 15:35:44 -05001316 ssl, &alert, ssl->retain_only_sha256_of_client_certs
David Benjaminc895d6b2016-08-11 13:26:41 -04001317 ? ssl->s3->new_session->peer_sha256
1318 : NULL,
1319 &certificate_msg);
1320 if (chain == NULL) {
1321 ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
David Benjamin6e899c72016-06-09 18:02:18 -04001322 goto err;
1323 }
1324
David Benjaminc895d6b2016-08-11 13:26:41 -04001325 if (CBS_len(&certificate_msg) != 0) {
David Benjamin6e899c72016-06-09 18:02:18 -04001326 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
David Benjaminc895d6b2016-08-11 13:26:41 -04001327 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1328 goto err;
David Benjamin6e899c72016-06-09 18:02:18 -04001329 }
1330
David Benjaminc895d6b2016-08-11 13:26:41 -04001331 if (sk_X509_num(chain) == 0) {
David Benjamin6e899c72016-06-09 18:02:18 -04001332 /* No client certificate so the handshake buffer may be discarded. */
1333 ssl3_free_handshake_buffer(ssl);
1334
David Benjaminc895d6b2016-08-11 13:26:41 -04001335 /* In SSL 3.0, sending no certificate is signaled by omitting the
1336 * Certificate message. */
David Benjamin6e899c72016-06-09 18:02:18 -04001337 if (ssl->version == SSL3_VERSION) {
David Benjamin6e899c72016-06-09 18:02:18 -04001338 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATES_RETURNED);
David Benjaminc895d6b2016-08-11 13:26:41 -04001339 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
1340 goto err;
1341 }
1342
1343 if (ssl->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
David Benjamin6e899c72016-06-09 18:02:18 -04001344 /* Fail for TLS only if we required a certificate */
1345 OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
David Benjaminc895d6b2016-08-11 13:26:41 -04001346 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
1347 goto err;
David Benjamin6e899c72016-06-09 18:02:18 -04001348 }
David Benjaminf0c4a6c2016-08-11 13:26:41 -04001349
1350 /* OpenSSL returns X509_V_OK when no certificates are received. This is
1351 * classed by them as a bug, but it's assumed by at least NGINX. */
1352 ssl->s3->new_session->verify_result = X509_V_OK;
David Benjamin6e899c72016-06-09 18:02:18 -04001353 } else {
David Benjaminc895d6b2016-08-11 13:26:41 -04001354 /* The hash would have been filled in. */
Steven Valdez909b19f2016-11-21 15:35:44 -05001355 if (ssl->retain_only_sha256_of_client_certs) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001356 ssl->s3->new_session->peer_sha256_valid = 1;
1357 }
1358
David Benjaminf0c4a6c2016-08-11 13:26:41 -04001359 if (!ssl_verify_cert_chain(ssl, &ssl->s3->new_session->verify_result,
1360 chain)) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001361 goto err;
David Benjamin6e899c72016-06-09 18:02:18 -04001362 }
1363 }
1364
Steven Valdez909b19f2016-11-21 15:35:44 -05001365 X509_free(ssl->s3->new_session->x509_peer);
1366 ssl->s3->new_session->x509_peer = sk_X509_shift(chain);
David Benjamin6e899c72016-06-09 18:02:18 -04001367
Steven Valdez909b19f2016-11-21 15:35:44 -05001368 sk_X509_pop_free(ssl->s3->new_session->x509_chain, X509_free);
1369 ssl->s3->new_session->x509_chain = chain;
1370 /* Inconsistency alert: x509_chain does *not* include the peer's own
David Benjamin6e899c72016-06-09 18:02:18 -04001371 * certificate, while we do include it in s3_clnt.c */
1372
David Benjaminc895d6b2016-08-11 13:26:41 -04001373 return 1;
David Benjamin6e899c72016-06-09 18:02:18 -04001374
1375err:
David Benjaminc895d6b2016-08-11 13:26:41 -04001376 sk_X509_pop_free(chain, X509_free);
1377 return -1;
David Benjamin6e899c72016-06-09 18:02:18 -04001378}
1379
1380static int ssl3_get_client_key_exchange(SSL *ssl) {
Kenny Roote99801b2015-11-06 15:31:15 -08001381 int al;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001382 CBS client_key_exchange;
Adam Langleye9ada862015-05-11 17:20:37 -07001383 uint32_t alg_k;
1384 uint32_t alg_a;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001385 uint8_t *premaster_secret = NULL;
1386 size_t premaster_secret_len = 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001387 uint8_t *decrypt_buf = NULL;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001388
Adam Langley4139edb2016-01-13 15:00:54 -08001389 unsigned psk_len = 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001390 uint8_t psk[PSK_MAX_PSK_LEN];
1391
David Benjamind316cba2016-06-02 16:17:39 -04001392 if (ssl->state == SSL3_ST_SR_KEY_EXCH_A) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001393 int ret = ssl->method->ssl_get_message(ssl, SSL3_MT_CLIENT_KEY_EXCHANGE,
1394 ssl_hash_message);
1395 if (ret <= 0) {
1396 return ret;
Kenny Roote99801b2015-11-06 15:31:15 -08001397 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001398 }
1399
Adam Langley4139edb2016-01-13 15:00:54 -08001400 CBS_init(&client_key_exchange, ssl->init_msg, ssl->init_num);
1401 alg_k = ssl->s3->tmp.new_cipher->algorithm_mkey;
1402 alg_a = ssl->s3->tmp.new_cipher->algorithm_auth;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001403
1404 /* If using a PSK key exchange, prepare the pre-shared key. */
1405 if (alg_a & SSL_aPSK) {
1406 CBS psk_identity;
1407
1408 /* If using PSK, the ClientKeyExchange contains a psk_identity. If PSK,
1409 * then this is the only field in the message. */
1410 if (!CBS_get_u16_length_prefixed(&client_key_exchange, &psk_identity) ||
1411 ((alg_k & SSL_kPSK) && CBS_len(&client_key_exchange) != 0)) {
Kenny Rootb8494592015-09-25 02:29:14 +00001412 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001413 al = SSL_AD_DECODE_ERROR;
1414 goto f_err;
1415 }
1416
Adam Langley4139edb2016-01-13 15:00:54 -08001417 if (ssl->psk_server_callback == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +00001418 OPENSSL_PUT_ERROR(SSL, SSL_R_PSK_NO_SERVER_CB);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001419 al = SSL_AD_INTERNAL_ERROR;
1420 goto f_err;
1421 }
1422
1423 if (CBS_len(&psk_identity) > PSK_MAX_IDENTITY_LEN ||
1424 CBS_contains_zero_byte(&psk_identity)) {
Kenny Rootb8494592015-09-25 02:29:14 +00001425 OPENSSL_PUT_ERROR(SSL, SSL_R_DATA_LENGTH_TOO_LONG);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001426 al = SSL_AD_ILLEGAL_PARAMETER;
1427 goto f_err;
1428 }
1429
David Benjaminc895d6b2016-08-11 13:26:41 -04001430 if (!CBS_strdup(&psk_identity, &ssl->s3->new_session->psk_identity)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001431 al = SSL_AD_INTERNAL_ERROR;
Kenny Rootb8494592015-09-25 02:29:14 +00001432 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001433 goto f_err;
1434 }
1435
1436 /* Look up the key for the identity. */
David Benjaminc895d6b2016-08-11 13:26:41 -04001437 psk_len = ssl->psk_server_callback(ssl, ssl->s3->new_session->psk_identity,
1438 psk, sizeof(psk));
Adam Langleyd9e397b2015-01-22 14:27:53 -08001439 if (psk_len > PSK_MAX_PSK_LEN) {
Kenny Rootb8494592015-09-25 02:29:14 +00001440 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001441 al = SSL_AD_INTERNAL_ERROR;
1442 goto f_err;
1443 } else if (psk_len == 0) {
1444 /* PSK related to the given identity not found */
Kenny Rootb8494592015-09-25 02:29:14 +00001445 OPENSSL_PUT_ERROR(SSL, SSL_R_PSK_IDENTITY_NOT_FOUND);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001446 al = SSL_AD_UNKNOWN_PSK_IDENTITY;
1447 goto f_err;
1448 }
1449 }
1450
1451 /* Depending on the key exchange method, compute |premaster_secret| and
1452 * |premaster_secret_len|. */
1453 if (alg_k & SSL_kRSA) {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001454 /* Allocate a buffer large enough for an RSA decryption. */
Adam Langley4139edb2016-01-13 15:00:54 -08001455 const size_t rsa_size = ssl_private_key_max_signature_len(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001456 decrypt_buf = OPENSSL_malloc(rsa_size);
1457 if (decrypt_buf == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +00001458 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001459 goto err;
1460 }
1461
Kenny Roote99801b2015-11-06 15:31:15 -08001462 enum ssl_private_key_result_t decrypt_result;
Adam Langley4139edb2016-01-13 15:00:54 -08001463 size_t decrypt_len;
David Benjamind316cba2016-06-02 16:17:39 -04001464 if (ssl->state == SSL3_ST_SR_KEY_EXCH_A) {
Adam Langley4139edb2016-01-13 15:00:54 -08001465 if (!ssl_has_private_key(ssl) ||
David Benjaminc895d6b2016-08-11 13:26:41 -04001466 ssl_private_key_type(ssl) != NID_rsaEncryption) {
Kenny Roote99801b2015-11-06 15:31:15 -08001467 al = SSL_AD_HANDSHAKE_FAILURE;
1468 OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_RSA_CERTIFICATE);
1469 goto f_err;
1470 }
Adam Langley4139edb2016-01-13 15:00:54 -08001471 CBS encrypted_premaster_secret;
1472 if (ssl->version > SSL3_VERSION) {
Kenny Roote99801b2015-11-06 15:31:15 -08001473 if (!CBS_get_u16_length_prefixed(&client_key_exchange,
1474 &encrypted_premaster_secret) ||
1475 CBS_len(&client_key_exchange) != 0) {
Adam Langley4139edb2016-01-13 15:00:54 -08001476 al = SSL_AD_DECODE_ERROR;
1477 OPENSSL_PUT_ERROR(SSL,
1478 SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
1479 goto f_err;
Kenny Roote99801b2015-11-06 15:31:15 -08001480 }
1481 } else {
1482 encrypted_premaster_secret = client_key_exchange;
1483 }
1484
Kenny Roote99801b2015-11-06 15:31:15 -08001485 /* Decrypt with no padding. PKCS#1 padding will be removed as part of the
1486 * timing-sensitive code below. */
1487 decrypt_result = ssl_private_key_decrypt(
Adam Langley4139edb2016-01-13 15:00:54 -08001488 ssl, decrypt_buf, &decrypt_len, rsa_size,
Kenny Roote99801b2015-11-06 15:31:15 -08001489 CBS_data(&encrypted_premaster_secret),
1490 CBS_len(&encrypted_premaster_secret));
1491 } else {
David Benjamind316cba2016-06-02 16:17:39 -04001492 assert(ssl->state == SSL3_ST_SR_KEY_EXCH_B);
Kenny Roote99801b2015-11-06 15:31:15 -08001493 /* Complete async decrypt. */
David Benjaminc895d6b2016-08-11 13:26:41 -04001494 decrypt_result =
1495 ssl_private_key_complete(ssl, decrypt_buf, &decrypt_len, rsa_size);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001496 }
Kenny Roote99801b2015-11-06 15:31:15 -08001497
1498 switch (decrypt_result) {
1499 case ssl_private_key_success:
Kenny Roote99801b2015-11-06 15:31:15 -08001500 break;
1501 case ssl_private_key_failure:
Kenny Roote99801b2015-11-06 15:31:15 -08001502 goto err;
1503 case ssl_private_key_retry:
Adam Langley4139edb2016-01-13 15:00:54 -08001504 ssl->rwstate = SSL_PRIVATE_KEY_OPERATION;
David Benjamind316cba2016-06-02 16:17:39 -04001505 ssl->state = SSL3_ST_SR_KEY_EXCH_B;
Kenny Roote99801b2015-11-06 15:31:15 -08001506 goto err;
1507 }
1508
David Benjamin4969cc92016-04-22 15:02:23 -04001509 if (decrypt_len != rsa_size) {
1510 al = SSL_AD_DECRYPT_ERROR;
1511 OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
1512 goto f_err;
1513 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001514
Adam Langley4139edb2016-01-13 15:00:54 -08001515 /* Prepare a random premaster, to be used on invalid padding. See RFC 5246,
1516 * section 7.4.7.1. */
1517 premaster_secret_len = SSL_MAX_MASTER_KEY_LENGTH;
1518 premaster_secret = OPENSSL_malloc(premaster_secret_len);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001519 if (premaster_secret == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +00001520 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001521 goto err;
1522 }
Adam Langley4139edb2016-01-13 15:00:54 -08001523 if (!RAND_bytes(premaster_secret, premaster_secret_len)) {
1524 goto err;
1525 }
1526
1527 /* The smallest padded premaster is 11 bytes of overhead. Small keys are
1528 * publicly invalid. */
1529 if (decrypt_len < 11 + premaster_secret_len) {
1530 al = SSL_AD_DECRYPT_ERROR;
1531 OPENSSL_PUT_ERROR(SSL, SSL_R_DECRYPTION_FAILED);
1532 goto f_err;
1533 }
1534
1535 /* Check the padding. See RFC 3447, section 7.2.2. */
1536 size_t padding_len = decrypt_len - premaster_secret_len;
1537 uint8_t good = constant_time_eq_int_8(decrypt_buf[0], 0) &
1538 constant_time_eq_int_8(decrypt_buf[1], 2);
David Benjamin7c0d06c2016-08-11 13:26:41 -04001539 for (size_t i = 2; i < padding_len - 1; i++) {
Adam Langley4139edb2016-01-13 15:00:54 -08001540 good &= ~constant_time_is_zero_8(decrypt_buf[i]);
1541 }
1542 good &= constant_time_is_zero_8(decrypt_buf[padding_len - 1]);
1543
1544 /* The premaster secret must begin with |client_version|. This too must be
1545 * checked in constant time (http://eprint.iacr.org/2003/052/). */
1546 good &= constant_time_eq_8(decrypt_buf[padding_len],
1547 (unsigned)(ssl->client_version >> 8));
1548 good &= constant_time_eq_8(decrypt_buf[padding_len + 1],
1549 (unsigned)(ssl->client_version & 0xff));
1550
1551 /* Select, in constant time, either the decrypted premaster or the random
1552 * premaster based on |good|. */
David Benjamin7c0d06c2016-08-11 13:26:41 -04001553 for (size_t i = 0; i < premaster_secret_len; i++) {
Adam Langley4139edb2016-01-13 15:00:54 -08001554 premaster_secret[i] = constant_time_select_8(
1555 good, decrypt_buf[padding_len + i], premaster_secret[i]);
1556 }
1557
Adam Langleyd9e397b2015-01-22 14:27:53 -08001558 OPENSSL_free(decrypt_buf);
1559 decrypt_buf = NULL;
David Benjamind316cba2016-06-02 16:17:39 -04001560 } else if (alg_k & (SSL_kECDHE|SSL_kDHE|SSL_kCECPQ1)) {
1561 /* Parse the ClientKeyExchange. */
Adam Langley4139edb2016-01-13 15:00:54 -08001562 CBS peer_key;
David Benjamin95add822016-10-19 01:09:12 -04001563 if (!SSL_ECDH_CTX_get_key(&ssl->s3->hs->ecdh_ctx, &client_key_exchange,
David Benjamind316cba2016-06-02 16:17:39 -04001564 &peer_key) ||
1565 CBS_len(&client_key_exchange) != 0) {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001566 al = SSL_AD_DECODE_ERROR;
Kenny Rootb8494592015-09-25 02:29:14 +00001567 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001568 goto f_err;
1569 }
1570
Adam Langley4139edb2016-01-13 15:00:54 -08001571 /* Compute the premaster. */
1572 uint8_t alert;
David Benjamin95add822016-10-19 01:09:12 -04001573 if (!SSL_ECDH_CTX_finish(&ssl->s3->hs->ecdh_ctx, &premaster_secret,
David Benjamind316cba2016-06-02 16:17:39 -04001574 &premaster_secret_len, &alert, CBS_data(&peer_key),
1575 CBS_len(&peer_key))) {
Adam Langley4139edb2016-01-13 15:00:54 -08001576 al = alert;
1577 goto f_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001578 }
1579
Adam Langley4139edb2016-01-13 15:00:54 -08001580 /* The key exchange state may now be discarded. */
David Benjamin95add822016-10-19 01:09:12 -04001581 SSL_ECDH_CTX_cleanup(&ssl->s3->hs->ecdh_ctx);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001582 } else if (alg_k & SSL_kPSK) {
1583 /* For plain PSK, other_secret is a block of 0s with the same length as the
1584 * pre-shared key. */
1585 premaster_secret_len = psk_len;
1586 premaster_secret = OPENSSL_malloc(premaster_secret_len);
1587 if (premaster_secret == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +00001588 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001589 goto err;
1590 }
1591 memset(premaster_secret, 0, premaster_secret_len);
1592 } else {
1593 al = SSL_AD_HANDSHAKE_FAILURE;
Kenny Rootb8494592015-09-25 02:29:14 +00001594 OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CIPHER_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001595 goto f_err;
1596 }
1597
1598 /* For a PSK cipher suite, the actual pre-master secret is combined with the
1599 * pre-shared key. */
1600 if (alg_a & SSL_aPSK) {
1601 CBB new_premaster, child;
1602 uint8_t *new_data;
1603 size_t new_len;
1604
Kenny Rootb8494592015-09-25 02:29:14 +00001605 CBB_zero(&new_premaster);
1606 if (!CBB_init(&new_premaster, 2 + psk_len + 2 + premaster_secret_len) ||
1607 !CBB_add_u16_length_prefixed(&new_premaster, &child) ||
Adam Langleyd9e397b2015-01-22 14:27:53 -08001608 !CBB_add_bytes(&child, premaster_secret, premaster_secret_len) ||
1609 !CBB_add_u16_length_prefixed(&new_premaster, &child) ||
1610 !CBB_add_bytes(&child, psk, psk_len) ||
1611 !CBB_finish(&new_premaster, &new_data, &new_len)) {
Kenny Rootb8494592015-09-25 02:29:14 +00001612 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001613 CBB_cleanup(&new_premaster);
1614 goto err;
1615 }
1616
1617 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
1618 OPENSSL_free(premaster_secret);
1619 premaster_secret = new_data;
1620 premaster_secret_len = new_len;
1621 }
1622
1623 /* Compute the master secret */
David Benjaminc895d6b2016-08-11 13:26:41 -04001624 ssl->s3->new_session->master_key_length = tls1_generate_master_secret(
1625 ssl, ssl->s3->new_session->master_key, premaster_secret,
1626 premaster_secret_len);
1627 if (ssl->s3->new_session->master_key_length == 0) {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001628 goto err;
1629 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001630 ssl->s3->new_session->extended_master_secret =
1631 ssl->s3->tmp.extended_master_secret;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001632
1633 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
1634 OPENSSL_free(premaster_secret);
1635 return 1;
1636
1637f_err:
Adam Langley4139edb2016-01-13 15:00:54 -08001638 ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001639err:
Adam Langley4139edb2016-01-13 15:00:54 -08001640 if (premaster_secret != NULL) {
1641 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001642 OPENSSL_free(premaster_secret);
1643 }
Adam Langleye9ada862015-05-11 17:20:37 -07001644 OPENSSL_free(decrypt_buf);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001645
1646 return -1;
1647}
1648
David Benjamin6e899c72016-06-09 18:02:18 -04001649static int ssl3_get_cert_verify(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001650 int al, ret = 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001651 CBS certificate_verify, signature;
Steven Valdez909b19f2016-11-21 15:35:44 -05001652 X509 *peer = ssl->s3->new_session->x509_peer;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001653 EVP_PKEY *pkey = NULL;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001654
1655 /* Only RSA and ECDSA client certificates are supported, so a
1656 * CertificateVerify is required if and only if there's a client certificate.
1657 * */
1658 if (peer == NULL) {
Adam Langley4139edb2016-01-13 15:00:54 -08001659 ssl3_free_handshake_buffer(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001660 return 1;
1661 }
1662
David Benjaminc895d6b2016-08-11 13:26:41 -04001663 int msg_ret = ssl->method->ssl_get_message(ssl, SSL3_MT_CERTIFICATE_VERIFY,
1664 ssl_dont_hash_message);
1665 if (msg_ret <= 0) {
1666 return msg_ret;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001667 }
1668
1669 /* Filter out unsupported certificate types. */
1670 pkey = X509_get_pubkey(peer);
Adam Langleye9ada862015-05-11 17:20:37 -07001671 if (pkey == NULL) {
1672 goto err;
1673 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001674
David Benjaminc895d6b2016-08-11 13:26:41 -04001675 CBS_init(&certificate_verify, ssl->init_msg, ssl->init_num);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001676
1677 /* Determine the digest type if needbe. */
David Benjaminc895d6b2016-08-11 13:26:41 -04001678 uint16_t signature_algorithm = 0;
David Benjamin4969cc92016-04-22 15:02:23 -04001679 if (ssl3_protocol_version(ssl) >= TLS1_2_VERSION) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001680 if (!CBS_get_u16(&certificate_verify, &signature_algorithm)) {
Adam Langleyfad63272015-11-12 12:15:39 -08001681 al = SSL_AD_DECODE_ERROR;
1682 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
1683 goto f_err;
1684 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001685 if (!tls12_check_peer_sigalg(ssl, &al, signature_algorithm)) {
Adam Langleyfad63272015-11-12 12:15:39 -08001686 goto f_err;
1687 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001688 ssl->s3->tmp.peer_signature_algorithm = signature_algorithm;
1689 } else if (pkey->type == EVP_PKEY_RSA) {
1690 signature_algorithm = SSL_SIGN_RSA_PKCS1_MD5_SHA1;
1691 } else if (pkey->type == EVP_PKEY_EC) {
1692 signature_algorithm = SSL_SIGN_ECDSA_SHA1;
1693 } else {
1694 al = SSL_AD_UNSUPPORTED_CERTIFICATE;
1695 OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE);
1696 goto f_err;
Adam Langleye9ada862015-05-11 17:20:37 -07001697 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001698
1699 /* Parse and verify the signature. */
1700 if (!CBS_get_u16_length_prefixed(&certificate_verify, &signature) ||
1701 CBS_len(&certificate_verify) != 0) {
1702 al = SSL_AD_DECODE_ERROR;
Kenny Rootb8494592015-09-25 02:29:14 +00001703 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001704 goto f_err;
1705 }
1706
David Benjaminc895d6b2016-08-11 13:26:41 -04001707 int sig_ok;
1708 /* The SSL3 construction for CertificateVerify does not decompose into a
1709 * single final digest and signature, and must be special-cased. */
1710 if (ssl3_protocol_version(ssl) == SSL3_VERSION) {
1711 const EVP_MD *md;
1712 uint8_t digest[EVP_MAX_MD_SIZE];
1713 size_t digest_len;
1714 if (!ssl3_cert_verify_hash(ssl, &md, digest, &digest_len,
1715 signature_algorithm)) {
1716 goto err;
1717 }
1718
1719 EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL);
1720 sig_ok = pctx != NULL &&
1721 EVP_PKEY_verify_init(pctx) &&
1722 EVP_PKEY_CTX_set_signature_md(pctx, md) &&
1723 EVP_PKEY_verify(pctx, CBS_data(&signature), CBS_len(&signature),
1724 digest, digest_len);
1725 EVP_PKEY_CTX_free(pctx);
1726 } else {
1727 sig_ok = ssl_public_key_verify(
1728 ssl, CBS_data(&signature), CBS_len(&signature), signature_algorithm,
1729 pkey, (const uint8_t *)ssl->s3->handshake_buffer->data,
1730 ssl->s3->handshake_buffer->length);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001731 }
David Benjaminc895d6b2016-08-11 13:26:41 -04001732
David Benjamin4969cc92016-04-22 15:02:23 -04001733#if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
1734 sig_ok = 1;
1735 ERR_clear_error();
1736#endif
1737 if (!sig_ok) {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001738 al = SSL_AD_DECRYPT_ERROR;
Kenny Rootb8494592015-09-25 02:29:14 +00001739 OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_SIGNATURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001740 goto f_err;
1741 }
1742
David Benjaminc895d6b2016-08-11 13:26:41 -04001743 /* The handshake buffer is no longer necessary, and we may hash the current
1744 * message.*/
1745 ssl3_free_handshake_buffer(ssl);
Steven Valdez909b19f2016-11-21 15:35:44 -05001746 if (!ssl_hash_current_message(ssl)) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001747 goto err;
1748 }
1749
Adam Langleyd9e397b2015-01-22 14:27:53 -08001750 ret = 1;
1751
1752 if (0) {
1753 f_err:
Adam Langley4139edb2016-01-13 15:00:54 -08001754 ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001755 }
1756
1757err:
Adam Langleyd9e397b2015-01-22 14:27:53 -08001758 EVP_PKEY_free(pkey);
1759
1760 return ret;
1761}
1762
David Benjamin6e899c72016-06-09 18:02:18 -04001763/* ssl3_get_next_proto reads a Next Protocol Negotiation handshake message. It
1764 * sets the next_proto member in s if found */
1765static int ssl3_get_next_proto(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001766 int ret =
1767 ssl->method->ssl_get_message(ssl, SSL3_MT_NEXT_PROTO, ssl_hash_message);
1768 if (ret <= 0) {
1769 return ret;
1770 }
1771
David Benjamin6e899c72016-06-09 18:02:18 -04001772 CBS next_protocol, selected_protocol, padding;
David Benjaminc895d6b2016-08-11 13:26:41 -04001773 CBS_init(&next_protocol, ssl->init_msg, ssl->init_num);
David Benjamin6e899c72016-06-09 18:02:18 -04001774 if (!CBS_get_u8_length_prefixed(&next_protocol, &selected_protocol) ||
1775 !CBS_get_u8_length_prefixed(&next_protocol, &padding) ||
David Benjamin7c0d06c2016-08-11 13:26:41 -04001776 CBS_len(&next_protocol) != 0) {
1777 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
1778 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1779 return 0;
1780 }
1781
1782 if (!CBS_stow(&selected_protocol, &ssl->s3->next_proto_negotiated,
David Benjamin6e899c72016-06-09 18:02:18 -04001783 &ssl->s3->next_proto_negotiated_len)) {
1784 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001785 }
1786
David Benjamin6e899c72016-06-09 18:02:18 -04001787 return 1;
1788}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001789
David Benjamin6e899c72016-06-09 18:02:18 -04001790/* ssl3_get_channel_id reads and verifies a ClientID handshake message. */
1791static int ssl3_get_channel_id(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001792 int msg_ret = ssl->method->ssl_get_message(ssl, SSL3_MT_CHANNEL_ID,
1793 ssl_dont_hash_message);
1794 if (msg_ret <= 0) {
1795 return msg_ret;
David Benjamin6e899c72016-06-09 18:02:18 -04001796 }
1797
Steven Valdez909b19f2016-11-21 15:35:44 -05001798 if (!tls1_verify_channel_id(ssl) ||
1799 !ssl_hash_current_message(ssl)) {
David Benjamin6e899c72016-06-09 18:02:18 -04001800 return -1;
1801 }
Steven Valdez909b19f2016-11-21 15:35:44 -05001802 return 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -08001803}
1804
David Benjamin6e899c72016-06-09 18:02:18 -04001805static int ssl3_send_new_session_ticket(SSL *ssl) {
David Benjaminc895d6b2016-08-11 13:26:41 -04001806 if (ssl->state == SSL3_ST_SW_SESSION_TICKET_B) {
1807 return ssl->method->write_message(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001808 }
1809
Steven Valdez909b19f2016-11-21 15:35:44 -05001810 const SSL_SESSION *session;
1811 SSL_SESSION *session_copy = NULL;
1812 if (ssl->session == NULL) {
1813 /* Fix the timeout to measure from the ticket issuance time. */
1814 ssl_session_refresh_time(ssl, ssl->s3->new_session);
1815 session = ssl->s3->new_session;
1816 } else {
1817 /* We are renewing an existing session. Duplicate the session to adjust the
1818 * timeout. */
1819 session_copy = SSL_SESSION_dup(ssl->session, SSL_SESSION_INCLUDE_NONAUTH);
1820 if (session_copy == NULL) {
1821 return -1;
1822 }
1823
1824 ssl_session_refresh_time(ssl, session_copy);
1825 session = session_copy;
1826 }
1827
David Benjaminc895d6b2016-08-11 13:26:41 -04001828 CBB cbb, body, ticket;
Steven Valdez909b19f2016-11-21 15:35:44 -05001829 int ok =
1830 ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_NEW_SESSION_TICKET) &&
1831 CBB_add_u32(&body, session->timeout) &&
1832 CBB_add_u16_length_prefixed(&body, &ticket) &&
1833 ssl_encrypt_ticket(ssl, &ticket, session) &&
1834 ssl_complete_message(ssl, &cbb);
1835
1836 SSL_SESSION_free(session_copy);
1837 CBB_cleanup(&cbb);
1838
1839 if (!ok) {
1840 return -1;
David Benjaminc895d6b2016-08-11 13:26:41 -04001841 }
Adam Langleye9ada862015-05-11 17:20:37 -07001842
David Benjaminc895d6b2016-08-11 13:26:41 -04001843 ssl->state = SSL3_ST_SW_SESSION_TICKET_B;
1844 return ssl->method->write_message(ssl);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001845}