blob: c7bc58bc1dd7300521c044443f8f986c9bf81953 [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* 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
Adam Langley95c29f32014-06-20 12:00:00 -0700149#define NETSCAPE_HANG_BUG
150
David Benjamin880b14e2014-08-25 22:35:07 -0400151#include <assert.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700152#include <stdio.h>
David Benjamin22f9bcc2014-07-13 12:29:21 -0400153#include <string.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700154
155#include <openssl/bn.h>
156#include <openssl/buf.h>
David Benjamindc72ff72014-06-25 12:36:10 -0400157#include <openssl/bytestring.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700158#include <openssl/cipher.h>
159#include <openssl/dh.h>
Adam Langley1258b6a2014-06-20 12:00:00 -0700160#include <openssl/ec.h>
161#include <openssl/ecdsa.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700162#include <openssl/evp.h>
163#include <openssl/hmac.h>
164#include <openssl/md5.h>
165#include <openssl/mem.h>
166#include <openssl/obj.h>
167#include <openssl/rand.h>
Adam Langley1258b6a2014-06-20 12:00:00 -0700168#include <openssl/sha.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700169#include <openssl/x509.h>
170
171#include "ssl_locl.h"
Adam Langleyaf6e45b2014-11-03 19:34:49 -0800172#include "../crypto/internal.h"
Adam Langley95c29f32014-06-20 12:00:00 -0700173#include "../crypto/dh/internal.h"
174
Adam Langley95c29f32014-06-20 12:00:00 -0700175static const SSL_METHOD *ssl3_get_server_method(int ver)
176 {
David Benjamin5b33a5e2014-09-24 16:27:30 -0400177 switch (ver)
178 {
179 case TLS1_2_VERSION:
180 return TLSv1_2_server_method();
181 case TLS1_1_VERSION:
182 return TLSv1_1_server_method();
183 case TLS1_VERSION:
184 return TLSv1_server_method();
185 case SSL3_VERSION:
186 return SSLv3_server_method();
187 default:
188 return NULL;
189 }
Adam Langley95c29f32014-06-20 12:00:00 -0700190 }
191
David Benjamin5b33a5e2014-09-24 16:27:30 -0400192IMPLEMENT_tls_meth_func(TLS1_2_VERSION, TLSv1_2_server_method,
193 ssl3_accept,
194 ssl_undefined_function,
195 ssl3_get_server_method,
196 TLSv1_2_enc_data)
197
198IMPLEMENT_tls_meth_func(TLS1_1_VERSION, TLSv1_1_server_method,
199 ssl3_accept,
200 ssl_undefined_function,
201 ssl3_get_server_method,
202 TLSv1_1_enc_data)
203
204IMPLEMENT_tls_meth_func(TLS1_VERSION, TLSv1_server_method,
205 ssl3_accept,
206 ssl_undefined_function,
207 ssl3_get_server_method,
208 TLSv1_enc_data)
209
David Benjamin00075b82014-09-24 15:48:14 -0400210IMPLEMENT_tls_meth_func(SSL3_VERSION, SSLv3_server_method,
Adam Langley95c29f32014-06-20 12:00:00 -0700211 ssl3_accept,
212 ssl_undefined_function,
David Benjamin00075b82014-09-24 15:48:14 -0400213 ssl3_get_server_method,
214 SSLv3_enc_data)
Adam Langley95c29f32014-06-20 12:00:00 -0700215
216int ssl3_accept(SSL *s)
217 {
218 BUF_MEM *buf;
Adam Langleyc26c8022014-06-20 12:00:00 -0700219 unsigned long alg_a;
Adam Langley95c29f32014-06-20 12:00:00 -0700220 void (*cb)(const SSL *ssl,int type,int val)=NULL;
221 int ret= -1;
222 int new_state,state,skip=0;
223
224 ERR_clear_error();
225 ERR_clear_system_error();
226
227 if (s->info_callback != NULL)
228 cb=s->info_callback;
229 else if (s->ctx->info_callback != NULL)
230 cb=s->ctx->info_callback;
231
232 /* init things to blank */
233 s->in_handshake++;
234 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
235
236 if (s->cert == NULL)
237 {
238 OPENSSL_PUT_ERROR(SSL, ssl3_accept, SSL_R_NO_CERTIFICATE_SET);
239 return(-1);
240 }
241
Adam Langley95c29f32014-06-20 12:00:00 -0700242 for (;;)
243 {
244 state=s->state;
245
246 switch (s->state)
247 {
248 case SSL_ST_RENEGOTIATE:
249 s->renegotiate=1;
250 /* s->state=SSL_ST_ACCEPT; */
251
252 case SSL_ST_BEFORE:
253 case SSL_ST_ACCEPT:
254 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
255 case SSL_ST_OK|SSL_ST_ACCEPT:
256
257 s->server=1;
258 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
259
260 if ((s->version>>8) != 3)
261 {
262 OPENSSL_PUT_ERROR(SSL, ssl3_accept, ERR_R_INTERNAL_ERROR);
263 return -1;
264 }
265 s->type=SSL_ST_ACCEPT;
266
267 if (s->init_buf == NULL)
268 {
269 if ((buf=BUF_MEM_new()) == NULL)
270 {
271 ret= -1;
272 goto end;
273 }
274 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
275 {
276 ret= -1;
277 goto end;
278 }
279 s->init_buf=buf;
280 }
281
282 if (!ssl3_setup_buffers(s))
283 {
284 ret= -1;
285 goto end;
286 }
287
288 s->init_num=0;
Adam Langley95c29f32014-06-20 12:00:00 -0700289
290 if (s->state != SSL_ST_RENEGOTIATE)
291 {
292 /* Ok, we now need to push on a buffering BIO so that
293 * the output is sent in a way that TCP likes :-)
294 */
295 if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
296
Adam Langley69a01602014-11-17 17:26:55 -0800297 if (!ssl3_init_finished_mac(s))
298 {
299 OPENSSL_PUT_ERROR(SSL, ssl3_accept, ERR_R_INTERNAL_ERROR);
300 ret = -1;
301 goto end;
302 }
Adam Langley95c29f32014-06-20 12:00:00 -0700303 s->state=SSL3_ST_SR_CLNT_HELLO_A;
304 s->ctx->stats.sess_accept++;
305 }
306 else if (!s->s3->send_connection_binding &&
307 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
308 {
309 /* Server attempting to renegotiate with
310 * client that doesn't support secure
311 * renegotiation.
312 */
313 OPENSSL_PUT_ERROR(SSL, ssl3_accept, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
314 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
315 ret = -1;
316 goto end;
317 }
318 else
319 {
320 /* s->state == SSL_ST_RENEGOTIATE,
321 * we will just send a HelloRequest */
322 s->ctx->stats.sess_accept_renegotiate++;
323 s->state=SSL3_ST_SW_HELLO_REQ_A;
324 }
325 break;
326
327 case SSL3_ST_SW_HELLO_REQ_A:
328 case SSL3_ST_SW_HELLO_REQ_B:
329
330 s->shutdown=0;
331 ret=ssl3_send_hello_request(s);
332 if (ret <= 0) goto end;
333 s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
334 s->state=SSL3_ST_SW_FLUSH;
335 s->init_num=0;
336
Adam Langley69a01602014-11-17 17:26:55 -0800337 if (!ssl3_init_finished_mac(s))
338 {
339 OPENSSL_PUT_ERROR(SSL, ssl3_accept, ERR_R_INTERNAL_ERROR);
340 ret = -1;
341 goto end;
342 }
Adam Langley95c29f32014-06-20 12:00:00 -0700343 break;
344
345 case SSL3_ST_SW_HELLO_REQ_C:
346 s->state=SSL_ST_OK;
347 break;
348
349 case SSL3_ST_SR_CLNT_HELLO_A:
350 case SSL3_ST_SR_CLNT_HELLO_B:
351 case SSL3_ST_SR_CLNT_HELLO_C:
Adam Langleyb2ce0582014-06-20 12:00:00 -0700352 case SSL3_ST_SR_CLNT_HELLO_D:
Adam Langley95c29f32014-06-20 12:00:00 -0700353 s->shutdown=0;
354 ret=ssl3_get_client_hello(s);
Adam Langleyb2ce0582014-06-20 12:00:00 -0700355 if (ret == PENDING_SESSION) {
Adam Langleyb2ce0582014-06-20 12:00:00 -0700356 s->rwstate = SSL_PENDING_SESSION;
357 goto end;
358 }
Adam Langleydc9b1412014-06-20 12:00:00 -0700359 if (ret == CERTIFICATE_SELECTION_PENDING)
360 {
361 s->rwstate = SSL_CERTIFICATE_SELECTION_PENDING;
362 goto end;
363 }
Adam Langley95c29f32014-06-20 12:00:00 -0700364 if (ret <= 0) goto end;
365 s->renegotiate = 2;
366 s->state=SSL3_ST_SW_SRVR_HELLO_A;
367 s->init_num=0;
368 break;
369
370 case SSL3_ST_SW_SRVR_HELLO_A:
371 case SSL3_ST_SW_SRVR_HELLO_B:
372 ret=ssl3_send_server_hello(s);
373 if (ret <= 0) goto end;
Adam Langley95c29f32014-06-20 12:00:00 -0700374 if (s->hit)
375 {
376 if (s->tlsext_ticket_expected)
377 s->state=SSL3_ST_SW_SESSION_TICKET_A;
378 else
379 s->state=SSL3_ST_SW_CHANGE_A;
380 }
Adam Langley95c29f32014-06-20 12:00:00 -0700381 else
David Benjamin2b0aeec2014-07-01 00:39:02 -0400382 s->state = SSL3_ST_SW_CERT_A;
Adam Langley95c29f32014-06-20 12:00:00 -0700383 s->init_num = 0;
384 break;
385
Adam Langley95c29f32014-06-20 12:00:00 -0700386 case SSL3_ST_SW_CERT_A:
387 case SSL3_ST_SW_CERT_B:
David Benjamine8f3d662014-07-12 01:10:19 -0400388 if (ssl_cipher_has_server_public_key(s->s3->tmp.new_cipher))
Adam Langley95c29f32014-06-20 12:00:00 -0700389 {
390 ret=ssl3_send_server_certificate(s);
391 if (ret <= 0) goto end;
David Benjamin6c7aed02014-08-27 16:42:38 -0400392 if (s->s3->tmp.certificate_status_expected)
Adam Langley95c29f32014-06-20 12:00:00 -0700393 s->state=SSL3_ST_SW_CERT_STATUS_A;
394 else
395 s->state=SSL3_ST_SW_KEY_EXCH_A;
396 }
397 else
398 {
399 skip = 1;
400 s->state=SSL3_ST_SW_KEY_EXCH_A;
401 }
Adam Langley95c29f32014-06-20 12:00:00 -0700402 s->init_num=0;
403 break;
404
405 case SSL3_ST_SW_KEY_EXCH_A:
406 case SSL3_ST_SW_KEY_EXCH_B:
Adam Langleyc26c8022014-06-20 12:00:00 -0700407 alg_a = s->s3->tmp.new_cipher->algorithm_auth;
Adam Langley95c29f32014-06-20 12:00:00 -0700408
David Benjaminb9cc33a2014-07-15 00:09:48 -0400409 /* Send a ServerKeyExchange message if:
410 * - The key exchange is ephemeral or anonymous
411 * Diffie-Hellman.
412 * - There is a PSK identity hint.
Adam Langley95c29f32014-06-20 12:00:00 -0700413 *
David Benjaminb9cc33a2014-07-15 00:09:48 -0400414 * TODO(davidben): This logic is currently duplicated
415 * in d1_srvr.c. Fix this. In the meantime, keep them
416 * in sync.
Adam Langley95c29f32014-06-20 12:00:00 -0700417 */
David Benjaminb9cc33a2014-07-15 00:09:48 -0400418 if (ssl_cipher_requires_server_key_exchange(s->s3->tmp.new_cipher) ||
David Benjamin688d8df2014-11-02 23:06:42 -0500419 ((alg_a & SSL_aPSK) && s->psk_identity_hint))
Adam Langley95c29f32014-06-20 12:00:00 -0700420 {
421 ret=ssl3_send_server_key_exchange(s);
422 if (ret <= 0) goto end;
423 }
424 else
425 skip=1;
426
427 s->state=SSL3_ST_SW_CERT_REQ_A;
428 s->init_num=0;
429 break;
430
431 case SSL3_ST_SW_CERT_REQ_A:
432 case SSL3_ST_SW_CERT_REQ_B:
433 if (/* don't request cert unless asked for it: */
434 !(s->verify_mode & SSL_VERIFY_PEER) ||
Adam Langley509e5ed2014-06-20 12:00:00 -0700435 /* Don't request a certificate if an obc was presented */
436 ((s->verify_mode & SSL_VERIFY_PEER_IF_NO_OBC) &&
437 s->s3->tlsext_channel_id_valid) ||
Adam Langley95c29f32014-06-20 12:00:00 -0700438 /* if SSL_VERIFY_CLIENT_ONCE is set,
439 * don't request cert during re-negotiation: */
440 ((s->session->peer != NULL) &&
441 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
442 /* never request cert in anonymous ciphersuites
443 * (see section "Certificate request" in SSL 3 drafts
444 * and in RFC 2246): */
445 ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
446 /* ... except when the application insists on verification
447 * (against the specs, but s3_clnt.c accepts this for SSL 3) */
448 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
Adam Langley95c29f32014-06-20 12:00:00 -0700449 /* With normal PSK Certificates and
450 * Certificate Requests are omitted */
David Benjamind26aea62014-07-12 00:13:56 -0400451 (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
Adam Langley95c29f32014-06-20 12:00:00 -0700452 {
453 /* no cert request */
454 skip=1;
455 s->s3->tmp.cert_request=0;
456 s->state=SSL3_ST_SW_SRVR_DONE_A;
457 if (s->s3->handshake_buffer)
Adam Langley75712922014-10-10 16:23:43 -0700458 if (!ssl3_digest_cached_records(s, free_handshake_buffer))
Adam Langley95c29f32014-06-20 12:00:00 -0700459 return -1;
460 }
461 else
462 {
463 s->s3->tmp.cert_request=1;
464 ret=ssl3_send_certificate_request(s);
465 if (ret <= 0) goto end;
466#ifndef NETSCAPE_HANG_BUG
467 s->state=SSL3_ST_SW_SRVR_DONE_A;
468#else
469 s->state=SSL3_ST_SW_FLUSH;
470 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
471#endif
472 s->init_num=0;
473 }
474 break;
475
476 case SSL3_ST_SW_SRVR_DONE_A:
477 case SSL3_ST_SW_SRVR_DONE_B:
478 ret=ssl3_send_server_done(s);
479 if (ret <= 0) goto end;
480 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
481 s->state=SSL3_ST_SW_FLUSH;
482 s->init_num=0;
483 break;
484
485 case SSL3_ST_SW_FLUSH:
486
487 /* This code originally checked to see if
488 * any data was pending using BIO_CTRL_INFO
489 * and then flushed. This caused problems
490 * as documented in PR#1939. The proposed
491 * fix doesn't completely resolve this issue
492 * as buggy implementations of BIO_CTRL_PENDING
493 * still exist. So instead we just flush
494 * unconditionally.
495 */
496
497 s->rwstate=SSL_WRITING;
498 if (BIO_flush(s->wbio) <= 0)
499 {
500 ret= -1;
501 goto end;
502 }
503 s->rwstate=SSL_NOTHING;
504
505 s->state=s->s3->tmp.next_state;
506 break;
507
508 case SSL3_ST_SR_CERT_A:
509 case SSL3_ST_SR_CERT_B:
David Benjamin92909a62014-08-20 11:40:03 -0400510 if (s->s3->tmp.cert_request)
511 {
512 ret=ssl3_get_client_certificate(s);
513 if (ret <= 0) goto end;
514 }
515 s->init_num=0;
516 s->state=SSL3_ST_SR_KEY_EXCH_A;
Adam Langley95c29f32014-06-20 12:00:00 -0700517 break;
518
519 case SSL3_ST_SR_KEY_EXCH_A:
520 case SSL3_ST_SR_KEY_EXCH_B:
521 ret=ssl3_get_client_key_exchange(s);
522 if (ret <= 0)
523 goto end;
David Benjaminb52e3dd2014-08-20 11:12:48 -0400524 s->state=SSL3_ST_SR_CERT_VRFY_A;
525 s->init_num=0;
Adam Langley95c29f32014-06-20 12:00:00 -0700526 break;
527
528 case SSL3_ST_SR_CERT_VRFY_A:
529 case SSL3_ST_SR_CERT_VRFY_B:
Adam Langley95c29f32014-06-20 12:00:00 -0700530 ret=ssl3_get_cert_verify(s);
531 if (ret <= 0) goto end;
532
David Benjamin84ec49e2014-07-22 14:25:28 -0400533 s->state = SSL3_ST_SR_CHANGE;
Adam Langley95c29f32014-06-20 12:00:00 -0700534 s->init_num=0;
535 break;
536
David Benjamin84ec49e2014-07-22 14:25:28 -0400537 case SSL3_ST_SR_CHANGE: {
Adam Langley1258b6a2014-06-20 12:00:00 -0700538 char next_proto_neg = 0;
539 char channel_id = 0;
Adam Langley1258b6a2014-06-20 12:00:00 -0700540 next_proto_neg = s->s3->next_proto_neg_seen;
Adam Langley1258b6a2014-06-20 12:00:00 -0700541 channel_id = s->s3->tlsext_channel_id_valid;
Adam Langley1258b6a2014-06-20 12:00:00 -0700542
David Benjamin84ec49e2014-07-22 14:25:28 -0400543 /* At this point, the next message must be entirely
544 * behind a ChangeCipherSpec. */
David Benjamin86271ee2014-07-21 16:14:03 -0400545 if (!ssl3_expect_change_cipher_spec(s))
546 {
547 ret = -1;
548 goto end;
549 }
Adam Langley1258b6a2014-06-20 12:00:00 -0700550 if (next_proto_neg)
David Benjamin84ec49e2014-07-22 14:25:28 -0400551 s->state = SSL3_ST_SR_NEXT_PROTO_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700552 else if (channel_id)
David Benjamin84ec49e2014-07-22 14:25:28 -0400553 s->state = SSL3_ST_SR_CHANNEL_ID_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700554 else
David Benjamin84ec49e2014-07-22 14:25:28 -0400555 s->state = SSL3_ST_SR_FINISHED_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700556 break;
557 }
558
Adam Langley95c29f32014-06-20 12:00:00 -0700559 case SSL3_ST_SR_NEXT_PROTO_A:
560 case SSL3_ST_SR_NEXT_PROTO_B:
561 ret=ssl3_get_next_proto(s);
562 if (ret <= 0) goto end;
563 s->init_num = 0;
Adam Langley1258b6a2014-06-20 12:00:00 -0700564 if (s->s3->tlsext_channel_id_valid)
565 s->state=SSL3_ST_SR_CHANNEL_ID_A;
566 else
567 s->state=SSL3_ST_SR_FINISHED_A;
568 break;
Adam Langley1258b6a2014-06-20 12:00:00 -0700569
Adam Langley1258b6a2014-06-20 12:00:00 -0700570 case SSL3_ST_SR_CHANNEL_ID_A:
571 case SSL3_ST_SR_CHANNEL_ID_B:
572 ret=ssl3_get_channel_id(s);
573 if (ret <= 0) goto end;
574 s->init_num = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700575 s->state=SSL3_ST_SR_FINISHED_A;
576 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700577
578 case SSL3_ST_SR_FINISHED_A:
579 case SSL3_ST_SR_FINISHED_B:
580 ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
581 SSL3_ST_SR_FINISHED_B);
582 if (ret <= 0) goto end;
583 if (s->hit)
584 s->state=SSL_ST_OK;
Adam Langley95c29f32014-06-20 12:00:00 -0700585 else if (s->tlsext_ticket_expected)
586 s->state=SSL3_ST_SW_SESSION_TICKET_A;
Adam Langley95c29f32014-06-20 12:00:00 -0700587 else
588 s->state=SSL3_ST_SW_CHANGE_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700589 /* If this is a full handshake with ChannelID then
590 * record the hashshake hashes in |s->session| in case
591 * we need them to verify a ChannelID signature on a
592 * resumption of this session in the future. */
593 if (!s->hit && s->s3->tlsext_channel_id_new)
594 {
595 ret = tls1_record_handshake_hashes_for_channel_id(s);
596 if (ret <= 0) goto end;
597 }
Adam Langley95c29f32014-06-20 12:00:00 -0700598 s->init_num=0;
599 break;
600
Adam Langley95c29f32014-06-20 12:00:00 -0700601 case SSL3_ST_SW_SESSION_TICKET_A:
602 case SSL3_ST_SW_SESSION_TICKET_B:
David Benjamin8da99062014-08-24 12:03:09 -0400603 ret=ssl3_send_new_session_ticket(s);
Adam Langley95c29f32014-06-20 12:00:00 -0700604 if (ret <= 0) goto end;
605 s->state=SSL3_ST_SW_CHANGE_A;
606 s->init_num=0;
607 break;
608
David Benjamin6c7aed02014-08-27 16:42:38 -0400609#if 0
610 // TODO(davidben): Implement OCSP stapling on the server.
Adam Langley95c29f32014-06-20 12:00:00 -0700611 case SSL3_ST_SW_CERT_STATUS_A:
612 case SSL3_ST_SW_CERT_STATUS_B:
613 ret=ssl3_send_cert_status(s);
614 if (ret <= 0) goto end;
615 s->state=SSL3_ST_SW_KEY_EXCH_A;
616 s->init_num=0;
617 break;
David Benjamin6c7aed02014-08-27 16:42:38 -0400618#endif
Adam Langley95c29f32014-06-20 12:00:00 -0700619
620 case SSL3_ST_SW_CHANGE_A:
621 case SSL3_ST_SW_CHANGE_B:
622
623 s->session->cipher=s->s3->tmp.new_cipher;
624 if (!s->method->ssl3_enc->setup_key_block(s))
625 { ret= -1; goto end; }
626
627 ret=ssl3_send_change_cipher_spec(s,
628 SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
629
630 if (ret <= 0) goto end;
631 s->state=SSL3_ST_SW_FINISHED_A;
632 s->init_num=0;
633
634 if (!s->method->ssl3_enc->change_cipher_state(s,
635 SSL3_CHANGE_CIPHER_SERVER_WRITE))
636 {
637 ret= -1;
638 goto end;
639 }
640
641 break;
642
643 case SSL3_ST_SW_FINISHED_A:
644 case SSL3_ST_SW_FINISHED_B:
645 ret=ssl3_send_finished(s,
646 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
647 s->method->ssl3_enc->server_finished_label,
648 s->method->ssl3_enc->server_finished_label_len);
649 if (ret <= 0) goto end;
David Benjamin84ec49e2014-07-22 14:25:28 -0400650 s->state = SSL3_ST_SW_FLUSH;
Adam Langley95c29f32014-06-20 12:00:00 -0700651 if (s->hit)
David Benjamin84ec49e2014-07-22 14:25:28 -0400652 s->s3->tmp.next_state = SSL3_ST_SR_CHANGE;
Adam Langley95c29f32014-06-20 12:00:00 -0700653 else
David Benjamin84ec49e2014-07-22 14:25:28 -0400654 s->s3->tmp.next_state = SSL_ST_OK;
Adam Langley95c29f32014-06-20 12:00:00 -0700655 s->init_num=0;
656 break;
657
658 case SSL_ST_OK:
659 /* clean a few things up */
660 ssl3_cleanup_key_block(s);
661
662 BUF_MEM_free(s->init_buf);
663 s->init_buf=NULL;
664
665 /* remove buffering on output */
666 ssl_free_wbio_buffer(s);
667
668 s->init_num=0;
669
Adam Langley75872532014-06-20 12:00:00 -0700670 /* If we aren't retaining peer certificates then we can
671 * discard it now. */
672 if (s->session->peer && s->ctx->retain_only_sha256_of_client_certs)
673 {
674 X509_free(s->session->peer);
675 s->session->peer = NULL;
676 }
677
Adam Langley95c29f32014-06-20 12:00:00 -0700678 if (s->renegotiate == 2) /* skipped if we just sent a HelloRequest */
679 {
680 s->renegotiate=0;
681 s->new_session=0;
682
683 ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
684
685 s->ctx->stats.sess_accept_good++;
686 /* s->server=1; */
687 s->handshake_func=ssl3_accept;
688
689 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
690 }
691
692 ret = 1;
693 goto end;
694 /* break; */
695
696 default:
697 OPENSSL_PUT_ERROR(SSL, ssl3_accept, SSL_R_UNKNOWN_STATE);
698 ret= -1;
699 goto end;
700 /* break; */
701 }
702
703 if (!s->s3->tmp.reuse_message && !skip)
704 {
705 if (s->debug)
706 {
707 if ((ret=BIO_flush(s->wbio)) <= 0)
708 goto end;
709 }
710
711
712 if ((cb != NULL) && (s->state != state))
713 {
714 new_state=s->state;
715 s->state=state;
716 cb(s,SSL_CB_ACCEPT_LOOP,1);
717 s->state=new_state;
718 }
719 }
720 skip=0;
721 }
722end:
723 /* BIO_flush(s->wbio); */
724
725 s->in_handshake--;
726 if (cb != NULL)
727 cb(s,SSL_CB_ACCEPT_EXIT,ret);
728 return(ret);
729 }
730
731int ssl3_send_hello_request(SSL *s)
732 {
733
734 if (s->state == SSL3_ST_SW_HELLO_REQ_A)
735 {
736 ssl_set_handshake_header(s, SSL3_MT_HELLO_REQUEST, 0);
737 s->state=SSL3_ST_SW_HELLO_REQ_B;
738 }
739
740 /* SSL3_ST_SW_HELLO_REQ_B */
741 return ssl_do_write(s);
742 }
743
Adam Langley95c29f32014-06-20 12:00:00 -0700744int ssl3_get_client_hello(SSL *s)
745 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400746 int i,ok,al=SSL_AD_INTERNAL_ERROR,ret= -1;
Adam Langley95c29f32014-06-20 12:00:00 -0700747 long n;
David Benjamin6f260012014-08-15 13:49:12 -0400748 const SSL_CIPHER *c;
Adam Langley95c29f32014-06-20 12:00:00 -0700749 STACK_OF(SSL_CIPHER) *ciphers=NULL;
Adam Langleydc9b1412014-06-20 12:00:00 -0700750 struct ssl_early_callback_ctx early_ctx;
David Benjamin22f9bcc2014-07-13 12:29:21 -0400751 CBS client_hello;
752 uint16_t client_version;
753 CBS client_random, session_id, cipher_suites, compression_methods;
Adam Langley95c29f32014-06-20 12:00:00 -0700754
755 /* We do this so that we will respond with our native type.
756 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
757 * This down switching should be handled by a different method.
758 * If we are SSLv3, we will respond with SSLv3, even if prompted with
759 * TLSv1.
760 */
Adam Langleydc9b1412014-06-20 12:00:00 -0700761 switch (s->state) {
762 case SSL3_ST_SR_CLNT_HELLO_A:
Adam Langleydc9b1412014-06-20 12:00:00 -0700763 case SSL3_ST_SR_CLNT_HELLO_B:
Adam Langleyb2ce0582014-06-20 12:00:00 -0700764 s->first_packet=1;
765 n=s->method->ssl_get_message(s,
David Benjamin95fcaa42014-08-05 13:10:14 -0400766 SSL3_ST_SR_CLNT_HELLO_A,
Adam Langleyb2ce0582014-06-20 12:00:00 -0700767 SSL3_ST_SR_CLNT_HELLO_B,
Adam Langleyb2ce0582014-06-20 12:00:00 -0700768 SSL3_MT_CLIENT_HELLO,
769 SSL3_RT_MAX_PLAIN_LENGTH,
David Benjamin590cbe92014-08-25 21:34:56 -0400770 SSL_GET_MESSAGE_HASH_MESSAGE,
Adam Langleyb2ce0582014-06-20 12:00:00 -0700771 &ok);
Adam Langley95c29f32014-06-20 12:00:00 -0700772
Adam Langleyb2ce0582014-06-20 12:00:00 -0700773 if (!ok) return((int)n);
774 s->first_packet=0;
Adam Langleydc9b1412014-06-20 12:00:00 -0700775
776 /* If we require cookies and this ClientHello doesn't
777 * contain one, just return since we do not want to
778 * allocate any memory yet. So check cookie length...
779 */
David Benjamin22f9bcc2014-07-13 12:29:21 -0400780 if (SSL_IS_DTLS(s) && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
Adam Langleydc9b1412014-06-20 12:00:00 -0700781 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400782 CBS session_id;
783 uint8_t cookie_length;
Adam Langleydc9b1412014-06-20 12:00:00 -0700784
David Benjamin22f9bcc2014-07-13 12:29:21 -0400785 CBS_init(&client_hello, s->init_msg, n);
786 if (!CBS_skip(&client_hello, 2 + SSL3_RANDOM_SIZE) ||
787 !CBS_get_u8_length_prefixed(&client_hello, &session_id) ||
788 !CBS_get_u8(&client_hello, &cookie_length))
789 {
790 al = SSL_AD_DECODE_ERROR;
791 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
792 goto f_err;
793 }
794
Adam Langleydc9b1412014-06-20 12:00:00 -0700795 if (cookie_length == 0)
796 return 1;
797 }
798 s->state = SSL3_ST_SR_CLNT_HELLO_C;
799 /* fallthrough */
800 case SSL3_ST_SR_CLNT_HELLO_C:
801 case SSL3_ST_SR_CLNT_HELLO_D:
802 /* We have previously parsed the ClientHello message,
803 * and can't call ssl_get_message again without hashing
804 * the message into the Finished digest again. */
Adam Langleyb2ce0582014-06-20 12:00:00 -0700805 n = s->init_num;
Adam Langleydc9b1412014-06-20 12:00:00 -0700806
807 memset(&early_ctx, 0, sizeof(early_ctx));
808 early_ctx.ssl = s;
809 early_ctx.client_hello = s->init_msg;
810 early_ctx.client_hello_len = n;
811 if (!ssl_early_callback_init(&early_ctx))
812 {
813 al = SSL_AD_DECODE_ERROR;
814 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CLIENTHELLO_PARSE_FAILED);
815 goto f_err;
816 }
817
818 if (s->state == SSL3_ST_SR_CLNT_HELLO_C &&
819 s->ctx->select_certificate_cb != NULL)
820 {
821 int ret;
822
823 s->state = SSL3_ST_SR_CLNT_HELLO_D;
824 ret = s->ctx->select_certificate_cb(&early_ctx);
825 if (ret == 0)
826 return CERTIFICATE_SELECTION_PENDING;
827 else if (ret == -1)
828 {
829 /* Connection rejected. */
830 al = SSL_AD_ACCESS_DENIED;
831 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CONNECTION_REJECTED);
832 goto f_err;
833 }
834 }
835 s->state = SSL3_ST_SR_CLNT_HELLO_D;
David Benjamin4c852c52014-07-02 15:24:48 -0400836 break;
Adam Langleydc9b1412014-06-20 12:00:00 -0700837 default:
David Benjamin4c852c52014-07-02 15:24:48 -0400838 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_UNKNOWN_STATE);
Adam Langleydc9b1412014-06-20 12:00:00 -0700839 return -1;
840 }
Adam Langleyb2ce0582014-06-20 12:00:00 -0700841
David Benjamin22f9bcc2014-07-13 12:29:21 -0400842 CBS_init(&client_hello, s->init_msg, n);
843 if (!CBS_get_u16(&client_hello, &client_version) ||
844 !CBS_get_bytes(&client_hello, &client_random, SSL3_RANDOM_SIZE) ||
845 !CBS_get_u8_length_prefixed(&client_hello, &session_id) ||
846 CBS_len(&session_id) > SSL_MAX_SSL_SESSION_ID_LENGTH)
847 {
848 al = SSL_AD_DECODE_ERROR;
849 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
850 goto f_err;
851 }
Adam Langley95c29f32014-06-20 12:00:00 -0700852
853 /* use version from inside client hello, not from record header
854 * (may differ: see RFC 2246, Appendix E, second paragraph) */
David Benjamin22f9bcc2014-07-13 12:29:21 -0400855 s->client_version = client_version;
Adam Langley95c29f32014-06-20 12:00:00 -0700856
857 if (SSL_IS_DTLS(s) ? (s->client_version > s->version &&
858 s->method->version != DTLS_ANY_VERSION)
859 : (s->client_version < s->version))
860 {
861 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_WRONG_VERSION_NUMBER);
862 if ((s->client_version>>8) == SSL3_VERSION_MAJOR &&
863 !s->enc_write_ctx && !s->write_hash)
864 {
865 /* similar to ssl3_get_record, send alert using remote version number */
866 s->version = s->client_version;
867 }
868 al = SSL_AD_PROTOCOL_VERSION;
869 goto f_err;
870 }
871
David Benjamin22f9bcc2014-07-13 12:29:21 -0400872 /* Load the client random. */
873 memcpy(s->s3->client_random, CBS_data(&client_random), SSL3_RANDOM_SIZE);
Adam Langley95c29f32014-06-20 12:00:00 -0700874
875 s->hit=0;
876 /* Versions before 0.9.7 always allow clients to resume sessions in renegotiation.
877 * 0.9.7 and later allow this by default, but optionally ignore resumption requests
878 * with flag SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION (it's a new flag rather
879 * than a change to default behavior so that applications relying on this for security
880 * won't even compile against older library versions).
881 *
882 * 1.0.1 and later also have a function SSL_renegotiate_abbreviated() to request
883 * renegotiation but not a new session (s->new_session remains unset): for servers,
884 * this essentially just means that the SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
885 * setting will be ignored.
886 */
887 if ((s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
888 {
889 if (!ssl_get_new_session(s,1))
890 goto err;
891 }
892 else
893 {
David Benjaminbdf5e722014-11-11 00:52:15 -0500894 i = ssl_get_prev_session(s, &early_ctx);
895 if (i == PENDING_SESSION)
Adam Langleyb2ce0582014-06-20 12:00:00 -0700896 {
897 ret = PENDING_SESSION;
898 goto err;
899 }
David Benjaminbdf5e722014-11-11 00:52:15 -0500900 else if (i == -1)
Adam Langley95c29f32014-06-20 12:00:00 -0700901 {
David Benjaminbdf5e722014-11-11 00:52:15 -0500902 goto err;
903 }
904
905 /* Only resume if the session's version matches the negotiated
906 * version: most clients do not accept a mismatch. */
907 if (i == 1 && s->version == s->session->ssl_version)
908 {
909 s->hit = 1;
910 }
911 else
912 {
913 /* No session was found or it was unacceptable. */
914 if (!ssl_get_new_session(s, 1))
Adam Langley95c29f32014-06-20 12:00:00 -0700915 goto err;
916 }
917 }
918
Adam Langley95c29f32014-06-20 12:00:00 -0700919 if (SSL_IS_DTLS(s))
920 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400921 CBS cookie;
Adam Langley95c29f32014-06-20 12:00:00 -0700922
David Benjamin22f9bcc2014-07-13 12:29:21 -0400923 if (!CBS_get_u8_length_prefixed(&client_hello, &cookie) ||
924 CBS_len(&cookie) > DTLS1_COOKIE_LENGTH)
Adam Langley95c29f32014-06-20 12:00:00 -0700925 {
Adam Langley95c29f32014-06-20 12:00:00 -0700926 al = SSL_AD_DECODE_ERROR;
David Benjamin22f9bcc2014-07-13 12:29:21 -0400927 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -0700928 goto f_err;
929 }
930
David Benjamin22f9bcc2014-07-13 12:29:21 -0400931 /* Verify the cookie if appropriate option is set. */
Adam Langley95c29f32014-06-20 12:00:00 -0700932 if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) &&
David Benjamin22f9bcc2014-07-13 12:29:21 -0400933 CBS_len(&cookie) > 0)
Adam Langley95c29f32014-06-20 12:00:00 -0700934 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400935 if (s->ctx->app_verify_cookie_cb != NULL)
Adam Langley95c29f32014-06-20 12:00:00 -0700936 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400937 if (s->ctx->app_verify_cookie_cb(s,
David Benjaminfb4ea282014-08-15 13:38:15 -0400938 CBS_data(&cookie), CBS_len(&cookie)) == 0)
Adam Langley95c29f32014-06-20 12:00:00 -0700939 {
940 al=SSL_AD_HANDSHAKE_FAILURE;
941 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_COOKIE_MISMATCH);
942 goto f_err;
943 }
944 /* else cookie verification succeeded */
945 }
David Benjamin22f9bcc2014-07-13 12:29:21 -0400946 else if (!CBS_mem_equal(&cookie, s->d1->cookie, s->d1->cookie_len))
Adam Langley95c29f32014-06-20 12:00:00 -0700947 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400948 /* default verification */
949 al=SSL_AD_HANDSHAKE_FAILURE;
950 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_COOKIE_MISMATCH);
951 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -0700952 }
David Benjamin22f9bcc2014-07-13 12:29:21 -0400953 /* Set to -2 so if successful we return 2 and
954 * don't send HelloVerifyRequest. */
Adam Langley95c29f32014-06-20 12:00:00 -0700955 ret = -2;
956 }
957
Adam Langley95c29f32014-06-20 12:00:00 -0700958 if (s->method->version == DTLS_ANY_VERSION)
959 {
960 /* Select version to use */
961 if (s->client_version <= DTLS1_2_VERSION &&
962 !(s->options & SSL_OP_NO_DTLSv1_2))
963 {
964 s->version = DTLS1_2_VERSION;
965 s->method = DTLSv1_2_server_method();
966 }
Adam Langley95c29f32014-06-20 12:00:00 -0700967 else if (s->client_version <= DTLS1_VERSION &&
968 !(s->options & SSL_OP_NO_DTLSv1))
969 {
970 s->version = DTLS1_VERSION;
971 s->method = DTLSv1_server_method();
972 }
973 else
974 {
975 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_WRONG_VERSION_NUMBER);
976 s->version = s->client_version;
977 al = SSL_AD_PROTOCOL_VERSION;
978 goto f_err;
979 }
980 s->session->ssl_version = s->version;
981 }
982 }
983
David Benjamin22f9bcc2014-07-13 12:29:21 -0400984 if (!CBS_get_u16_length_prefixed(&client_hello, &cipher_suites) ||
985 !CBS_get_u8_length_prefixed(&client_hello, &compression_methods) ||
986 CBS_len(&compression_methods) == 0)
Adam Langley95c29f32014-06-20 12:00:00 -0700987 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400988 al = SSL_AD_DECODE_ERROR;
989 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
990 goto f_err;
991 }
992
993 /* TODO(davidben): Per spec, cipher_suites can never be empty
994 * (specified at the ClientHello structure level). This logic
995 * allows it to be empty if resuming a session. Can we always
996 * require non-empty? If a client sends empty cipher_suites
997 * because it's resuming a session, it could always fail to
998 * resume a session, so it's unlikely to actually work. */
999 if (CBS_len(&cipher_suites) == 0 && CBS_len(&session_id) != 0)
1000 {
1001 /* We need a cipher if we are not resuming a session. */
1002 al = SSL_AD_ILLEGAL_PARAMETER;
Adam Langley95c29f32014-06-20 12:00:00 -07001003 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_CIPHERS_SPECIFIED);
1004 goto f_err;
1005 }
David Benjamin22f9bcc2014-07-13 12:29:21 -04001006
David Benjamin9f2c0d72014-10-21 22:00:19 -04001007 ciphers = ssl_bytes_to_cipher_list(s, &cipher_suites);
1008 if (ciphers == NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07001009 {
1010 goto err;
1011 }
Adam Langley95c29f32014-06-20 12:00:00 -07001012
1013 /* If it is a hit, check that the cipher is in the list */
David Benjamin22f9bcc2014-07-13 12:29:21 -04001014 if (s->hit && CBS_len(&cipher_suites) > 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001015 {
David Benjaminfb3ff2c2014-09-30 21:00:38 -04001016 size_t j;
David Benjamin22f9bcc2014-07-13 12:29:21 -04001017 int found_cipher = 0;
1018 unsigned long id = s->session->cipher->id;
Adam Langley95c29f32014-06-20 12:00:00 -07001019
David Benjaminfb3ff2c2014-09-30 21:00:38 -04001020 for (j = 0; j < sk_SSL_CIPHER_num(ciphers); j++)
Adam Langley95c29f32014-06-20 12:00:00 -07001021 {
David Benjaminfb3ff2c2014-09-30 21:00:38 -04001022 c = sk_SSL_CIPHER_value(ciphers, j);
Adam Langley95c29f32014-06-20 12:00:00 -07001023 if (c->id == id)
1024 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001025 found_cipher = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07001026 break;
1027 }
1028 }
David Benjamin22f9bcc2014-07-13 12:29:21 -04001029 if (!found_cipher)
Adam Langley95c29f32014-06-20 12:00:00 -07001030 {
1031 /* we need to have the cipher in the cipher
1032 * list if we are asked to reuse it */
1033 al=SSL_AD_ILLEGAL_PARAMETER;
1034 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_REQUIRED_CIPHER_MISSING);
1035 goto f_err;
1036 }
1037 }
1038
David Benjamin22f9bcc2014-07-13 12:29:21 -04001039 /* Only null compression is supported. */
1040 if (memchr(CBS_data(&compression_methods), 0,
1041 CBS_len(&compression_methods)) == NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07001042 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001043 al = SSL_AD_ILLEGAL_PARAMETER;
Adam Langley95c29f32014-06-20 12:00:00 -07001044 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_COMPRESSION_SPECIFIED);
1045 goto f_err;
1046 }
1047
Adam Langley95c29f32014-06-20 12:00:00 -07001048 /* TLS extensions*/
1049 if (s->version >= SSL3_VERSION)
1050 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001051 if (!ssl_parse_clienthello_tlsext(s, &client_hello))
Adam Langley95c29f32014-06-20 12:00:00 -07001052 {
1053 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_PARSE_TLSEXT);
1054 goto err;
1055 }
1056 }
1057
David Benjamindc72ff72014-06-25 12:36:10 -04001058 /* There should be nothing left over in the record. */
David Benjamin22f9bcc2014-07-13 12:29:21 -04001059 if (CBS_len(&client_hello) != 0)
David Benjamindc72ff72014-06-25 12:36:10 -04001060 {
1061 /* wrong packet length */
1062 al=SSL_AD_DECODE_ERROR;
1063 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_BAD_PACKET_LENGTH);
1064 goto f_err;
1065 }
1066
Adam Langley95c29f32014-06-20 12:00:00 -07001067 /* Check if we want to use external pre-shared secret for this
1068 * handshake for not reused session only. We need to generate
1069 * server_random before calling tls_session_secret_cb in order to allow
1070 * SessionTicket processing to use it in key derivation. */
1071 {
1072 unsigned char *pos;
1073 pos=s->s3->server_random;
1074 if (ssl_fill_hello_random(s, 1, pos, SSL3_RANDOM_SIZE) <= 0)
1075 {
1076 goto f_err;
1077 }
1078 }
1079
1080 if (!s->hit && s->version >= TLS1_VERSION && s->tls_session_secret_cb)
1081 {
David Benjamin6f260012014-08-15 13:49:12 -04001082 const SSL_CIPHER *pref_cipher=NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001083
1084 s->session->master_key_length=sizeof(s->session->master_key);
1085 if(s->tls_session_secret_cb(s, s->session->master_key, &s->session->master_key_length,
1086 ciphers, &pref_cipher, s->tls_session_secret_cb_arg))
1087 {
1088 s->hit=1;
Adam Langley95c29f32014-06-20 12:00:00 -07001089 s->session->verify_result=X509_V_OK;
1090
Adam Langley95c29f32014-06-20 12:00:00 -07001091 /* check if some cipher was preferred by call back */
David Benjamin180d1eb2014-10-01 01:21:51 -04001092 pref_cipher=pref_cipher ? pref_cipher : ssl3_choose_cipher(s, ciphers, ssl_get_cipher_preferences(s));
Adam Langley95c29f32014-06-20 12:00:00 -07001093 if (pref_cipher == NULL)
1094 {
1095 al=SSL_AD_HANDSHAKE_FAILURE;
1096 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_SHARED_CIPHER);
1097 goto f_err;
1098 }
1099
1100 s->session->cipher=pref_cipher;
1101
1102 if (s->cipher_list)
Adam Langley858a88d2014-06-20 12:00:00 -07001103 ssl_cipher_preference_list_free(s->cipher_list);
Adam Langley95c29f32014-06-20 12:00:00 -07001104
1105 if (s->cipher_list_by_id)
1106 sk_SSL_CIPHER_free(s->cipher_list_by_id);
1107
David Benjamin180d1eb2014-10-01 01:21:51 -04001108 s->cipher_list = ssl_cipher_preference_list_from_ciphers(ciphers);
1109 s->cipher_list_by_id = sk_SSL_CIPHER_dup(ciphers);
Adam Langley95c29f32014-06-20 12:00:00 -07001110 }
1111 }
Adam Langley95c29f32014-06-20 12:00:00 -07001112
David Benjamin180d1eb2014-10-01 01:21:51 -04001113 /* Given ciphers and SSL_get_ciphers, we must pick a cipher */
Adam Langley95c29f32014-06-20 12:00:00 -07001114
1115 if (!s->hit)
1116 {
Adam Langley95c29f32014-06-20 12:00:00 -07001117 if (ciphers == NULL)
1118 {
1119 al=SSL_AD_ILLEGAL_PARAMETER;
1120 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_CIPHERS_PASSED);
1121 goto f_err;
1122 }
Adam Langley95c29f32014-06-20 12:00:00 -07001123 /* Let cert callback update server certificates if required */
Adam Langley95c29f32014-06-20 12:00:00 -07001124 if (s->cert->cert_cb)
1125 {
1126 int rv = s->cert->cert_cb(s, s->cert->cert_cb_arg);
1127 if (rv == 0)
1128 {
1129 al=SSL_AD_INTERNAL_ERROR;
1130 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CERT_CB_ERROR);
1131 goto f_err;
1132 }
1133 if (rv < 0)
1134 {
1135 s->rwstate=SSL_X509_LOOKUP;
David Benjamin180d1eb2014-10-01 01:21:51 -04001136 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -07001137 }
1138 s->rwstate = SSL_NOTHING;
1139 }
David Benjamin180d1eb2014-10-01 01:21:51 -04001140 c=ssl3_choose_cipher(s, ciphers, ssl_get_cipher_preferences(s));
Adam Langley95c29f32014-06-20 12:00:00 -07001141
1142 if (c == NULL)
1143 {
1144 al=SSL_AD_HANDSHAKE_FAILURE;
1145 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_SHARED_CIPHER);
1146 goto f_err;
1147 }
1148 s->s3->tmp.new_cipher=c;
1149 }
1150 else
1151 {
1152 /* Session-id reuse */
Adam Langley95c29f32014-06-20 12:00:00 -07001153 s->s3->tmp.new_cipher=s->session->cipher;
1154 }
1155
1156 if (!SSL_USE_SIGALGS(s) || !(s->verify_mode & SSL_VERIFY_PEER))
1157 {
Adam Langley75712922014-10-10 16:23:43 -07001158 if (!ssl3_digest_cached_records(s, free_handshake_buffer))
Adam Langley95c29f32014-06-20 12:00:00 -07001159 goto f_err;
1160 }
1161
1162 /* we now have the following setup.
1163 * client_random
1164 * cipher_list - our prefered list of ciphers
1165 * ciphers - the clients prefered list of ciphers
1166 * compression - basically ignored right now
1167 * ssl version is set - sslv3
1168 * s->session - The ssl session has been setup.
1169 * s->hit - session reuse flag
1170 * s->tmp.new_cipher - the new cipher to use.
1171 */
1172
Adam Langley95c29f32014-06-20 12:00:00 -07001173 if (ret < 0) ret=-ret;
1174 if (0)
1175 {
1176f_err:
1177 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1178 }
1179err:
1180 if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
Adam Langleyb2ce0582014-06-20 12:00:00 -07001181 return ret;
Adam Langley95c29f32014-06-20 12:00:00 -07001182 }
1183
1184int ssl3_send_server_hello(SSL *s)
1185 {
1186 unsigned char *buf;
1187 unsigned char *p,*d;
David Benjamin39482a12014-07-20 13:30:15 -04001188 int sl;
Adam Langley95c29f32014-06-20 12:00:00 -07001189 unsigned long l;
1190
1191 if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
1192 {
Adam Langley1258b6a2014-06-20 12:00:00 -07001193 /* We only accept ChannelIDs on connections with ECDHE in order
1194 * to avoid a known attack while we fix ChannelID itself. */
David Benjamine2793a72014-11-02 19:48:45 -05001195 if (s->s3->tlsext_channel_id_valid &&
Adam Langley1258b6a2014-06-20 12:00:00 -07001196 (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kEECDH) == 0)
1197 s->s3->tlsext_channel_id_valid = 0;
1198
1199 /* If this is a resumption and the original handshake didn't
1200 * support ChannelID then we didn't record the original
1201 * handshake hashes in the session and so cannot resume with
1202 * ChannelIDs. */
1203 if (s->hit &&
1204 s->s3->tlsext_channel_id_new &&
1205 s->session->original_handshake_hash_len == 0)
1206 s->s3->tlsext_channel_id_valid = 0;
1207
Adam Langley95c29f32014-06-20 12:00:00 -07001208 buf=(unsigned char *)s->init_buf->data;
Adam Langley95c29f32014-06-20 12:00:00 -07001209 /* Do the message type and length last */
1210 d=p= ssl_handshake_start(s);
1211
1212 *(p++)=s->version>>8;
1213 *(p++)=s->version&0xff;
1214
1215 /* Random stuff */
1216 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
1217 p+=SSL3_RANDOM_SIZE;
1218
1219 /* There are several cases for the session ID to send
1220 * back in the server hello:
1221 * - For session reuse from the session cache,
1222 * we send back the old session ID.
1223 * - If stateless session reuse (using a session ticket)
1224 * is successful, we send back the client's "session ID"
1225 * (which doesn't actually identify the session).
1226 * - If it is a new session, we send back the new
1227 * session ID.
1228 * - However, if we want the new session to be single-use,
1229 * we send back a 0-length session ID.
1230 * s->hit is non-zero in either case of session reuse,
1231 * so the following won't overwrite an ID that we're supposed
1232 * to send back.
1233 */
1234 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER)
1235 && !s->hit)
1236 s->session->session_id_length=0;
1237
1238 sl=s->session->session_id_length;
1239 if (sl > (int)sizeof(s->session->session_id))
1240 {
1241 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_hello, ERR_R_INTERNAL_ERROR);
1242 return -1;
1243 }
1244 *(p++)=sl;
1245 memcpy(p,s->session->session_id,sl);
1246 p+=sl;
1247
1248 /* put the cipher */
David Benjamin39482a12014-07-20 13:30:15 -04001249 s2n(ssl3_get_cipher_value(s->s3->tmp.new_cipher), p);
Adam Langley95c29f32014-06-20 12:00:00 -07001250
1251 /* put the compression method */
1252 *(p++)=0;
Adam Langley95c29f32014-06-20 12:00:00 -07001253 if (ssl_prepare_serverhello_tlsext(s) <= 0)
1254 {
1255 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_hello, SSL_R_SERVERHELLO_TLSEXT);
1256 return -1;
1257 }
1258 if ((p = ssl_add_serverhello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
1259 {
1260 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_hello, ERR_R_INTERNAL_ERROR);
1261 return -1;
1262 }
Adam Langley95c29f32014-06-20 12:00:00 -07001263 /* do the header */
1264 l=(p-d);
1265 ssl_set_handshake_header(s, SSL3_MT_SERVER_HELLO, l);
1266 s->state=SSL3_ST_SW_SRVR_HELLO_B;
1267 }
1268
1269 /* SSL3_ST_SW_SRVR_HELLO_B */
1270 return ssl_do_write(s);
1271 }
1272
1273int ssl3_send_server_done(SSL *s)
1274 {
1275
1276 if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1277 {
1278 ssl_set_handshake_header(s, SSL3_MT_SERVER_DONE, 0);
1279 s->state = SSL3_ST_SW_SRVR_DONE_B;
1280 }
1281
1282 /* SSL3_ST_SW_SRVR_DONE_B */
1283 return ssl_do_write(s);
1284 }
1285
1286int ssl3_send_server_key_exchange(SSL *s)
1287 {
Adam Langley95c29f32014-06-20 12:00:00 -07001288 unsigned char *q;
1289 int j,num;
Adam Langley95c29f32014-06-20 12:00:00 -07001290 unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1291 unsigned int u;
Adam Langley95c29f32014-06-20 12:00:00 -07001292 DH *dh=NULL,*dhp;
Adam Langley95c29f32014-06-20 12:00:00 -07001293 EC_KEY *ecdh=NULL, *ecdhp;
1294 unsigned char *encodedPoint = NULL;
1295 int encodedlen = 0;
1296 int curve_id = 0;
1297 BN_CTX *bn_ctx = NULL;
David Benjamin77a942b2014-07-15 01:22:50 -04001298 const char* psk_identity_hint = NULL;
1299 size_t psk_identity_hint_len = 0;
Adam Langley95c29f32014-06-20 12:00:00 -07001300 EVP_PKEY *pkey;
Adam Langley95c29f32014-06-20 12:00:00 -07001301 unsigned char *p,*d;
1302 int al,i;
Adam Langleyc26c8022014-06-20 12:00:00 -07001303 unsigned long alg_k;
1304 unsigned long alg_a;
Adam Langley95c29f32014-06-20 12:00:00 -07001305 int n;
1306 CERT *cert;
1307 BIGNUM *r[4];
1308 int nr[4],kn;
1309 BUF_MEM *buf;
1310 EVP_MD_CTX md_ctx;
1311
1312 EVP_MD_CTX_init(&md_ctx);
1313 if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1314 {
Adam Langleyc26c8022014-06-20 12:00:00 -07001315 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
1316 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
Adam Langley95c29f32014-06-20 12:00:00 -07001317 cert=s->cert;
1318
1319 buf=s->init_buf;
1320
1321 r[0]=r[1]=r[2]=r[3]=NULL;
1322 n=0;
Adam Langleyc26c8022014-06-20 12:00:00 -07001323 if (alg_a & SSL_aPSK)
1324 {
1325 /* size for PSK identity hint */
David Benjamin688d8df2014-11-02 23:06:42 -05001326 psk_identity_hint = s->psk_identity_hint;
Adam Langley0289c732014-06-20 12:00:00 -07001327 if (psk_identity_hint)
1328 psk_identity_hint_len = strlen(psk_identity_hint);
1329 else
1330 psk_identity_hint_len = 0;
1331 n+=2+psk_identity_hint_len;
Adam Langleyc26c8022014-06-20 12:00:00 -07001332 }
David Benjamin77a942b2014-07-15 01:22:50 -04001333 if (alg_k & SSL_kEDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001334 {
1335 dhp=cert->dh_tmp;
1336 if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
David Benjamin060d9d22014-07-15 00:54:26 -04001337 dhp=s->cert->dh_tmp_cb(s, 0, 1024);
Adam Langley95c29f32014-06-20 12:00:00 -07001338 if (dhp == NULL)
1339 {
1340 al=SSL_AD_HANDSHAKE_FAILURE;
1341 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_MISSING_TMP_DH_KEY);
1342 goto f_err;
1343 }
1344
1345 if (s->s3->tmp.dh != NULL)
1346 {
1347 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_INTERNAL_ERROR);
1348 goto err;
1349 }
1350
1351 if ((dh=DHparams_dup(dhp)) == NULL)
1352 {
1353 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_DH_LIB);
1354 goto err;
1355 }
1356
1357 s->s3->tmp.dh=dh;
1358 if ((dhp->pub_key == NULL ||
1359 dhp->priv_key == NULL ||
1360 (s->options & SSL_OP_SINGLE_DH_USE)))
1361 {
1362 if(!DH_generate_key(dh))
1363 {
1364 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_DH_LIB);
1365 goto err;
1366 }
1367 }
1368 else
1369 {
1370 dh->pub_key=BN_dup(dhp->pub_key);
1371 dh->priv_key=BN_dup(dhp->priv_key);
1372 if ((dh->pub_key == NULL) ||
1373 (dh->priv_key == NULL))
1374 {
1375 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_DH_LIB);
1376 goto err;
1377 }
1378 }
1379 r[0]=dh->p;
1380 r[1]=dh->g;
1381 r[2]=dh->pub_key;
1382 }
David Benjamin77a942b2014-07-15 01:22:50 -04001383 else
David Benjamin77a942b2014-07-15 01:22:50 -04001384 if (alg_k & SSL_kEECDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001385 {
1386 const EC_GROUP *group;
1387
1388 ecdhp=cert->ecdh_tmp;
1389 if (s->cert->ecdh_tmp_auto)
1390 {
1391 /* Get NID of appropriate shared curve */
David Benjamin072334d2014-07-13 16:24:27 -04001392 int nid = tls1_get_shared_curve(s);
Adam Langley95c29f32014-06-20 12:00:00 -07001393 if (nid != NID_undef)
1394 ecdhp = EC_KEY_new_by_curve_name(nid);
1395 }
1396 else if ((ecdhp == NULL) && s->cert->ecdh_tmp_cb)
1397 {
David Benjamin060d9d22014-07-15 00:54:26 -04001398 ecdhp = s->cert->ecdh_tmp_cb(s, 0, 1024);
Adam Langley95c29f32014-06-20 12:00:00 -07001399 }
1400 if (ecdhp == NULL)
1401 {
1402 al=SSL_AD_HANDSHAKE_FAILURE;
1403 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_MISSING_TMP_ECDH_KEY);
1404 goto f_err;
1405 }
1406
1407 if (s->s3->tmp.ecdh != NULL)
1408 {
1409 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_INTERNAL_ERROR);
1410 goto err;
1411 }
1412
1413 /* Duplicate the ECDH structure. */
1414 if (ecdhp == NULL)
1415 {
1416 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1417 goto err;
1418 }
1419 if (s->cert->ecdh_tmp_auto)
1420 ecdh = ecdhp;
1421 else if ((ecdh = EC_KEY_dup(ecdhp)) == NULL)
1422 {
1423 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1424 goto err;
1425 }
1426
1427 s->s3->tmp.ecdh=ecdh;
1428 if ((EC_KEY_get0_public_key(ecdh) == NULL) ||
1429 (EC_KEY_get0_private_key(ecdh) == NULL) ||
1430 (s->options & SSL_OP_SINGLE_ECDH_USE))
1431 {
1432 if(!EC_KEY_generate_key(ecdh))
1433 {
1434 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1435 goto err;
1436 }
1437 }
1438
1439 if (((group = EC_KEY_get0_group(ecdh)) == NULL) ||
1440 (EC_KEY_get0_public_key(ecdh) == NULL) ||
1441 (EC_KEY_get0_private_key(ecdh) == NULL))
1442 {
1443 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1444 goto err;
1445 }
1446
Adam Langley95c29f32014-06-20 12:00:00 -07001447 /* XXX: For now, we only support ephemeral ECDH
1448 * keys over named (not generic) curves. For
1449 * supported named curves, curve_id is non-zero.
1450 */
1451 if ((curve_id =
1452 tls1_ec_nid2curve_id(EC_GROUP_get_curve_name(group)))
1453 == 0)
1454 {
1455 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1456 goto err;
1457 }
1458
1459 /* Encode the public key.
1460 * First check the size of encoding and
1461 * allocate memory accordingly.
1462 */
1463 encodedlen = EC_POINT_point2oct(group,
1464 EC_KEY_get0_public_key(ecdh),
1465 POINT_CONVERSION_UNCOMPRESSED,
1466 NULL, 0, NULL);
1467
1468 encodedPoint = (unsigned char *)
1469 OPENSSL_malloc(encodedlen*sizeof(unsigned char));
1470 bn_ctx = BN_CTX_new();
1471 if ((encodedPoint == NULL) || (bn_ctx == NULL))
1472 {
1473 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_MALLOC_FAILURE);
1474 goto err;
1475 }
1476
1477
1478 encodedlen = EC_POINT_point2oct(group,
1479 EC_KEY_get0_public_key(ecdh),
1480 POINT_CONVERSION_UNCOMPRESSED,
1481 encodedPoint, encodedlen, bn_ctx);
1482
1483 if (encodedlen == 0)
1484 {
1485 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1486 goto err;
1487 }
1488
1489 BN_CTX_free(bn_ctx); bn_ctx=NULL;
1490
1491 /* XXX: For now, we only support named (not
1492 * generic) curves in ECDH ephemeral key exchanges.
1493 * In this situation, we need four additional bytes
1494 * to encode the entire ServerECDHParams
1495 * structure.
1496 */
Adam Langleyc26c8022014-06-20 12:00:00 -07001497 n += 4 + encodedlen;
Adam Langley95c29f32014-06-20 12:00:00 -07001498
1499 /* We'll generate the serverKeyExchange message
1500 * explicitly so we can set these to NULLs
1501 */
1502 r[0]=NULL;
1503 r[1]=NULL;
1504 r[2]=NULL;
1505 r[3]=NULL;
1506 }
David Benjamin77a942b2014-07-15 01:22:50 -04001507 else
David Benjamin77a942b2014-07-15 01:22:50 -04001508 if (!(alg_k & SSL_kPSK))
Adam Langley95c29f32014-06-20 12:00:00 -07001509 {
1510 al=SSL_AD_HANDSHAKE_FAILURE;
1511 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1512 goto f_err;
1513 }
1514 for (i=0; i < 4 && r[i] != NULL; i++)
1515 {
1516 nr[i]=BN_num_bytes(r[i]);
1517 n+=2+nr[i];
1518 }
1519
David Benjamine8f3d662014-07-12 01:10:19 -04001520 if (ssl_cipher_has_server_public_key(s->s3->tmp.new_cipher))
Adam Langley95c29f32014-06-20 12:00:00 -07001521 {
David Benjaminec2f27d2014-11-13 19:17:25 -05001522 if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
Adam Langley95c29f32014-06-20 12:00:00 -07001523 == NULL)
1524 {
1525 al=SSL_AD_DECODE_ERROR;
1526 goto f_err;
1527 }
1528 kn=EVP_PKEY_size(pkey);
1529 }
1530 else
1531 {
1532 pkey=NULL;
1533 kn=0;
1534 }
1535
1536 if (!BUF_MEM_grow_clean(buf,n+SSL_HM_HEADER_LENGTH(s)+kn))
1537 {
1538 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_LIB_BUF);
1539 goto err;
1540 }
1541 d = p = ssl_handshake_start(s);
1542
1543 for (i=0; i < 4 && r[i] != NULL; i++)
1544 {
1545 s2n(nr[i],p);
1546 BN_bn2bin(r[i],p);
1547 p+=nr[i];
1548 }
1549
Adam Langleyc26c8022014-06-20 12:00:00 -07001550/* Note: ECDHE PSK ciphersuites use SSL_kEECDH and SSL_aPSK.
1551 * When one of them is used, the server key exchange record needs to have both
1552 * the psk_identity_hint and the ServerECDHParams. */
Adam Langleyc26c8022014-06-20 12:00:00 -07001553 if (alg_a & SSL_aPSK)
1554 {
Adam Langley0289c732014-06-20 12:00:00 -07001555 /* copy PSK identity hint (if provided) */
1556 s2n(psk_identity_hint_len, p);
1557 if (psk_identity_hint_len > 0)
Adam Langleyc26c8022014-06-20 12:00:00 -07001558 {
Adam Langley0289c732014-06-20 12:00:00 -07001559 memcpy(p, psk_identity_hint, psk_identity_hint_len);
1560 p+=psk_identity_hint_len;
Adam Langleyc26c8022014-06-20 12:00:00 -07001561 }
1562 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001563
Adam Langleyc26c8022014-06-20 12:00:00 -07001564 if (alg_k & SSL_kEECDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001565 {
1566 /* XXX: For now, we only support named (not generic) curves.
1567 * In this situation, the serverKeyExchange message has:
1568 * [1 byte CurveType], [2 byte CurveName]
1569 * [1 byte length of encoded point], followed by
1570 * the actual encoded point itself
1571 */
1572 *p = NAMED_CURVE_TYPE;
1573 p += 1;
1574 *p = 0;
1575 p += 1;
1576 *p = curve_id;
1577 p += 1;
1578 *p = encodedlen;
1579 p += 1;
1580 memcpy((unsigned char*)p,
1581 (unsigned char *)encodedPoint,
1582 encodedlen);
1583 OPENSSL_free(encodedPoint);
1584 encodedPoint = NULL;
1585 p += encodedlen;
1586 }
Adam Langley95c29f32014-06-20 12:00:00 -07001587
1588 /* not anonymous */
1589 if (pkey != NULL)
1590 {
1591 /* n is the length of the params, they start at &(d[4])
1592 * and p points to the space at the end. */
Adam Langley95c29f32014-06-20 12:00:00 -07001593 if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s))
1594 {
1595 q=md_buf;
1596 j=0;
1597 for (num=2; num > 0; num--)
1598 {
David Benjamine7127782014-08-18 23:15:29 -04001599 EVP_DigestInit_ex(&md_ctx,
1600 (num == 2) ? EVP_md5() : EVP_sha1(), NULL);
Adam Langley95c29f32014-06-20 12:00:00 -07001601 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1602 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1603 EVP_DigestUpdate(&md_ctx,d,n);
1604 EVP_DigestFinal_ex(&md_ctx,q,
1605 (unsigned int *)&i);
1606 q+=i;
1607 j+=i;
1608 }
1609 if (RSA_sign(NID_md5_sha1, md_buf, j,
1610 &(p[2]), &u, pkey->pkey.rsa) <= 0)
1611 {
1612 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_LIB_RSA);
1613 goto err;
1614 }
1615 s2n(u,p);
1616 n+=u+2;
1617 }
1618 else
Adam Langley95c29f32014-06-20 12:00:00 -07001619 {
David Benjaminec2f27d2014-11-13 19:17:25 -05001620 const EVP_MD *md;
David Benjaminfd617a52014-10-31 00:21:46 -04001621 size_t sig_len = EVP_PKEY_size(pkey);
1622
David Benjaminec2f27d2014-11-13 19:17:25 -05001623
Adam Langley95c29f32014-06-20 12:00:00 -07001624 /* send signature algorithm */
1625 if (SSL_USE_SIGALGS(s))
1626 {
David Benjaminec2f27d2014-11-13 19:17:25 -05001627 md = tls1_choose_signing_digest(s, pkey);
Adam Langley95c29f32014-06-20 12:00:00 -07001628 if (!tls12_get_sigandhash(p, pkey, md))
1629 {
1630 /* Should never happen */
1631 al=SSL_AD_INTERNAL_ERROR;
1632 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_INTERNAL_ERROR);
1633 goto f_err;
1634 }
1635 p+=2;
1636 }
David Benjaminec2f27d2014-11-13 19:17:25 -05001637 else
1638 {
1639 md = EVP_sha1();
1640 }
David Benjaminfd617a52014-10-31 00:21:46 -04001641 if (!EVP_DigestSignInit(&md_ctx, NULL, md, NULL, pkey) ||
1642 !EVP_DigestSignUpdate(&md_ctx, s->s3->client_random, SSL3_RANDOM_SIZE) ||
1643 !EVP_DigestSignUpdate(&md_ctx, s->s3->server_random, SSL3_RANDOM_SIZE) ||
1644 !EVP_DigestSignUpdate(&md_ctx, d, n) ||
1645 !EVP_DigestSignFinal(&md_ctx, &p[2], &sig_len))
Adam Langley95c29f32014-06-20 12:00:00 -07001646 {
1647 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_LIB_EVP);
1648 goto err;
1649 }
David Benjaminfd617a52014-10-31 00:21:46 -04001650 s2n(sig_len, p);
1651 n += sig_len + 2;
Adam Langley95c29f32014-06-20 12:00:00 -07001652 if (SSL_USE_SIGALGS(s))
David Benjaminfd617a52014-10-31 00:21:46 -04001653 n += 2;
Adam Langley95c29f32014-06-20 12:00:00 -07001654 }
Adam Langley95c29f32014-06-20 12:00:00 -07001655 }
1656
1657 ssl_set_handshake_header(s, SSL3_MT_SERVER_KEY_EXCHANGE, n);
1658 }
1659
1660 s->state = SSL3_ST_SW_KEY_EXCH_B;
1661 EVP_MD_CTX_cleanup(&md_ctx);
1662 return ssl_do_write(s);
1663f_err:
1664 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1665err:
Adam Langley95c29f32014-06-20 12:00:00 -07001666 if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1667 BN_CTX_free(bn_ctx);
Adam Langley95c29f32014-06-20 12:00:00 -07001668 EVP_MD_CTX_cleanup(&md_ctx);
1669 return(-1);
1670 }
1671
1672int ssl3_send_certificate_request(SSL *s)
1673 {
1674 unsigned char *p,*d;
David Benjaminfb3ff2c2014-09-30 21:00:38 -04001675 size_t i;
1676 int j,nl,off,n;
Adam Langley95c29f32014-06-20 12:00:00 -07001677 STACK_OF(X509_NAME) *sk=NULL;
1678 X509_NAME *name;
1679 BUF_MEM *buf;
1680
1681 if (s->state == SSL3_ST_SW_CERT_REQ_A)
1682 {
1683 buf=s->init_buf;
1684
1685 d=p=ssl_handshake_start(s);
1686
1687 /* get the list of acceptable cert types */
1688 p++;
1689 n=ssl3_get_req_cert_type(s,p);
1690 d[0]=n;
1691 p+=n;
1692 n++;
1693
1694 if (SSL_USE_SIGALGS(s))
1695 {
1696 const unsigned char *psigs;
1697 nl = tls12_get_psigalgs(s, &psigs);
1698 s2n(nl, p);
1699 memcpy(p, psigs, nl);
1700 p += nl;
1701 n += nl + 2;
1702 }
1703
1704 off=n;
1705 p+=2;
1706 n+=2;
1707
1708 sk=SSL_get_client_CA_list(s);
1709 nl=0;
1710 if (sk != NULL)
1711 {
1712 for (i=0; i<sk_X509_NAME_num(sk); i++)
1713 {
1714 name=sk_X509_NAME_value(sk,i);
1715 j=i2d_X509_NAME(name,NULL);
1716 if (!BUF_MEM_grow_clean(buf,SSL_HM_HEADER_LENGTH(s)+n+j+2))
1717 {
1718 OPENSSL_PUT_ERROR(SSL, ssl3_send_certificate_request, ERR_R_BUF_LIB);
1719 goto err;
1720 }
1721 p = ssl_handshake_start(s) + n;
Alex Chernyakhovsky9c890d42014-07-05 00:53:11 -04001722 s2n(j,p);
1723 i2d_X509_NAME(name,&p);
1724 n+=2+j;
1725 nl+=2+j;
Adam Langley95c29f32014-06-20 12:00:00 -07001726 }
1727 }
1728 /* else no CA names */
1729 p = ssl_handshake_start(s) + off;
1730 s2n(nl,p);
1731
1732 ssl_set_handshake_header(s, SSL3_MT_CERTIFICATE_REQUEST, n);
1733
1734#ifdef NETSCAPE_HANG_BUG
1735 if (!SSL_IS_DTLS(s))
1736 {
Adam Langleyce1cfe12014-06-20 12:00:00 -07001737 if (!BUF_MEM_grow_clean(buf, s->init_num + 4))
1738 {
1739 OPENSSL_PUT_ERROR(SSL, ssl3_send_certificate_request, ERR_R_BUF_LIB);
1740 goto err;
1741 }
Adam Langley95c29f32014-06-20 12:00:00 -07001742 p=(unsigned char *)s->init_buf->data + s->init_num;
1743 /* do the header */
1744 *(p++)=SSL3_MT_SERVER_DONE;
1745 *(p++)=0;
1746 *(p++)=0;
1747 *(p++)=0;
1748 s->init_num += 4;
1749 }
1750#endif
1751
1752 s->state = SSL3_ST_SW_CERT_REQ_B;
1753 }
1754
1755 /* SSL3_ST_SW_CERT_REQ_B */
1756 return ssl_do_write(s);
1757err:
1758 return(-1);
1759 }
1760
1761int ssl3_get_client_key_exchange(SSL *s)
1762 {
David Benjamin35c02302014-07-13 04:14:59 -04001763 int al,ok;
Adam Langley95c29f32014-06-20 12:00:00 -07001764 long n;
David Benjamin35c02302014-07-13 04:14:59 -04001765 CBS client_key_exchange;
Adam Langley95c29f32014-06-20 12:00:00 -07001766 unsigned long alg_k;
Adam Langleyc26c8022014-06-20 12:00:00 -07001767 unsigned long alg_a;
David Benjamin35c02302014-07-13 04:14:59 -04001768 uint8_t *premaster_secret = NULL;
David Benjamin14c83e72014-07-13 04:54:57 -04001769 size_t premaster_secret_len = 0;
Adam Langley95c29f32014-06-20 12:00:00 -07001770 RSA *rsa=NULL;
David Benjamin0aa07672014-07-24 15:34:14 -04001771 uint8_t *decrypt_buf = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001772 EVP_PKEY *pkey=NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001773 BIGNUM *pub=NULL;
David Benjaminbd30f8e2014-08-19 16:02:38 -04001774 DH *dh_srvr;
Adam Langley95c29f32014-06-20 12:00:00 -07001775
Adam Langley95c29f32014-06-20 12:00:00 -07001776 EC_KEY *srvr_ecdh = NULL;
1777 EVP_PKEY *clnt_pub_pkey = NULL;
1778 EC_POINT *clnt_ecpoint = NULL;
Adam Langleyc26c8022014-06-20 12:00:00 -07001779 BN_CTX *bn_ctx = NULL;
Adam Langleyc26c8022014-06-20 12:00:00 -07001780 unsigned int psk_len = 0;
1781 unsigned char psk[PSK_MAX_PSK_LEN];
Adam Langley95c29f32014-06-20 12:00:00 -07001782
1783 n=s->method->ssl_get_message(s,
1784 SSL3_ST_SR_KEY_EXCH_A,
1785 SSL3_ST_SR_KEY_EXCH_B,
1786 SSL3_MT_CLIENT_KEY_EXCHANGE,
1787 2048, /* ??? */
David Benjamin590cbe92014-08-25 21:34:56 -04001788 SSL_GET_MESSAGE_HASH_MESSAGE,
Adam Langley95c29f32014-06-20 12:00:00 -07001789 &ok);
1790
1791 if (!ok) return((int)n);
David Benjamin35c02302014-07-13 04:14:59 -04001792 CBS_init(&client_key_exchange, s->init_msg, n);
Adam Langley95c29f32014-06-20 12:00:00 -07001793
1794 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
Adam Langleyc26c8022014-06-20 12:00:00 -07001795 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
Adam Langley95c29f32014-06-20 12:00:00 -07001796
David Benjamin14c83e72014-07-13 04:54:57 -04001797 /* If using a PSK key exchange, prepare the pre-shared key. */
Adam Langleyc26c8022014-06-20 12:00:00 -07001798 if (alg_a & SSL_aPSK)
1799 {
David Benjamin35c02302014-07-13 04:14:59 -04001800 CBS psk_identity;
Adam Langleyc26c8022014-06-20 12:00:00 -07001801
David Benjamin35c02302014-07-13 04:14:59 -04001802 /* If using PSK, the ClientKeyExchange contains a
1803 * psk_identity. If PSK, then this is the only field
1804 * in the message. */
1805 if (!CBS_get_u16_length_prefixed(&client_key_exchange, &psk_identity) ||
1806 ((alg_k & SSL_kPSK) && CBS_len(&client_key_exchange) != 0))
Adam Langleyc26c8022014-06-20 12:00:00 -07001807 {
David Benjamin35c02302014-07-13 04:14:59 -04001808 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DECODE_ERROR);
1809 al = SSL_AD_DECODE_ERROR;
David Benjamin14c83e72014-07-13 04:54:57 -04001810 goto f_err;
Adam Langleyc26c8022014-06-20 12:00:00 -07001811 }
David Benjamin35c02302014-07-13 04:14:59 -04001812
Adam Langleyc26c8022014-06-20 12:00:00 -07001813 if (s->psk_server_callback == NULL)
1814 {
1815 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_PSK_NO_SERVER_CB);
David Benjamin35c02302014-07-13 04:14:59 -04001816 al = SSL_AD_INTERNAL_ERROR;
David Benjamin14c83e72014-07-13 04:54:57 -04001817 goto f_err;
Adam Langleyc26c8022014-06-20 12:00:00 -07001818 }
1819
David Benjamin35c02302014-07-13 04:14:59 -04001820 if (CBS_len(&psk_identity) > PSK_MAX_IDENTITY_LEN ||
1821 CBS_contains_zero_byte(&psk_identity))
1822 {
1823 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DATA_LENGTH_TOO_LONG);
1824 al = SSL_AD_ILLEGAL_PARAMETER;
David Benjamin14c83e72014-07-13 04:54:57 -04001825 goto f_err;
David Benjamin35c02302014-07-13 04:14:59 -04001826 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001827
David Benjamin35c02302014-07-13 04:14:59 -04001828 if (!CBS_strdup(&psk_identity, &s->session->psk_identity))
1829 {
1830 al = SSL_AD_INTERNAL_ERROR;
1831 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
David Benjamin14c83e72014-07-13 04:54:57 -04001832 goto f_err;
David Benjamin35c02302014-07-13 04:14:59 -04001833 }
1834
1835 /* Look up the key for the identity. */
1836 psk_len = s->psk_server_callback(s, s->session->psk_identity, psk, sizeof(psk));
Adam Langleyc26c8022014-06-20 12:00:00 -07001837 if (psk_len > PSK_MAX_PSK_LEN)
1838 {
1839 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_INTERNAL_ERROR);
David Benjamin35c02302014-07-13 04:14:59 -04001840 al = SSL_AD_INTERNAL_ERROR;
David Benjamin14c83e72014-07-13 04:54:57 -04001841 goto f_err;
Adam Langleyc26c8022014-06-20 12:00:00 -07001842 }
1843 else if (psk_len == 0)
1844 {
1845 /* PSK related to the given identity not found */
1846 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_PSK_IDENTITY_NOT_FOUND);
David Benjamin35c02302014-07-13 04:14:59 -04001847 al = SSL_AD_UNKNOWN_PSK_IDENTITY;
Adam Langleyc26c8022014-06-20 12:00:00 -07001848 goto f_err;
David Benjamin14c83e72014-07-13 04:54:57 -04001849 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001850 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001851
David Benjamin14c83e72014-07-13 04:54:57 -04001852 /* Depending on the key exchange method, compute |premaster_secret| and
David Benjaminbd30f8e2014-08-19 16:02:38 -04001853 * |premaster_secret_len|. */
David Benjamin35c02302014-07-13 04:14:59 -04001854 if (alg_k & SSL_kRSA)
Adam Langley95c29f32014-06-20 12:00:00 -07001855 {
David Benjamin35c02302014-07-13 04:14:59 -04001856 CBS encrypted_premaster_secret;
David Benjamin0aa07672014-07-24 15:34:14 -04001857 uint8_t rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
Adam Langleyaf6e45b2014-11-03 19:34:49 -08001858 uint8_t good;
David Benjamin0aa07672014-07-24 15:34:14 -04001859 size_t rsa_size, decrypt_len, premaster_index, j;
Adam Langleyacff73f2014-06-20 12:00:00 -07001860
David Benjaminb9cc33a2014-07-15 00:09:48 -04001861 pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1862 if ( (pkey == NULL) ||
1863 (pkey->type != EVP_PKEY_RSA) ||
1864 (pkey->pkey.rsa == NULL))
Adam Langley95c29f32014-06-20 12:00:00 -07001865 {
David Benjaminb9cc33a2014-07-15 00:09:48 -04001866 al=SSL_AD_HANDSHAKE_FAILURE;
1867 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_RSA_CERTIFICATE);
1868 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001869 }
David Benjaminb9cc33a2014-07-15 00:09:48 -04001870 rsa=pkey->pkey.rsa;
Adam Langley95c29f32014-06-20 12:00:00 -07001871
David Benjamincc23df52014-08-03 13:37:47 -04001872 /* TLS and [incidentally] DTLS{0xFEFF} */
David Benjamin35c02302014-07-13 04:14:59 -04001873 if (s->version > SSL3_VERSION)
Adam Langley95c29f32014-06-20 12:00:00 -07001874 {
David Benjamin35c02302014-07-13 04:14:59 -04001875 CBS copy = client_key_exchange;
1876 if (!CBS_get_u16_length_prefixed(&client_key_exchange,
1877 &encrypted_premaster_secret) ||
1878 CBS_len(&client_key_exchange) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001879 {
1880 if (!(s->options & SSL_OP_TLS_D5_BUG))
1881 {
Adam Langleyacff73f2014-06-20 12:00:00 -07001882 al = SSL_AD_DECODE_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07001883 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
Adam Langleyacff73f2014-06-20 12:00:00 -07001884 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001885 }
1886 else
David Benjamin35c02302014-07-13 04:14:59 -04001887 encrypted_premaster_secret = copy;
Adam Langley95c29f32014-06-20 12:00:00 -07001888 }
Adam Langley95c29f32014-06-20 12:00:00 -07001889 }
David Benjamin35c02302014-07-13 04:14:59 -04001890 else
1891 encrypted_premaster_secret = client_key_exchange;
Adam Langley95c29f32014-06-20 12:00:00 -07001892
David Benjamin0aa07672014-07-24 15:34:14 -04001893 /* Reject overly short RSA keys because we want to be sure that
1894 * the buffer size makes it safe to iterate over the entire size
1895 * of a premaster secret (SSL_MAX_MASTER_KEY_LENGTH). The actual
1896 * expected size is larger due to RSA padding, but the bound is
1897 * sufficient to be safe. */
1898 rsa_size = RSA_size(rsa);
1899 if (rsa_size < SSL_MAX_MASTER_KEY_LENGTH)
Adam Langley95c29f32014-06-20 12:00:00 -07001900 {
Adam Langleyacff73f2014-06-20 12:00:00 -07001901 al = SSL_AD_DECRYPT_ERROR;
1902 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DECRYPTION_FAILED);
1903 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001904 }
1905
Adam Langleyacff73f2014-06-20 12:00:00 -07001906 /* We must not leak whether a decryption failure occurs because
1907 * of Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see
1908 * RFC 2246, section 7.4.7.1). The code follows that advice of
1909 * the TLS RFC and generates a random premaster secret for the
1910 * case that the decrypt fails. See
1911 * https://tools.ietf.org/html/rfc5246#section-7.4.7.1 */
1912 if (RAND_pseudo_bytes(rand_premaster_secret,
1913 sizeof(rand_premaster_secret)) <= 0)
1914 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -07001915
David Benjamin35c02302014-07-13 04:14:59 -04001916 /* Allocate a buffer large enough for an RSA decryption. */
David Benjamin0aa07672014-07-24 15:34:14 -04001917 decrypt_buf = OPENSSL_malloc(rsa_size);
1918 if (decrypt_buf == NULL)
David Benjamin35c02302014-07-13 04:14:59 -04001919 {
1920 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
1921 goto err;
1922 }
1923
David Benjamin0aa07672014-07-24 15:34:14 -04001924 /* Decrypt with no padding. PKCS#1 padding will be removed as
1925 * part of the timing-sensitive code below. */
1926 if (!RSA_decrypt(rsa, &decrypt_len, decrypt_buf, rsa_size,
1927 CBS_data(&encrypted_premaster_secret),
1928 CBS_len(&encrypted_premaster_secret),
1929 RSA_NO_PADDING))
1930 {
1931 goto err;
1932 }
1933 if (decrypt_len != rsa_size)
1934 {
1935 /* This should never happen, but do a check so we do not
1936 * read uninitialized memory. */
1937 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_INTERNAL_ERROR);
1938 goto err;
1939 }
David Benjamin35c02302014-07-13 04:14:59 -04001940
Adam Langleyaf6e45b2014-11-03 19:34:49 -08001941 /* Remove the PKCS#1 padding and adjust |decrypt_len| as
1942 * appropriate. |good| will be 0xff if the premaster is
1943 * acceptable and zero otherwise. */
1944 good = constant_time_eq_int_8(
1945 RSA_message_index_PKCS1_type_2(decrypt_buf, decrypt_len, &premaster_index), 1);
David Benjamin0aa07672014-07-24 15:34:14 -04001946 decrypt_len = decrypt_len - premaster_index;
Adam Langleyacff73f2014-06-20 12:00:00 -07001947
David Benjamin0aa07672014-07-24 15:34:14 -04001948 /* decrypt_len should be SSL_MAX_MASTER_KEY_LENGTH. */
Adam Langleyaf6e45b2014-11-03 19:34:49 -08001949 good &= constant_time_eq_8(decrypt_len, SSL_MAX_MASTER_KEY_LENGTH);
David Benjamin0aa07672014-07-24 15:34:14 -04001950
1951 /* Copy over the unpadded premaster. Whatever the value of
1952 * |decrypt_good_mask|, copy as if the premaster were the right
1953 * length. It is important the memory access pattern be
1954 * constant. */
1955 premaster_secret = BUF_memdup(
1956 decrypt_buf + (rsa_size - SSL_MAX_MASTER_KEY_LENGTH),
1957 SSL_MAX_MASTER_KEY_LENGTH);
1958 if (premaster_secret == NULL)
1959 {
1960 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
1961 goto err;
1962 }
1963 OPENSSL_free(decrypt_buf);
1964 decrypt_buf = NULL;
Adam Langleyacff73f2014-06-20 12:00:00 -07001965
1966 /* If the version in the decrypted pre-master secret is correct
Adam Langleyaf6e45b2014-11-03 19:34:49 -08001967 * then version_good will be 0xff, otherwise it'll be zero. The
1968 * Klima-Pokorny-Rosa extension of Bleichenbacher's attack
Adam Langleyacff73f2014-06-20 12:00:00 -07001969 * (http://eprint.iacr.org/2003/052/) exploits the version
1970 * number check as a "bad version oracle". Thus version checks
1971 * are done in constant time and are treated like any other
1972 * decryption error. */
Adam Langleyaf6e45b2014-11-03 19:34:49 -08001973 good &= constant_time_eq_8(premaster_secret[0], (unsigned)(s->client_version>>8));
1974 good &= constant_time_eq_8(premaster_secret[1], (unsigned)(s->client_version&0xff));
Adam Langleyacff73f2014-06-20 12:00:00 -07001975
David Benjamin35c02302014-07-13 04:14:59 -04001976 /* Now copy rand_premaster_secret over premaster_secret using
Adam Langleyacff73f2014-06-20 12:00:00 -07001977 * decrypt_good_mask. */
1978 for (j = 0; j < sizeof(rand_premaster_secret); j++)
Adam Langley95c29f32014-06-20 12:00:00 -07001979 {
Adam Langleyaf6e45b2014-11-03 19:34:49 -08001980 premaster_secret[j] = constant_time_select_8(good, premaster_secret[j], rand_premaster_secret[j]);
Adam Langley95c29f32014-06-20 12:00:00 -07001981 }
Adam Langleyacff73f2014-06-20 12:00:00 -07001982
David Benjamin14c83e72014-07-13 04:54:57 -04001983 premaster_secret_len = sizeof(rand_premaster_secret);
Adam Langley95c29f32014-06-20 12:00:00 -07001984 }
David Benjamin0da0e182014-08-19 16:20:28 -04001985 else if (alg_k & SSL_kEDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001986 {
David Benjamin35c02302014-07-13 04:14:59 -04001987 CBS dh_Yc;
David Benjamin35c02302014-07-13 04:14:59 -04001988 int dh_len;
David Benjamin35c02302014-07-13 04:14:59 -04001989
1990 if (!CBS_get_u16_length_prefixed(&client_key_exchange, &dh_Yc) ||
David Benjaminbd30f8e2014-08-19 16:02:38 -04001991 CBS_len(&dh_Yc) == 0 ||
David Benjamin35c02302014-07-13 04:14:59 -04001992 CBS_len(&client_key_exchange) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001993 {
David Benjamin35c02302014-07-13 04:14:59 -04001994 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1995 al = SSL_R_DECODE_ERROR;
1996 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001997 }
David Benjamin35c02302014-07-13 04:14:59 -04001998
David Benjamin0da0e182014-08-19 16:20:28 -04001999 if (s->s3->tmp.dh == NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07002000 {
2001 al=SSL_AD_HANDSHAKE_FAILURE;
2002 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_TMP_DH_KEY);
2003 goto f_err;
2004 }
David Benjamin0da0e182014-08-19 16:20:28 -04002005 dh_srvr=s->s3->tmp.dh;
Adam Langley95c29f32014-06-20 12:00:00 -07002006
David Benjaminbd30f8e2014-08-19 16:02:38 -04002007 pub = BN_bin2bn(CBS_data(&dh_Yc), CBS_len(&dh_Yc), NULL);
Adam Langley95c29f32014-06-20 12:00:00 -07002008 if (pub == NULL)
2009 {
2010 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_BN_LIB);
2011 goto err;
2012 }
2013
David Benjamin35c02302014-07-13 04:14:59 -04002014 /* Allocate a buffer for the premaster secret. */
2015 premaster_secret = OPENSSL_malloc(DH_size(dh_srvr));
2016 if (premaster_secret == NULL)
2017 {
2018 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2019 goto err;
2020 }
Adam Langley95c29f32014-06-20 12:00:00 -07002021
David Benjamin35c02302014-07-13 04:14:59 -04002022 dh_len = DH_compute_key(premaster_secret, pub, dh_srvr);
2023 if (dh_len <= 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002024 {
2025 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_DH_LIB);
2026 BN_clear_free(pub);
2027 goto err;
2028 }
2029
2030 DH_free(s->s3->tmp.dh);
2031 s->s3->tmp.dh=NULL;
David Benjaminbd30f8e2014-08-19 16:02:38 -04002032 BN_clear_free(pub);
Adam Langley95c29f32014-06-20 12:00:00 -07002033 pub=NULL;
David Benjamin14c83e72014-07-13 04:54:57 -04002034
2035 premaster_secret_len = dh_len;
Adam Langley95c29f32014-06-20 12:00:00 -07002036 }
Adam Langley95c29f32014-06-20 12:00:00 -07002037
David Benjamin0da0e182014-08-19 16:20:28 -04002038 else if (alg_k & SSL_kEECDH)
Adam Langley95c29f32014-06-20 12:00:00 -07002039 {
David Benjamin35c02302014-07-13 04:14:59 -04002040 int field_size = 0, ecdh_len;
Adam Langley95c29f32014-06-20 12:00:00 -07002041 const EC_KEY *tkey;
2042 const EC_GROUP *group;
2043 const BIGNUM *priv_key;
David Benjaminbd30f8e2014-08-19 16:02:38 -04002044 CBS ecdh_Yc;
Adam Langley95c29f32014-06-20 12:00:00 -07002045
2046 /* initialize structures for server's ECDH key pair */
2047 if ((srvr_ecdh = EC_KEY_new()) == NULL)
2048 {
2049 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2050 goto err;
2051 }
2052
David Benjamin0da0e182014-08-19 16:20:28 -04002053 /* Use the ephermeral values we saved when generating the
2054 * ServerKeyExchange msg. */
2055 tkey = s->s3->tmp.ecdh;
Adam Langley95c29f32014-06-20 12:00:00 -07002056
2057 group = EC_KEY_get0_group(tkey);
2058 priv_key = EC_KEY_get0_private_key(tkey);
2059
2060 if (!EC_KEY_set_group(srvr_ecdh, group) ||
2061 !EC_KEY_set_private_key(srvr_ecdh, priv_key))
2062 {
2063 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_EC_LIB);
2064 goto err;
2065 }
2066
2067 /* Let's get client's public key */
2068 if ((clnt_ecpoint = EC_POINT_new(group)) == NULL)
2069 {
2070 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2071 goto err;
2072 }
2073
David Benjaminbd30f8e2014-08-19 16:02:38 -04002074 /* Get client's public key from encoded point
2075 * in the ClientKeyExchange message.
2076 */
2077 if (!CBS_get_u8_length_prefixed(&client_key_exchange, &ecdh_Yc) ||
2078 CBS_len(&client_key_exchange) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002079 {
David Benjaminbd30f8e2014-08-19 16:02:38 -04002080 al = SSL_AD_DECODE_ERROR;
2081 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DECODE_ERROR);
2082 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07002083 }
David Benjaminbd30f8e2014-08-19 16:02:38 -04002084
2085 if ((bn_ctx = BN_CTX_new()) == NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07002086 {
David Benjaminbd30f8e2014-08-19 16:02:38 -04002087 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2088 goto err;
2089 }
David Benjamin35c02302014-07-13 04:14:59 -04002090
David Benjaminbd30f8e2014-08-19 16:02:38 -04002091 if (!EC_POINT_oct2point(group, clnt_ecpoint,
2092 CBS_data(&ecdh_Yc), CBS_len(&ecdh_Yc), bn_ctx))
2093 {
2094 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_EC_LIB);
2095 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -07002096 }
2097
David Benjamin35c02302014-07-13 04:14:59 -04002098 /* Allocate a buffer for both the secret and the PSK. */
Adam Langley95c29f32014-06-20 12:00:00 -07002099 field_size = EC_GROUP_get_degree(group);
2100 if (field_size <= 0)
2101 {
2102 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_ECDH_LIB);
2103 goto err;
2104 }
David Benjamin35c02302014-07-13 04:14:59 -04002105
2106 ecdh_len = (field_size + 7) / 8;
2107 premaster_secret = OPENSSL_malloc(ecdh_len);
2108 if (premaster_secret == NULL)
2109 {
2110 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2111 goto err;
2112 }
2113
2114 /* Compute the shared pre-master secret */
2115 ecdh_len = ECDH_compute_key(premaster_secret,
2116 ecdh_len, clnt_ecpoint, srvr_ecdh, NULL);
2117 if (ecdh_len <= 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002118 {
2119 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_ECDH_LIB);
2120 goto err;
2121 }
2122
2123 EVP_PKEY_free(clnt_pub_pkey);
David Benjamin8f1ef1d2014-10-28 01:07:54 -04002124 clnt_pub_pkey = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002125 EC_POINT_free(clnt_ecpoint);
David Benjamin8f1ef1d2014-10-28 01:07:54 -04002126 clnt_ecpoint = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002127 EC_KEY_free(srvr_ecdh);
David Benjamin8f1ef1d2014-10-28 01:07:54 -04002128 srvr_ecdh = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002129 BN_CTX_free(bn_ctx);
David Benjamin8f1ef1d2014-10-28 01:07:54 -04002130 bn_ctx = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002131 EC_KEY_free(s->s3->tmp.ecdh);
Adam Langleyc26c8022014-06-20 12:00:00 -07002132 s->s3->tmp.ecdh = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002133
David Benjamin14c83e72014-07-13 04:54:57 -04002134 premaster_secret_len = ecdh_len;
Adam Langleyc26c8022014-06-20 12:00:00 -07002135 }
David Benjamin14c83e72014-07-13 04:54:57 -04002136 else if (alg_k & SSL_kPSK)
2137 {
2138 /* For plain PSK, other_secret is a block of 0s with the same
2139 * length as the pre-shared key. */
2140 premaster_secret_len = psk_len;
2141 premaster_secret = OPENSSL_malloc(premaster_secret_len);
2142 if (premaster_secret == NULL)
2143 {
2144 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2145 goto err;
2146 }
2147 memset(premaster_secret, 0, premaster_secret_len);
2148 }
David Benjamin820c74a2014-07-13 04:22:14 -04002149 else
Adam Langley95c29f32014-06-20 12:00:00 -07002150 {
2151 al=SSL_AD_HANDSHAKE_FAILURE;
2152 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_UNKNOWN_CIPHER_TYPE);
2153 goto f_err;
2154 }
2155
David Benjamin14c83e72014-07-13 04:54:57 -04002156 /* For a PSK cipher suite, the actual pre-master secret is combined with
2157 * the pre-shared key. */
2158 if (alg_a & SSL_aPSK)
2159 {
2160 CBB new_premaster, child;
2161 uint8_t *new_data;
2162 size_t new_len;
2163
2164 if (!CBB_init(&new_premaster, 2 + psk_len + 2 + premaster_secret_len))
2165 {
2166 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2167 goto err;
2168 }
2169 if (!CBB_add_u16_length_prefixed(&new_premaster, &child) ||
2170 !CBB_add_bytes(&child, premaster_secret, premaster_secret_len) ||
2171 !CBB_add_u16_length_prefixed(&new_premaster, &child) ||
2172 !CBB_add_bytes(&child, psk, psk_len) ||
2173 !CBB_finish(&new_premaster, &new_data, &new_len))
2174 {
2175 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_INTERNAL_ERROR);
2176 CBB_cleanup(&new_premaster);
2177 goto err;
2178 }
2179
2180 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
2181 OPENSSL_free(premaster_secret);
2182 premaster_secret = new_data;
2183 premaster_secret_len = new_len;
2184 }
David Benjamin14c83e72014-07-13 04:54:57 -04002185
2186 /* Compute the master secret */
2187 s->session->master_key_length = s->method->ssl3_enc
2188 ->generate_master_secret(s,
2189 s->session->master_key, premaster_secret, premaster_secret_len);
Adam Langley75712922014-10-10 16:23:43 -07002190 if (s->session->master_key_length == 0)
2191 goto err;
2192 s->session->extended_master_secret = s->s3->tmp.extended_master_secret;
David Benjamin14c83e72014-07-13 04:54:57 -04002193
2194 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
2195 OPENSSL_free(premaster_secret);
David Benjaminbd30f8e2014-08-19 16:02:38 -04002196 return 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002197f_err:
2198 ssl3_send_alert(s,SSL3_AL_FATAL,al);
Adam Langley95c29f32014-06-20 12:00:00 -07002199err:
David Benjamin35c02302014-07-13 04:14:59 -04002200 if (premaster_secret)
David Benjamin14c83e72014-07-13 04:54:57 -04002201 {
2202 if (premaster_secret_len)
2203 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
David Benjamin35c02302014-07-13 04:14:59 -04002204 OPENSSL_free(premaster_secret);
David Benjamin14c83e72014-07-13 04:54:57 -04002205 }
David Benjamin0aa07672014-07-24 15:34:14 -04002206 if (decrypt_buf)
2207 OPENSSL_free(decrypt_buf);
Adam Langley95c29f32014-06-20 12:00:00 -07002208 EVP_PKEY_free(clnt_pub_pkey);
2209 EC_POINT_free(clnt_ecpoint);
2210 if (srvr_ecdh != NULL)
2211 EC_KEY_free(srvr_ecdh);
2212 BN_CTX_free(bn_ctx);
Adam Langley95c29f32014-06-20 12:00:00 -07002213 return(-1);
2214 }
2215
2216int ssl3_get_cert_verify(SSL *s)
2217 {
Adam Langley95c29f32014-06-20 12:00:00 -07002218 int al,ok,ret=0;
2219 long n;
David Benjamin6897dbe2014-07-12 20:18:28 -04002220 CBS certificate_verify, signature;
David Benjamin6553b372014-07-22 14:11:30 -04002221 X509 *peer = s->session->peer;
David Benjamin854dd652014-08-26 00:32:30 -04002222 EVP_PKEY *pkey = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002223 const EVP_MD *md = NULL;
David Benjamin854dd652014-08-26 00:32:30 -04002224 uint8_t digest[EVP_MAX_MD_SIZE];
2225 size_t digest_length;
2226 EVP_PKEY_CTX *pctx = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002227
David Benjaminef865502014-08-24 02:48:34 -04002228 /* Only RSA and ECDSA client certificates are supported, so a
2229 * CertificateVerify is required if and only if there's a
2230 * client certificate. */
2231 if (peer == NULL)
David Benjamin6553b372014-07-22 14:11:30 -04002232 {
Adam Langley75712922014-10-10 16:23:43 -07002233 if (s->s3->handshake_buffer && !ssl3_digest_cached_records(s, free_handshake_buffer))
David Benjamin854dd652014-08-26 00:32:30 -04002234 return -1;
2235 return 1;
David Benjamin6553b372014-07-22 14:11:30 -04002236 }
2237
Adam Langley95c29f32014-06-20 12:00:00 -07002238 n=s->method->ssl_get_message(s,
2239 SSL3_ST_SR_CERT_VRFY_A,
2240 SSL3_ST_SR_CERT_VRFY_B,
David Benjamin6553b372014-07-22 14:11:30 -04002241 SSL3_MT_CERTIFICATE_VERIFY,
Adam Langley887b1c32014-07-24 18:00:06 -07002242 SSL3_RT_MAX_PLAIN_LENGTH,
David Benjamin854dd652014-08-26 00:32:30 -04002243 SSL_GET_MESSAGE_DONT_HASH_MESSAGE,
Adam Langley95c29f32014-06-20 12:00:00 -07002244 &ok);
2245
David Benjamin734fca02014-08-05 13:06:20 -04002246 if (!ok)
David Benjamin854dd652014-08-26 00:32:30 -04002247 return (int)n;
Adam Langley95c29f32014-06-20 12:00:00 -07002248
David Benjamin854dd652014-08-26 00:32:30 -04002249 /* Filter out unsupported certificate types. */
David Benjaminef865502014-08-24 02:48:34 -04002250 pkey = X509_get_pubkey(peer);
David Benjamin854dd652014-08-26 00:32:30 -04002251 if (!(X509_certificate_type(peer, pkey) & EVP_PKT_SIGN) ||
2252 (pkey->type != EVP_PKEY_RSA && pkey->type != EVP_PKEY_EC))
David Benjaminef865502014-08-24 02:48:34 -04002253 {
David Benjaminef865502014-08-24 02:48:34 -04002254 al = SSL_AD_UNSUPPORTED_CERTIFICATE;
2255 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE);
2256 goto f_err;
2257 }
2258
David Benjamin6897dbe2014-07-12 20:18:28 -04002259 CBS_init(&certificate_verify, s->init_msg, n);
2260
David Benjamin854dd652014-08-26 00:32:30 -04002261 /* Determine the digest type if needbe. */
Adam Langley3213bed2014-06-23 12:26:07 -07002262 if (SSL_USE_SIGALGS(s))
Adam Langley95c29f32014-06-20 12:00:00 -07002263 {
David Benjamin05da6e12014-07-12 20:42:55 -04002264 if (!tls12_check_peer_sigalg(&md, &al, s, &certificate_verify, pkey))
David Benjamin6897dbe2014-07-12 20:18:28 -04002265 goto f_err;
Adam Langley3213bed2014-06-23 12:26:07 -07002266 }
David Benjamin6897dbe2014-07-12 20:18:28 -04002267
David Benjamin854dd652014-08-26 00:32:30 -04002268 /* Compute the digest. */
2269 if (!ssl3_cert_verify_hash(s, digest, &digest_length, &md, pkey))
2270 goto err;
2271
2272 /* The handshake buffer is no longer necessary, and we may hash the
2273 * current message.*/
Adam Langley75712922014-10-10 16:23:43 -07002274 if (s->s3->handshake_buffer && !ssl3_digest_cached_records(s, free_handshake_buffer))
David Benjamin854dd652014-08-26 00:32:30 -04002275 goto err;
2276 ssl3_hash_current_message(s);
2277
2278 /* Parse and verify the signature. */
David Benjamin6897dbe2014-07-12 20:18:28 -04002279 if (!CBS_get_u16_length_prefixed(&certificate_verify, &signature) ||
2280 CBS_len(&certificate_verify) != 0)
Adam Langley3213bed2014-06-23 12:26:07 -07002281 {
David Benjamin6897dbe2014-07-12 20:18:28 -04002282 al = SSL_AD_DECODE_ERROR;
2283 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07002284 goto f_err;
2285 }
2286
David Benjamin854dd652014-08-26 00:32:30 -04002287 pctx = EVP_PKEY_CTX_new(pkey, NULL);
2288 if (pctx == NULL)
2289 goto err;
2290 if (!EVP_PKEY_verify_init(pctx) ||
2291 !EVP_PKEY_CTX_set_signature_md(pctx, md) ||
2292 !EVP_PKEY_verify(pctx, CBS_data(&signature), CBS_len(&signature),
2293 digest, digest_length))
Adam Langley95c29f32014-06-20 12:00:00 -07002294 {
David Benjamin854dd652014-08-26 00:32:30 -04002295 al = SSL_AD_DECRYPT_ERROR;
2296 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_BAD_SIGNATURE);
Adam Langley95c29f32014-06-20 12:00:00 -07002297 goto f_err;
2298 }
2299
David Benjamin854dd652014-08-26 00:32:30 -04002300 ret = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002301 if (0)
2302 {
2303f_err:
2304 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2305 }
David Benjamin854dd652014-08-26 00:32:30 -04002306err:
2307 EVP_PKEY_CTX_free(pctx);
Adam Langley95c29f32014-06-20 12:00:00 -07002308 EVP_PKEY_free(pkey);
2309 return(ret);
2310 }
2311
2312int ssl3_get_client_certificate(SSL *s)
2313 {
2314 int i,ok,al,ret= -1;
2315 X509 *x=NULL;
David Benjamind5b1f842014-07-11 23:43:48 -04002316 unsigned long n;
Adam Langley95c29f32014-06-20 12:00:00 -07002317 STACK_OF(X509) *sk=NULL;
Adam Langley75872532014-06-20 12:00:00 -07002318 SHA256_CTX sha256;
David Benjamind5b1f842014-07-11 23:43:48 -04002319 CBS certificate_msg, certificate_list;
2320 int is_first_certificate = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002321
2322 n=s->method->ssl_get_message(s,
2323 SSL3_ST_SR_CERT_A,
2324 SSL3_ST_SR_CERT_B,
2325 -1,
2326 s->max_cert_list,
David Benjamin590cbe92014-08-25 21:34:56 -04002327 SSL_GET_MESSAGE_HASH_MESSAGE,
Adam Langley95c29f32014-06-20 12:00:00 -07002328 &ok);
2329
2330 if (!ok) return((int)n);
2331
2332 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
2333 {
2334 if ( (s->verify_mode & SSL_VERIFY_PEER) &&
2335 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
2336 {
2337 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
2338 al=SSL_AD_HANDSHAKE_FAILURE;
2339 goto f_err;
2340 }
2341 /* If tls asked for a client cert, the client must return a 0 list */
2342 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
2343 {
2344 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
2345 al=SSL_AD_UNEXPECTED_MESSAGE;
2346 goto f_err;
2347 }
2348 s->s3->tmp.reuse_message=1;
2349 return(1);
2350 }
2351
2352 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
2353 {
2354 al=SSL_AD_UNEXPECTED_MESSAGE;
2355 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_WRONG_MESSAGE_TYPE);
2356 goto f_err;
2357 }
David Benjamind5b1f842014-07-11 23:43:48 -04002358
David Benjamin51b1f742014-07-12 16:31:12 -04002359 CBS_init(&certificate_msg, s->init_msg, n);
Adam Langley95c29f32014-06-20 12:00:00 -07002360
2361 if ((sk=sk_X509_new_null()) == NULL)
2362 {
2363 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_MALLOC_FAILURE);
2364 goto err;
2365 }
2366
David Benjamind5b1f842014-07-11 23:43:48 -04002367 if (!CBS_get_u24_length_prefixed(&certificate_msg, &certificate_list) ||
2368 CBS_len(&certificate_msg) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002369 {
David Benjamind5b1f842014-07-11 23:43:48 -04002370 al = SSL_AD_DECODE_ERROR;
2371 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07002372 goto f_err;
2373 }
David Benjamind5b1f842014-07-11 23:43:48 -04002374
2375 while (CBS_len(&certificate_list) > 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002376 {
David Benjamind5b1f842014-07-11 23:43:48 -04002377 CBS certificate;
2378 const uint8_t *data;
2379
2380 if (!CBS_get_u24_length_prefixed(&certificate_list, &certificate))
Adam Langley95c29f32014-06-20 12:00:00 -07002381 {
David Benjamind5b1f842014-07-11 23:43:48 -04002382 al = SSL_AD_DECODE_ERROR;
2383 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07002384 goto f_err;
2385 }
David Benjamind5b1f842014-07-11 23:43:48 -04002386 if (is_first_certificate && s->ctx->retain_only_sha256_of_client_certs)
Adam Langley75872532014-06-20 12:00:00 -07002387 {
2388 /* If this is the first certificate, and we don't want
2389 * to keep peer certificates in memory, then we hash it
2390 * right away. */
2391 SHA256_Init(&sha256);
David Benjamind5b1f842014-07-11 23:43:48 -04002392 SHA256_Update(&sha256, CBS_data(&certificate), CBS_len(&certificate));
Adam Langley75872532014-06-20 12:00:00 -07002393 SHA256_Final(s->session->peer_sha256, &sha256);
2394 s->session->peer_sha256_valid = 1;
2395 }
David Benjamind5b1f842014-07-11 23:43:48 -04002396 is_first_certificate = 0;
2397 data = CBS_data(&certificate);
2398 x = d2i_X509(NULL, &data, CBS_len(&certificate));
Adam Langley95c29f32014-06-20 12:00:00 -07002399 if (x == NULL)
2400 {
David Benjamind5b1f842014-07-11 23:43:48 -04002401 al = SSL_AD_BAD_CERTIFICATE;
Adam Langley95c29f32014-06-20 12:00:00 -07002402 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_ASN1_LIB);
David Benjamind5b1f842014-07-11 23:43:48 -04002403 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07002404 }
David Benjamind5b1f842014-07-11 23:43:48 -04002405 if (!CBS_skip(&certificate, data - CBS_data(&certificate)))
Adam Langley95c29f32014-06-20 12:00:00 -07002406 {
David Benjamind5b1f842014-07-11 23:43:48 -04002407 al = SSL_AD_INTERNAL_ERROR;
2408 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_INTERNAL_ERROR);
2409 goto f_err;
2410 }
2411 if (CBS_len(&certificate) != 0)
2412 {
2413 al = SSL_AD_DECODE_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07002414 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_CERT_LENGTH_MISMATCH);
2415 goto f_err;
2416 }
2417 if (!sk_X509_push(sk,x))
2418 {
2419 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_MALLOC_FAILURE);
2420 goto err;
2421 }
David Benjamind5b1f842014-07-11 23:43:48 -04002422 x = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002423 }
2424
2425 if (sk_X509_num(sk) <= 0)
2426 {
2427 /* TLS does not mind 0 certs returned */
2428 if (s->version == SSL3_VERSION)
2429 {
2430 al=SSL_AD_HANDSHAKE_FAILURE;
2431 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_NO_CERTIFICATES_RETURNED);
2432 goto f_err;
2433 }
2434 /* Fail for TLS only if we required a certificate */
2435 else if ((s->verify_mode & SSL_VERIFY_PEER) &&
2436 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
2437 {
2438 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
2439 al=SSL_AD_HANDSHAKE_FAILURE;
2440 goto f_err;
2441 }
2442 /* No client certificate so digest cached records */
Adam Langley75712922014-10-10 16:23:43 -07002443 if (s->s3->handshake_buffer && !ssl3_digest_cached_records(s, free_handshake_buffer))
Adam Langley95c29f32014-06-20 12:00:00 -07002444 {
2445 al=SSL_AD_INTERNAL_ERROR;
2446 goto f_err;
2447 }
2448 }
2449 else
2450 {
2451 i=ssl_verify_cert_chain(s,sk);
2452 if (i <= 0)
2453 {
2454 al=ssl_verify_alarm_type(s->verify_result);
2455 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_CERTIFICATE_VERIFY_FAILED);
2456 goto f_err;
2457 }
2458 }
2459
2460 if (s->session->peer != NULL) /* This should not be needed */
2461 X509_free(s->session->peer);
2462 s->session->peer=sk_X509_shift(sk);
2463 s->session->verify_result = s->verify_result;
2464
2465 /* With the current implementation, sess_cert will always be NULL
2466 * when we arrive here. */
2467 if (s->session->sess_cert == NULL)
2468 {
2469 s->session->sess_cert = ssl_sess_cert_new();
2470 if (s->session->sess_cert == NULL)
2471 {
2472 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_MALLOC_FAILURE);
2473 goto err;
2474 }
2475 }
2476 if (s->session->sess_cert->cert_chain != NULL)
2477 sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2478 s->session->sess_cert->cert_chain=sk;
2479 /* Inconsistency alert: cert_chain does *not* include the
2480 * peer's own certificate, while we do include it in s3_clnt.c */
2481
2482 sk=NULL;
2483
2484 ret=1;
2485 if (0)
2486 {
2487f_err:
2488 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2489 }
2490err:
2491 if (x != NULL) X509_free(x);
2492 if (sk != NULL) sk_X509_pop_free(sk,X509_free);
2493 return(ret);
2494 }
2495
2496int ssl3_send_server_certificate(SSL *s)
2497 {
2498 CERT_PKEY *cpk;
2499
2500 if (s->state == SSL3_ST_SW_CERT_A)
2501 {
2502 cpk=ssl_get_server_send_pkey(s);
2503 if (cpk == NULL)
2504 {
David Benjamind26aea62014-07-12 00:13:56 -04002505 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_certificate, ERR_R_INTERNAL_ERROR);
2506 return(0);
Adam Langley95c29f32014-06-20 12:00:00 -07002507 }
2508
2509 ssl3_output_cert_chain(s,cpk);
2510 s->state=SSL3_ST_SW_CERT_B;
2511 }
2512
2513 /* SSL3_ST_SW_CERT_B */
2514 return ssl_do_write(s);
2515 }
2516
Adam Langley95c29f32014-06-20 12:00:00 -07002517/* send a new session ticket (not necessarily for a new session) */
David Benjamin8da99062014-08-24 12:03:09 -04002518int ssl3_send_new_session_ticket(SSL *s)
Adam Langley95c29f32014-06-20 12:00:00 -07002519 {
2520 if (s->state == SSL3_ST_SW_SESSION_TICKET_A)
2521 {
David Benjamin3cac4502014-10-21 01:46:30 -04002522 uint8_t *session;
2523 size_t session_len;
2524 uint8_t *p, *macstart;
2525 int len;
Adam Langley95c29f32014-06-20 12:00:00 -07002526 unsigned int hlen;
2527 EVP_CIPHER_CTX ctx;
2528 HMAC_CTX hctx;
2529 SSL_CTX *tctx = s->initial_ctx;
2530 unsigned char iv[EVP_MAX_IV_LENGTH];
2531 unsigned char key_name[16];
David Benjamin3cac4502014-10-21 01:46:30 -04002532 /* The maximum overhead of encrypting the session is 16 (key
2533 * name) + IV + one block of encryption overhead + HMAC. */
2534 const size_t max_ticket_overhead = 16 + EVP_MAX_IV_LENGTH +
2535 EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE;
Adam Langley95c29f32014-06-20 12:00:00 -07002536
David Benjamin3cac4502014-10-21 01:46:30 -04002537 /* Serialize the SSL_SESSION to be encoded into the ticket. */
2538 if (!SSL_SESSION_to_bytes_for_ticket(s->session, &session,
2539 &session_len))
Adam Langley95c29f32014-06-20 12:00:00 -07002540 {
Adam Langley95c29f32014-06-20 12:00:00 -07002541 return -1;
2542 }
Adam Langley95c29f32014-06-20 12:00:00 -07002543
David Benjamin3cac4502014-10-21 01:46:30 -04002544 /* If the session is too long, emit a dummy value rather than
2545 * abort the connection. */
2546 if (session_len > 0xFFFF - max_ticket_overhead)
Adam Langley95c29f32014-06-20 12:00:00 -07002547 {
David Benjamin3cac4502014-10-21 01:46:30 -04002548 const char kTicketPlaceholder[] = "TICKET TOO LARGE";
2549 size_t placeholder_len = strlen(kTicketPlaceholder);
2550
2551 OPENSSL_free(session);
2552
2553 p = ssl_handshake_start(s);
2554 /* Emit ticket_lifetime_hint. */
2555 l2n(0, p);
2556 /* Emit ticket. */
2557 s2n(placeholder_len, p);
2558 memcpy(p, kTicketPlaceholder, placeholder_len);
2559 p += placeholder_len;
2560
2561 len = p - ssl_handshake_start(s);
2562 ssl_set_handshake_header(s, SSL3_MT_NEWSESSION_TICKET, len);
2563 s->state = SSL3_ST_SW_SESSION_TICKET_B;
2564 return ssl_do_write(s);
Adam Langley95c29f32014-06-20 12:00:00 -07002565 }
Adam Langley95c29f32014-06-20 12:00:00 -07002566
2567 /* Grow buffer if need be: the length calculation is as
David Benjamin3cac4502014-10-21 01:46:30 -04002568 * follows: handshake_header_length +
Adam Langley95c29f32014-06-20 12:00:00 -07002569 * 4 (ticket lifetime hint) + 2 (ticket length) +
David Benjamin3cac4502014-10-21 01:46:30 -04002570 * max_ticket_overhead + * session_length */
Adam Langley95c29f32014-06-20 12:00:00 -07002571 if (!BUF_MEM_grow(s->init_buf,
David Benjamin3cac4502014-10-21 01:46:30 -04002572 SSL_HM_HEADER_LENGTH(s) + 6 +
2573 max_ticket_overhead + session_len))
2574 {
2575 OPENSSL_free(session);
Adam Langley95c29f32014-06-20 12:00:00 -07002576 return -1;
David Benjamin3cac4502014-10-21 01:46:30 -04002577 }
Adam Langley95c29f32014-06-20 12:00:00 -07002578 p = ssl_handshake_start(s);
2579 EVP_CIPHER_CTX_init(&ctx);
2580 HMAC_CTX_init(&hctx);
2581 /* Initialize HMAC and cipher contexts. If callback present
2582 * it does all the work otherwise use generated values
2583 * from parent ctx.
2584 */
2585 if (tctx->tlsext_ticket_key_cb)
2586 {
2587 if (tctx->tlsext_ticket_key_cb(s, key_name, iv, &ctx,
2588 &hctx, 1) < 0)
2589 {
David Benjamin3cac4502014-10-21 01:46:30 -04002590 OPENSSL_free(session);
Adam Langley69a01602014-11-17 17:26:55 -08002591 EVP_CIPHER_CTX_cleanup(&ctx);
2592 HMAC_CTX_cleanup(&hctx);
Adam Langley95c29f32014-06-20 12:00:00 -07002593 return -1;
2594 }
2595 }
2596 else
2597 {
2598 RAND_pseudo_bytes(iv, 16);
Adam Langley69a01602014-11-17 17:26:55 -08002599 if (!EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, tctx->tlsext_tick_aes_key, iv) ||
2600 !HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16, tlsext_tick_md(), NULL))
2601 {
2602 OPENSSL_free(session);
2603 EVP_CIPHER_CTX_cleanup(&ctx);
2604 HMAC_CTX_cleanup(&hctx);
2605 return -1;
2606 }
Adam Langley95c29f32014-06-20 12:00:00 -07002607 memcpy(key_name, tctx->tlsext_tick_key_name, 16);
2608 }
2609
2610 /* Ticket lifetime hint (advisory only):
2611 * We leave this unspecified for resumed session (for simplicity),
2612 * and guess that tickets for new sessions will live as long
2613 * as their sessions. */
2614 l2n(s->hit ? 0 : s->session->timeout, p);
2615
2616 /* Skip ticket length for now */
2617 p += 2;
2618 /* Output key name */
2619 macstart = p;
2620 memcpy(p, key_name, 16);
2621 p += 16;
2622 /* output IV */
2623 memcpy(p, iv, EVP_CIPHER_CTX_iv_length(&ctx));
2624 p += EVP_CIPHER_CTX_iv_length(&ctx);
2625 /* Encrypt session data */
David Benjamin3cac4502014-10-21 01:46:30 -04002626 EVP_EncryptUpdate(&ctx, p, &len, session, session_len);
Adam Langley95c29f32014-06-20 12:00:00 -07002627 p += len;
2628 EVP_EncryptFinal_ex(&ctx, p, &len);
2629 p += len;
2630 EVP_CIPHER_CTX_cleanup(&ctx);
2631
2632 HMAC_Update(&hctx, macstart, p - macstart);
2633 HMAC_Final(&hctx, p, &hlen);
2634 HMAC_CTX_cleanup(&hctx);
2635
2636 p += hlen;
2637 /* Now write out lengths: p points to end of data written */
2638 /* Total length */
2639 len = p - ssl_handshake_start(s);
2640 ssl_set_handshake_header(s, SSL3_MT_NEWSESSION_TICKET, len);
2641 /* Skip ticket lifetime hint */
2642 p = ssl_handshake_start(s) + 4;
2643 s2n(len - 6, p);
2644 s->state=SSL3_ST_SW_SESSION_TICKET_B;
David Benjamin3cac4502014-10-21 01:46:30 -04002645 OPENSSL_free(session);
Adam Langley95c29f32014-06-20 12:00:00 -07002646 }
2647
2648 /* SSL3_ST_SW_SESSION_TICKET_B */
2649 return ssl_do_write(s);
2650 }
2651
David Benjamin6c7aed02014-08-27 16:42:38 -04002652#if 0
Adam Langley95c29f32014-06-20 12:00:00 -07002653int ssl3_send_cert_status(SSL *s)
2654 {
2655 if (s->state == SSL3_ST_SW_CERT_STATUS_A)
2656 {
2657 unsigned char *p;
2658 /* Grow buffer if need be: the length calculation is as
2659 * follows 1 (message type) + 3 (message length) +
2660 * 1 (ocsp response type) + 3 (ocsp response length)
2661 * + (ocsp response)
2662 */
2663 if (!BUF_MEM_grow(s->init_buf, 8 + s->tlsext_ocsp_resplen))
2664 return -1;
2665
2666 p=(unsigned char *)s->init_buf->data;
2667
2668 /* do the header */
2669 *(p++)=SSL3_MT_CERTIFICATE_STATUS;
2670 /* message length */
2671 l2n3(s->tlsext_ocsp_resplen + 4, p);
2672 /* status type */
2673 *(p++)= s->tlsext_status_type;
2674 /* length of OCSP response */
2675 l2n3(s->tlsext_ocsp_resplen, p);
2676 /* actual response */
2677 memcpy(p, s->tlsext_ocsp_resp, s->tlsext_ocsp_resplen);
2678 /* number of bytes to write */
2679 s->init_num = 8 + s->tlsext_ocsp_resplen;
2680 s->state=SSL3_ST_SW_CERT_STATUS_B;
2681 s->init_off = 0;
2682 }
2683
2684 /* SSL3_ST_SW_CERT_STATUS_B */
2685 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2686 }
David Benjamin6c7aed02014-08-27 16:42:38 -04002687#endif
Adam Langley95c29f32014-06-20 12:00:00 -07002688
Adam Langley95c29f32014-06-20 12:00:00 -07002689/* ssl3_get_next_proto reads a Next Protocol Negotiation handshake message. It
2690 * sets the next_proto member in s if found */
2691int ssl3_get_next_proto(SSL *s)
2692 {
2693 int ok;
Adam Langley95c29f32014-06-20 12:00:00 -07002694 long n;
David Benjaminced551f2014-07-11 23:16:16 -04002695 CBS next_protocol, selected_protocol, padding;
Adam Langley95c29f32014-06-20 12:00:00 -07002696
2697 /* Clients cannot send a NextProtocol message if we didn't see the
2698 * extension in their ClientHello */
2699 if (!s->s3->next_proto_neg_seen)
2700 {
2701 OPENSSL_PUT_ERROR(SSL, ssl3_get_next_proto, SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION);
2702 return -1;
2703 }
2704
2705 n=s->method->ssl_get_message(s,
2706 SSL3_ST_SR_NEXT_PROTO_A,
2707 SSL3_ST_SR_NEXT_PROTO_B,
2708 SSL3_MT_NEXT_PROTO,
2709 514, /* See the payload format below */
David Benjamin590cbe92014-08-25 21:34:56 -04002710 SSL_GET_MESSAGE_HASH_MESSAGE,
Adam Langley95c29f32014-06-20 12:00:00 -07002711 &ok);
2712
2713 if (!ok)
2714 return((int)n);
2715
2716 /* s->state doesn't reflect whether ChangeCipherSpec has been received
2717 * in this handshake, but s->s3->change_cipher_spec does (will be reset
David Benjamin86271ee2014-07-21 16:14:03 -04002718 * by ssl3_get_finished).
2719 * TODO(davidben): Is this check now redundant with
2720 * SSL3_FLAGS_EXPECT_CCS? */
Adam Langley95c29f32014-06-20 12:00:00 -07002721 if (!s->s3->change_cipher_spec)
2722 {
2723 OPENSSL_PUT_ERROR(SSL, ssl3_get_next_proto, SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS);
2724 return -1;
2725 }
2726
David Benjamin51b1f742014-07-12 16:31:12 -04002727 CBS_init(&next_protocol, s->init_msg, n);
Adam Langley95c29f32014-06-20 12:00:00 -07002728
2729 /* The payload looks like:
2730 * uint8 proto_len;
2731 * uint8 proto[proto_len];
2732 * uint8 padding_len;
2733 * uint8 padding[padding_len];
2734 */
David Benjaminced551f2014-07-11 23:16:16 -04002735 if (!CBS_get_u8_length_prefixed(&next_protocol, &selected_protocol) ||
2736 !CBS_get_u8_length_prefixed(&next_protocol, &padding) ||
2737 CBS_len(&next_protocol) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002738 return 0;
2739
David Benjaminced551f2014-07-11 23:16:16 -04002740 if (!CBS_stow(&selected_protocol,
2741 &s->next_proto_negotiated,
2742 &s->next_proto_negotiated_len))
Adam Langley95c29f32014-06-20 12:00:00 -07002743 return 0;
Adam Langley95c29f32014-06-20 12:00:00 -07002744
2745 return 1;
2746 }
Adam Langley95c29f32014-06-20 12:00:00 -07002747
Adam Langley1258b6a2014-06-20 12:00:00 -07002748/* ssl3_get_channel_id reads and verifies a ClientID handshake message. */
2749int ssl3_get_channel_id(SSL *s)
2750 {
2751 int ret = -1, ok;
2752 long n;
David Benjamin880b14e2014-08-25 22:35:07 -04002753 EVP_MD_CTX md_ctx;
2754 uint8_t channel_id_hash[SHA256_DIGEST_LENGTH];
2755 unsigned int channel_id_hash_len;
David Benjamin9a6232f2014-07-11 23:07:47 -04002756 const uint8_t *p;
2757 uint16_t extension_type, expected_extension_type;
Adam Langley1258b6a2014-06-20 12:00:00 -07002758 EC_GROUP* p256 = NULL;
2759 EC_KEY* key = NULL;
2760 EC_POINT* point = NULL;
2761 ECDSA_SIG sig;
2762 BIGNUM x, y;
David Benjamin9a6232f2014-07-11 23:07:47 -04002763 CBS encrypted_extensions, extension;
Adam Langley1258b6a2014-06-20 12:00:00 -07002764
Adam Langley1258b6a2014-06-20 12:00:00 -07002765 n = s->method->ssl_get_message(s,
2766 SSL3_ST_SR_CHANNEL_ID_A,
2767 SSL3_ST_SR_CHANNEL_ID_B,
2768 SSL3_MT_ENCRYPTED_EXTENSIONS,
2769 2 + 2 + TLSEXT_CHANNEL_ID_SIZE,
David Benjamin590cbe92014-08-25 21:34:56 -04002770 SSL_GET_MESSAGE_DONT_HASH_MESSAGE,
Adam Langley1258b6a2014-06-20 12:00:00 -07002771 &ok);
2772
2773 if (!ok)
2774 return((int)n);
2775
David Benjamin880b14e2014-08-25 22:35:07 -04002776 /* Before incorporating the EncryptedExtensions message to the
2777 * handshake hash, compute the hash that should have been signed. */
2778 channel_id_hash_len = sizeof(channel_id_hash);
2779 EVP_MD_CTX_init(&md_ctx);
2780 if (!EVP_DigestInit_ex(&md_ctx, EVP_sha256(), NULL) ||
2781 !tls1_channel_id_hash(&md_ctx, s) ||
2782 !EVP_DigestFinal(&md_ctx, channel_id_hash, &channel_id_hash_len))
2783 {
2784 EVP_MD_CTX_cleanup(&md_ctx);
2785 return -1;
2786 }
2787 EVP_MD_CTX_cleanup(&md_ctx);
2788 assert(channel_id_hash_len == SHA256_DIGEST_LENGTH);
2789
2790 ssl3_hash_current_message(s);
Adam Langley1258b6a2014-06-20 12:00:00 -07002791
2792 /* s->state doesn't reflect whether ChangeCipherSpec has been received
2793 * in this handshake, but s->s3->change_cipher_spec does (will be reset
David Benjamin86271ee2014-07-21 16:14:03 -04002794 * by ssl3_get_finished).
2795 * TODO(davidben): Is this check now redundant with
2796 * SSL3_FLAGS_EXPECT_CCS? */
Adam Langley1258b6a2014-06-20 12:00:00 -07002797 if (!s->s3->change_cipher_spec)
2798 {
2799 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_GOT_CHANNEL_ID_BEFORE_A_CCS);
2800 return -1;
2801 }
2802
David Benjamin51b1f742014-07-12 16:31:12 -04002803 CBS_init(&encrypted_extensions, s->init_msg, n);
Adam Langley1258b6a2014-06-20 12:00:00 -07002804
David Benjamin9a6232f2014-07-11 23:07:47 -04002805 /* EncryptedExtensions could include multiple extensions, but
2806 * the only extension that could be negotiated is ChannelID,
2807 * so there can only be one entry.
2808 *
2809 * The payload looks like:
Adam Langley1258b6a2014-06-20 12:00:00 -07002810 * uint16 extension_type
2811 * uint16 extension_len;
2812 * uint8 x[32];
2813 * uint8 y[32];
2814 * uint8 r[32];
2815 * uint8 s[32];
2816 */
Adam Langley1258b6a2014-06-20 12:00:00 -07002817 expected_extension_type = TLSEXT_TYPE_channel_id;
2818 if (s->s3->tlsext_channel_id_new)
2819 expected_extension_type = TLSEXT_TYPE_channel_id_new;
2820
David Benjamin9a6232f2014-07-11 23:07:47 -04002821 if (!CBS_get_u16(&encrypted_extensions, &extension_type) ||
2822 !CBS_get_u16_length_prefixed(&encrypted_extensions, &extension) ||
2823 CBS_len(&encrypted_extensions) != 0 ||
2824 extension_type != expected_extension_type ||
2825 CBS_len(&extension) != TLSEXT_CHANNEL_ID_SIZE)
Adam Langley1258b6a2014-06-20 12:00:00 -07002826 {
2827 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_INVALID_MESSAGE);
2828 return -1;
2829 }
2830
2831 p256 = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
2832 if (!p256)
2833 {
2834 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_NO_P256_SUPPORT);
2835 return -1;
2836 }
2837
2838 BN_init(&x);
2839 BN_init(&y);
2840 sig.r = BN_new();
2841 sig.s = BN_new();
2842
David Benjamin9a6232f2014-07-11 23:07:47 -04002843 p = CBS_data(&extension);
Adam Langley1258b6a2014-06-20 12:00:00 -07002844 if (BN_bin2bn(p + 0, 32, &x) == NULL ||
2845 BN_bin2bn(p + 32, 32, &y) == NULL ||
2846 BN_bin2bn(p + 64, 32, sig.r) == NULL ||
2847 BN_bin2bn(p + 96, 32, sig.s) == NULL)
2848 goto err;
2849
2850 point = EC_POINT_new(p256);
2851 if (!point ||
2852 !EC_POINT_set_affine_coordinates_GFp(p256, point, &x, &y, NULL))
2853 goto err;
2854
2855 key = EC_KEY_new();
2856 if (!key ||
2857 !EC_KEY_set_group(key, p256) ||
2858 !EC_KEY_set_public_key(key, point))
2859 goto err;
2860
2861 /* We stored the handshake hash in |tlsext_channel_id| the first time
2862 * that we were called. */
David Benjamin880b14e2014-08-25 22:35:07 -04002863 if (!ECDSA_do_verify(channel_id_hash, channel_id_hash_len, &sig, key))
David Benjamin3a66e282014-08-24 02:22:29 -04002864 {
Adam Langley1258b6a2014-06-20 12:00:00 -07002865 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_CHANNEL_ID_SIGNATURE_INVALID);
2866 s->s3->tlsext_channel_id_valid = 0;
2867 goto err;
David Benjamin3a66e282014-08-24 02:22:29 -04002868 }
Adam Langley1258b6a2014-06-20 12:00:00 -07002869
2870 memcpy(s->s3->tlsext_channel_id, p, 64);
2871 ret = 1;
2872
2873err:
2874 BN_free(&x);
2875 BN_free(&y);
2876 BN_free(sig.r);
2877 BN_free(sig.s);
2878 if (key)
2879 EC_KEY_free(key);
2880 if (point)
2881 EC_POINT_free(point);
2882 if (p256)
2883 EC_GROUP_free(p256);
2884 return ret;
2885 }
2886