blob: f84d8d494431a7d5c4ee57f215bce2ca47d89281 [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
151#include <stdio.h>
David Benjamin22f9bcc2014-07-13 12:29:21 -0400152#include <string.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700153
154#include <openssl/bn.h>
155#include <openssl/buf.h>
David Benjamindc72ff72014-06-25 12:36:10 -0400156#include <openssl/bytestring.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700157#include <openssl/cipher.h>
158#include <openssl/dh.h>
Adam Langley1258b6a2014-06-20 12:00:00 -0700159#include <openssl/ec.h>
160#include <openssl/ecdsa.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700161#include <openssl/evp.h>
162#include <openssl/hmac.h>
163#include <openssl/md5.h>
164#include <openssl/mem.h>
165#include <openssl/obj.h>
166#include <openssl/rand.h>
Adam Langley1258b6a2014-06-20 12:00:00 -0700167#include <openssl/sha.h>
Adam Langley95c29f32014-06-20 12:00:00 -0700168#include <openssl/x509.h>
169
170#include "ssl_locl.h"
171#include "../crypto/dh/internal.h"
172
173static const SSL_METHOD *ssl3_get_server_method(int ver);
174
175static const SSL_METHOD *ssl3_get_server_method(int ver)
176 {
177 if (ver == SSL3_VERSION)
178 return(SSLv3_server_method());
179 else
180 return(NULL);
181 }
182
183IMPLEMENT_ssl3_meth_func(SSLv3_server_method,
184 ssl3_accept,
185 ssl_undefined_function,
186 ssl3_get_server_method)
187
188int ssl3_accept(SSL *s)
189 {
190 BUF_MEM *buf;
Adam Langleyc26c8022014-06-20 12:00:00 -0700191 unsigned long alg_a;
Adam Langley95c29f32014-06-20 12:00:00 -0700192 void (*cb)(const SSL *ssl,int type,int val)=NULL;
193 int ret= -1;
194 int new_state,state,skip=0;
195
196 ERR_clear_error();
197 ERR_clear_system_error();
198
199 if (s->info_callback != NULL)
200 cb=s->info_callback;
201 else if (s->ctx->info_callback != NULL)
202 cb=s->ctx->info_callback;
203
204 /* init things to blank */
205 s->in_handshake++;
206 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
207
208 if (s->cert == NULL)
209 {
210 OPENSSL_PUT_ERROR(SSL, ssl3_accept, SSL_R_NO_CERTIFICATE_SET);
211 return(-1);
212 }
213
Adam Langley95c29f32014-06-20 12:00:00 -0700214 for (;;)
215 {
216 state=s->state;
217
218 switch (s->state)
219 {
220 case SSL_ST_RENEGOTIATE:
221 s->renegotiate=1;
222 /* s->state=SSL_ST_ACCEPT; */
223
224 case SSL_ST_BEFORE:
225 case SSL_ST_ACCEPT:
226 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
227 case SSL_ST_OK|SSL_ST_ACCEPT:
228
229 s->server=1;
230 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
231
232 if ((s->version>>8) != 3)
233 {
234 OPENSSL_PUT_ERROR(SSL, ssl3_accept, ERR_R_INTERNAL_ERROR);
235 return -1;
236 }
237 s->type=SSL_ST_ACCEPT;
238
239 if (s->init_buf == NULL)
240 {
241 if ((buf=BUF_MEM_new()) == NULL)
242 {
243 ret= -1;
244 goto end;
245 }
246 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
247 {
248 ret= -1;
249 goto end;
250 }
251 s->init_buf=buf;
252 }
253
254 if (!ssl3_setup_buffers(s))
255 {
256 ret= -1;
257 goto end;
258 }
259
260 s->init_num=0;
261 s->s3->flags &= ~SSL3_FLAGS_SGC_RESTART_DONE;
262 s->s3->flags &= ~TLS1_FLAGS_SKIP_CERT_VERIFY;
263
264 if (s->state != SSL_ST_RENEGOTIATE)
265 {
266 /* Ok, we now need to push on a buffering BIO so that
267 * the output is sent in a way that TCP likes :-)
268 */
269 if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
270
271 ssl3_init_finished_mac(s);
272 s->state=SSL3_ST_SR_CLNT_HELLO_A;
273 s->ctx->stats.sess_accept++;
274 }
275 else if (!s->s3->send_connection_binding &&
276 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
277 {
278 /* Server attempting to renegotiate with
279 * client that doesn't support secure
280 * renegotiation.
281 */
282 OPENSSL_PUT_ERROR(SSL, ssl3_accept, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
283 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
284 ret = -1;
285 goto end;
286 }
287 else
288 {
289 /* s->state == SSL_ST_RENEGOTIATE,
290 * we will just send a HelloRequest */
291 s->ctx->stats.sess_accept_renegotiate++;
292 s->state=SSL3_ST_SW_HELLO_REQ_A;
293 }
294 break;
295
296 case SSL3_ST_SW_HELLO_REQ_A:
297 case SSL3_ST_SW_HELLO_REQ_B:
298
299 s->shutdown=0;
300 ret=ssl3_send_hello_request(s);
301 if (ret <= 0) goto end;
302 s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
303 s->state=SSL3_ST_SW_FLUSH;
304 s->init_num=0;
305
306 ssl3_init_finished_mac(s);
307 break;
308
309 case SSL3_ST_SW_HELLO_REQ_C:
310 s->state=SSL_ST_OK;
311 break;
312
313 case SSL3_ST_SR_CLNT_HELLO_A:
314 case SSL3_ST_SR_CLNT_HELLO_B:
315 case SSL3_ST_SR_CLNT_HELLO_C:
Adam Langleyb2ce0582014-06-20 12:00:00 -0700316 case SSL3_ST_SR_CLNT_HELLO_D:
Adam Langley95c29f32014-06-20 12:00:00 -0700317 s->shutdown=0;
318 ret=ssl3_get_client_hello(s);
Adam Langleyb2ce0582014-06-20 12:00:00 -0700319 if (ret == PENDING_SESSION) {
Adam Langleyb2ce0582014-06-20 12:00:00 -0700320 s->rwstate = SSL_PENDING_SESSION;
321 goto end;
322 }
Adam Langleydc9b1412014-06-20 12:00:00 -0700323 if (ret == CERTIFICATE_SELECTION_PENDING)
324 {
325 s->rwstate = SSL_CERTIFICATE_SELECTION_PENDING;
326 goto end;
327 }
Adam Langley95c29f32014-06-20 12:00:00 -0700328 if (ret <= 0) goto end;
329 s->renegotiate = 2;
330 s->state=SSL3_ST_SW_SRVR_HELLO_A;
331 s->init_num=0;
332 break;
333
334 case SSL3_ST_SW_SRVR_HELLO_A:
335 case SSL3_ST_SW_SRVR_HELLO_B:
336 ret=ssl3_send_server_hello(s);
337 if (ret <= 0) goto end;
Adam Langley95c29f32014-06-20 12:00:00 -0700338 if (s->hit)
339 {
340 if (s->tlsext_ticket_expected)
341 s->state=SSL3_ST_SW_SESSION_TICKET_A;
342 else
343 s->state=SSL3_ST_SW_CHANGE_A;
344 }
Adam Langley95c29f32014-06-20 12:00:00 -0700345 else
David Benjamin2b0aeec2014-07-01 00:39:02 -0400346 s->state = SSL3_ST_SW_CERT_A;
Adam Langley95c29f32014-06-20 12:00:00 -0700347 s->init_num = 0;
348 break;
349
Adam Langley95c29f32014-06-20 12:00:00 -0700350 case SSL3_ST_SW_CERT_A:
351 case SSL3_ST_SW_CERT_B:
David Benjamine8f3d662014-07-12 01:10:19 -0400352 if (ssl_cipher_has_server_public_key(s->s3->tmp.new_cipher))
Adam Langley95c29f32014-06-20 12:00:00 -0700353 {
354 ret=ssl3_send_server_certificate(s);
355 if (ret <= 0) goto end;
Adam Langley95c29f32014-06-20 12:00:00 -0700356 if (s->tlsext_status_expected)
357 s->state=SSL3_ST_SW_CERT_STATUS_A;
358 else
359 s->state=SSL3_ST_SW_KEY_EXCH_A;
360 }
361 else
362 {
363 skip = 1;
364 s->state=SSL3_ST_SW_KEY_EXCH_A;
365 }
Adam Langley95c29f32014-06-20 12:00:00 -0700366 s->init_num=0;
367 break;
368
369 case SSL3_ST_SW_KEY_EXCH_A:
370 case SSL3_ST_SW_KEY_EXCH_B:
Adam Langleyc26c8022014-06-20 12:00:00 -0700371 alg_a = s->s3->tmp.new_cipher->algorithm_auth;
Adam Langley95c29f32014-06-20 12:00:00 -0700372
David Benjaminb9cc33a2014-07-15 00:09:48 -0400373 /* Send a ServerKeyExchange message if:
374 * - The key exchange is ephemeral or anonymous
375 * Diffie-Hellman.
376 * - There is a PSK identity hint.
Adam Langley95c29f32014-06-20 12:00:00 -0700377 *
David Benjaminb9cc33a2014-07-15 00:09:48 -0400378 * TODO(davidben): This logic is currently duplicated
379 * in d1_srvr.c. Fix this. In the meantime, keep them
380 * in sync.
Adam Langley95c29f32014-06-20 12:00:00 -0700381 */
David Benjaminb9cc33a2014-07-15 00:09:48 -0400382 if (ssl_cipher_requires_server_key_exchange(s->s3->tmp.new_cipher) ||
David Benjamin77a942b2014-07-15 01:22:50 -0400383 ((alg_a & SSL_aPSK) && s->session->psk_identity_hint))
Adam Langley95c29f32014-06-20 12:00:00 -0700384 {
385 ret=ssl3_send_server_key_exchange(s);
386 if (ret <= 0) goto end;
387 }
388 else
389 skip=1;
390
391 s->state=SSL3_ST_SW_CERT_REQ_A;
392 s->init_num=0;
393 break;
394
395 case SSL3_ST_SW_CERT_REQ_A:
396 case SSL3_ST_SW_CERT_REQ_B:
397 if (/* don't request cert unless asked for it: */
398 !(s->verify_mode & SSL_VERIFY_PEER) ||
Adam Langley509e5ed2014-06-20 12:00:00 -0700399 /* Don't request a certificate if an obc was presented */
400 ((s->verify_mode & SSL_VERIFY_PEER_IF_NO_OBC) &&
401 s->s3->tlsext_channel_id_valid) ||
Adam Langley95c29f32014-06-20 12:00:00 -0700402 /* if SSL_VERIFY_CLIENT_ONCE is set,
403 * don't request cert during re-negotiation: */
404 ((s->session->peer != NULL) &&
405 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
406 /* never request cert in anonymous ciphersuites
407 * (see section "Certificate request" in SSL 3 drafts
408 * and in RFC 2246): */
409 ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
410 /* ... except when the application insists on verification
411 * (against the specs, but s3_clnt.c accepts this for SSL 3) */
412 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
Adam Langley95c29f32014-06-20 12:00:00 -0700413 /* With normal PSK Certificates and
414 * Certificate Requests are omitted */
David Benjamind26aea62014-07-12 00:13:56 -0400415 (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
Adam Langley95c29f32014-06-20 12:00:00 -0700416 {
417 /* no cert request */
418 skip=1;
419 s->s3->tmp.cert_request=0;
420 s->state=SSL3_ST_SW_SRVR_DONE_A;
421 if (s->s3->handshake_buffer)
422 if (!ssl3_digest_cached_records(s))
423 return -1;
424 }
425 else
426 {
427 s->s3->tmp.cert_request=1;
428 ret=ssl3_send_certificate_request(s);
429 if (ret <= 0) goto end;
430#ifndef NETSCAPE_HANG_BUG
431 s->state=SSL3_ST_SW_SRVR_DONE_A;
432#else
433 s->state=SSL3_ST_SW_FLUSH;
434 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
435#endif
436 s->init_num=0;
437 }
438 break;
439
440 case SSL3_ST_SW_SRVR_DONE_A:
441 case SSL3_ST_SW_SRVR_DONE_B:
442 ret=ssl3_send_server_done(s);
443 if (ret <= 0) goto end;
444 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
445 s->state=SSL3_ST_SW_FLUSH;
446 s->init_num=0;
447 break;
448
449 case SSL3_ST_SW_FLUSH:
450
451 /* This code originally checked to see if
452 * any data was pending using BIO_CTRL_INFO
453 * and then flushed. This caused problems
454 * as documented in PR#1939. The proposed
455 * fix doesn't completely resolve this issue
456 * as buggy implementations of BIO_CTRL_PENDING
457 * still exist. So instead we just flush
458 * unconditionally.
459 */
460
461 s->rwstate=SSL_WRITING;
462 if (BIO_flush(s->wbio) <= 0)
463 {
464 ret= -1;
465 goto end;
466 }
467 s->rwstate=SSL_NOTHING;
468
469 s->state=s->s3->tmp.next_state;
470 break;
471
472 case SSL3_ST_SR_CERT_A:
473 case SSL3_ST_SR_CERT_B:
474 /* Check for second client hello (MS SGC) */
475 ret = ssl3_check_client_hello(s);
476 if (ret <= 0)
477 goto end;
478 if (ret == 2)
479 s->state = SSL3_ST_SR_CLNT_HELLO_C;
480 else {
481 if (s->s3->tmp.cert_request)
482 {
483 ret=ssl3_get_client_certificate(s);
484 if (ret <= 0) goto end;
485 }
486 s->init_num=0;
487 s->state=SSL3_ST_SR_KEY_EXCH_A;
488 }
489 break;
490
491 case SSL3_ST_SR_KEY_EXCH_A:
492 case SSL3_ST_SR_KEY_EXCH_B:
493 ret=ssl3_get_client_key_exchange(s);
494 if (ret <= 0)
495 goto end;
496 if (ret == 2)
497 {
498 /* For the ECDH ciphersuites when
499 * the client sends its ECDH pub key in
500 * a certificate, the CertificateVerify
501 * message is not sent.
Adam Langley95c29f32014-06-20 12:00:00 -0700502 */
Adam Langley95c29f32014-06-20 12:00:00 -0700503 s->init_num = 0;
David Benjamin84ec49e2014-07-22 14:25:28 -0400504 s->state = SSL3_ST_SR_CHANGE;
Adam Langley95c29f32014-06-20 12:00:00 -0700505 }
506 else if (SSL_USE_SIGALGS(s))
507 {
508 s->state=SSL3_ST_SR_CERT_VRFY_A;
509 s->init_num=0;
510 if (!s->session->peer)
511 break;
512 /* For sigalgs freeze the handshake buffer
513 * at this point and digest cached records.
514 */
515 if (!s->s3->handshake_buffer)
516 {
517 OPENSSL_PUT_ERROR(SSL, ssl3_accept, ERR_R_INTERNAL_ERROR);
518 return -1;
519 }
520 s->s3->flags |= TLS1_FLAGS_KEEP_HANDSHAKE;
521 if (!ssl3_digest_cached_records(s))
522 return -1;
523 }
524 else
525 {
526 int offset=0;
527 int dgst_num;
528
529 s->state=SSL3_ST_SR_CERT_VRFY_A;
530 s->init_num=0;
531
532 /* We need to get hashes here so if there is
533 * a client cert, it can be verified
534 * FIXME - digest processing for CertificateVerify
535 * should be generalized. But it is next step
536 */
537 if (s->s3->handshake_buffer)
538 if (!ssl3_digest_cached_records(s))
539 return -1;
540 for (dgst_num=0; dgst_num<SSL_MAX_DIGEST;dgst_num++)
541 if (s->s3->handshake_dgst[dgst_num])
542 {
543 int dgst_size;
544
545 s->method->ssl3_enc->cert_verify_mac(s,EVP_MD_CTX_type(s->s3->handshake_dgst[dgst_num]),&(s->s3->tmp.cert_verify_md[offset]));
546 dgst_size=EVP_MD_CTX_size(s->s3->handshake_dgst[dgst_num]);
547 if (dgst_size < 0)
548 {
549 ret = -1;
550 goto end;
551 }
552 offset+=dgst_size;
553 }
554 }
555 break;
556
557 case SSL3_ST_SR_CERT_VRFY_A:
558 case SSL3_ST_SR_CERT_VRFY_B:
Adam Langley95c29f32014-06-20 12:00:00 -0700559 ret=ssl3_get_cert_verify(s);
560 if (ret <= 0) goto end;
561
David Benjamin84ec49e2014-07-22 14:25:28 -0400562 s->state = SSL3_ST_SR_CHANGE;
Adam Langley95c29f32014-06-20 12:00:00 -0700563 s->init_num=0;
564 break;
565
David Benjamin84ec49e2014-07-22 14:25:28 -0400566 case SSL3_ST_SR_CHANGE: {
Adam Langley1258b6a2014-06-20 12:00:00 -0700567 char next_proto_neg = 0;
568 char channel_id = 0;
Adam Langley1258b6a2014-06-20 12:00:00 -0700569# if !defined(OPENSSL_NO_NEXTPROTONEG)
570 next_proto_neg = s->s3->next_proto_neg_seen;
571# endif
572 channel_id = s->s3->tlsext_channel_id_valid;
Adam Langley1258b6a2014-06-20 12:00:00 -0700573
David Benjamin84ec49e2014-07-22 14:25:28 -0400574 /* At this point, the next message must be entirely
575 * behind a ChangeCipherSpec. */
David Benjamin86271ee2014-07-21 16:14:03 -0400576 if (!ssl3_expect_change_cipher_spec(s))
577 {
578 ret = -1;
579 goto end;
580 }
Adam Langley1258b6a2014-06-20 12:00:00 -0700581 if (next_proto_neg)
David Benjamin84ec49e2014-07-22 14:25:28 -0400582 s->state = SSL3_ST_SR_NEXT_PROTO_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700583 else if (channel_id)
David Benjamin84ec49e2014-07-22 14:25:28 -0400584 s->state = SSL3_ST_SR_CHANNEL_ID_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700585 else
David Benjamin84ec49e2014-07-22 14:25:28 -0400586 s->state = SSL3_ST_SR_FINISHED_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700587 break;
588 }
589
David Benjamin6dbd73d2014-07-03 15:59:49 -0400590#if !defined(OPENSSL_NO_NEXTPROTONEG)
Adam Langley95c29f32014-06-20 12:00:00 -0700591 case SSL3_ST_SR_NEXT_PROTO_A:
592 case SSL3_ST_SR_NEXT_PROTO_B:
593 ret=ssl3_get_next_proto(s);
594 if (ret <= 0) goto end;
595 s->init_num = 0;
Adam Langley1258b6a2014-06-20 12:00:00 -0700596 if (s->s3->tlsext_channel_id_valid)
597 s->state=SSL3_ST_SR_CHANNEL_ID_A;
598 else
599 s->state=SSL3_ST_SR_FINISHED_A;
600 break;
601#endif
602
Adam Langley1258b6a2014-06-20 12:00:00 -0700603 case SSL3_ST_SR_CHANNEL_ID_A:
604 case SSL3_ST_SR_CHANNEL_ID_B:
605 ret=ssl3_get_channel_id(s);
606 if (ret <= 0) goto end;
607 s->init_num = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700608 s->state=SSL3_ST_SR_FINISHED_A;
609 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700610
611 case SSL3_ST_SR_FINISHED_A:
612 case SSL3_ST_SR_FINISHED_B:
613 ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
614 SSL3_ST_SR_FINISHED_B);
615 if (ret <= 0) goto end;
616 if (s->hit)
617 s->state=SSL_ST_OK;
Adam Langley95c29f32014-06-20 12:00:00 -0700618 else if (s->tlsext_ticket_expected)
619 s->state=SSL3_ST_SW_SESSION_TICKET_A;
Adam Langley95c29f32014-06-20 12:00:00 -0700620 else
621 s->state=SSL3_ST_SW_CHANGE_A;
Adam Langley1258b6a2014-06-20 12:00:00 -0700622 /* If this is a full handshake with ChannelID then
623 * record the hashshake hashes in |s->session| in case
624 * we need them to verify a ChannelID signature on a
625 * resumption of this session in the future. */
626 if (!s->hit && s->s3->tlsext_channel_id_new)
627 {
628 ret = tls1_record_handshake_hashes_for_channel_id(s);
629 if (ret <= 0) goto end;
630 }
Adam Langley95c29f32014-06-20 12:00:00 -0700631 s->init_num=0;
632 break;
633
Adam Langley95c29f32014-06-20 12:00:00 -0700634 case SSL3_ST_SW_SESSION_TICKET_A:
635 case SSL3_ST_SW_SESSION_TICKET_B:
636 ret=ssl3_send_newsession_ticket(s);
637 if (ret <= 0) goto end;
638 s->state=SSL3_ST_SW_CHANGE_A;
639 s->init_num=0;
640 break;
641
642 case SSL3_ST_SW_CERT_STATUS_A:
643 case SSL3_ST_SW_CERT_STATUS_B:
644 ret=ssl3_send_cert_status(s);
645 if (ret <= 0) goto end;
646 s->state=SSL3_ST_SW_KEY_EXCH_A;
647 s->init_num=0;
648 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700649
650 case SSL3_ST_SW_CHANGE_A:
651 case SSL3_ST_SW_CHANGE_B:
652
653 s->session->cipher=s->s3->tmp.new_cipher;
654 if (!s->method->ssl3_enc->setup_key_block(s))
655 { ret= -1; goto end; }
656
657 ret=ssl3_send_change_cipher_spec(s,
658 SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
659
660 if (ret <= 0) goto end;
661 s->state=SSL3_ST_SW_FINISHED_A;
662 s->init_num=0;
663
664 if (!s->method->ssl3_enc->change_cipher_state(s,
665 SSL3_CHANGE_CIPHER_SERVER_WRITE))
666 {
667 ret= -1;
668 goto end;
669 }
670
671 break;
672
673 case SSL3_ST_SW_FINISHED_A:
674 case SSL3_ST_SW_FINISHED_B:
675 ret=ssl3_send_finished(s,
676 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
677 s->method->ssl3_enc->server_finished_label,
678 s->method->ssl3_enc->server_finished_label_len);
679 if (ret <= 0) goto end;
David Benjamin84ec49e2014-07-22 14:25:28 -0400680 s->state = SSL3_ST_SW_FLUSH;
Adam Langley95c29f32014-06-20 12:00:00 -0700681 if (s->hit)
David Benjamin84ec49e2014-07-22 14:25:28 -0400682 s->s3->tmp.next_state = SSL3_ST_SR_CHANGE;
Adam Langley95c29f32014-06-20 12:00:00 -0700683 else
David Benjamin84ec49e2014-07-22 14:25:28 -0400684 s->s3->tmp.next_state = SSL_ST_OK;
Adam Langley95c29f32014-06-20 12:00:00 -0700685 s->init_num=0;
686 break;
687
688 case SSL_ST_OK:
689 /* clean a few things up */
690 ssl3_cleanup_key_block(s);
691
692 BUF_MEM_free(s->init_buf);
693 s->init_buf=NULL;
694
695 /* remove buffering on output */
696 ssl_free_wbio_buffer(s);
697
698 s->init_num=0;
699
Adam Langley75872532014-06-20 12:00:00 -0700700 /* If we aren't retaining peer certificates then we can
701 * discard it now. */
702 if (s->session->peer && s->ctx->retain_only_sha256_of_client_certs)
703 {
704 X509_free(s->session->peer);
705 s->session->peer = NULL;
706 }
707
Adam Langley95c29f32014-06-20 12:00:00 -0700708 if (s->renegotiate == 2) /* skipped if we just sent a HelloRequest */
709 {
710 s->renegotiate=0;
711 s->new_session=0;
712
713 ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
714
715 s->ctx->stats.sess_accept_good++;
716 /* s->server=1; */
717 s->handshake_func=ssl3_accept;
718
719 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
720 }
721
722 ret = 1;
723 goto end;
724 /* break; */
725
726 default:
727 OPENSSL_PUT_ERROR(SSL, ssl3_accept, SSL_R_UNKNOWN_STATE);
728 ret= -1;
729 goto end;
730 /* break; */
731 }
732
733 if (!s->s3->tmp.reuse_message && !skip)
734 {
735 if (s->debug)
736 {
737 if ((ret=BIO_flush(s->wbio)) <= 0)
738 goto end;
739 }
740
741
742 if ((cb != NULL) && (s->state != state))
743 {
744 new_state=s->state;
745 s->state=state;
746 cb(s,SSL_CB_ACCEPT_LOOP,1);
747 s->state=new_state;
748 }
749 }
750 skip=0;
751 }
752end:
753 /* BIO_flush(s->wbio); */
754
755 s->in_handshake--;
756 if (cb != NULL)
757 cb(s,SSL_CB_ACCEPT_EXIT,ret);
758 return(ret);
759 }
760
761int ssl3_send_hello_request(SSL *s)
762 {
763
764 if (s->state == SSL3_ST_SW_HELLO_REQ_A)
765 {
766 ssl_set_handshake_header(s, SSL3_MT_HELLO_REQUEST, 0);
767 s->state=SSL3_ST_SW_HELLO_REQ_B;
768 }
769
770 /* SSL3_ST_SW_HELLO_REQ_B */
771 return ssl_do_write(s);
772 }
773
774int ssl3_check_client_hello(SSL *s)
775 {
776 int ok;
777 long n;
778
779 /* this function is called when we really expect a Certificate message,
780 * so permit appropriate message length */
781 n=s->method->ssl_get_message(s,
782 SSL3_ST_SR_CERT_A,
783 SSL3_ST_SR_CERT_B,
784 -1,
785 s->max_cert_list,
786 &ok);
787 if (!ok) return((int)n);
788 s->s3->tmp.reuse_message = 1;
789 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO)
790 {
791 /* We only allow the client to restart the handshake once per
792 * negotiation. */
793 if (s->s3->flags & SSL3_FLAGS_SGC_RESTART_DONE)
794 {
795 OPENSSL_PUT_ERROR(SSL, ssl3_check_client_hello, SSL_R_MULTIPLE_SGC_RESTARTS);
796 return -1;
797 }
798 /* Throw away what we have done so far in the current handshake,
799 * which will now be aborted. (A full SSL_clear would be too much.) */
800#ifndef OPENSSL_NO_DH
801 if (s->s3->tmp.dh != NULL)
802 {
803 DH_free(s->s3->tmp.dh);
804 s->s3->tmp.dh = NULL;
805 }
806#endif
807#ifndef OPENSSL_NO_ECDH
808 if (s->s3->tmp.ecdh != NULL)
809 {
810 EC_KEY_free(s->s3->tmp.ecdh);
811 s->s3->tmp.ecdh = NULL;
812 }
813#endif
814 s->s3->flags |= SSL3_FLAGS_SGC_RESTART_DONE;
815 return 2;
816 }
817 return 1;
818}
819
820int ssl3_get_client_hello(SSL *s)
821 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400822 int i,ok,al=SSL_AD_INTERNAL_ERROR,ret= -1;
Adam Langley95c29f32014-06-20 12:00:00 -0700823 long n;
David Benjamin6f260012014-08-15 13:49:12 -0400824 const SSL_CIPHER *c;
Adam Langley95c29f32014-06-20 12:00:00 -0700825 STACK_OF(SSL_CIPHER) *ciphers=NULL;
Adam Langleydc9b1412014-06-20 12:00:00 -0700826 struct ssl_early_callback_ctx early_ctx;
David Benjamin22f9bcc2014-07-13 12:29:21 -0400827 CBS client_hello;
828 uint16_t client_version;
829 CBS client_random, session_id, cipher_suites, compression_methods;
Adam Langley95c29f32014-06-20 12:00:00 -0700830
831 /* We do this so that we will respond with our native type.
832 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
833 * This down switching should be handled by a different method.
834 * If we are SSLv3, we will respond with SSLv3, even if prompted with
835 * TLSv1.
836 */
Adam Langleydc9b1412014-06-20 12:00:00 -0700837 switch (s->state) {
838 case SSL3_ST_SR_CLNT_HELLO_A:
Adam Langleydc9b1412014-06-20 12:00:00 -0700839 case SSL3_ST_SR_CLNT_HELLO_B:
Adam Langleyb2ce0582014-06-20 12:00:00 -0700840 s->first_packet=1;
841 n=s->method->ssl_get_message(s,
David Benjamin95fcaa42014-08-05 13:10:14 -0400842 SSL3_ST_SR_CLNT_HELLO_A,
Adam Langleyb2ce0582014-06-20 12:00:00 -0700843 SSL3_ST_SR_CLNT_HELLO_B,
Adam Langleyb2ce0582014-06-20 12:00:00 -0700844 SSL3_MT_CLIENT_HELLO,
845 SSL3_RT_MAX_PLAIN_LENGTH,
846 &ok);
Adam Langley95c29f32014-06-20 12:00:00 -0700847
Adam Langleyb2ce0582014-06-20 12:00:00 -0700848 if (!ok) return((int)n);
849 s->first_packet=0;
Adam Langleydc9b1412014-06-20 12:00:00 -0700850
851 /* If we require cookies and this ClientHello doesn't
852 * contain one, just return since we do not want to
853 * allocate any memory yet. So check cookie length...
854 */
David Benjamin22f9bcc2014-07-13 12:29:21 -0400855 if (SSL_IS_DTLS(s) && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
Adam Langleydc9b1412014-06-20 12:00:00 -0700856 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400857 CBS session_id;
858 uint8_t cookie_length;
Adam Langleydc9b1412014-06-20 12:00:00 -0700859
David Benjamin22f9bcc2014-07-13 12:29:21 -0400860 CBS_init(&client_hello, s->init_msg, n);
861 if (!CBS_skip(&client_hello, 2 + SSL3_RANDOM_SIZE) ||
862 !CBS_get_u8_length_prefixed(&client_hello, &session_id) ||
863 !CBS_get_u8(&client_hello, &cookie_length))
864 {
865 al = SSL_AD_DECODE_ERROR;
866 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
867 goto f_err;
868 }
869
Adam Langleydc9b1412014-06-20 12:00:00 -0700870 if (cookie_length == 0)
871 return 1;
872 }
873 s->state = SSL3_ST_SR_CLNT_HELLO_C;
874 /* fallthrough */
875 case SSL3_ST_SR_CLNT_HELLO_C:
876 case SSL3_ST_SR_CLNT_HELLO_D:
877 /* We have previously parsed the ClientHello message,
878 * and can't call ssl_get_message again without hashing
879 * the message into the Finished digest again. */
Adam Langleyb2ce0582014-06-20 12:00:00 -0700880 n = s->init_num;
Adam Langleydc9b1412014-06-20 12:00:00 -0700881
882 memset(&early_ctx, 0, sizeof(early_ctx));
883 early_ctx.ssl = s;
884 early_ctx.client_hello = s->init_msg;
885 early_ctx.client_hello_len = n;
886 if (!ssl_early_callback_init(&early_ctx))
887 {
888 al = SSL_AD_DECODE_ERROR;
889 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CLIENTHELLO_PARSE_FAILED);
890 goto f_err;
891 }
892
893 if (s->state == SSL3_ST_SR_CLNT_HELLO_C &&
894 s->ctx->select_certificate_cb != NULL)
895 {
896 int ret;
897
898 s->state = SSL3_ST_SR_CLNT_HELLO_D;
899 ret = s->ctx->select_certificate_cb(&early_ctx);
900 if (ret == 0)
901 return CERTIFICATE_SELECTION_PENDING;
902 else if (ret == -1)
903 {
904 /* Connection rejected. */
905 al = SSL_AD_ACCESS_DENIED;
906 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CONNECTION_REJECTED);
907 goto f_err;
908 }
909 }
910 s->state = SSL3_ST_SR_CLNT_HELLO_D;
David Benjamin4c852c52014-07-02 15:24:48 -0400911 break;
Adam Langleydc9b1412014-06-20 12:00:00 -0700912 default:
David Benjamin4c852c52014-07-02 15:24:48 -0400913 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_UNKNOWN_STATE);
Adam Langleydc9b1412014-06-20 12:00:00 -0700914 return -1;
915 }
Adam Langleyb2ce0582014-06-20 12:00:00 -0700916
David Benjamin22f9bcc2014-07-13 12:29:21 -0400917 CBS_init(&client_hello, s->init_msg, n);
918 if (!CBS_get_u16(&client_hello, &client_version) ||
919 !CBS_get_bytes(&client_hello, &client_random, SSL3_RANDOM_SIZE) ||
920 !CBS_get_u8_length_prefixed(&client_hello, &session_id) ||
921 CBS_len(&session_id) > SSL_MAX_SSL_SESSION_ID_LENGTH)
922 {
923 al = SSL_AD_DECODE_ERROR;
924 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
925 goto f_err;
926 }
Adam Langley95c29f32014-06-20 12:00:00 -0700927
928 /* use version from inside client hello, not from record header
929 * (may differ: see RFC 2246, Appendix E, second paragraph) */
David Benjamin22f9bcc2014-07-13 12:29:21 -0400930 s->client_version = client_version;
Adam Langley95c29f32014-06-20 12:00:00 -0700931
932 if (SSL_IS_DTLS(s) ? (s->client_version > s->version &&
933 s->method->version != DTLS_ANY_VERSION)
934 : (s->client_version < s->version))
935 {
936 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_WRONG_VERSION_NUMBER);
937 if ((s->client_version>>8) == SSL3_VERSION_MAJOR &&
938 !s->enc_write_ctx && !s->write_hash)
939 {
940 /* similar to ssl3_get_record, send alert using remote version number */
941 s->version = s->client_version;
942 }
943 al = SSL_AD_PROTOCOL_VERSION;
944 goto f_err;
945 }
946
David Benjamin22f9bcc2014-07-13 12:29:21 -0400947 /* Load the client random. */
948 memcpy(s->s3->client_random, CBS_data(&client_random), SSL3_RANDOM_SIZE);
Adam Langley95c29f32014-06-20 12:00:00 -0700949
950 s->hit=0;
951 /* Versions before 0.9.7 always allow clients to resume sessions in renegotiation.
952 * 0.9.7 and later allow this by default, but optionally ignore resumption requests
953 * with flag SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION (it's a new flag rather
954 * than a change to default behavior so that applications relying on this for security
955 * won't even compile against older library versions).
956 *
957 * 1.0.1 and later also have a function SSL_renegotiate_abbreviated() to request
958 * renegotiation but not a new session (s->new_session remains unset): for servers,
959 * this essentially just means that the SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
960 * setting will be ignored.
961 */
962 if ((s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
963 {
964 if (!ssl_get_new_session(s,1))
965 goto err;
966 }
967 else
968 {
Adam Langleydc9b1412014-06-20 12:00:00 -0700969 i=ssl_get_prev_session(s, &early_ctx);
Adam Langley95c29f32014-06-20 12:00:00 -0700970 if (i == 1)
971 { /* previous session */
972 s->hit=1;
973 }
974 else if (i == -1)
975 goto err;
Adam Langleyb2ce0582014-06-20 12:00:00 -0700976 else if (i == PENDING_SESSION)
977 {
978 ret = PENDING_SESSION;
979 goto err;
980 }
Adam Langley95c29f32014-06-20 12:00:00 -0700981 else /* i == 0 */
982 {
983 if (!ssl_get_new_session(s,1))
984 goto err;
985 }
986 }
987
Adam Langley95c29f32014-06-20 12:00:00 -0700988 if (SSL_IS_DTLS(s))
989 {
David Benjamin22f9bcc2014-07-13 12:29:21 -0400990 CBS cookie;
Adam Langley95c29f32014-06-20 12:00:00 -0700991
David Benjamin22f9bcc2014-07-13 12:29:21 -0400992 /* TODO(davidben): The length check here is off. Per
993 * spec, the maximum cookie length is 32. However, the
994 * DTLS1_COOKIE_LENGTH check is checking against 256,
995 * not 32 (so it's actually redundant).
996 * 07a9d1a2c2b735cbc327065000b545deb5e136cf from
997 * OpenSSL switched this from 32 to 256. */
998 if (!CBS_get_u8_length_prefixed(&client_hello, &cookie) ||
999 CBS_len(&cookie) > DTLS1_COOKIE_LENGTH)
Adam Langley95c29f32014-06-20 12:00:00 -07001000 {
Adam Langley95c29f32014-06-20 12:00:00 -07001001 al = SSL_AD_DECODE_ERROR;
David Benjamin22f9bcc2014-07-13 12:29:21 -04001002 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07001003 goto f_err;
1004 }
1005
David Benjamin22f9bcc2014-07-13 12:29:21 -04001006 /* Verify the cookie if appropriate option is set. */
Adam Langley95c29f32014-06-20 12:00:00 -07001007 if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) &&
David Benjamin22f9bcc2014-07-13 12:29:21 -04001008 CBS_len(&cookie) > 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001009 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001010 if (s->ctx->app_verify_cookie_cb != NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07001011 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001012 if (s->ctx->app_verify_cookie_cb(s,
David Benjaminfb4ea282014-08-15 13:38:15 -04001013 CBS_data(&cookie), CBS_len(&cookie)) == 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001014 {
1015 al=SSL_AD_HANDSHAKE_FAILURE;
1016 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_COOKIE_MISMATCH);
1017 goto f_err;
1018 }
1019 /* else cookie verification succeeded */
1020 }
David Benjamin22f9bcc2014-07-13 12:29:21 -04001021 else if (!CBS_mem_equal(&cookie, s->d1->cookie, s->d1->cookie_len))
Adam Langley95c29f32014-06-20 12:00:00 -07001022 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001023 /* default verification */
1024 al=SSL_AD_HANDSHAKE_FAILURE;
1025 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_COOKIE_MISMATCH);
1026 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001027 }
David Benjamin22f9bcc2014-07-13 12:29:21 -04001028 /* Set to -2 so if successful we return 2 and
1029 * don't send HelloVerifyRequest. */
Adam Langley95c29f32014-06-20 12:00:00 -07001030 ret = -2;
1031 }
1032
Adam Langley95c29f32014-06-20 12:00:00 -07001033 if (s->method->version == DTLS_ANY_VERSION)
1034 {
1035 /* Select version to use */
1036 if (s->client_version <= DTLS1_2_VERSION &&
1037 !(s->options & SSL_OP_NO_DTLSv1_2))
1038 {
1039 s->version = DTLS1_2_VERSION;
1040 s->method = DTLSv1_2_server_method();
1041 }
Adam Langley95c29f32014-06-20 12:00:00 -07001042 else if (s->client_version <= DTLS1_VERSION &&
1043 !(s->options & SSL_OP_NO_DTLSv1))
1044 {
1045 s->version = DTLS1_VERSION;
1046 s->method = DTLSv1_server_method();
1047 }
1048 else
1049 {
1050 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_WRONG_VERSION_NUMBER);
1051 s->version = s->client_version;
1052 al = SSL_AD_PROTOCOL_VERSION;
1053 goto f_err;
1054 }
1055 s->session->ssl_version = s->version;
1056 }
1057 }
1058
David Benjamin22f9bcc2014-07-13 12:29:21 -04001059 if (!CBS_get_u16_length_prefixed(&client_hello, &cipher_suites) ||
1060 !CBS_get_u8_length_prefixed(&client_hello, &compression_methods) ||
1061 CBS_len(&compression_methods) == 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001062 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001063 al = SSL_AD_DECODE_ERROR;
1064 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_DECODE_ERROR);
1065 goto f_err;
1066 }
1067
1068 /* TODO(davidben): Per spec, cipher_suites can never be empty
1069 * (specified at the ClientHello structure level). This logic
1070 * allows it to be empty if resuming a session. Can we always
1071 * require non-empty? If a client sends empty cipher_suites
1072 * because it's resuming a session, it could always fail to
1073 * resume a session, so it's unlikely to actually work. */
1074 if (CBS_len(&cipher_suites) == 0 && CBS_len(&session_id) != 0)
1075 {
1076 /* We need a cipher if we are not resuming a session. */
1077 al = SSL_AD_ILLEGAL_PARAMETER;
Adam Langley95c29f32014-06-20 12:00:00 -07001078 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_CIPHERS_SPECIFIED);
1079 goto f_err;
1080 }
David Benjamin22f9bcc2014-07-13 12:29:21 -04001081
David Benjamin39482a12014-07-20 13:30:15 -04001082 if (ssl_bytes_to_cipher_list(s, &cipher_suites, &ciphers) == NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07001083 {
1084 goto err;
1085 }
Adam Langley95c29f32014-06-20 12:00:00 -07001086
1087 /* If it is a hit, check that the cipher is in the list */
David Benjamin22f9bcc2014-07-13 12:29:21 -04001088 if (s->hit && CBS_len(&cipher_suites) > 0)
Adam Langley95c29f32014-06-20 12:00:00 -07001089 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001090 int found_cipher = 0;
1091 unsigned long id = s->session->cipher->id;
Adam Langley95c29f32014-06-20 12:00:00 -07001092
Adam Langley95c29f32014-06-20 12:00:00 -07001093 for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
1094 {
1095 c=sk_SSL_CIPHER_value(ciphers,i);
Adam Langley95c29f32014-06-20 12:00:00 -07001096 if (c->id == id)
1097 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001098 found_cipher = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07001099 break;
1100 }
1101 }
David Benjamin22f9bcc2014-07-13 12:29:21 -04001102 if (!found_cipher)
Adam Langley95c29f32014-06-20 12:00:00 -07001103 {
1104 /* we need to have the cipher in the cipher
1105 * list if we are asked to reuse it */
1106 al=SSL_AD_ILLEGAL_PARAMETER;
1107 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_REQUIRED_CIPHER_MISSING);
1108 goto f_err;
1109 }
1110 }
1111
David Benjamin22f9bcc2014-07-13 12:29:21 -04001112 /* Only null compression is supported. */
1113 if (memchr(CBS_data(&compression_methods), 0,
1114 CBS_len(&compression_methods)) == NULL)
Adam Langley95c29f32014-06-20 12:00:00 -07001115 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001116 al = SSL_AD_ILLEGAL_PARAMETER;
Adam Langley95c29f32014-06-20 12:00:00 -07001117 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_COMPRESSION_SPECIFIED);
1118 goto f_err;
1119 }
1120
Adam Langley95c29f32014-06-20 12:00:00 -07001121 /* TLS extensions*/
1122 if (s->version >= SSL3_VERSION)
1123 {
David Benjamin22f9bcc2014-07-13 12:29:21 -04001124 if (!ssl_parse_clienthello_tlsext(s, &client_hello))
Adam Langley95c29f32014-06-20 12:00:00 -07001125 {
1126 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_PARSE_TLSEXT);
1127 goto err;
1128 }
1129 }
1130
David Benjamindc72ff72014-06-25 12:36:10 -04001131 /* There should be nothing left over in the record. */
David Benjamin22f9bcc2014-07-13 12:29:21 -04001132 if (CBS_len(&client_hello) != 0)
David Benjamindc72ff72014-06-25 12:36:10 -04001133 {
1134 /* wrong packet length */
1135 al=SSL_AD_DECODE_ERROR;
1136 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_BAD_PACKET_LENGTH);
1137 goto f_err;
1138 }
1139
Adam Langley95c29f32014-06-20 12:00:00 -07001140 /* Check if we want to use external pre-shared secret for this
1141 * handshake for not reused session only. We need to generate
1142 * server_random before calling tls_session_secret_cb in order to allow
1143 * SessionTicket processing to use it in key derivation. */
1144 {
1145 unsigned char *pos;
1146 pos=s->s3->server_random;
1147 if (ssl_fill_hello_random(s, 1, pos, SSL3_RANDOM_SIZE) <= 0)
1148 {
1149 goto f_err;
1150 }
1151 }
1152
1153 if (!s->hit && s->version >= TLS1_VERSION && s->tls_session_secret_cb)
1154 {
David Benjamin6f260012014-08-15 13:49:12 -04001155 const SSL_CIPHER *pref_cipher=NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001156
1157 s->session->master_key_length=sizeof(s->session->master_key);
1158 if(s->tls_session_secret_cb(s, s->session->master_key, &s->session->master_key_length,
1159 ciphers, &pref_cipher, s->tls_session_secret_cb_arg))
1160 {
1161 s->hit=1;
1162 s->session->ciphers=ciphers;
1163 s->session->verify_result=X509_V_OK;
1164
1165 ciphers=NULL;
1166
1167 /* check if some cipher was preferred by call back */
Adam Langley858a88d2014-06-20 12:00:00 -07001168 pref_cipher=pref_cipher ? pref_cipher : ssl3_choose_cipher(s, s->session->ciphers, ssl_get_cipher_preferences(s));
Adam Langley95c29f32014-06-20 12:00:00 -07001169 if (pref_cipher == NULL)
1170 {
1171 al=SSL_AD_HANDSHAKE_FAILURE;
1172 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_SHARED_CIPHER);
1173 goto f_err;
1174 }
1175
1176 s->session->cipher=pref_cipher;
1177
1178 if (s->cipher_list)
Adam Langley858a88d2014-06-20 12:00:00 -07001179 ssl_cipher_preference_list_free(s->cipher_list);
Adam Langley95c29f32014-06-20 12:00:00 -07001180
1181 if (s->cipher_list_by_id)
1182 sk_SSL_CIPHER_free(s->cipher_list_by_id);
1183
Adam Langley858a88d2014-06-20 12:00:00 -07001184 s->cipher_list = ssl_cipher_preference_list_from_ciphers(s->session->ciphers);
Adam Langley95c29f32014-06-20 12:00:00 -07001185 s->cipher_list_by_id = sk_SSL_CIPHER_dup(s->session->ciphers);
1186 }
1187 }
Adam Langley95c29f32014-06-20 12:00:00 -07001188
Adam Langley95c29f32014-06-20 12:00:00 -07001189 /* Given s->session->ciphers and SSL_get_ciphers, we must
1190 * pick a cipher */
1191
1192 if (!s->hit)
1193 {
Adam Langley95c29f32014-06-20 12:00:00 -07001194 if (s->session->ciphers != NULL)
1195 sk_SSL_CIPHER_free(s->session->ciphers);
1196 s->session->ciphers=ciphers;
1197 if (ciphers == NULL)
1198 {
1199 al=SSL_AD_ILLEGAL_PARAMETER;
1200 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_CIPHERS_PASSED);
1201 goto f_err;
1202 }
1203 ciphers=NULL;
1204 /* Let cert callback update server certificates if required */
Adam Langley95c29f32014-06-20 12:00:00 -07001205 if (s->cert->cert_cb)
1206 {
1207 int rv = s->cert->cert_cb(s, s->cert->cert_cb_arg);
1208 if (rv == 0)
1209 {
1210 al=SSL_AD_INTERNAL_ERROR;
1211 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CERT_CB_ERROR);
1212 goto f_err;
1213 }
1214 if (rv < 0)
1215 {
1216 s->rwstate=SSL_X509_LOOKUP;
1217 return -1;
1218 }
1219 s->rwstate = SSL_NOTHING;
1220 }
1221 c=ssl3_choose_cipher(s,s->session->ciphers,
Adam Langley858a88d2014-06-20 12:00:00 -07001222 ssl_get_cipher_preferences(s));
Adam Langley95c29f32014-06-20 12:00:00 -07001223
1224 if (c == NULL)
1225 {
1226 al=SSL_AD_HANDSHAKE_FAILURE;
1227 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_NO_SHARED_CIPHER);
1228 goto f_err;
1229 }
1230 s->s3->tmp.new_cipher=c;
1231 }
1232 else
1233 {
1234 /* Session-id reuse */
Adam Langley95c29f32014-06-20 12:00:00 -07001235 s->s3->tmp.new_cipher=s->session->cipher;
1236 }
1237
1238 if (!SSL_USE_SIGALGS(s) || !(s->verify_mode & SSL_VERIFY_PEER))
1239 {
1240 if (!ssl3_digest_cached_records(s))
1241 goto f_err;
1242 }
1243
1244 /* we now have the following setup.
1245 * client_random
1246 * cipher_list - our prefered list of ciphers
1247 * ciphers - the clients prefered list of ciphers
1248 * compression - basically ignored right now
1249 * ssl version is set - sslv3
1250 * s->session - The ssl session has been setup.
1251 * s->hit - session reuse flag
1252 * s->tmp.new_cipher - the new cipher to use.
1253 */
1254
1255 /* Handles TLS extensions that we couldn't check earlier */
1256 if (s->version >= SSL3_VERSION)
1257 {
1258 if (ssl_check_clienthello_tlsext_late(s) <= 0)
1259 {
1260 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_hello, SSL_R_CLIENTHELLO_TLSEXT);
1261 goto err;
1262 }
1263 }
1264
1265 if (ret < 0) ret=-ret;
1266 if (0)
1267 {
1268f_err:
1269 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1270 }
1271err:
1272 if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
Adam Langleyb2ce0582014-06-20 12:00:00 -07001273 return ret;
Adam Langley95c29f32014-06-20 12:00:00 -07001274 }
1275
1276int ssl3_send_server_hello(SSL *s)
1277 {
1278 unsigned char *buf;
1279 unsigned char *p,*d;
David Benjamin39482a12014-07-20 13:30:15 -04001280 int sl;
Adam Langley95c29f32014-06-20 12:00:00 -07001281 unsigned long l;
1282
1283 if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
1284 {
Adam Langley1258b6a2014-06-20 12:00:00 -07001285 /* We only accept ChannelIDs on connections with ECDHE in order
1286 * to avoid a known attack while we fix ChannelID itself. */
1287 if (s->s3 &&
1288 s->s3->tlsext_channel_id_valid &&
1289 (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kEECDH) == 0)
1290 s->s3->tlsext_channel_id_valid = 0;
1291
1292 /* If this is a resumption and the original handshake didn't
1293 * support ChannelID then we didn't record the original
1294 * handshake hashes in the session and so cannot resume with
1295 * ChannelIDs. */
1296 if (s->hit &&
1297 s->s3->tlsext_channel_id_new &&
1298 s->session->original_handshake_hash_len == 0)
1299 s->s3->tlsext_channel_id_valid = 0;
1300
Adam Langley1b9d4772014-06-20 12:00:00 -07001301 if (s->mode & SSL_MODE_RELEASE_BUFFERS)
1302 {
1303 /* Free s->session->ciphers in order to release memory. This
1304 * breaks SSL_get_shared_ciphers(), but many servers will
David Benjamin5ffeb7c2014-07-15 00:34:01 -04001305 * prefer the memory savings. */
Adam Langley1b9d4772014-06-20 12:00:00 -07001306 sk_SSL_CIPHER_free(s->session->ciphers);
1307 s->session->ciphers = NULL;
1308 }
1309
Adam Langley95c29f32014-06-20 12:00:00 -07001310 buf=(unsigned char *)s->init_buf->data;
Adam Langley95c29f32014-06-20 12:00:00 -07001311 /* Do the message type and length last */
1312 d=p= ssl_handshake_start(s);
1313
1314 *(p++)=s->version>>8;
1315 *(p++)=s->version&0xff;
1316
1317 /* Random stuff */
1318 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
1319 p+=SSL3_RANDOM_SIZE;
1320
1321 /* There are several cases for the session ID to send
1322 * back in the server hello:
1323 * - For session reuse from the session cache,
1324 * we send back the old session ID.
1325 * - If stateless session reuse (using a session ticket)
1326 * is successful, we send back the client's "session ID"
1327 * (which doesn't actually identify the session).
1328 * - If it is a new session, we send back the new
1329 * session ID.
1330 * - However, if we want the new session to be single-use,
1331 * we send back a 0-length session ID.
1332 * s->hit is non-zero in either case of session reuse,
1333 * so the following won't overwrite an ID that we're supposed
1334 * to send back.
1335 */
1336 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER)
1337 && !s->hit)
1338 s->session->session_id_length=0;
1339
1340 sl=s->session->session_id_length;
1341 if (sl > (int)sizeof(s->session->session_id))
1342 {
1343 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_hello, ERR_R_INTERNAL_ERROR);
1344 return -1;
1345 }
1346 *(p++)=sl;
1347 memcpy(p,s->session->session_id,sl);
1348 p+=sl;
1349
1350 /* put the cipher */
David Benjamin39482a12014-07-20 13:30:15 -04001351 s2n(ssl3_get_cipher_value(s->s3->tmp.new_cipher), p);
Adam Langley95c29f32014-06-20 12:00:00 -07001352
1353 /* put the compression method */
1354 *(p++)=0;
Adam Langley95c29f32014-06-20 12:00:00 -07001355 if (ssl_prepare_serverhello_tlsext(s) <= 0)
1356 {
1357 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_hello, SSL_R_SERVERHELLO_TLSEXT);
1358 return -1;
1359 }
1360 if ((p = ssl_add_serverhello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
1361 {
1362 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_hello, ERR_R_INTERNAL_ERROR);
1363 return -1;
1364 }
Adam Langley95c29f32014-06-20 12:00:00 -07001365 /* do the header */
1366 l=(p-d);
1367 ssl_set_handshake_header(s, SSL3_MT_SERVER_HELLO, l);
1368 s->state=SSL3_ST_SW_SRVR_HELLO_B;
1369 }
1370
1371 /* SSL3_ST_SW_SRVR_HELLO_B */
1372 return ssl_do_write(s);
1373 }
1374
1375int ssl3_send_server_done(SSL *s)
1376 {
1377
1378 if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1379 {
1380 ssl_set_handshake_header(s, SSL3_MT_SERVER_DONE, 0);
1381 s->state = SSL3_ST_SW_SRVR_DONE_B;
1382 }
1383
1384 /* SSL3_ST_SW_SRVR_DONE_B */
1385 return ssl_do_write(s);
1386 }
1387
1388int ssl3_send_server_key_exchange(SSL *s)
1389 {
Adam Langley95c29f32014-06-20 12:00:00 -07001390 unsigned char *q;
1391 int j,num;
Adam Langley95c29f32014-06-20 12:00:00 -07001392 unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1393 unsigned int u;
Adam Langley95c29f32014-06-20 12:00:00 -07001394#ifndef OPENSSL_NO_DH
1395 DH *dh=NULL,*dhp;
1396#endif
1397#ifndef OPENSSL_NO_ECDH
1398 EC_KEY *ecdh=NULL, *ecdhp;
1399 unsigned char *encodedPoint = NULL;
1400 int encodedlen = 0;
1401 int curve_id = 0;
1402 BN_CTX *bn_ctx = NULL;
1403#endif
David Benjamin77a942b2014-07-15 01:22:50 -04001404 const char* psk_identity_hint = NULL;
1405 size_t psk_identity_hint_len = 0;
Adam Langley95c29f32014-06-20 12:00:00 -07001406 EVP_PKEY *pkey;
1407 const EVP_MD *md = NULL;
1408 unsigned char *p,*d;
1409 int al,i;
Adam Langleyc26c8022014-06-20 12:00:00 -07001410 unsigned long alg_k;
1411 unsigned long alg_a;
Adam Langley95c29f32014-06-20 12:00:00 -07001412 int n;
1413 CERT *cert;
1414 BIGNUM *r[4];
1415 int nr[4],kn;
1416 BUF_MEM *buf;
1417 EVP_MD_CTX md_ctx;
1418
1419 EVP_MD_CTX_init(&md_ctx);
1420 if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1421 {
Adam Langleyc26c8022014-06-20 12:00:00 -07001422 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
1423 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
Adam Langley95c29f32014-06-20 12:00:00 -07001424 cert=s->cert;
1425
1426 buf=s->init_buf;
1427
1428 r[0]=r[1]=r[2]=r[3]=NULL;
1429 n=0;
Adam Langleyc26c8022014-06-20 12:00:00 -07001430 if (alg_a & SSL_aPSK)
1431 {
1432 /* size for PSK identity hint */
Adam Langley0289c732014-06-20 12:00:00 -07001433 psk_identity_hint = s->session->psk_identity_hint;
1434 if (psk_identity_hint)
1435 psk_identity_hint_len = strlen(psk_identity_hint);
1436 else
1437 psk_identity_hint_len = 0;
1438 n+=2+psk_identity_hint_len;
Adam Langleyc26c8022014-06-20 12:00:00 -07001439 }
Adam Langley95c29f32014-06-20 12:00:00 -07001440#ifndef OPENSSL_NO_DH
David Benjamin77a942b2014-07-15 01:22:50 -04001441 if (alg_k & SSL_kEDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001442 {
1443 dhp=cert->dh_tmp;
1444 if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
David Benjamin060d9d22014-07-15 00:54:26 -04001445 dhp=s->cert->dh_tmp_cb(s, 0, 1024);
Adam Langley95c29f32014-06-20 12:00:00 -07001446 if (dhp == NULL)
1447 {
1448 al=SSL_AD_HANDSHAKE_FAILURE;
1449 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_MISSING_TMP_DH_KEY);
1450 goto f_err;
1451 }
1452
1453 if (s->s3->tmp.dh != NULL)
1454 {
1455 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_INTERNAL_ERROR);
1456 goto err;
1457 }
1458
1459 if ((dh=DHparams_dup(dhp)) == NULL)
1460 {
1461 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_DH_LIB);
1462 goto err;
1463 }
1464
1465 s->s3->tmp.dh=dh;
1466 if ((dhp->pub_key == NULL ||
1467 dhp->priv_key == NULL ||
1468 (s->options & SSL_OP_SINGLE_DH_USE)))
1469 {
1470 if(!DH_generate_key(dh))
1471 {
1472 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_DH_LIB);
1473 goto err;
1474 }
1475 }
1476 else
1477 {
1478 dh->pub_key=BN_dup(dhp->pub_key);
1479 dh->priv_key=BN_dup(dhp->priv_key);
1480 if ((dh->pub_key == NULL) ||
1481 (dh->priv_key == NULL))
1482 {
1483 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_DH_LIB);
1484 goto err;
1485 }
1486 }
1487 r[0]=dh->p;
1488 r[1]=dh->g;
1489 r[2]=dh->pub_key;
1490 }
David Benjamin77a942b2014-07-15 01:22:50 -04001491 else
Adam Langley95c29f32014-06-20 12:00:00 -07001492#endif
1493#ifndef OPENSSL_NO_ECDH
David Benjamin77a942b2014-07-15 01:22:50 -04001494 if (alg_k & SSL_kEECDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001495 {
1496 const EC_GROUP *group;
1497
1498 ecdhp=cert->ecdh_tmp;
1499 if (s->cert->ecdh_tmp_auto)
1500 {
1501 /* Get NID of appropriate shared curve */
David Benjamin072334d2014-07-13 16:24:27 -04001502 int nid = tls1_get_shared_curve(s);
Adam Langley95c29f32014-06-20 12:00:00 -07001503 if (nid != NID_undef)
1504 ecdhp = EC_KEY_new_by_curve_name(nid);
1505 }
1506 else if ((ecdhp == NULL) && s->cert->ecdh_tmp_cb)
1507 {
David Benjamin060d9d22014-07-15 00:54:26 -04001508 ecdhp = s->cert->ecdh_tmp_cb(s, 0, 1024);
Adam Langley95c29f32014-06-20 12:00:00 -07001509 }
1510 if (ecdhp == NULL)
1511 {
1512 al=SSL_AD_HANDSHAKE_FAILURE;
1513 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_MISSING_TMP_ECDH_KEY);
1514 goto f_err;
1515 }
1516
1517 if (s->s3->tmp.ecdh != NULL)
1518 {
1519 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_INTERNAL_ERROR);
1520 goto err;
1521 }
1522
1523 /* Duplicate the ECDH structure. */
1524 if (ecdhp == NULL)
1525 {
1526 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1527 goto err;
1528 }
1529 if (s->cert->ecdh_tmp_auto)
1530 ecdh = ecdhp;
1531 else if ((ecdh = EC_KEY_dup(ecdhp)) == NULL)
1532 {
1533 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1534 goto err;
1535 }
1536
1537 s->s3->tmp.ecdh=ecdh;
1538 if ((EC_KEY_get0_public_key(ecdh) == NULL) ||
1539 (EC_KEY_get0_private_key(ecdh) == NULL) ||
1540 (s->options & SSL_OP_SINGLE_ECDH_USE))
1541 {
1542 if(!EC_KEY_generate_key(ecdh))
1543 {
1544 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1545 goto err;
1546 }
1547 }
1548
1549 if (((group = EC_KEY_get0_group(ecdh)) == NULL) ||
1550 (EC_KEY_get0_public_key(ecdh) == NULL) ||
1551 (EC_KEY_get0_private_key(ecdh) == NULL))
1552 {
1553 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1554 goto err;
1555 }
1556
Adam Langley95c29f32014-06-20 12:00:00 -07001557 /* XXX: For now, we only support ephemeral ECDH
1558 * keys over named (not generic) curves. For
1559 * supported named curves, curve_id is non-zero.
1560 */
1561 if ((curve_id =
1562 tls1_ec_nid2curve_id(EC_GROUP_get_curve_name(group)))
1563 == 0)
1564 {
1565 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1566 goto err;
1567 }
1568
1569 /* Encode the public key.
1570 * First check the size of encoding and
1571 * allocate memory accordingly.
1572 */
1573 encodedlen = EC_POINT_point2oct(group,
1574 EC_KEY_get0_public_key(ecdh),
1575 POINT_CONVERSION_UNCOMPRESSED,
1576 NULL, 0, NULL);
1577
1578 encodedPoint = (unsigned char *)
1579 OPENSSL_malloc(encodedlen*sizeof(unsigned char));
1580 bn_ctx = BN_CTX_new();
1581 if ((encodedPoint == NULL) || (bn_ctx == NULL))
1582 {
1583 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_MALLOC_FAILURE);
1584 goto err;
1585 }
1586
1587
1588 encodedlen = EC_POINT_point2oct(group,
1589 EC_KEY_get0_public_key(ecdh),
1590 POINT_CONVERSION_UNCOMPRESSED,
1591 encodedPoint, encodedlen, bn_ctx);
1592
1593 if (encodedlen == 0)
1594 {
1595 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_ECDH_LIB);
1596 goto err;
1597 }
1598
1599 BN_CTX_free(bn_ctx); bn_ctx=NULL;
1600
1601 /* XXX: For now, we only support named (not
1602 * generic) curves in ECDH ephemeral key exchanges.
1603 * In this situation, we need four additional bytes
1604 * to encode the entire ServerECDHParams
1605 * structure.
1606 */
Adam Langleyc26c8022014-06-20 12:00:00 -07001607 n += 4 + encodedlen;
Adam Langley95c29f32014-06-20 12:00:00 -07001608
1609 /* We'll generate the serverKeyExchange message
1610 * explicitly so we can set these to NULLs
1611 */
1612 r[0]=NULL;
1613 r[1]=NULL;
1614 r[2]=NULL;
1615 r[3]=NULL;
1616 }
David Benjamin77a942b2014-07-15 01:22:50 -04001617 else
Adam Langley95c29f32014-06-20 12:00:00 -07001618#endif /* !OPENSSL_NO_ECDH */
David Benjamin77a942b2014-07-15 01:22:50 -04001619 if (!(alg_k & SSL_kPSK))
Adam Langley95c29f32014-06-20 12:00:00 -07001620 {
1621 al=SSL_AD_HANDSHAKE_FAILURE;
1622 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1623 goto f_err;
1624 }
1625 for (i=0; i < 4 && r[i] != NULL; i++)
1626 {
1627 nr[i]=BN_num_bytes(r[i]);
1628 n+=2+nr[i];
1629 }
1630
David Benjamine8f3d662014-07-12 01:10:19 -04001631 if (ssl_cipher_has_server_public_key(s->s3->tmp.new_cipher))
Adam Langley95c29f32014-06-20 12:00:00 -07001632 {
1633 if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher,&md))
1634 == NULL)
1635 {
1636 al=SSL_AD_DECODE_ERROR;
1637 goto f_err;
1638 }
1639 kn=EVP_PKEY_size(pkey);
1640 }
1641 else
1642 {
1643 pkey=NULL;
1644 kn=0;
1645 }
1646
1647 if (!BUF_MEM_grow_clean(buf,n+SSL_HM_HEADER_LENGTH(s)+kn))
1648 {
1649 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_LIB_BUF);
1650 goto err;
1651 }
1652 d = p = ssl_handshake_start(s);
1653
1654 for (i=0; i < 4 && r[i] != NULL; i++)
1655 {
1656 s2n(nr[i],p);
1657 BN_bn2bin(r[i],p);
1658 p+=nr[i];
1659 }
1660
Adam Langleyc26c8022014-06-20 12:00:00 -07001661/* Note: ECDHE PSK ciphersuites use SSL_kEECDH and SSL_aPSK.
1662 * When one of them is used, the server key exchange record needs to have both
1663 * the psk_identity_hint and the ServerECDHParams. */
Adam Langleyc26c8022014-06-20 12:00:00 -07001664 if (alg_a & SSL_aPSK)
1665 {
Adam Langley0289c732014-06-20 12:00:00 -07001666 /* copy PSK identity hint (if provided) */
1667 s2n(psk_identity_hint_len, p);
1668 if (psk_identity_hint_len > 0)
Adam Langleyc26c8022014-06-20 12:00:00 -07001669 {
Adam Langley0289c732014-06-20 12:00:00 -07001670 memcpy(p, psk_identity_hint, psk_identity_hint_len);
1671 p+=psk_identity_hint_len;
Adam Langleyc26c8022014-06-20 12:00:00 -07001672 }
1673 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001674
Adam Langley95c29f32014-06-20 12:00:00 -07001675#ifndef OPENSSL_NO_ECDH
Adam Langleyc26c8022014-06-20 12:00:00 -07001676 if (alg_k & SSL_kEECDH)
Adam Langley95c29f32014-06-20 12:00:00 -07001677 {
1678 /* XXX: For now, we only support named (not generic) curves.
1679 * In this situation, the serverKeyExchange message has:
1680 * [1 byte CurveType], [2 byte CurveName]
1681 * [1 byte length of encoded point], followed by
1682 * the actual encoded point itself
1683 */
1684 *p = NAMED_CURVE_TYPE;
1685 p += 1;
1686 *p = 0;
1687 p += 1;
1688 *p = curve_id;
1689 p += 1;
1690 *p = encodedlen;
1691 p += 1;
1692 memcpy((unsigned char*)p,
1693 (unsigned char *)encodedPoint,
1694 encodedlen);
1695 OPENSSL_free(encodedPoint);
1696 encodedPoint = NULL;
1697 p += encodedlen;
1698 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001699#endif /* OPENSSL_NO_ECDH */
Adam Langley95c29f32014-06-20 12:00:00 -07001700
1701 /* not anonymous */
1702 if (pkey != NULL)
1703 {
1704 /* n is the length of the params, they start at &(d[4])
1705 * and p points to the space at the end. */
Adam Langley95c29f32014-06-20 12:00:00 -07001706 if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s))
1707 {
1708 q=md_buf;
1709 j=0;
1710 for (num=2; num > 0; num--)
1711 {
1712 EVP_DigestInit_ex(&md_ctx,(num == 2)
1713 ?s->ctx->md5:s->ctx->sha1, NULL);
1714 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1715 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1716 EVP_DigestUpdate(&md_ctx,d,n);
1717 EVP_DigestFinal_ex(&md_ctx,q,
1718 (unsigned int *)&i);
1719 q+=i;
1720 j+=i;
1721 }
1722 if (RSA_sign(NID_md5_sha1, md_buf, j,
1723 &(p[2]), &u, pkey->pkey.rsa) <= 0)
1724 {
1725 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_LIB_RSA);
1726 goto err;
1727 }
1728 s2n(u,p);
1729 n+=u+2;
1730 }
1731 else
Adam Langley95c29f32014-06-20 12:00:00 -07001732 if (md)
1733 {
1734 /* send signature algorithm */
1735 if (SSL_USE_SIGALGS(s))
1736 {
1737 if (!tls12_get_sigandhash(p, pkey, md))
1738 {
1739 /* Should never happen */
1740 al=SSL_AD_INTERNAL_ERROR;
1741 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_R_INTERNAL_ERROR);
1742 goto f_err;
1743 }
1744 p+=2;
1745 }
1746#ifdef SSL_DEBUG
1747 fprintf(stderr, "Using hash %s\n",
1748 EVP_MD_name(md));
1749#endif
1750 EVP_SignInit_ex(&md_ctx, md, NULL);
1751 EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1752 EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1753 EVP_SignUpdate(&md_ctx,d,n);
1754 if (!EVP_SignFinal(&md_ctx,&(p[2]),
1755 (unsigned int *)&i,pkey))
1756 {
1757 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, ERR_LIB_EVP);
1758 goto err;
1759 }
1760 s2n(i,p);
1761 n+=i+2;
1762 if (SSL_USE_SIGALGS(s))
1763 n+= 2;
1764 }
1765 else
1766 {
1767 /* Is this error check actually needed? */
1768 al=SSL_AD_HANDSHAKE_FAILURE;
1769 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_key_exchange, SSL_R_UNKNOWN_PKEY_TYPE);
1770 goto f_err;
1771 }
1772 }
1773
1774 ssl_set_handshake_header(s, SSL3_MT_SERVER_KEY_EXCHANGE, n);
1775 }
1776
1777 s->state = SSL3_ST_SW_KEY_EXCH_B;
1778 EVP_MD_CTX_cleanup(&md_ctx);
1779 return ssl_do_write(s);
1780f_err:
1781 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1782err:
1783#ifndef OPENSSL_NO_ECDH
1784 if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1785 BN_CTX_free(bn_ctx);
1786#endif
1787 EVP_MD_CTX_cleanup(&md_ctx);
1788 return(-1);
1789 }
1790
1791int ssl3_send_certificate_request(SSL *s)
1792 {
1793 unsigned char *p,*d;
1794 int i,j,nl,off,n;
1795 STACK_OF(X509_NAME) *sk=NULL;
1796 X509_NAME *name;
1797 BUF_MEM *buf;
1798
1799 if (s->state == SSL3_ST_SW_CERT_REQ_A)
1800 {
1801 buf=s->init_buf;
1802
1803 d=p=ssl_handshake_start(s);
1804
1805 /* get the list of acceptable cert types */
1806 p++;
1807 n=ssl3_get_req_cert_type(s,p);
1808 d[0]=n;
1809 p+=n;
1810 n++;
1811
1812 if (SSL_USE_SIGALGS(s))
1813 {
1814 const unsigned char *psigs;
1815 nl = tls12_get_psigalgs(s, &psigs);
1816 s2n(nl, p);
1817 memcpy(p, psigs, nl);
1818 p += nl;
1819 n += nl + 2;
1820 }
1821
1822 off=n;
1823 p+=2;
1824 n+=2;
1825
1826 sk=SSL_get_client_CA_list(s);
1827 nl=0;
1828 if (sk != NULL)
1829 {
1830 for (i=0; i<sk_X509_NAME_num(sk); i++)
1831 {
1832 name=sk_X509_NAME_value(sk,i);
1833 j=i2d_X509_NAME(name,NULL);
1834 if (!BUF_MEM_grow_clean(buf,SSL_HM_HEADER_LENGTH(s)+n+j+2))
1835 {
1836 OPENSSL_PUT_ERROR(SSL, ssl3_send_certificate_request, ERR_R_BUF_LIB);
1837 goto err;
1838 }
1839 p = ssl_handshake_start(s) + n;
Alex Chernyakhovsky9c890d42014-07-05 00:53:11 -04001840 s2n(j,p);
1841 i2d_X509_NAME(name,&p);
1842 n+=2+j;
1843 nl+=2+j;
Adam Langley95c29f32014-06-20 12:00:00 -07001844 }
1845 }
1846 /* else no CA names */
1847 p = ssl_handshake_start(s) + off;
1848 s2n(nl,p);
1849
1850 ssl_set_handshake_header(s, SSL3_MT_CERTIFICATE_REQUEST, n);
1851
1852#ifdef NETSCAPE_HANG_BUG
1853 if (!SSL_IS_DTLS(s))
1854 {
Adam Langleyce1cfe12014-06-20 12:00:00 -07001855 if (!BUF_MEM_grow_clean(buf, s->init_num + 4))
1856 {
1857 OPENSSL_PUT_ERROR(SSL, ssl3_send_certificate_request, ERR_R_BUF_LIB);
1858 goto err;
1859 }
Adam Langley95c29f32014-06-20 12:00:00 -07001860 p=(unsigned char *)s->init_buf->data + s->init_num;
1861 /* do the header */
1862 *(p++)=SSL3_MT_SERVER_DONE;
1863 *(p++)=0;
1864 *(p++)=0;
1865 *(p++)=0;
1866 s->init_num += 4;
1867 }
1868#endif
1869
1870 s->state = SSL3_ST_SW_CERT_REQ_B;
1871 }
1872
1873 /* SSL3_ST_SW_CERT_REQ_B */
1874 return ssl_do_write(s);
1875err:
1876 return(-1);
1877 }
1878
1879int ssl3_get_client_key_exchange(SSL *s)
1880 {
David Benjamin35c02302014-07-13 04:14:59 -04001881 int al,ok;
Adam Langley95c29f32014-06-20 12:00:00 -07001882 long n;
David Benjamin35c02302014-07-13 04:14:59 -04001883 CBS client_key_exchange;
Adam Langley95c29f32014-06-20 12:00:00 -07001884 unsigned long alg_k;
Adam Langleyc26c8022014-06-20 12:00:00 -07001885 unsigned long alg_a;
David Benjamin35c02302014-07-13 04:14:59 -04001886 uint8_t *premaster_secret = NULL;
David Benjamin14c83e72014-07-13 04:54:57 -04001887 size_t premaster_secret_len = 0;
1888 int skip_certificate_verify = 0;
Adam Langley95c29f32014-06-20 12:00:00 -07001889 RSA *rsa=NULL;
David Benjamin0aa07672014-07-24 15:34:14 -04001890 uint8_t *decrypt_buf = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001891 EVP_PKEY *pkey=NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07001892#ifndef OPENSSL_NO_DH
1893 BIGNUM *pub=NULL;
1894 DH *dh_srvr, *dh_clnt = NULL;
1895#endif
1896
1897#ifndef OPENSSL_NO_ECDH
1898 EC_KEY *srvr_ecdh = NULL;
1899 EVP_PKEY *clnt_pub_pkey = NULL;
1900 EC_POINT *clnt_ecpoint = NULL;
Adam Langleyc26c8022014-06-20 12:00:00 -07001901 BN_CTX *bn_ctx = NULL;
Adam Langleyc26c8022014-06-20 12:00:00 -07001902 unsigned int psk_len = 0;
1903 unsigned char psk[PSK_MAX_PSK_LEN];
Adam Langley95c29f32014-06-20 12:00:00 -07001904#endif
1905
1906 n=s->method->ssl_get_message(s,
1907 SSL3_ST_SR_KEY_EXCH_A,
1908 SSL3_ST_SR_KEY_EXCH_B,
1909 SSL3_MT_CLIENT_KEY_EXCHANGE,
1910 2048, /* ??? */
1911 &ok);
1912
1913 if (!ok) return((int)n);
David Benjamin35c02302014-07-13 04:14:59 -04001914 CBS_init(&client_key_exchange, s->init_msg, n);
Adam Langley95c29f32014-06-20 12:00:00 -07001915
1916 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
Adam Langleyc26c8022014-06-20 12:00:00 -07001917 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
Adam Langley95c29f32014-06-20 12:00:00 -07001918
David Benjamin14c83e72014-07-13 04:54:57 -04001919 /* If using a PSK key exchange, prepare the pre-shared key. */
Adam Langleyc26c8022014-06-20 12:00:00 -07001920 if (alg_a & SSL_aPSK)
1921 {
David Benjamin35c02302014-07-13 04:14:59 -04001922 CBS psk_identity;
Adam Langleyc26c8022014-06-20 12:00:00 -07001923
David Benjamin35c02302014-07-13 04:14:59 -04001924 /* If using PSK, the ClientKeyExchange contains a
1925 * psk_identity. If PSK, then this is the only field
1926 * in the message. */
1927 if (!CBS_get_u16_length_prefixed(&client_key_exchange, &psk_identity) ||
1928 ((alg_k & SSL_kPSK) && CBS_len(&client_key_exchange) != 0))
Adam Langleyc26c8022014-06-20 12:00:00 -07001929 {
David Benjamin35c02302014-07-13 04:14:59 -04001930 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DECODE_ERROR);
1931 al = SSL_AD_DECODE_ERROR;
David Benjamin14c83e72014-07-13 04:54:57 -04001932 goto f_err;
Adam Langleyc26c8022014-06-20 12:00:00 -07001933 }
David Benjamin35c02302014-07-13 04:14:59 -04001934
Adam Langleyc26c8022014-06-20 12:00:00 -07001935 if (s->psk_server_callback == NULL)
1936 {
1937 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_PSK_NO_SERVER_CB);
David Benjamin35c02302014-07-13 04:14:59 -04001938 al = SSL_AD_INTERNAL_ERROR;
David Benjamin14c83e72014-07-13 04:54:57 -04001939 goto f_err;
Adam Langleyc26c8022014-06-20 12:00:00 -07001940 }
1941
David Benjamin35c02302014-07-13 04:14:59 -04001942 if (CBS_len(&psk_identity) > PSK_MAX_IDENTITY_LEN ||
1943 CBS_contains_zero_byte(&psk_identity))
1944 {
1945 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DATA_LENGTH_TOO_LONG);
1946 al = SSL_AD_ILLEGAL_PARAMETER;
David Benjamin14c83e72014-07-13 04:54:57 -04001947 goto f_err;
David Benjamin35c02302014-07-13 04:14:59 -04001948 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001949
David Benjamin35c02302014-07-13 04:14:59 -04001950 if (!CBS_strdup(&psk_identity, &s->session->psk_identity))
1951 {
1952 al = SSL_AD_INTERNAL_ERROR;
1953 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
David Benjamin14c83e72014-07-13 04:54:57 -04001954 goto f_err;
David Benjamin35c02302014-07-13 04:14:59 -04001955 }
1956
1957 /* Look up the key for the identity. */
1958 psk_len = s->psk_server_callback(s, s->session->psk_identity, psk, sizeof(psk));
Adam Langleyc26c8022014-06-20 12:00:00 -07001959 if (psk_len > PSK_MAX_PSK_LEN)
1960 {
1961 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_INTERNAL_ERROR);
David Benjamin35c02302014-07-13 04:14:59 -04001962 al = SSL_AD_INTERNAL_ERROR;
David Benjamin14c83e72014-07-13 04:54:57 -04001963 goto f_err;
Adam Langleyc26c8022014-06-20 12:00:00 -07001964 }
1965 else if (psk_len == 0)
1966 {
1967 /* PSK related to the given identity not found */
1968 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_PSK_IDENTITY_NOT_FOUND);
David Benjamin35c02302014-07-13 04:14:59 -04001969 al = SSL_AD_UNKNOWN_PSK_IDENTITY;
Adam Langleyc26c8022014-06-20 12:00:00 -07001970 goto f_err;
David Benjamin14c83e72014-07-13 04:54:57 -04001971 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001972 }
Adam Langleyc26c8022014-06-20 12:00:00 -07001973
David Benjamin14c83e72014-07-13 04:54:57 -04001974 /* Depending on the key exchange method, compute |premaster_secret| and
1975 * |premaster_secret_len|. Also, for DH and ECDH, set
1976 * |skip_certificate_verify| as appropriate. */
David Benjamin35c02302014-07-13 04:14:59 -04001977 if (alg_k & SSL_kRSA)
Adam Langley95c29f32014-06-20 12:00:00 -07001978 {
David Benjamin35c02302014-07-13 04:14:59 -04001979 CBS encrypted_premaster_secret;
David Benjamin0aa07672014-07-24 15:34:14 -04001980 uint8_t rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
1981 int decrypt_good_mask;
1982 uint8_t version_good;
1983 size_t rsa_size, decrypt_len, premaster_index, j;
Adam Langleyacff73f2014-06-20 12:00:00 -07001984
David Benjaminb9cc33a2014-07-15 00:09:48 -04001985 pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1986 if ( (pkey == NULL) ||
1987 (pkey->type != EVP_PKEY_RSA) ||
1988 (pkey->pkey.rsa == NULL))
Adam Langley95c29f32014-06-20 12:00:00 -07001989 {
David Benjaminb9cc33a2014-07-15 00:09:48 -04001990 al=SSL_AD_HANDSHAKE_FAILURE;
1991 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_RSA_CERTIFICATE);
1992 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001993 }
David Benjaminb9cc33a2014-07-15 00:09:48 -04001994 rsa=pkey->pkey.rsa;
Adam Langley95c29f32014-06-20 12:00:00 -07001995
David Benjamincc23df52014-08-03 13:37:47 -04001996 /* TLS and [incidentally] DTLS{0xFEFF} */
David Benjamin35c02302014-07-13 04:14:59 -04001997 if (s->version > SSL3_VERSION)
Adam Langley95c29f32014-06-20 12:00:00 -07001998 {
David Benjamin35c02302014-07-13 04:14:59 -04001999 CBS copy = client_key_exchange;
2000 if (!CBS_get_u16_length_prefixed(&client_key_exchange,
2001 &encrypted_premaster_secret) ||
2002 CBS_len(&client_key_exchange) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002003 {
2004 if (!(s->options & SSL_OP_TLS_D5_BUG))
2005 {
Adam Langleyacff73f2014-06-20 12:00:00 -07002006 al = SSL_AD_DECODE_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07002007 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 -07002008 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07002009 }
2010 else
David Benjamin35c02302014-07-13 04:14:59 -04002011 encrypted_premaster_secret = copy;
Adam Langley95c29f32014-06-20 12:00:00 -07002012 }
Adam Langley95c29f32014-06-20 12:00:00 -07002013 }
David Benjamin35c02302014-07-13 04:14:59 -04002014 else
2015 encrypted_premaster_secret = client_key_exchange;
Adam Langley95c29f32014-06-20 12:00:00 -07002016
David Benjamin0aa07672014-07-24 15:34:14 -04002017 /* Reject overly short RSA keys because we want to be sure that
2018 * the buffer size makes it safe to iterate over the entire size
2019 * of a premaster secret (SSL_MAX_MASTER_KEY_LENGTH). The actual
2020 * expected size is larger due to RSA padding, but the bound is
2021 * sufficient to be safe. */
2022 rsa_size = RSA_size(rsa);
2023 if (rsa_size < SSL_MAX_MASTER_KEY_LENGTH)
Adam Langley95c29f32014-06-20 12:00:00 -07002024 {
Adam Langleyacff73f2014-06-20 12:00:00 -07002025 al = SSL_AD_DECRYPT_ERROR;
2026 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DECRYPTION_FAILED);
2027 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07002028 }
2029
Adam Langleyacff73f2014-06-20 12:00:00 -07002030 /* We must not leak whether a decryption failure occurs because
2031 * of Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see
2032 * RFC 2246, section 7.4.7.1). The code follows that advice of
2033 * the TLS RFC and generates a random premaster secret for the
2034 * case that the decrypt fails. See
2035 * https://tools.ietf.org/html/rfc5246#section-7.4.7.1 */
2036 if (RAND_pseudo_bytes(rand_premaster_secret,
2037 sizeof(rand_premaster_secret)) <= 0)
2038 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -07002039
David Benjamin35c02302014-07-13 04:14:59 -04002040 /* Allocate a buffer large enough for an RSA decryption. */
David Benjamin0aa07672014-07-24 15:34:14 -04002041 decrypt_buf = OPENSSL_malloc(rsa_size);
2042 if (decrypt_buf == NULL)
David Benjamin35c02302014-07-13 04:14:59 -04002043 {
2044 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2045 goto err;
2046 }
2047
David Benjamin0aa07672014-07-24 15:34:14 -04002048 /* Decrypt with no padding. PKCS#1 padding will be removed as
2049 * part of the timing-sensitive code below. */
2050 if (!RSA_decrypt(rsa, &decrypt_len, decrypt_buf, rsa_size,
2051 CBS_data(&encrypted_premaster_secret),
2052 CBS_len(&encrypted_premaster_secret),
2053 RSA_NO_PADDING))
2054 {
2055 goto err;
2056 }
2057 if (decrypt_len != rsa_size)
2058 {
2059 /* This should never happen, but do a check so we do not
2060 * read uninitialized memory. */
2061 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_INTERNAL_ERROR);
2062 goto err;
2063 }
David Benjamin35c02302014-07-13 04:14:59 -04002064
David Benjamin0aa07672014-07-24 15:34:14 -04002065 /* Remove the PKCS#1 padding and adjust decrypt_len as
2066 * appropriate. decrypt_good_mask will be zero if the premaster
2067 * if good and non-zero otherwise. */
2068 decrypt_good_mask = RSA_message_index_PKCS1_type_2(
2069 decrypt_buf, decrypt_len, &premaster_index);
2070 decrypt_good_mask--;
2071 decrypt_len = decrypt_len - premaster_index;
Adam Langleyacff73f2014-06-20 12:00:00 -07002072
David Benjamin0aa07672014-07-24 15:34:14 -04002073 /* decrypt_len should be SSL_MAX_MASTER_KEY_LENGTH. */
2074 decrypt_good_mask |= decrypt_len ^ SSL_MAX_MASTER_KEY_LENGTH;
2075
2076 /* Copy over the unpadded premaster. Whatever the value of
2077 * |decrypt_good_mask|, copy as if the premaster were the right
2078 * length. It is important the memory access pattern be
2079 * constant. */
2080 premaster_secret = BUF_memdup(
2081 decrypt_buf + (rsa_size - SSL_MAX_MASTER_KEY_LENGTH),
2082 SSL_MAX_MASTER_KEY_LENGTH);
2083 if (premaster_secret == NULL)
2084 {
2085 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2086 goto err;
2087 }
2088 OPENSSL_free(decrypt_buf);
2089 decrypt_buf = NULL;
Adam Langleyacff73f2014-06-20 12:00:00 -07002090
2091 /* If the version in the decrypted pre-master secret is correct
2092 * then version_good will be zero. The Klima-Pokorny-Rosa
2093 * extension of Bleichenbacher's attack
2094 * (http://eprint.iacr.org/2003/052/) exploits the version
2095 * number check as a "bad version oracle". Thus version checks
2096 * are done in constant time and are treated like any other
2097 * decryption error. */
David Benjamin35c02302014-07-13 04:14:59 -04002098 version_good = premaster_secret[0] ^ (s->client_version>>8);
2099 version_good |= premaster_secret[1] ^ (s->client_version&0xff);
Adam Langleyacff73f2014-06-20 12:00:00 -07002100
Adam Langleyacff73f2014-06-20 12:00:00 -07002101 /* If any bits in version_good are set then they'll poision
2102 * decrypt_good_mask and cause rand_premaster_secret to be
2103 * used. */
2104 decrypt_good_mask |= version_good;
2105
2106 /* decrypt_good_mask will be zero iff decrypt_len ==
2107 * SSL_MAX_MASTER_KEY_LENGTH and the version check passed. We
2108 * fold the bottom 32 bits of it with an OR so that the LSB
2109 * will be zero iff everything is good. This assumes that we'll
2110 * never decrypt a value > 2**31 bytes, which seems safe. */
2111 decrypt_good_mask |= decrypt_good_mask >> 16;
2112 decrypt_good_mask |= decrypt_good_mask >> 8;
2113 decrypt_good_mask |= decrypt_good_mask >> 4;
2114 decrypt_good_mask |= decrypt_good_mask >> 2;
2115 decrypt_good_mask |= decrypt_good_mask >> 1;
2116 /* Now select only the LSB and subtract one. If decrypt_len ==
2117 * SSL_MAX_MASTER_KEY_LENGTH and the version check passed then
2118 * decrypt_good_mask will be all ones. Otherwise it'll be all
2119 * zeros. */
2120 decrypt_good_mask &= 1;
2121 decrypt_good_mask--;
2122
David Benjamin35c02302014-07-13 04:14:59 -04002123 /* Now copy rand_premaster_secret over premaster_secret using
Adam Langleyacff73f2014-06-20 12:00:00 -07002124 * decrypt_good_mask. */
2125 for (j = 0; j < sizeof(rand_premaster_secret); j++)
Adam Langley95c29f32014-06-20 12:00:00 -07002126 {
David Benjamin35c02302014-07-13 04:14:59 -04002127 premaster_secret[j] = (premaster_secret[j] & decrypt_good_mask) |
Adam Langleyacff73f2014-06-20 12:00:00 -07002128 (rand_premaster_secret[j] & ~decrypt_good_mask);
Adam Langley95c29f32014-06-20 12:00:00 -07002129 }
Adam Langleyacff73f2014-06-20 12:00:00 -07002130
David Benjamin14c83e72014-07-13 04:54:57 -04002131 premaster_secret_len = sizeof(rand_premaster_secret);
Adam Langley95c29f32014-06-20 12:00:00 -07002132 }
Adam Langley95c29f32014-06-20 12:00:00 -07002133#ifndef OPENSSL_NO_DH
Adam Langleyc26c8022014-06-20 12:00:00 -07002134 else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
Adam Langley95c29f32014-06-20 12:00:00 -07002135 {
David Benjamin35c02302014-07-13 04:14:59 -04002136 CBS dh_Yc;
Adam Langley95c29f32014-06-20 12:00:00 -07002137 int idx = -1;
David Benjamin35c02302014-07-13 04:14:59 -04002138 int dh_len;
Adam Langley95c29f32014-06-20 12:00:00 -07002139 EVP_PKEY *skey = NULL;
David Benjamin35c02302014-07-13 04:14:59 -04002140
2141 if (!CBS_get_u16_length_prefixed(&client_key_exchange, &dh_Yc) ||
2142 CBS_len(&client_key_exchange) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002143 {
David Benjamin35c02302014-07-13 04:14:59 -04002144 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
2145 al = SSL_R_DECODE_ERROR;
2146 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07002147 }
David Benjamin35c02302014-07-13 04:14:59 -04002148
Adam Langley95c29f32014-06-20 12:00:00 -07002149 if (alg_k & SSL_kDHr)
2150 idx = SSL_PKEY_DH_RSA;
2151 else if (alg_k & SSL_kDHd)
2152 idx = SSL_PKEY_DH_DSA;
2153 if (idx >= 0)
2154 {
2155 skey = s->cert->pkeys[idx].privatekey;
2156 if ((skey == NULL) ||
2157 (skey->type != EVP_PKEY_DH) ||
2158 (skey->pkey.dh == NULL))
2159 {
2160 al=SSL_AD_HANDSHAKE_FAILURE;
2161 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_RSA_CERTIFICATE);
2162 goto f_err;
2163 }
2164 dh_srvr = skey->pkey.dh;
2165 }
2166 else if (s->s3->tmp.dh == NULL)
2167 {
2168 al=SSL_AD_HANDSHAKE_FAILURE;
2169 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_TMP_DH_KEY);
2170 goto f_err;
2171 }
2172 else
2173 dh_srvr=s->s3->tmp.dh;
2174
David Benjamin35c02302014-07-13 04:14:59 -04002175 if (CBS_len(&dh_Yc) == 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002176 {
David Benjamin35c02302014-07-13 04:14:59 -04002177 /* Get pubkey from the client certificate. This is the
2178 * 'implicit' case of ClientDiffieHellman.
2179 *
2180 * TODO(davidben): Either lose this code or fix a bug
2181 * (or get the spec changed): if there is a fixed_dh
2182 * client certificate, per spec, the 'implicit' mode
2183 * MUST be used. This logic will still accept 'explicit'
2184 * mode. */
Adam Langley95c29f32014-06-20 12:00:00 -07002185 EVP_PKEY *clkey=X509_get_pubkey(s->session->peer);
2186 if (clkey)
2187 {
2188 if (EVP_PKEY_cmp_parameters(clkey, skey) == 1)
2189 dh_clnt = EVP_PKEY_get1_DH(clkey);
2190 }
2191 if (dh_clnt == NULL)
2192 {
2193 al=SSL_AD_HANDSHAKE_FAILURE;
2194 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_TMP_DH_KEY);
2195 goto f_err;
2196 }
2197 EVP_PKEY_free(clkey);
2198 pub = dh_clnt->pub_key;
2199 }
2200 else
David Benjamin35c02302014-07-13 04:14:59 -04002201 pub = BN_bin2bn(CBS_data(&dh_Yc), CBS_len(&dh_Yc), NULL);
Adam Langley95c29f32014-06-20 12:00:00 -07002202 if (pub == NULL)
2203 {
2204 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_BN_LIB);
2205 goto err;
2206 }
2207
David Benjamin35c02302014-07-13 04:14:59 -04002208 /* Allocate a buffer for the premaster secret. */
2209 premaster_secret = OPENSSL_malloc(DH_size(dh_srvr));
2210 if (premaster_secret == NULL)
2211 {
2212 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2213 goto err;
2214 }
Adam Langley95c29f32014-06-20 12:00:00 -07002215
David Benjamin35c02302014-07-13 04:14:59 -04002216 dh_len = DH_compute_key(premaster_secret, pub, dh_srvr);
2217 if (dh_len <= 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002218 {
2219 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_DH_LIB);
2220 BN_clear_free(pub);
2221 goto err;
2222 }
2223
2224 DH_free(s->s3->tmp.dh);
2225 s->s3->tmp.dh=NULL;
2226 if (dh_clnt)
2227 DH_free(dh_clnt);
2228 else
2229 BN_clear_free(pub);
2230 pub=NULL;
David Benjamin14c83e72014-07-13 04:54:57 -04002231
2232 premaster_secret_len = dh_len;
Adam Langley95c29f32014-06-20 12:00:00 -07002233 if (dh_clnt)
David Benjamin14c83e72014-07-13 04:54:57 -04002234 skip_certificate_verify = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002235 }
Adam Langley95c29f32014-06-20 12:00:00 -07002236#endif
2237
2238#ifndef OPENSSL_NO_ECDH
Adam Langleyc26c8022014-06-20 12:00:00 -07002239 else if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe))
Adam Langley95c29f32014-06-20 12:00:00 -07002240 {
David Benjamin35c02302014-07-13 04:14:59 -04002241 int field_size = 0, ecdh_len;
Adam Langley95c29f32014-06-20 12:00:00 -07002242 const EC_KEY *tkey;
2243 const EC_GROUP *group;
2244 const BIGNUM *priv_key;
2245
2246 /* initialize structures for server's ECDH key pair */
2247 if ((srvr_ecdh = EC_KEY_new()) == NULL)
2248 {
2249 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2250 goto err;
2251 }
2252
2253 /* Let's get server private key and group information */
2254 if (alg_k & (SSL_kECDHr|SSL_kECDHe))
2255 {
2256 /* use the certificate */
2257 tkey = s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec;
2258 }
2259 else
2260 {
2261 /* use the ephermeral values we saved when
2262 * generating the ServerKeyExchange msg.
2263 */
2264 tkey = s->s3->tmp.ecdh;
2265 }
2266
2267 group = EC_KEY_get0_group(tkey);
2268 priv_key = EC_KEY_get0_private_key(tkey);
2269
2270 if (!EC_KEY_set_group(srvr_ecdh, group) ||
2271 !EC_KEY_set_private_key(srvr_ecdh, priv_key))
2272 {
2273 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_EC_LIB);
2274 goto err;
2275 }
2276
2277 /* Let's get client's public key */
2278 if ((clnt_ecpoint = EC_POINT_new(group)) == NULL)
2279 {
2280 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2281 goto err;
2282 }
2283
David Benjamin35c02302014-07-13 04:14:59 -04002284 if (CBS_len(&client_key_exchange) == 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002285 {
2286 /* Client Publickey was in Client Certificate */
2287
2288 if (alg_k & SSL_kEECDH)
2289 {
2290 al=SSL_AD_HANDSHAKE_FAILURE;
2291 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_MISSING_TMP_ECDH_KEY);
2292 goto f_err;
2293 }
2294 if (((clnt_pub_pkey=X509_get_pubkey(s->session->peer))
2295 == NULL) ||
2296 (clnt_pub_pkey->type != EVP_PKEY_EC))
2297 {
2298 /* XXX: For now, we do not support client
2299 * authentication using ECDH certificates
2300 * so this branch (n == 0L) of the code is
2301 * never executed. When that support is
2302 * added, we ought to ensure the key
2303 * received in the certificate is
2304 * authorized for key agreement.
2305 * ECDH_compute_key implicitly checks that
2306 * the two ECDH shares are for the same
2307 * group.
2308 */
2309 al=SSL_AD_HANDSHAKE_FAILURE;
2310 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_UNABLE_TO_DECODE_ECDH_CERTS);
2311 goto f_err;
2312 }
2313
2314 if (EC_POINT_copy(clnt_ecpoint,
2315 EC_KEY_get0_public_key(clnt_pub_pkey->pkey.ec)) == 0)
2316 {
2317 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_EC_LIB);
2318 goto err;
2319 }
David Benjamin14c83e72014-07-13 04:54:57 -04002320 /* Skip certificate verify processing */
2321 skip_certificate_verify = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002322 }
2323 else
2324 {
David Benjamin35c02302014-07-13 04:14:59 -04002325 CBS ecdh_Yc;
2326
Adam Langley95c29f32014-06-20 12:00:00 -07002327 /* Get client's public key from encoded point
2328 * in the ClientKeyExchange message.
2329 */
David Benjamin35c02302014-07-13 04:14:59 -04002330 if (!CBS_get_u8_length_prefixed(&client_key_exchange, &ecdh_Yc) ||
2331 CBS_len(&client_key_exchange) != 0)
2332 {
2333 al = SSL_AD_DECODE_ERROR;
2334 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_DECODE_ERROR);
2335 goto f_err;
2336 }
2337
Adam Langley95c29f32014-06-20 12:00:00 -07002338 if ((bn_ctx = BN_CTX_new()) == NULL)
2339 {
2340 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2341 goto err;
2342 }
2343
David Benjamin35c02302014-07-13 04:14:59 -04002344 if (!EC_POINT_oct2point(group, clnt_ecpoint,
2345 CBS_data(&ecdh_Yc), CBS_len(&ecdh_Yc), bn_ctx))
Adam Langley95c29f32014-06-20 12:00:00 -07002346 {
2347 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_EC_LIB);
2348 goto err;
2349 }
Adam Langley95c29f32014-06-20 12:00:00 -07002350 }
2351
David Benjamin35c02302014-07-13 04:14:59 -04002352 /* Allocate a buffer for both the secret and the PSK. */
Adam Langley95c29f32014-06-20 12:00:00 -07002353 field_size = EC_GROUP_get_degree(group);
2354 if (field_size <= 0)
2355 {
2356 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_ECDH_LIB);
2357 goto err;
2358 }
David Benjamin35c02302014-07-13 04:14:59 -04002359
2360 ecdh_len = (field_size + 7) / 8;
2361 premaster_secret = OPENSSL_malloc(ecdh_len);
2362 if (premaster_secret == NULL)
2363 {
2364 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2365 goto err;
2366 }
2367
2368 /* Compute the shared pre-master secret */
2369 ecdh_len = ECDH_compute_key(premaster_secret,
2370 ecdh_len, clnt_ecpoint, srvr_ecdh, NULL);
2371 if (ecdh_len <= 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002372 {
2373 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_ECDH_LIB);
2374 goto err;
2375 }
2376
2377 EVP_PKEY_free(clnt_pub_pkey);
2378 EC_POINT_free(clnt_ecpoint);
2379 EC_KEY_free(srvr_ecdh);
2380 BN_CTX_free(bn_ctx);
2381 EC_KEY_free(s->s3->tmp.ecdh);
Adam Langleyc26c8022014-06-20 12:00:00 -07002382 s->s3->tmp.ecdh = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002383
David Benjamin14c83e72014-07-13 04:54:57 -04002384 premaster_secret_len = ecdh_len;
Adam Langleyc26c8022014-06-20 12:00:00 -07002385 }
Adam Langley95c29f32014-06-20 12:00:00 -07002386#endif
David Benjamin14c83e72014-07-13 04:54:57 -04002387 else if (alg_k & SSL_kPSK)
2388 {
2389 /* For plain PSK, other_secret is a block of 0s with the same
2390 * length as the pre-shared key. */
2391 premaster_secret_len = psk_len;
2392 premaster_secret = OPENSSL_malloc(premaster_secret_len);
2393 if (premaster_secret == NULL)
2394 {
2395 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2396 goto err;
2397 }
2398 memset(premaster_secret, 0, premaster_secret_len);
2399 }
David Benjamin820c74a2014-07-13 04:22:14 -04002400 else
Adam Langley95c29f32014-06-20 12:00:00 -07002401 {
2402 al=SSL_AD_HANDSHAKE_FAILURE;
2403 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, SSL_R_UNKNOWN_CIPHER_TYPE);
2404 goto f_err;
2405 }
2406
David Benjamin14c83e72014-07-13 04:54:57 -04002407 /* For a PSK cipher suite, the actual pre-master secret is combined with
2408 * the pre-shared key. */
2409 if (alg_a & SSL_aPSK)
2410 {
2411 CBB new_premaster, child;
2412 uint8_t *new_data;
2413 size_t new_len;
2414
2415 if (!CBB_init(&new_premaster, 2 + psk_len + 2 + premaster_secret_len))
2416 {
2417 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_MALLOC_FAILURE);
2418 goto err;
2419 }
2420 if (!CBB_add_u16_length_prefixed(&new_premaster, &child) ||
2421 !CBB_add_bytes(&child, premaster_secret, premaster_secret_len) ||
2422 !CBB_add_u16_length_prefixed(&new_premaster, &child) ||
2423 !CBB_add_bytes(&child, psk, psk_len) ||
2424 !CBB_finish(&new_premaster, &new_data, &new_len))
2425 {
2426 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_key_exchange, ERR_R_INTERNAL_ERROR);
2427 CBB_cleanup(&new_premaster);
2428 goto err;
2429 }
2430
2431 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
2432 OPENSSL_free(premaster_secret);
2433 premaster_secret = new_data;
2434 premaster_secret_len = new_len;
2435 }
David Benjamin14c83e72014-07-13 04:54:57 -04002436
2437 /* Compute the master secret */
2438 s->session->master_key_length = s->method->ssl3_enc
2439 ->generate_master_secret(s,
2440 s->session->master_key, premaster_secret, premaster_secret_len);
2441
2442 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
2443 OPENSSL_free(premaster_secret);
2444 return skip_certificate_verify ? 2 : 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002445f_err:
2446 ssl3_send_alert(s,SSL3_AL_FATAL,al);
Adam Langley95c29f32014-06-20 12:00:00 -07002447err:
David Benjamin35c02302014-07-13 04:14:59 -04002448 if (premaster_secret)
David Benjamin14c83e72014-07-13 04:54:57 -04002449 {
2450 if (premaster_secret_len)
2451 OPENSSL_cleanse(premaster_secret, premaster_secret_len);
David Benjamin35c02302014-07-13 04:14:59 -04002452 OPENSSL_free(premaster_secret);
David Benjamin14c83e72014-07-13 04:54:57 -04002453 }
David Benjamin0aa07672014-07-24 15:34:14 -04002454 if (decrypt_buf)
2455 OPENSSL_free(decrypt_buf);
Adam Langley95c29f32014-06-20 12:00:00 -07002456#ifndef OPENSSL_NO_ECDH
2457 EVP_PKEY_free(clnt_pub_pkey);
2458 EC_POINT_free(clnt_ecpoint);
2459 if (srvr_ecdh != NULL)
2460 EC_KEY_free(srvr_ecdh);
2461 BN_CTX_free(bn_ctx);
2462#endif
2463 return(-1);
2464 }
2465
2466int ssl3_get_cert_verify(SSL *s)
2467 {
2468 EVP_PKEY *pkey=NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002469 int al,ok,ret=0;
2470 long n;
David Benjamin6897dbe2014-07-12 20:18:28 -04002471 CBS certificate_verify, signature;
2472 int type = 0;
David Benjamin6553b372014-07-22 14:11:30 -04002473 X509 *peer = s->session->peer;
Adam Langley95c29f32014-06-20 12:00:00 -07002474 const EVP_MD *md = NULL;
2475 EVP_MD_CTX mctx;
David Benjamin6897dbe2014-07-12 20:18:28 -04002476
Adam Langley95c29f32014-06-20 12:00:00 -07002477 EVP_MD_CTX_init(&mctx);
2478
David Benjamin6553b372014-07-22 14:11:30 -04002479 /* Determine if a CertificateVerify message is expected at all. It is
2480 * important that this be determined before ssl_get_message is called,
2481 * so as not to process the ChangeCipherSpec message early. */
2482 if (peer != NULL)
2483 {
2484 pkey = X509_get_pubkey(peer);
2485 type = X509_certificate_type(peer,pkey);
2486 }
2487 if (!(type & EVP_PKT_SIGN))
2488 {
2489 ret = 1;
David Benjamin734fca02014-08-05 13:06:20 -04002490 goto done_with_buffer;
David Benjamin6553b372014-07-22 14:11:30 -04002491 }
2492
Adam Langley95c29f32014-06-20 12:00:00 -07002493 n=s->method->ssl_get_message(s,
2494 SSL3_ST_SR_CERT_VRFY_A,
2495 SSL3_ST_SR_CERT_VRFY_B,
David Benjamin6553b372014-07-22 14:11:30 -04002496 SSL3_MT_CERTIFICATE_VERIFY,
Adam Langley887b1c32014-07-24 18:00:06 -07002497 SSL3_RT_MAX_PLAIN_LENGTH,
Adam Langley95c29f32014-06-20 12:00:00 -07002498 &ok);
2499
David Benjamin734fca02014-08-05 13:06:20 -04002500 if (!ok)
2501 {
2502 ret = (int)n;
2503 goto done;
2504 }
Adam Langley95c29f32014-06-20 12:00:00 -07002505
David Benjamin6897dbe2014-07-12 20:18:28 -04002506 CBS_init(&certificate_verify, s->init_msg, n);
2507
2508 /* We now have a signature that we need to verify. */
2509 /* TODO(davidben): This should share code with
David Benjamin8f8040d2014-07-14 19:14:46 -04002510 * ssl3_get_server_key_exchange. */
David Benjamin05da6e12014-07-12 20:42:55 -04002511
Adam Langley3213bed2014-06-23 12:26:07 -07002512 if (SSL_USE_SIGALGS(s))
Adam Langley95c29f32014-06-20 12:00:00 -07002513 {
David Benjamin05da6e12014-07-12 20:42:55 -04002514 if (!tls12_check_peer_sigalg(&md, &al, s, &certificate_verify, pkey))
David Benjamin6897dbe2014-07-12 20:18:28 -04002515 goto f_err;
Adam Langley3213bed2014-06-23 12:26:07 -07002516 }
David Benjamin6897dbe2014-07-12 20:18:28 -04002517
2518 if (!CBS_get_u16_length_prefixed(&certificate_verify, &signature) ||
2519 CBS_len(&certificate_verify) != 0)
Adam Langley3213bed2014-06-23 12:26:07 -07002520 {
David Benjamin6897dbe2014-07-12 20:18:28 -04002521 al = SSL_AD_DECODE_ERROR;
2522 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07002523 goto f_err;
2524 }
2525
2526 if (SSL_USE_SIGALGS(s))
2527 {
Adam Langley37a623c2014-07-18 09:28:40 -07002528 size_t hdatalen;
2529 const uint8_t *hdata;
2530 if (!BIO_mem_contents(s->s3->handshake_buffer, &hdata, &hdatalen))
Adam Langley95c29f32014-06-20 12:00:00 -07002531 {
2532 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, ERR_R_INTERNAL_ERROR);
2533 al=SSL_AD_INTERNAL_ERROR;
2534 goto f_err;
2535 }
Adam Langley95c29f32014-06-20 12:00:00 -07002536 if (!EVP_VerifyInit_ex(&mctx, md, NULL)
2537 || !EVP_VerifyUpdate(&mctx, hdata, hdatalen))
2538 {
2539 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, ERR_R_EVP_LIB);
2540 al=SSL_AD_INTERNAL_ERROR;
2541 goto f_err;
2542 }
2543
David Benjamin6897dbe2014-07-12 20:18:28 -04002544 if (EVP_VerifyFinal(&mctx,
2545 CBS_data(&signature), CBS_len(&signature),
2546 pkey) <= 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002547 {
2548 al=SSL_AD_DECRYPT_ERROR;
2549 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_BAD_SIGNATURE);
2550 goto f_err;
2551 }
2552 }
2553 else
Adam Langley95c29f32014-06-20 12:00:00 -07002554 if (pkey->type == EVP_PKEY_RSA)
2555 {
David Benjamin6897dbe2014-07-12 20:18:28 -04002556 if (!RSA_verify(NID_md5_sha1, s->s3->tmp.cert_verify_md,
2557 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
2558 CBS_data(&signature), CBS_len(&signature),
2559 pkey->pkey.rsa))
Adam Langley95c29f32014-06-20 12:00:00 -07002560 {
David Benjamin6897dbe2014-07-12 20:18:28 -04002561 al = SSL_AD_DECRYPT_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07002562 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_BAD_RSA_SIGNATURE);
2563 goto f_err;
2564 }
2565 }
2566 else
Adam Langley95c29f32014-06-20 12:00:00 -07002567#ifndef OPENSSL_NO_DSA
2568 if (pkey->type == EVP_PKEY_DSA)
2569 {
David Benjamin6897dbe2014-07-12 20:18:28 -04002570 if (DSA_verify(pkey->save_type,
2571 &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
2572 SHA_DIGEST_LENGTH,
2573 CBS_data(&signature), CBS_len(&signature),
2574 pkey->pkey.dsa) <= 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002575 {
2576 /* bad signature */
David Benjamin6897dbe2014-07-12 20:18:28 -04002577 al = SSL_AD_DECRYPT_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07002578 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_BAD_DSA_SIGNATURE);
2579 goto f_err;
2580 }
2581 }
2582 else
2583#endif
2584#ifndef OPENSSL_NO_ECDSA
2585 if (pkey->type == EVP_PKEY_EC)
2586 {
David Benjamin6897dbe2014-07-12 20:18:28 -04002587 if (!ECDSA_verify(pkey->save_type,
2588 &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
2589 SHA_DIGEST_LENGTH,
2590 CBS_data(&signature), CBS_len(&signature),
2591 pkey->pkey.ec))
Adam Langley95c29f32014-06-20 12:00:00 -07002592 {
2593 /* bad signature */
David Benjamin6897dbe2014-07-12 20:18:28 -04002594 al = SSL_AD_DECRYPT_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07002595 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, SSL_R_BAD_ECDSA_SIGNATURE);
2596 goto f_err;
2597 }
2598 }
2599 else
2600#endif
Adam Langley95c29f32014-06-20 12:00:00 -07002601 {
2602 OPENSSL_PUT_ERROR(SSL, ssl3_get_cert_verify, ERR_R_INTERNAL_ERROR);
2603 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
2604 goto f_err;
2605 }
2606
2607
2608 ret=1;
2609 if (0)
2610 {
2611f_err:
2612 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2613 }
David Benjamin734fca02014-08-05 13:06:20 -04002614done_with_buffer:
2615 /* There is no more need for the handshake buffer. */
Adam Langley95c29f32014-06-20 12:00:00 -07002616 if (s->s3->handshake_buffer)
2617 {
2618 BIO_free(s->s3->handshake_buffer);
2619 s->s3->handshake_buffer = NULL;
2620 s->s3->flags &= ~TLS1_FLAGS_KEEP_HANDSHAKE;
2621 }
David Benjamin734fca02014-08-05 13:06:20 -04002622done:
Adam Langley95c29f32014-06-20 12:00:00 -07002623 EVP_MD_CTX_cleanup(&mctx);
2624 EVP_PKEY_free(pkey);
2625 return(ret);
2626 }
2627
2628int ssl3_get_client_certificate(SSL *s)
2629 {
2630 int i,ok,al,ret= -1;
2631 X509 *x=NULL;
David Benjamind5b1f842014-07-11 23:43:48 -04002632 unsigned long n;
Adam Langley95c29f32014-06-20 12:00:00 -07002633 STACK_OF(X509) *sk=NULL;
Adam Langley75872532014-06-20 12:00:00 -07002634 SHA256_CTX sha256;
David Benjamind5b1f842014-07-11 23:43:48 -04002635 CBS certificate_msg, certificate_list;
2636 int is_first_certificate = 1;
Adam Langley95c29f32014-06-20 12:00:00 -07002637
2638 n=s->method->ssl_get_message(s,
2639 SSL3_ST_SR_CERT_A,
2640 SSL3_ST_SR_CERT_B,
2641 -1,
2642 s->max_cert_list,
2643 &ok);
2644
2645 if (!ok) return((int)n);
2646
2647 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
2648 {
2649 if ( (s->verify_mode & SSL_VERIFY_PEER) &&
2650 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
2651 {
2652 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
2653 al=SSL_AD_HANDSHAKE_FAILURE;
2654 goto f_err;
2655 }
2656 /* If tls asked for a client cert, the client must return a 0 list */
2657 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
2658 {
2659 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
2660 al=SSL_AD_UNEXPECTED_MESSAGE;
2661 goto f_err;
2662 }
2663 s->s3->tmp.reuse_message=1;
2664 return(1);
2665 }
2666
2667 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
2668 {
2669 al=SSL_AD_UNEXPECTED_MESSAGE;
2670 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_WRONG_MESSAGE_TYPE);
2671 goto f_err;
2672 }
David Benjamind5b1f842014-07-11 23:43:48 -04002673
David Benjamin51b1f742014-07-12 16:31:12 -04002674 CBS_init(&certificate_msg, s->init_msg, n);
Adam Langley95c29f32014-06-20 12:00:00 -07002675
2676 if ((sk=sk_X509_new_null()) == NULL)
2677 {
2678 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_MALLOC_FAILURE);
2679 goto err;
2680 }
2681
David Benjamind5b1f842014-07-11 23:43:48 -04002682 if (!CBS_get_u24_length_prefixed(&certificate_msg, &certificate_list) ||
2683 CBS_len(&certificate_msg) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002684 {
David Benjamind5b1f842014-07-11 23:43:48 -04002685 al = SSL_AD_DECODE_ERROR;
2686 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07002687 goto f_err;
2688 }
David Benjamind5b1f842014-07-11 23:43:48 -04002689
2690 while (CBS_len(&certificate_list) > 0)
Adam Langley95c29f32014-06-20 12:00:00 -07002691 {
David Benjamind5b1f842014-07-11 23:43:48 -04002692 CBS certificate;
2693 const uint8_t *data;
2694
2695 if (!CBS_get_u24_length_prefixed(&certificate_list, &certificate))
Adam Langley95c29f32014-06-20 12:00:00 -07002696 {
David Benjamind5b1f842014-07-11 23:43:48 -04002697 al = SSL_AD_DECODE_ERROR;
2698 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_DECODE_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07002699 goto f_err;
2700 }
David Benjamind5b1f842014-07-11 23:43:48 -04002701 if (is_first_certificate && s->ctx->retain_only_sha256_of_client_certs)
Adam Langley75872532014-06-20 12:00:00 -07002702 {
2703 /* If this is the first certificate, and we don't want
2704 * to keep peer certificates in memory, then we hash it
2705 * right away. */
2706 SHA256_Init(&sha256);
David Benjamind5b1f842014-07-11 23:43:48 -04002707 SHA256_Update(&sha256, CBS_data(&certificate), CBS_len(&certificate));
Adam Langley75872532014-06-20 12:00:00 -07002708 SHA256_Final(s->session->peer_sha256, &sha256);
2709 s->session->peer_sha256_valid = 1;
2710 }
David Benjamind5b1f842014-07-11 23:43:48 -04002711 is_first_certificate = 0;
2712 data = CBS_data(&certificate);
2713 x = d2i_X509(NULL, &data, CBS_len(&certificate));
Adam Langley95c29f32014-06-20 12:00:00 -07002714 if (x == NULL)
2715 {
David Benjamind5b1f842014-07-11 23:43:48 -04002716 al = SSL_AD_BAD_CERTIFICATE;
Adam Langley95c29f32014-06-20 12:00:00 -07002717 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_ASN1_LIB);
David Benjamind5b1f842014-07-11 23:43:48 -04002718 goto f_err;
Adam Langley95c29f32014-06-20 12:00:00 -07002719 }
David Benjamind5b1f842014-07-11 23:43:48 -04002720 if (!CBS_skip(&certificate, data - CBS_data(&certificate)))
Adam Langley95c29f32014-06-20 12:00:00 -07002721 {
David Benjamind5b1f842014-07-11 23:43:48 -04002722 al = SSL_AD_INTERNAL_ERROR;
2723 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_INTERNAL_ERROR);
2724 goto f_err;
2725 }
2726 if (CBS_len(&certificate) != 0)
2727 {
2728 al = SSL_AD_DECODE_ERROR;
Adam Langley95c29f32014-06-20 12:00:00 -07002729 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_CERT_LENGTH_MISMATCH);
2730 goto f_err;
2731 }
2732 if (!sk_X509_push(sk,x))
2733 {
2734 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_MALLOC_FAILURE);
2735 goto err;
2736 }
David Benjamind5b1f842014-07-11 23:43:48 -04002737 x = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -07002738 }
2739
2740 if (sk_X509_num(sk) <= 0)
2741 {
2742 /* TLS does not mind 0 certs returned */
2743 if (s->version == SSL3_VERSION)
2744 {
2745 al=SSL_AD_HANDSHAKE_FAILURE;
2746 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_NO_CERTIFICATES_RETURNED);
2747 goto f_err;
2748 }
2749 /* Fail for TLS only if we required a certificate */
2750 else if ((s->verify_mode & SSL_VERIFY_PEER) &&
2751 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
2752 {
2753 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
2754 al=SSL_AD_HANDSHAKE_FAILURE;
2755 goto f_err;
2756 }
2757 /* No client certificate so digest cached records */
2758 if (s->s3->handshake_buffer && !ssl3_digest_cached_records(s))
2759 {
2760 al=SSL_AD_INTERNAL_ERROR;
2761 goto f_err;
2762 }
2763 }
2764 else
2765 {
2766 i=ssl_verify_cert_chain(s,sk);
2767 if (i <= 0)
2768 {
2769 al=ssl_verify_alarm_type(s->verify_result);
2770 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, SSL_R_CERTIFICATE_VERIFY_FAILED);
2771 goto f_err;
2772 }
2773 }
2774
2775 if (s->session->peer != NULL) /* This should not be needed */
2776 X509_free(s->session->peer);
2777 s->session->peer=sk_X509_shift(sk);
2778 s->session->verify_result = s->verify_result;
2779
2780 /* With the current implementation, sess_cert will always be NULL
2781 * when we arrive here. */
2782 if (s->session->sess_cert == NULL)
2783 {
2784 s->session->sess_cert = ssl_sess_cert_new();
2785 if (s->session->sess_cert == NULL)
2786 {
2787 OPENSSL_PUT_ERROR(SSL, ssl3_get_client_certificate, ERR_R_MALLOC_FAILURE);
2788 goto err;
2789 }
2790 }
2791 if (s->session->sess_cert->cert_chain != NULL)
2792 sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2793 s->session->sess_cert->cert_chain=sk;
2794 /* Inconsistency alert: cert_chain does *not* include the
2795 * peer's own certificate, while we do include it in s3_clnt.c */
2796
2797 sk=NULL;
2798
2799 ret=1;
2800 if (0)
2801 {
2802f_err:
2803 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2804 }
2805err:
2806 if (x != NULL) X509_free(x);
2807 if (sk != NULL) sk_X509_pop_free(sk,X509_free);
2808 return(ret);
2809 }
2810
2811int ssl3_send_server_certificate(SSL *s)
2812 {
2813 CERT_PKEY *cpk;
2814
2815 if (s->state == SSL3_ST_SW_CERT_A)
2816 {
2817 cpk=ssl_get_server_send_pkey(s);
2818 if (cpk == NULL)
2819 {
David Benjamind26aea62014-07-12 00:13:56 -04002820 OPENSSL_PUT_ERROR(SSL, ssl3_send_server_certificate, ERR_R_INTERNAL_ERROR);
2821 return(0);
Adam Langley95c29f32014-06-20 12:00:00 -07002822 }
2823
2824 ssl3_output_cert_chain(s,cpk);
2825 s->state=SSL3_ST_SW_CERT_B;
2826 }
2827
2828 /* SSL3_ST_SW_CERT_B */
2829 return ssl_do_write(s);
2830 }
2831
Adam Langley95c29f32014-06-20 12:00:00 -07002832/* send a new session ticket (not necessarily for a new session) */
2833int ssl3_send_newsession_ticket(SSL *s)
2834 {
2835 if (s->state == SSL3_ST_SW_SESSION_TICKET_A)
2836 {
2837 unsigned char *p, *senc, *macstart;
2838 const unsigned char *const_p;
2839 int len, slen_full, slen;
2840 SSL_SESSION *sess;
2841 unsigned int hlen;
2842 EVP_CIPHER_CTX ctx;
2843 HMAC_CTX hctx;
2844 SSL_CTX *tctx = s->initial_ctx;
2845 unsigned char iv[EVP_MAX_IV_LENGTH];
2846 unsigned char key_name[16];
2847
2848 /* get session encoding length */
2849 slen_full = i2d_SSL_SESSION(s->session, NULL);
2850 /* Some length values are 16 bits, so forget it if session is
2851 * too long
2852 */
2853 if (slen_full > 0xFF00)
2854 return -1;
2855 senc = OPENSSL_malloc(slen_full);
2856 if (!senc)
2857 return -1;
2858 p = senc;
2859 i2d_SSL_SESSION(s->session, &p);
2860
2861 /* create a fresh copy (not shared with other threads) to clean up */
2862 const_p = senc;
2863 sess = d2i_SSL_SESSION(NULL, &const_p, slen_full);
2864 if (sess == NULL)
2865 {
2866 OPENSSL_free(senc);
2867 return -1;
2868 }
2869 sess->session_id_length = 0; /* ID is irrelevant for the ticket */
2870
2871 slen = i2d_SSL_SESSION(sess, NULL);
2872 if (slen > slen_full) /* shouldn't ever happen */
2873 {
2874 OPENSSL_free(senc);
2875 return -1;
2876 }
2877 p = senc;
2878 i2d_SSL_SESSION(sess, &p);
2879 SSL_SESSION_free(sess);
2880
2881 /* Grow buffer if need be: the length calculation is as
2882 * follows handshake_header_length +
2883 * 4 (ticket lifetime hint) + 2 (ticket length) +
2884 * 16 (key name) + max_iv_len (iv length) +
2885 * session_length + max_enc_block_size (max encrypted session
2886 * length) + max_md_size (HMAC).
2887 */
2888 if (!BUF_MEM_grow(s->init_buf,
2889 SSL_HM_HEADER_LENGTH(s) + 22 + EVP_MAX_IV_LENGTH +
2890 EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE + slen))
2891 return -1;
2892 p = ssl_handshake_start(s);
2893 EVP_CIPHER_CTX_init(&ctx);
2894 HMAC_CTX_init(&hctx);
2895 /* Initialize HMAC and cipher contexts. If callback present
2896 * it does all the work otherwise use generated values
2897 * from parent ctx.
2898 */
2899 if (tctx->tlsext_ticket_key_cb)
2900 {
2901 if (tctx->tlsext_ticket_key_cb(s, key_name, iv, &ctx,
2902 &hctx, 1) < 0)
2903 {
2904 OPENSSL_free(senc);
2905 return -1;
2906 }
2907 }
2908 else
2909 {
2910 RAND_pseudo_bytes(iv, 16);
2911 EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
2912 tctx->tlsext_tick_aes_key, iv);
2913 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
2914 tlsext_tick_md(), NULL);
2915 memcpy(key_name, tctx->tlsext_tick_key_name, 16);
2916 }
2917
2918 /* Ticket lifetime hint (advisory only):
2919 * We leave this unspecified for resumed session (for simplicity),
2920 * and guess that tickets for new sessions will live as long
2921 * as their sessions. */
2922 l2n(s->hit ? 0 : s->session->timeout, p);
2923
2924 /* Skip ticket length for now */
2925 p += 2;
2926 /* Output key name */
2927 macstart = p;
2928 memcpy(p, key_name, 16);
2929 p += 16;
2930 /* output IV */
2931 memcpy(p, iv, EVP_CIPHER_CTX_iv_length(&ctx));
2932 p += EVP_CIPHER_CTX_iv_length(&ctx);
2933 /* Encrypt session data */
2934 EVP_EncryptUpdate(&ctx, p, &len, senc, slen);
2935 p += len;
2936 EVP_EncryptFinal_ex(&ctx, p, &len);
2937 p += len;
2938 EVP_CIPHER_CTX_cleanup(&ctx);
2939
2940 HMAC_Update(&hctx, macstart, p - macstart);
2941 HMAC_Final(&hctx, p, &hlen);
2942 HMAC_CTX_cleanup(&hctx);
2943
2944 p += hlen;
2945 /* Now write out lengths: p points to end of data written */
2946 /* Total length */
2947 len = p - ssl_handshake_start(s);
2948 ssl_set_handshake_header(s, SSL3_MT_NEWSESSION_TICKET, len);
2949 /* Skip ticket lifetime hint */
2950 p = ssl_handshake_start(s) + 4;
2951 s2n(len - 6, p);
2952 s->state=SSL3_ST_SW_SESSION_TICKET_B;
2953 OPENSSL_free(senc);
2954 }
2955
2956 /* SSL3_ST_SW_SESSION_TICKET_B */
2957 return ssl_do_write(s);
2958 }
2959
2960int ssl3_send_cert_status(SSL *s)
2961 {
2962 if (s->state == SSL3_ST_SW_CERT_STATUS_A)
2963 {
2964 unsigned char *p;
2965 /* Grow buffer if need be: the length calculation is as
2966 * follows 1 (message type) + 3 (message length) +
2967 * 1 (ocsp response type) + 3 (ocsp response length)
2968 * + (ocsp response)
2969 */
2970 if (!BUF_MEM_grow(s->init_buf, 8 + s->tlsext_ocsp_resplen))
2971 return -1;
2972
2973 p=(unsigned char *)s->init_buf->data;
2974
2975 /* do the header */
2976 *(p++)=SSL3_MT_CERTIFICATE_STATUS;
2977 /* message length */
2978 l2n3(s->tlsext_ocsp_resplen + 4, p);
2979 /* status type */
2980 *(p++)= s->tlsext_status_type;
2981 /* length of OCSP response */
2982 l2n3(s->tlsext_ocsp_resplen, p);
2983 /* actual response */
2984 memcpy(p, s->tlsext_ocsp_resp, s->tlsext_ocsp_resplen);
2985 /* number of bytes to write */
2986 s->init_num = 8 + s->tlsext_ocsp_resplen;
2987 s->state=SSL3_ST_SW_CERT_STATUS_B;
2988 s->init_off = 0;
2989 }
2990
2991 /* SSL3_ST_SW_CERT_STATUS_B */
2992 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2993 }
2994
2995# ifndef OPENSSL_NO_NEXTPROTONEG
2996/* ssl3_get_next_proto reads a Next Protocol Negotiation handshake message. It
2997 * sets the next_proto member in s if found */
2998int ssl3_get_next_proto(SSL *s)
2999 {
3000 int ok;
Adam Langley95c29f32014-06-20 12:00:00 -07003001 long n;
David Benjaminced551f2014-07-11 23:16:16 -04003002 CBS next_protocol, selected_protocol, padding;
Adam Langley95c29f32014-06-20 12:00:00 -07003003
3004 /* Clients cannot send a NextProtocol message if we didn't see the
3005 * extension in their ClientHello */
3006 if (!s->s3->next_proto_neg_seen)
3007 {
3008 OPENSSL_PUT_ERROR(SSL, ssl3_get_next_proto, SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION);
3009 return -1;
3010 }
3011
3012 n=s->method->ssl_get_message(s,
3013 SSL3_ST_SR_NEXT_PROTO_A,
3014 SSL3_ST_SR_NEXT_PROTO_B,
3015 SSL3_MT_NEXT_PROTO,
3016 514, /* See the payload format below */
3017 &ok);
3018
3019 if (!ok)
3020 return((int)n);
3021
3022 /* s->state doesn't reflect whether ChangeCipherSpec has been received
3023 * in this handshake, but s->s3->change_cipher_spec does (will be reset
David Benjamin86271ee2014-07-21 16:14:03 -04003024 * by ssl3_get_finished).
3025 * TODO(davidben): Is this check now redundant with
3026 * SSL3_FLAGS_EXPECT_CCS? */
Adam Langley95c29f32014-06-20 12:00:00 -07003027 if (!s->s3->change_cipher_spec)
3028 {
3029 OPENSSL_PUT_ERROR(SSL, ssl3_get_next_proto, SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS);
3030 return -1;
3031 }
3032
David Benjamin51b1f742014-07-12 16:31:12 -04003033 CBS_init(&next_protocol, s->init_msg, n);
Adam Langley95c29f32014-06-20 12:00:00 -07003034
3035 /* The payload looks like:
3036 * uint8 proto_len;
3037 * uint8 proto[proto_len];
3038 * uint8 padding_len;
3039 * uint8 padding[padding_len];
3040 */
David Benjaminced551f2014-07-11 23:16:16 -04003041 if (!CBS_get_u8_length_prefixed(&next_protocol, &selected_protocol) ||
3042 !CBS_get_u8_length_prefixed(&next_protocol, &padding) ||
3043 CBS_len(&next_protocol) != 0)
Adam Langley95c29f32014-06-20 12:00:00 -07003044 return 0;
3045
David Benjaminced551f2014-07-11 23:16:16 -04003046 if (!CBS_stow(&selected_protocol,
3047 &s->next_proto_negotiated,
3048 &s->next_proto_negotiated_len))
Adam Langley95c29f32014-06-20 12:00:00 -07003049 return 0;
Adam Langley95c29f32014-06-20 12:00:00 -07003050
3051 return 1;
3052 }
3053# endif
3054
Adam Langley1258b6a2014-06-20 12:00:00 -07003055/* ssl3_get_channel_id reads and verifies a ClientID handshake message. */
3056int ssl3_get_channel_id(SSL *s)
3057 {
3058 int ret = -1, ok;
3059 long n;
David Benjamin9a6232f2014-07-11 23:07:47 -04003060 const uint8_t *p;
3061 uint16_t extension_type, expected_extension_type;
Adam Langley1258b6a2014-06-20 12:00:00 -07003062 EC_GROUP* p256 = NULL;
3063 EC_KEY* key = NULL;
3064 EC_POINT* point = NULL;
3065 ECDSA_SIG sig;
3066 BIGNUM x, y;
David Benjamin9a6232f2014-07-11 23:07:47 -04003067 CBS encrypted_extensions, extension;
Adam Langley1258b6a2014-06-20 12:00:00 -07003068
3069 if (s->state == SSL3_ST_SR_CHANNEL_ID_A && s->init_num == 0)
3070 {
3071 /* The first time that we're called we take the current
3072 * handshake hash and store it. */
3073 EVP_MD_CTX md_ctx;
3074 unsigned int len;
3075
3076 EVP_MD_CTX_init(&md_ctx);
3077 EVP_DigestInit_ex(&md_ctx, EVP_sha256(), NULL);
3078 if (!tls1_channel_id_hash(&md_ctx, s))
3079 return -1;
3080 len = sizeof(s->s3->tlsext_channel_id);
3081 EVP_DigestFinal(&md_ctx, s->s3->tlsext_channel_id, &len);
3082 EVP_MD_CTX_cleanup(&md_ctx);
3083 }
3084
3085 n = s->method->ssl_get_message(s,
3086 SSL3_ST_SR_CHANNEL_ID_A,
3087 SSL3_ST_SR_CHANNEL_ID_B,
3088 SSL3_MT_ENCRYPTED_EXTENSIONS,
3089 2 + 2 + TLSEXT_CHANNEL_ID_SIZE,
3090 &ok);
3091
3092 if (!ok)
3093 return((int)n);
3094
3095 ssl3_finish_mac(s, (unsigned char*)s->init_buf->data, s->init_num + 4);
3096
3097 /* s->state doesn't reflect whether ChangeCipherSpec has been received
3098 * in this handshake, but s->s3->change_cipher_spec does (will be reset
David Benjamin86271ee2014-07-21 16:14:03 -04003099 * by ssl3_get_finished).
3100 * TODO(davidben): Is this check now redundant with
3101 * SSL3_FLAGS_EXPECT_CCS? */
Adam Langley1258b6a2014-06-20 12:00:00 -07003102 if (!s->s3->change_cipher_spec)
3103 {
3104 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_GOT_CHANNEL_ID_BEFORE_A_CCS);
3105 return -1;
3106 }
3107
David Benjamin51b1f742014-07-12 16:31:12 -04003108 CBS_init(&encrypted_extensions, s->init_msg, n);
Adam Langley1258b6a2014-06-20 12:00:00 -07003109
David Benjamin9a6232f2014-07-11 23:07:47 -04003110 /* EncryptedExtensions could include multiple extensions, but
3111 * the only extension that could be negotiated is ChannelID,
3112 * so there can only be one entry.
3113 *
3114 * The payload looks like:
Adam Langley1258b6a2014-06-20 12:00:00 -07003115 * uint16 extension_type
3116 * uint16 extension_len;
3117 * uint8 x[32];
3118 * uint8 y[32];
3119 * uint8 r[32];
3120 * uint8 s[32];
3121 */
Adam Langley1258b6a2014-06-20 12:00:00 -07003122 expected_extension_type = TLSEXT_TYPE_channel_id;
3123 if (s->s3->tlsext_channel_id_new)
3124 expected_extension_type = TLSEXT_TYPE_channel_id_new;
3125
David Benjamin9a6232f2014-07-11 23:07:47 -04003126 if (!CBS_get_u16(&encrypted_extensions, &extension_type) ||
3127 !CBS_get_u16_length_prefixed(&encrypted_extensions, &extension) ||
3128 CBS_len(&encrypted_extensions) != 0 ||
3129 extension_type != expected_extension_type ||
3130 CBS_len(&extension) != TLSEXT_CHANNEL_ID_SIZE)
Adam Langley1258b6a2014-06-20 12:00:00 -07003131 {
3132 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_INVALID_MESSAGE);
3133 return -1;
3134 }
3135
3136 p256 = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
3137 if (!p256)
3138 {
3139 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_NO_P256_SUPPORT);
3140 return -1;
3141 }
3142
3143 BN_init(&x);
3144 BN_init(&y);
3145 sig.r = BN_new();
3146 sig.s = BN_new();
3147
David Benjamin9a6232f2014-07-11 23:07:47 -04003148 p = CBS_data(&extension);
Adam Langley1258b6a2014-06-20 12:00:00 -07003149 if (BN_bin2bn(p + 0, 32, &x) == NULL ||
3150 BN_bin2bn(p + 32, 32, &y) == NULL ||
3151 BN_bin2bn(p + 64, 32, sig.r) == NULL ||
3152 BN_bin2bn(p + 96, 32, sig.s) == NULL)
3153 goto err;
3154
3155 point = EC_POINT_new(p256);
3156 if (!point ||
3157 !EC_POINT_set_affine_coordinates_GFp(p256, point, &x, &y, NULL))
3158 goto err;
3159
3160 key = EC_KEY_new();
3161 if (!key ||
3162 !EC_KEY_set_group(key, p256) ||
3163 !EC_KEY_set_public_key(key, point))
3164 goto err;
3165
3166 /* We stored the handshake hash in |tlsext_channel_id| the first time
3167 * that we were called. */
3168 switch (ECDSA_do_verify(s->s3->tlsext_channel_id, SHA256_DIGEST_LENGTH, &sig, key)) {
3169 case 1:
3170 break;
3171 case 0:
3172 OPENSSL_PUT_ERROR(SSL, ssl3_get_channel_id, SSL_R_CHANNEL_ID_SIGNATURE_INVALID);
3173 s->s3->tlsext_channel_id_valid = 0;
3174 goto err;
3175 default:
3176 s->s3->tlsext_channel_id_valid = 0;
3177 goto err;
3178 }
3179
3180 memcpy(s->s3->tlsext_channel_id, p, 64);
3181 ret = 1;
3182
3183err:
3184 BN_free(&x);
3185 BN_free(&y);
3186 BN_free(sig.r);
3187 BN_free(sig.s);
3188 if (key)
3189 EC_KEY_free(key);
3190 if (point)
3191 EC_POINT_free(point);
3192 if (p256)
3193 EC_GROUP_free(p256);
3194 return ret;
3195 }
3196