Home | History | Annotate | Download | only in ssl
      1 /* ssl/s3_clnt.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 /* ====================================================================
     59  * Copyright (c) 1998-2003 The OpenSSL Project.  All rights reserved.
     60  *
     61  * Redistribution and use in source and binary forms, with or without
     62  * modification, are permitted provided that the following conditions
     63  * are met:
     64  *
     65  * 1. Redistributions of source code must retain the above copyright
     66  *    notice, this list of conditions and the following disclaimer.
     67  *
     68  * 2. Redistributions in binary form must reproduce the above copyright
     69  *    notice, this list of conditions and the following disclaimer in
     70  *    the documentation and/or other materials provided with the
     71  *    distribution.
     72  *
     73  * 3. All advertising materials mentioning features or use of this
     74  *    software must display the following acknowledgment:
     75  *    "This product includes software developed by the OpenSSL Project
     76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     77  *
     78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     79  *    endorse or promote products derived from this software without
     80  *    prior written permission. For written permission, please contact
     81  *    openssl-core (at) openssl.org.
     82  *
     83  * 5. Products derived from this software may not be called "OpenSSL"
     84  *    nor may "OpenSSL" appear in their names without prior written
     85  *    permission of the OpenSSL Project.
     86  *
     87  * 6. Redistributions of any form whatsoever must retain the following
     88  *    acknowledgment:
     89  *    "This product includes software developed by the OpenSSL Project
     90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     91  *
     92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    103  * OF THE POSSIBILITY OF SUCH DAMAGE.
    104  * ====================================================================
    105  *
    106  * This product includes cryptographic software written by Eric Young
    107  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    108  * Hudson (tjh (at) cryptsoft.com).
    109  *
    110  */
    111 /* ====================================================================
    112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
    113  *
    114  * Portions of the attached software ("Contribution") are developed by
    115  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
    116  *
    117  * The Contribution is licensed pursuant to the OpenSSL open source
    118  * license provided above.
    119  *
    120  * ECC cipher suite support in OpenSSL originally written by
    121  * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
    122  *
    123  */
    124 
    125 #include <stdio.h>
    126 #include "ssl_locl.h"
    127 #include "kssl_lcl.h"
    128 #include <openssl/buffer.h>
    129 #include <openssl/rand.h>
    130 #include <openssl/objects.h>
    131 #include <openssl/evp.h>
    132 #include <openssl/md5.h>
    133 #ifdef OPENSSL_FIPS
    134 #include <openssl/fips.h>
    135 #endif
    136 
    137 #ifndef OPENSSL_NO_DH
    138 #include <openssl/dh.h>
    139 #endif
    140 #include <openssl/bn.h>
    141 #ifndef OPENSSL_NO_ENGINE
    142 #include <openssl/engine.h>
    143 #endif
    144 
    145 static SSL_METHOD *ssl3_get_client_method(int ver);
    146 static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b);
    147 
    148 #ifndef OPENSSL_NO_ECDH
    149 static int curve_id2nid(int curve_id);
    150 int check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs);
    151 #endif
    152 
    153 static SSL_METHOD *ssl3_get_client_method(int ver)
    154 	{
    155 	if (ver == SSL3_VERSION)
    156 		return(SSLv3_client_method());
    157 	else
    158 		return(NULL);
    159 	}
    160 
    161 IMPLEMENT_ssl3_meth_func(SSLv3_client_method,
    162 			ssl_undefined_function,
    163 			ssl3_connect,
    164 			ssl3_get_client_method)
    165 
    166 int ssl3_connect(SSL *s)
    167 	{
    168 	BUF_MEM *buf=NULL;
    169 	unsigned long Time=(unsigned long)time(NULL),l;
    170 	void (*cb)(const SSL *ssl,int type,int val)=NULL;
    171 	int ret= -1;
    172 	int new_state,state,skip=0;
    173 
    174 	RAND_add(&Time,sizeof(Time),0);
    175 	ERR_clear_error();
    176 	clear_sys_error();
    177 
    178 	if (s->info_callback != NULL)
    179 		cb=s->info_callback;
    180 	else if (s->ctx->info_callback != NULL)
    181 		cb=s->ctx->info_callback;
    182 
    183 	s->in_handshake++;
    184 	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
    185 	if (SSL_get_mode(s) & SSL_MODE_HANDSHAKE_CUTTHROUGH)
    186 		{
    187 		/* Renegotiation complicates the state machine */
    188 		s->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;
    189 #if 0	/* Send app data in separate packet, otherwise, some particular site
    190 	 * (only one site so far) closes the socket.
    191 	 * Note: there is a very small chance that two TCP packets
    192 	 * could be arriving at server combined into a single TCP packet,
    193 	 * then trigger that site to break. We haven't encounter that though.
    194 	 */
    195 		/* Send app data along with CCS/Finished */
    196 		s->s3->flags |= SSL3_FLAGS_DELAY_CLIENT_FINISHED;
    197 #endif
    198 		}
    199 
    200 	for (;;)
    201 		{
    202 		state=s->state;
    203 
    204 		switch(s->state)
    205 			{
    206 		case SSL_ST_RENEGOTIATE:
    207 			s->new_session=1;
    208 			s->state=SSL_ST_CONNECT;
    209 			s->ctx->stats.sess_connect_renegotiate++;
    210 			/* break */
    211 		case SSL_ST_BEFORE:
    212 		case SSL_ST_CONNECT:
    213 		case SSL_ST_BEFORE|SSL_ST_CONNECT:
    214 		case SSL_ST_OK|SSL_ST_CONNECT:
    215 
    216 			s->server=0;
    217 			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
    218 
    219 			if ((s->version & 0xff00 ) != 0x0300)
    220 				{
    221 				SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR);
    222 				ret = -1;
    223 				goto end;
    224 				}
    225 
    226 			/* s->version=SSL3_VERSION; */
    227 			s->type=SSL_ST_CONNECT;
    228 
    229 			if (s->init_buf == NULL)
    230 				{
    231 				if ((buf=BUF_MEM_new()) == NULL)
    232 					{
    233 					ret= -1;
    234 					goto end;
    235 					}
    236 				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
    237 					{
    238 					ret= -1;
    239 					goto end;
    240 					}
    241 				s->init_buf=buf;
    242 				buf=NULL;
    243 				}
    244 
    245 			if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
    246 
    247 			/* setup buffing BIO */
    248 			if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
    249 
    250 			/* don't push the buffering BIO quite yet */
    251 
    252 			ssl3_init_finished_mac(s);
    253 
    254 			s->state=SSL3_ST_CW_CLNT_HELLO_A;
    255 			s->ctx->stats.sess_connect++;
    256 			s->init_num=0;
    257 			break;
    258 
    259 		case SSL3_ST_CW_CLNT_HELLO_A:
    260 		case SSL3_ST_CW_CLNT_HELLO_B:
    261 
    262 			s->shutdown=0;
    263 			ret=ssl3_client_hello(s);
    264 			if (ret <= 0) goto end;
    265 			s->state=SSL3_ST_CR_SRVR_HELLO_A;
    266 			s->init_num=0;
    267 
    268 			/* turn on buffering for the next lot of output */
    269 			if (s->bbio != s->wbio)
    270 				s->wbio=BIO_push(s->bbio,s->wbio);
    271 
    272 			break;
    273 
    274 		case SSL3_ST_CR_SRVR_HELLO_A:
    275 		case SSL3_ST_CR_SRVR_HELLO_B:
    276 			ret=ssl3_get_server_hello(s);
    277 			if (ret <= 0) goto end;
    278 			if (s->hit)
    279 				s->state=SSL3_ST_CR_FINISHED_A;
    280 			else
    281 				s->state=SSL3_ST_CR_CERT_A;
    282 			s->init_num=0;
    283 			break;
    284 
    285 		case SSL3_ST_CR_CERT_A:
    286 		case SSL3_ST_CR_CERT_B:
    287 #ifndef OPENSSL_NO_TLSEXT
    288 			ret=ssl3_check_finished(s);
    289 			if (ret <= 0) goto end;
    290 			if (ret == 2)
    291 				{
    292 				s->hit = 1;
    293 				if (s->tlsext_ticket_expected)
    294 					s->state=SSL3_ST_CR_SESSION_TICKET_A;
    295 				else
    296 					s->state=SSL3_ST_CR_FINISHED_A;
    297 				s->init_num=0;
    298 				break;
    299 				}
    300 #endif
    301 			/* Check if it is anon DH/ECDH */
    302 			if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
    303 				{
    304 				ret=ssl3_get_server_certificate(s);
    305 				if (ret <= 0) goto end;
    306 #ifndef OPENSSL_NO_TLSEXT
    307 				if (s->tlsext_status_expected)
    308 					s->state=SSL3_ST_CR_CERT_STATUS_A;
    309 				else
    310 					s->state=SSL3_ST_CR_KEY_EXCH_A;
    311 				}
    312 			else
    313 				{
    314 				skip = 1;
    315 				s->state=SSL3_ST_CR_KEY_EXCH_A;
    316 				}
    317 #else
    318 				}
    319 			else
    320 				skip=1;
    321 
    322 			s->state=SSL3_ST_CR_KEY_EXCH_A;
    323 #endif
    324 			s->init_num=0;
    325 			break;
    326 
    327 		case SSL3_ST_CR_KEY_EXCH_A:
    328 		case SSL3_ST_CR_KEY_EXCH_B:
    329 			ret=ssl3_get_key_exchange(s);
    330 			if (ret <= 0) goto end;
    331 			s->state=SSL3_ST_CR_CERT_REQ_A;
    332 			s->init_num=0;
    333 
    334 			/* at this point we check that we have the
    335 			 * required stuff from the server */
    336 			if (!ssl3_check_cert_and_algorithm(s))
    337 				{
    338 				ret= -1;
    339 				goto end;
    340 				}
    341 			break;
    342 
    343 		case SSL3_ST_CR_CERT_REQ_A:
    344 		case SSL3_ST_CR_CERT_REQ_B:
    345 			ret=ssl3_get_certificate_request(s);
    346 			if (ret <= 0) goto end;
    347 			s->state=SSL3_ST_CR_SRVR_DONE_A;
    348 			s->init_num=0;
    349 			break;
    350 
    351 		case SSL3_ST_CR_SRVR_DONE_A:
    352 		case SSL3_ST_CR_SRVR_DONE_B:
    353 			ret=ssl3_get_server_done(s);
    354 			if (ret <= 0) goto end;
    355 			if (s->s3->tmp.cert_req)
    356 				s->state=SSL3_ST_CW_CERT_A;
    357 			else
    358 				s->state=SSL3_ST_CW_KEY_EXCH_A;
    359 			s->init_num=0;
    360 
    361 			break;
    362 
    363 		case SSL3_ST_CW_CERT_A:
    364 		case SSL3_ST_CW_CERT_B:
    365 		case SSL3_ST_CW_CERT_C:
    366 		case SSL3_ST_CW_CERT_D:
    367 			ret=ssl3_send_client_certificate(s);
    368 			if (ret <= 0) goto end;
    369 			s->state=SSL3_ST_CW_KEY_EXCH_A;
    370 			s->init_num=0;
    371 			break;
    372 
    373 		case SSL3_ST_CW_KEY_EXCH_A:
    374 		case SSL3_ST_CW_KEY_EXCH_B:
    375 			ret=ssl3_send_client_key_exchange(s);
    376 			if (ret <= 0) goto end;
    377 			l=s->s3->tmp.new_cipher->algorithms;
    378 			/* EAY EAY EAY need to check for DH fix cert
    379 			 * sent back */
    380 			/* For TLS, cert_req is set to 2, so a cert chain
    381 			 * of nothing is sent, but no verify packet is sent */
    382 			/* XXX: For now, we do not support client
    383 			 * authentication in ECDH cipher suites with
    384 			 * ECDH (rather than ECDSA) certificates.
    385 			 * We need to skip the certificate verify
    386 			 * message when client's ECDH public key is sent
    387 			 * inside the client certificate.
    388 			 */
    389 			if (s->s3->tmp.cert_req == 1)
    390 				{
    391 				s->state=SSL3_ST_CW_CERT_VRFY_A;
    392 				}
    393 			else
    394 				{
    395 				s->state=SSL3_ST_CW_CHANGE_A;
    396 				s->s3->change_cipher_spec=0;
    397 				}
    398 
    399 			s->init_num=0;
    400 			break;
    401 
    402 		case SSL3_ST_CW_CERT_VRFY_A:
    403 		case SSL3_ST_CW_CERT_VRFY_B:
    404 			ret=ssl3_send_client_verify(s);
    405 			if (ret <= 0) goto end;
    406 			s->state=SSL3_ST_CW_CHANGE_A;
    407 			s->init_num=0;
    408 			s->s3->change_cipher_spec=0;
    409 			break;
    410 
    411 		case SSL3_ST_CW_CHANGE_A:
    412 		case SSL3_ST_CW_CHANGE_B:
    413 			ret=ssl3_send_change_cipher_spec(s,
    414 				SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
    415 			if (ret <= 0) goto end;
    416 			s->state=SSL3_ST_CW_FINISHED_A;
    417 			s->init_num=0;
    418 
    419 			s->session->cipher=s->s3->tmp.new_cipher;
    420 #ifdef OPENSSL_NO_COMP
    421 			s->session->compress_meth=0;
    422 #else
    423 			if (s->s3->tmp.new_compression == NULL)
    424 				s->session->compress_meth=0;
    425 			else
    426 				s->session->compress_meth=
    427 					s->s3->tmp.new_compression->id;
    428 #endif
    429 			if (!s->method->ssl3_enc->setup_key_block(s))
    430 				{
    431 				ret= -1;
    432 				goto end;
    433 				}
    434 
    435 			if (!s->method->ssl3_enc->change_cipher_state(s,
    436 				SSL3_CHANGE_CIPHER_CLIENT_WRITE))
    437 				{
    438 				ret= -1;
    439 				goto end;
    440 				}
    441 
    442 			break;
    443 
    444 		case SSL3_ST_CW_FINISHED_A:
    445 		case SSL3_ST_CW_FINISHED_B:
    446 			ret=ssl3_send_finished(s,
    447 				SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
    448 				s->method->ssl3_enc->client_finished_label,
    449 				s->method->ssl3_enc->client_finished_label_len);
    450 			if (ret <= 0) goto end;
    451 			s->state=SSL3_ST_CW_FLUSH;
    452 
    453 			/* clear flags */
    454 			s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
    455 			if (s->hit)
    456 				{
    457 				s->s3->tmp.next_state=SSL_ST_OK;
    458 				if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
    459 					{
    460 					s->state=SSL_ST_OK;
    461 					s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
    462 					s->s3->delay_buf_pop_ret=0;
    463 					}
    464 				}
    465 			else
    466 				{
    467 				if ((SSL_get_mode(s) & SSL_MODE_HANDSHAKE_CUTTHROUGH) && SSL_get_cipher_bits(s, NULL) >= 128)
    468 					{
    469 					if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
    470 						{
    471 						s->state=SSL3_ST_CUTTHROUGH_COMPLETE;
    472 						s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
    473 						s->s3->delay_buf_pop_ret=0;
    474 						}
    475 					else
    476 						{
    477 						s->s3->tmp.next_state=SSL3_ST_CUTTHROUGH_COMPLETE;
    478 						}
    479 					}
    480 				else
    481 					{
    482 #ifndef OPENSSL_NO_TLSEXT
    483 					/* Allow NewSessionTicket if ticket expected */
    484 					if (s->tlsext_ticket_expected)
    485 						s->s3->tmp.next_state=SSL3_ST_CR_SESSION_TICKET_A;
    486 					else
    487 #endif
    488 						s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
    489 					}
    490 				}
    491 			s->init_num=0;
    492 			break;
    493 
    494 #ifndef OPENSSL_NO_TLSEXT
    495 		case SSL3_ST_CR_SESSION_TICKET_A:
    496 		case SSL3_ST_CR_SESSION_TICKET_B:
    497 			ret=ssl3_get_new_session_ticket(s);
    498 			if (ret <= 0) goto end;
    499 			s->state=SSL3_ST_CR_FINISHED_A;
    500 			s->init_num=0;
    501 		break;
    502 
    503 		case SSL3_ST_CR_CERT_STATUS_A:
    504 		case SSL3_ST_CR_CERT_STATUS_B:
    505 			ret=ssl3_get_cert_status(s);
    506 			if (ret <= 0) goto end;
    507 			s->state=SSL3_ST_CR_KEY_EXCH_A;
    508 			s->init_num=0;
    509 		break;
    510 #endif
    511 
    512 		case SSL3_ST_CR_FINISHED_A:
    513 		case SSL3_ST_CR_FINISHED_B:
    514 
    515 			ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
    516 				SSL3_ST_CR_FINISHED_B);
    517 			if (ret <= 0) goto end;
    518 
    519 			if (s->hit)
    520 				s->state=SSL3_ST_CW_CHANGE_A;
    521 			else
    522 				s->state=SSL_ST_OK;
    523 			s->init_num=0;
    524 			break;
    525 
    526 		case SSL3_ST_CW_FLUSH:
    527 			s->rwstate=SSL_WRITING;
    528 			if (BIO_flush(s->wbio) <= 0)
    529 				{
    530 				ret= -1;
    531 				goto end;
    532 				}
    533 			s->rwstate=SSL_NOTHING;
    534 			s->state=s->s3->tmp.next_state;
    535 			break;
    536 
    537 		case SSL3_ST_CUTTHROUGH_COMPLETE:
    538 #ifndef OPENSSL_NO_TLSEXT
    539 			/* Allow NewSessionTicket if ticket expected */
    540 			if (s->tlsext_ticket_expected)
    541 				s->state=SSL3_ST_CR_SESSION_TICKET_A;
    542 			else
    543 #endif
    544 				s->state=SSL3_ST_CR_FINISHED_A;
    545 
    546 			/* SSL_write() will take care of flushing buffered data if
    547 			 * DELAY_CLIENT_FINISHED is set.
    548 			 */
    549 			if (!(s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED))
    550 				ssl_free_wbio_buffer(s);
    551 			ret = 1;
    552 			goto end;
    553 			/* break; */
    554 
    555 		case SSL_ST_OK:
    556 			/* clean a few things up */
    557 			ssl3_cleanup_key_block(s);
    558 
    559 			if (s->init_buf != NULL)
    560 				{
    561 				BUF_MEM_free(s->init_buf);
    562 				s->init_buf=NULL;
    563 				}
    564 
    565 			/* If we are not 'joining' the last two packets,
    566 			 * remove the buffering now */
    567 			if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
    568 				ssl_free_wbio_buffer(s);
    569 			/* else do it later in ssl3_write */
    570 
    571 			s->init_num=0;
    572 			s->new_session=0;
    573 
    574 			ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
    575 			if (s->hit) s->ctx->stats.sess_hit++;
    576 
    577 			ret=1;
    578 			/* s->server=0; */
    579 			s->handshake_func=ssl3_connect;
    580 			s->ctx->stats.sess_connect_good++;
    581 
    582 			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
    583 
    584 			goto end;
    585 			/* break; */
    586 
    587 		default:
    588 			SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE);
    589 			ret= -1;
    590 			goto end;
    591 			/* break; */
    592 			}
    593 
    594 		/* did we do anything */
    595 		if (!s->s3->tmp.reuse_message && !skip)
    596 			{
    597 			if (s->debug)
    598 				{
    599 				if ((ret=BIO_flush(s->wbio)) <= 0)
    600 					goto end;
    601 				}
    602 
    603 			if ((cb != NULL) && (s->state != state))
    604 				{
    605 				new_state=s->state;
    606 				s->state=state;
    607 				cb(s,SSL_CB_CONNECT_LOOP,1);
    608 				s->state=new_state;
    609 				}
    610 			}
    611 		skip=0;
    612 		}
    613 end:
    614 	s->in_handshake--;
    615 	if (buf != NULL)
    616 		BUF_MEM_free(buf);
    617 	if (cb != NULL)
    618 		cb(s,SSL_CB_CONNECT_EXIT,ret);
    619 	return(ret);
    620 	}
    621 
    622 
    623 int ssl3_client_hello(SSL *s)
    624 	{
    625 	unsigned char *buf;
    626 	unsigned char *p,*d;
    627 	int i;
    628 	unsigned long Time,l;
    629 #ifndef OPENSSL_NO_COMP
    630 	int j;
    631 	SSL_COMP *comp;
    632 #endif
    633 
    634 	buf=(unsigned char *)s->init_buf->data;
    635 	if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
    636 		{
    637 		SSL_SESSION *sess = s->session;
    638 		if ((sess == NULL) ||
    639 			(sess->ssl_version != s->version) ||
    640 #ifdef OPENSSL_NO_TLSEXT
    641 			!sess->session_id_length ||
    642 #else
    643 			(!sess->session_id_length && !sess->tlsext_tick) ||
    644 #endif
    645 			(sess->not_resumable))
    646 			{
    647 			if (!ssl_get_new_session(s,0))
    648 				goto err;
    649 			}
    650 		/* else use the pre-loaded session */
    651 
    652 		p=s->s3->client_random;
    653 		Time=(unsigned long)time(NULL);			/* Time */
    654 		l2n(Time,p);
    655 		if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0)
    656 			goto err;
    657 
    658 		/* Do the message type and length last */
    659 		d=p= &(buf[4]);
    660 
    661 		*(p++)=s->version>>8;
    662 		*(p++)=s->version&0xff;
    663 		s->client_version=s->version;
    664 
    665 		/* Random stuff */
    666 		memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
    667 		p+=SSL3_RANDOM_SIZE;
    668 
    669 		/* Session ID */
    670 		if (s->new_session)
    671 			i=0;
    672 		else
    673 			i=s->session->session_id_length;
    674 		*(p++)=i;
    675 		if (i != 0)
    676 			{
    677 			if (i > (int)sizeof(s->session->session_id))
    678 				{
    679 				SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
    680 				goto err;
    681 				}
    682 			memcpy(p,s->session->session_id,i);
    683 			p+=i;
    684 			}
    685 
    686 		/* Ciphers supported */
    687 		i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0);
    688 		if (i == 0)
    689 			{
    690 			SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
    691 			goto err;
    692 			}
    693 		s2n(i,p);
    694 		p+=i;
    695 
    696 		/* COMPRESSION */
    697 #ifdef OPENSSL_NO_COMP
    698 		*(p++)=1;
    699 #else
    700 		if (s->ctx->comp_methods == NULL)
    701 			j=0;
    702 		else
    703 			j=sk_SSL_COMP_num(s->ctx->comp_methods);
    704 		*(p++)=1+j;
    705 		for (i=0; i<j; i++)
    706 			{
    707 			comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
    708 			*(p++)=comp->id;
    709 			}
    710 #endif
    711 		*(p++)=0; /* Add the NULL method */
    712 #ifndef OPENSSL_NO_TLSEXT
    713 		if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
    714 			{
    715 			SSLerr(SSL_F_SSL3_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
    716 			goto err;
    717 			}
    718 #endif
    719 		l=(p-d);
    720 		d=buf;
    721 		*(d++)=SSL3_MT_CLIENT_HELLO;
    722 		l2n3(l,d);
    723 
    724 		s->state=SSL3_ST_CW_CLNT_HELLO_B;
    725 		/* number of bytes to write */
    726 		s->init_num=p-buf;
    727 		s->init_off=0;
    728 		}
    729 
    730 	/* SSL3_ST_CW_CLNT_HELLO_B */
    731 	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
    732 err:
    733 	return(-1);
    734 	}
    735 
    736 int ssl3_get_server_hello(SSL *s)
    737 	{
    738 	STACK_OF(SSL_CIPHER) *sk;
    739 	SSL_CIPHER *c;
    740 	unsigned char *p,*d;
    741 	int i,al,ok;
    742 	unsigned int j;
    743 	long n;
    744 #ifndef OPENSSL_NO_COMP
    745 	SSL_COMP *comp;
    746 #endif
    747 
    748 	n=s->method->ssl_get_message(s,
    749 		SSL3_ST_CR_SRVR_HELLO_A,
    750 		SSL3_ST_CR_SRVR_HELLO_B,
    751 		-1,
    752 		20000, /* ?? */
    753 		&ok);
    754 
    755 	if (!ok) return((int)n);
    756 
    757 	if ( SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
    758 		{
    759 		if ( s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST)
    760 			{
    761 			if ( s->d1->send_cookie == 0)
    762 				{
    763 				s->s3->tmp.reuse_message = 1;
    764 				return 1;
    765 				}
    766 			else /* already sent a cookie */
    767 				{
    768 				al=SSL_AD_UNEXPECTED_MESSAGE;
    769 				SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);
    770 				goto f_err;
    771 				}
    772 			}
    773 		}
    774 
    775 	if ( s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO)
    776 		{
    777 		al=SSL_AD_UNEXPECTED_MESSAGE;
    778 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);
    779 		goto f_err;
    780 		}
    781 
    782 	d=p=(unsigned char *)s->init_msg;
    783 
    784 	if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff)))
    785 		{
    786 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_SSL_VERSION);
    787 		s->version=(s->version&0xff00)|p[1];
    788 		al=SSL_AD_PROTOCOL_VERSION;
    789 		goto f_err;
    790 		}
    791 	p+=2;
    792 
    793 	/* load the server hello data */
    794 	/* load the server random */
    795 	memcpy(s->s3->server_random,p,SSL3_RANDOM_SIZE);
    796 	p+=SSL3_RANDOM_SIZE;
    797 
    798 	/* get the session-id */
    799 	j= *(p++);
    800 
    801 	if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE))
    802 		{
    803 		al=SSL_AD_ILLEGAL_PARAMETER;
    804 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_LONG);
    805 		goto f_err;
    806 		}
    807 
    808 	if (j != 0 && j == s->session->session_id_length
    809 	    && memcmp(p,s->session->session_id,j) == 0)
    810 	    {
    811 	    if(s->sid_ctx_length != s->session->sid_ctx_length
    812 	       || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length))
    813 		{
    814 		/* actually a client application bug */
    815 		al=SSL_AD_ILLEGAL_PARAMETER;
    816 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
    817 		goto f_err;
    818 		}
    819 	    s->hit=1;
    820 	    }
    821 	else	/* a miss or crap from the other end */
    822 		{
    823 		/* If we were trying for session-id reuse, make a new
    824 		 * SSL_SESSION so we don't stuff up other people */
    825 		s->hit=0;
    826 		if (s->session->session_id_length > 0)
    827 			{
    828 			if (!ssl_get_new_session(s,0))
    829 				{
    830 				al=SSL_AD_INTERNAL_ERROR;
    831 				goto f_err;
    832 				}
    833 			}
    834 		s->session->session_id_length=j;
    835 		memcpy(s->session->session_id,p,j); /* j could be 0 */
    836 		}
    837 	p+=j;
    838 	c=ssl_get_cipher_by_char(s,p);
    839 	if (c == NULL)
    840 		{
    841 		/* unknown cipher */
    842 		al=SSL_AD_ILLEGAL_PARAMETER;
    843 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNKNOWN_CIPHER_RETURNED);
    844 		goto f_err;
    845 		}
    846 	p+=ssl_put_cipher_by_char(s,NULL,NULL);
    847 
    848 	sk=ssl_get_ciphers_by_id(s);
    849 	i=sk_SSL_CIPHER_find(sk,c);
    850 	if (i < 0)
    851 		{
    852 		/* we did not say we would use this cipher */
    853 		al=SSL_AD_ILLEGAL_PARAMETER;
    854 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);
    855 		goto f_err;
    856 		}
    857 
    858 	/* Depending on the session caching (internal/external), the cipher
    859 	   and/or cipher_id values may not be set. Make sure that
    860 	   cipher_id is set and use it for comparison. */
    861 	if (s->session->cipher)
    862 		s->session->cipher_id = s->session->cipher->id;
    863 	if (s->hit && (s->session->cipher_id != c->id))
    864 		{
    865 		if (!(s->options &
    866 			SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG))
    867 			{
    868 			al=SSL_AD_ILLEGAL_PARAMETER;
    869 			SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
    870 			goto f_err;
    871 			}
    872 		}
    873 	s->s3->tmp.new_cipher=c;
    874 
    875 	/* lets get the compression algorithm */
    876 	/* COMPRESSION */
    877 #ifdef OPENSSL_NO_COMP
    878 	if (*(p++) != 0)
    879 		{
    880 		al=SSL_AD_ILLEGAL_PARAMETER;
    881 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
    882 		goto f_err;
    883 		}
    884 #else
    885 	j= *(p++);
    886 	if (j == 0)
    887 		comp=NULL;
    888 	else
    889 		comp=ssl3_comp_find(s->ctx->comp_methods,j);
    890 
    891 	if ((j != 0) && (comp == NULL))
    892 		{
    893 		al=SSL_AD_ILLEGAL_PARAMETER;
    894 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
    895 		goto f_err;
    896 		}
    897 	else
    898 		{
    899 		s->s3->tmp.new_compression=comp;
    900 		}
    901 #endif
    902 #ifndef OPENSSL_NO_TLSEXT
    903 	/* TLS extensions*/
    904 	if (s->version >= SSL3_VERSION)
    905 		{
    906 		if (!ssl_parse_serverhello_tlsext(s,&p,d,n, &al))
    907 			{
    908 			/* 'al' set by ssl_parse_serverhello_tlsext */
    909 			SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_PARSE_TLSEXT);
    910 			goto f_err;
    911 			}
    912 		if (ssl_check_serverhello_tlsext(s) <= 0)
    913 			{
    914 			SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SERVERHELLO_TLSEXT);
    915 				goto err;
    916 			}
    917 		}
    918 #endif
    919 
    920 
    921 	if (p != (d+n))
    922 		{
    923 		/* wrong packet length */
    924 		al=SSL_AD_DECODE_ERROR;
    925 		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_PACKET_LENGTH);
    926 		goto err;
    927 		}
    928 
    929 	return(1);
    930 f_err:
    931 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
    932 err:
    933 	return(-1);
    934 	}
    935 
    936 int ssl3_get_server_certificate(SSL *s)
    937 	{
    938 	int al,i,ok,ret= -1;
    939 	unsigned long n,nc,llen,l;
    940 	X509 *x=NULL;
    941 	const unsigned char *q,*p;
    942 	unsigned char *d;
    943 	STACK_OF(X509) *sk=NULL;
    944 	SESS_CERT *sc;
    945 	EVP_PKEY *pkey=NULL;
    946 	int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */
    947 
    948 	n=s->method->ssl_get_message(s,
    949 		SSL3_ST_CR_CERT_A,
    950 		SSL3_ST_CR_CERT_B,
    951 		-1,
    952 		s->max_cert_list,
    953 		&ok);
    954 
    955 	if (!ok) return((int)n);
    956 
    957 	if ((s->s3->tmp.message_type == SSL3_MT_SERVER_KEY_EXCHANGE) ||
    958 		((s->s3->tmp.new_cipher->algorithms & SSL_aKRB5) &&
    959 		(s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)))
    960 		{
    961 		s->s3->tmp.reuse_message=1;
    962 		return(1);
    963 		}
    964 
    965 	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
    966 		{
    967 		al=SSL_AD_UNEXPECTED_MESSAGE;
    968 		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE);
    969 		goto f_err;
    970 		}
    971 	p=d=(unsigned char *)s->init_msg;
    972 
    973 	if ((sk=sk_X509_new_null()) == NULL)
    974 		{
    975 		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
    976 		goto err;
    977 		}
    978 
    979 	n2l3(p,llen);
    980 	if (llen+3 != n)
    981 		{
    982 		al=SSL_AD_DECODE_ERROR;
    983 		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
    984 		goto f_err;
    985 		}
    986 	for (nc=0; nc<llen; )
    987 		{
    988 		n2l3(p,l);
    989 		if ((l+nc+3) > llen)
    990 			{
    991 			al=SSL_AD_DECODE_ERROR;
    992 			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
    993 			goto f_err;
    994 			}
    995 
    996 		q=p;
    997 		x=d2i_X509(NULL,&q,l);
    998 		if (x == NULL)
    999 			{
   1000 			al=SSL_AD_BAD_CERTIFICATE;
   1001 			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_ASN1_LIB);
   1002 			goto f_err;
   1003 			}
   1004 		if (q != (p+l))
   1005 			{
   1006 			al=SSL_AD_DECODE_ERROR;
   1007 			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
   1008 			goto f_err;
   1009 			}
   1010 		if (!sk_X509_push(sk,x))
   1011 			{
   1012 			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
   1013 			goto err;
   1014 			}
   1015 		x=NULL;
   1016 		nc+=l+3;
   1017 		p=q;
   1018 		}
   1019 
   1020 	i=ssl_verify_cert_chain(s,sk);
   1021 	if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
   1022 #ifndef OPENSSL_NO_KRB5
   1023 	        && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK))
   1024 	        != (SSL_aKRB5|SSL_kKRB5)
   1025 #endif /* OPENSSL_NO_KRB5 */
   1026 	        )
   1027 		{
   1028 		al=ssl_verify_alarm_type(s->verify_result);
   1029 		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
   1030 		goto f_err;
   1031 		}
   1032 	ERR_clear_error(); /* but we keep s->verify_result */
   1033 
   1034 	sc=ssl_sess_cert_new();
   1035 	if (sc == NULL) goto err;
   1036 
   1037 	if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
   1038 	s->session->sess_cert=sc;
   1039 
   1040 	sc->cert_chain=sk;
   1041 	/* Inconsistency alert: cert_chain does include the peer's
   1042 	 * certificate, which we don't include in s3_srvr.c */
   1043 	x=sk_X509_value(sk,0);
   1044 	sk=NULL;
   1045  	/* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/
   1046 
   1047 	pkey=X509_get_pubkey(x);
   1048 
   1049 	/* VRS: allow null cert if auth == KRB5 */
   1050 	need_cert =	((s->s3->tmp.new_cipher->algorithms
   1051 	                 & (SSL_MKEY_MASK|SSL_AUTH_MASK))
   1052 	                 == (SSL_aKRB5|SSL_kKRB5))? 0: 1;
   1053 
   1054 #ifdef KSSL_DEBUG
   1055 	printf("pkey,x = %p, %p\n", (void *)pkey,(void *)x);
   1056 	printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey));
   1057 	printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name,
   1058 	        s->s3->tmp.new_cipher->algorithms, need_cert);
   1059 #endif    /* KSSL_DEBUG */
   1060 
   1061 	if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey)))
   1062 		{
   1063 		x=NULL;
   1064 		al=SSL3_AL_FATAL;
   1065 		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
   1066 			SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
   1067 		goto f_err;
   1068 		}
   1069 
   1070 	i=ssl_cert_type(x,pkey);
   1071 	if (need_cert && i < 0)
   1072 		{
   1073 		x=NULL;
   1074 		al=SSL3_AL_FATAL;
   1075 		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
   1076 			SSL_R_UNKNOWN_CERTIFICATE_TYPE);
   1077 		goto f_err;
   1078 		}
   1079 
   1080 	if (need_cert)
   1081 		{
   1082 		sc->peer_cert_type=i;
   1083 		CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
   1084 		/* Why would the following ever happen?
   1085 		 * We just created sc a couple of lines ago. */
   1086 		if (sc->peer_pkeys[i].x509 != NULL)
   1087 			X509_free(sc->peer_pkeys[i].x509);
   1088 		sc->peer_pkeys[i].x509=x;
   1089 		sc->peer_key= &(sc->peer_pkeys[i]);
   1090 
   1091 		if (s->session->peer != NULL)
   1092 			X509_free(s->session->peer);
   1093 		CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
   1094 		s->session->peer=x;
   1095 		}
   1096 	else
   1097 		{
   1098 		sc->peer_cert_type=i;
   1099 		sc->peer_key= NULL;
   1100 
   1101 		if (s->session->peer != NULL)
   1102 			X509_free(s->session->peer);
   1103 		s->session->peer=NULL;
   1104 		}
   1105 	s->session->verify_result = s->verify_result;
   1106 
   1107 	x=NULL;
   1108 	ret=1;
   1109 
   1110 	if (0)
   1111 		{
   1112 f_err:
   1113 		ssl3_send_alert(s,SSL3_AL_FATAL,al);
   1114 		}
   1115 err:
   1116 	EVP_PKEY_free(pkey);
   1117 	X509_free(x);
   1118 	sk_X509_pop_free(sk,X509_free);
   1119 	return(ret);
   1120 	}
   1121 
   1122 int ssl3_get_key_exchange(SSL *s)
   1123 	{
   1124 #ifndef OPENSSL_NO_RSA
   1125 	unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];
   1126 #endif
   1127 	EVP_MD_CTX md_ctx;
   1128 	unsigned char *param,*p;
   1129 	int al,i,j,param_len,ok;
   1130 	long n,alg;
   1131 	EVP_PKEY *pkey=NULL;
   1132 #ifndef OPENSSL_NO_RSA
   1133 	RSA *rsa=NULL;
   1134 #endif
   1135 #ifndef OPENSSL_NO_DH
   1136 	DH *dh=NULL;
   1137 #endif
   1138 #ifndef OPENSSL_NO_ECDH
   1139 	EC_KEY *ecdh = NULL;
   1140 	BN_CTX *bn_ctx = NULL;
   1141 	EC_POINT *srvr_ecpoint = NULL;
   1142 	int curve_nid = 0;
   1143 	int encoded_pt_len = 0;
   1144 #endif
   1145 
   1146 	/* use same message size as in ssl3_get_certificate_request()
   1147 	 * as ServerKeyExchange message may be skipped */
   1148 	n=s->method->ssl_get_message(s,
   1149 		SSL3_ST_CR_KEY_EXCH_A,
   1150 		SSL3_ST_CR_KEY_EXCH_B,
   1151 		-1,
   1152 		s->max_cert_list,
   1153 		&ok);
   1154 
   1155 	if (!ok) return((int)n);
   1156 
   1157 	if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)
   1158 		{
   1159 		s->s3->tmp.reuse_message=1;
   1160 		return(1);
   1161 		}
   1162 
   1163 	param=p=(unsigned char *)s->init_msg;
   1164 
   1165 	if (s->session->sess_cert != NULL)
   1166 		{
   1167 #ifndef OPENSSL_NO_RSA
   1168 		if (s->session->sess_cert->peer_rsa_tmp != NULL)
   1169 			{
   1170 			RSA_free(s->session->sess_cert->peer_rsa_tmp);
   1171 			s->session->sess_cert->peer_rsa_tmp=NULL;
   1172 			}
   1173 #endif
   1174 #ifndef OPENSSL_NO_DH
   1175 		if (s->session->sess_cert->peer_dh_tmp)
   1176 			{
   1177 			DH_free(s->session->sess_cert->peer_dh_tmp);
   1178 			s->session->sess_cert->peer_dh_tmp=NULL;
   1179 			}
   1180 #endif
   1181 #ifndef OPENSSL_NO_ECDH
   1182 		if (s->session->sess_cert->peer_ecdh_tmp)
   1183 			{
   1184 			EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp);
   1185 			s->session->sess_cert->peer_ecdh_tmp=NULL;
   1186 			}
   1187 #endif
   1188 		}
   1189 	else
   1190 		{
   1191 		s->session->sess_cert=ssl_sess_cert_new();
   1192 		}
   1193 
   1194 	param_len=0;
   1195 	alg=s->s3->tmp.new_cipher->algorithms;
   1196 	EVP_MD_CTX_init(&md_ctx);
   1197 
   1198 #ifndef OPENSSL_NO_RSA
   1199 	if (alg & SSL_kRSA)
   1200 		{
   1201 		if ((rsa=RSA_new()) == NULL)
   1202 			{
   1203 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
   1204 			goto err;
   1205 			}
   1206 		n2s(p,i);
   1207 		param_len=i+2;
   1208 		if (param_len > n)
   1209 			{
   1210 			al=SSL_AD_DECODE_ERROR;
   1211 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_MODULUS_LENGTH);
   1212 			goto f_err;
   1213 			}
   1214 		if (!(rsa->n=BN_bin2bn(p,i,rsa->n)))
   1215 			{
   1216 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
   1217 			goto err;
   1218 			}
   1219 		p+=i;
   1220 
   1221 		n2s(p,i);
   1222 		param_len+=i+2;
   1223 		if (param_len > n)
   1224 			{
   1225 			al=SSL_AD_DECODE_ERROR;
   1226 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_E_LENGTH);
   1227 			goto f_err;
   1228 			}
   1229 		if (!(rsa->e=BN_bin2bn(p,i,rsa->e)))
   1230 			{
   1231 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
   1232 			goto err;
   1233 			}
   1234 		p+=i;
   1235 		n-=param_len;
   1236 
   1237 		/* this should be because we are using an export cipher */
   1238 		if (alg & SSL_aRSA)
   1239 			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
   1240 		else
   1241 			{
   1242 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
   1243 			goto err;
   1244 			}
   1245 		s->session->sess_cert->peer_rsa_tmp=rsa;
   1246 		rsa=NULL;
   1247 		}
   1248 #else /* OPENSSL_NO_RSA */
   1249 	if (0)
   1250 		;
   1251 #endif
   1252 #ifndef OPENSSL_NO_DH
   1253 	else if (alg & SSL_kEDH)
   1254 		{
   1255 		if ((dh=DH_new()) == NULL)
   1256 			{
   1257 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_DH_LIB);
   1258 			goto err;
   1259 			}
   1260 		n2s(p,i);
   1261 		param_len=i+2;
   1262 		if (param_len > n)
   1263 			{
   1264 			al=SSL_AD_DECODE_ERROR;
   1265 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_P_LENGTH);
   1266 			goto f_err;
   1267 			}
   1268 		if (!(dh->p=BN_bin2bn(p,i,NULL)))
   1269 			{
   1270 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
   1271 			goto err;
   1272 			}
   1273 		p+=i;
   1274 
   1275 		n2s(p,i);
   1276 		param_len+=i+2;
   1277 		if (param_len > n)
   1278 			{
   1279 			al=SSL_AD_DECODE_ERROR;
   1280 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_G_LENGTH);
   1281 			goto f_err;
   1282 			}
   1283 		if (!(dh->g=BN_bin2bn(p,i,NULL)))
   1284 			{
   1285 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
   1286 			goto err;
   1287 			}
   1288 		p+=i;
   1289 
   1290 		n2s(p,i);
   1291 		param_len+=i+2;
   1292 		if (param_len > n)
   1293 			{
   1294 			al=SSL_AD_DECODE_ERROR;
   1295 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_PUB_KEY_LENGTH);
   1296 			goto f_err;
   1297 			}
   1298 		if (!(dh->pub_key=BN_bin2bn(p,i,NULL)))
   1299 			{
   1300 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
   1301 			goto err;
   1302 			}
   1303 		p+=i;
   1304 		n-=param_len;
   1305 
   1306 #ifndef OPENSSL_NO_RSA
   1307 		if (alg & SSL_aRSA)
   1308 			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
   1309 #else
   1310 		if (0)
   1311 			;
   1312 #endif
   1313 #ifndef OPENSSL_NO_DSA
   1314 		else if (alg & SSL_aDSS)
   1315 			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
   1316 #endif
   1317 		/* else anonymous DH, so no certificate or pkey. */
   1318 
   1319 		s->session->sess_cert->peer_dh_tmp=dh;
   1320 		dh=NULL;
   1321 		}
   1322 	else if ((alg & SSL_kDHr) || (alg & SSL_kDHd))
   1323 		{
   1324 		al=SSL_AD_ILLEGAL_PARAMETER;
   1325 		SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
   1326 		goto f_err;
   1327 		}
   1328 #endif /* !OPENSSL_NO_DH */
   1329 
   1330 #ifndef OPENSSL_NO_ECDH
   1331 	else if (alg & SSL_kECDHE)
   1332 		{
   1333 		EC_GROUP *ngroup;
   1334 		const EC_GROUP *group;
   1335 
   1336 		if ((ecdh=EC_KEY_new()) == NULL)
   1337 			{
   1338 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
   1339 			goto err;
   1340 			}
   1341 
   1342 		/* Extract elliptic curve parameters and the
   1343 		 * server's ephemeral ECDH public key.
   1344 		 * Keep accumulating lengths of various components in
   1345 		 * param_len and make sure it never exceeds n.
   1346 		 */
   1347 
   1348 		/* XXX: For now we only support named (not generic) curves
   1349 		 * and the ECParameters in this case is just three bytes.
   1350 		 */
   1351 		param_len=3;
   1352 		if ((param_len > n) ||
   1353 		    (*p != NAMED_CURVE_TYPE) ||
   1354 		    ((curve_nid = curve_id2nid(*(p + 2))) == 0))
   1355 			{
   1356 			al=SSL_AD_INTERNAL_ERROR;
   1357 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
   1358 			goto f_err;
   1359 			}
   1360 
   1361 		ngroup = EC_GROUP_new_by_curve_name(curve_nid);
   1362 		if (ngroup == NULL)
   1363 			{
   1364 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);
   1365 			goto err;
   1366 			}
   1367 		if (EC_KEY_set_group(ecdh, ngroup) == 0)
   1368 			{
   1369 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);
   1370 			goto err;
   1371 			}
   1372 		EC_GROUP_free(ngroup);
   1373 
   1374 		group = EC_KEY_get0_group(ecdh);
   1375 
   1376 		if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
   1377 		    (EC_GROUP_get_degree(group) > 163))
   1378 			{
   1379 			al=SSL_AD_EXPORT_RESTRICTION;
   1380 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
   1381 			goto f_err;
   1382 			}
   1383 
   1384 		p+=3;
   1385 
   1386 		/* Next, get the encoded ECPoint */
   1387 		if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) ||
   1388 		    ((bn_ctx = BN_CTX_new()) == NULL))
   1389 			{
   1390 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
   1391 			goto err;
   1392 			}
   1393 
   1394 		encoded_pt_len = *p;  /* length of encoded point */
   1395 		p+=1;
   1396 		param_len += (1 + encoded_pt_len);
   1397 		if ((param_len > n) ||
   1398 		    (EC_POINT_oct2point(group, srvr_ecpoint,
   1399 			p, encoded_pt_len, bn_ctx) == 0))
   1400 			{
   1401 			al=SSL_AD_DECODE_ERROR;
   1402 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_ECPOINT);
   1403 			goto f_err;
   1404 			}
   1405 
   1406 		n-=param_len;
   1407 		p+=encoded_pt_len;
   1408 
   1409 		/* The ECC/TLS specification does not mention
   1410 		 * the use of DSA to sign ECParameters in the server
   1411 		 * key exchange message. We do support RSA and ECDSA.
   1412 		 */
   1413 		if (0) ;
   1414 #ifndef OPENSSL_NO_RSA
   1415 		else if (alg & SSL_aRSA)
   1416 			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
   1417 #endif
   1418 #ifndef OPENSSL_NO_ECDSA
   1419 		else if (alg & SSL_aECDSA)
   1420 			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
   1421 #endif
   1422 		/* else anonymous ECDH, so no certificate or pkey. */
   1423 		EC_KEY_set_public_key(ecdh, srvr_ecpoint);
   1424 		s->session->sess_cert->peer_ecdh_tmp=ecdh;
   1425 		ecdh=NULL;
   1426 		BN_CTX_free(bn_ctx);
   1427 		EC_POINT_free(srvr_ecpoint);
   1428 		srvr_ecpoint = NULL;
   1429 		}
   1430 	else if (alg & SSL_kECDH)
   1431 		{
   1432 		al=SSL_AD_UNEXPECTED_MESSAGE;
   1433 		SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
   1434 		goto f_err;
   1435 		}
   1436 #endif /* !OPENSSL_NO_ECDH */
   1437 	if (alg & SSL_aFZA)
   1438 		{
   1439 		al=SSL_AD_HANDSHAKE_FAILURE;
   1440 		SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
   1441 		goto f_err;
   1442 		}
   1443 
   1444 
   1445 	/* p points to the next byte, there are 'n' bytes left */
   1446 
   1447 	/* if it was signed, check the signature */
   1448 	if (pkey != NULL)
   1449 		{
   1450 		n2s(p,i);
   1451 		n-=2;
   1452 		j=EVP_PKEY_size(pkey);
   1453 
   1454 		if ((i != n) || (n > j) || (n <= 0))
   1455 			{
   1456 			/* wrong packet length */
   1457 			al=SSL_AD_DECODE_ERROR;
   1458 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);
   1459 			goto f_err;
   1460 			}
   1461 
   1462 #ifndef OPENSSL_NO_RSA
   1463 		if (pkey->type == EVP_PKEY_RSA)
   1464 			{
   1465 			int num;
   1466 
   1467 			j=0;
   1468 			q=md_buf;
   1469 			for (num=2; num > 0; num--)
   1470 				{
   1471 				EVP_MD_CTX_set_flags(&md_ctx,
   1472 					EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
   1473 				EVP_DigestInit_ex(&md_ctx,(num == 2)
   1474 					?s->ctx->md5:s->ctx->sha1, NULL);
   1475 				EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
   1476 				EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
   1477 				EVP_DigestUpdate(&md_ctx,param,param_len);
   1478 				EVP_DigestFinal_ex(&md_ctx,q,(unsigned int *)&i);
   1479 				q+=i;
   1480 				j+=i;
   1481 				}
   1482 			i=RSA_verify(NID_md5_sha1, md_buf, j, p, n,
   1483 								pkey->pkey.rsa);
   1484 			if (i < 0)
   1485 				{
   1486 				al=SSL_AD_DECRYPT_ERROR;
   1487 				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
   1488 				goto f_err;
   1489 				}
   1490 			if (i == 0)
   1491 				{
   1492 				/* bad signature */
   1493 				al=SSL_AD_DECRYPT_ERROR;
   1494 				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
   1495 				goto f_err;
   1496 				}
   1497 			}
   1498 		else
   1499 #endif
   1500 #ifndef OPENSSL_NO_DSA
   1501 			if (pkey->type == EVP_PKEY_DSA)
   1502 			{
   1503 			/* lets do DSS */
   1504 			EVP_VerifyInit_ex(&md_ctx,EVP_dss1(), NULL);
   1505 			EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
   1506 			EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
   1507 			EVP_VerifyUpdate(&md_ctx,param,param_len);
   1508 			if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
   1509 				{
   1510 				/* bad signature */
   1511 				al=SSL_AD_DECRYPT_ERROR;
   1512 				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
   1513 				goto f_err;
   1514 				}
   1515 			}
   1516 		else
   1517 #endif
   1518 #ifndef OPENSSL_NO_ECDSA
   1519 			if (pkey->type == EVP_PKEY_EC)
   1520 			{
   1521 			/* let's do ECDSA */
   1522 			EVP_VerifyInit_ex(&md_ctx,EVP_ecdsa(), NULL);
   1523 			EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
   1524 			EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
   1525 			EVP_VerifyUpdate(&md_ctx,param,param_len);
   1526 			if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
   1527 				{
   1528 				/* bad signature */
   1529 				al=SSL_AD_DECRYPT_ERROR;
   1530 				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
   1531 				goto f_err;
   1532 				}
   1533 			}
   1534 		else
   1535 #endif
   1536 			{
   1537 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
   1538 			goto err;
   1539 			}
   1540 		}
   1541 	else
   1542 		{
   1543 		/* still data left over */
   1544 		if (!(alg & SSL_aNULL))
   1545 			{
   1546 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
   1547 			goto err;
   1548 			}
   1549 		if (n != 0)
   1550 			{
   1551 			al=SSL_AD_DECODE_ERROR;
   1552 			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_EXTRA_DATA_IN_MESSAGE);
   1553 			goto f_err;
   1554 			}
   1555 		}
   1556 	EVP_PKEY_free(pkey);
   1557 	EVP_MD_CTX_cleanup(&md_ctx);
   1558 	return(1);
   1559 f_err:
   1560 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
   1561 err:
   1562 	EVP_PKEY_free(pkey);
   1563 #ifndef OPENSSL_NO_RSA
   1564 	if (rsa != NULL)
   1565 		RSA_free(rsa);
   1566 #endif
   1567 #ifndef OPENSSL_NO_DH
   1568 	if (dh != NULL)
   1569 		DH_free(dh);
   1570 #endif
   1571 #ifndef OPENSSL_NO_ECDH
   1572 	BN_CTX_free(bn_ctx);
   1573 	EC_POINT_free(srvr_ecpoint);
   1574 	if (ecdh != NULL)
   1575 		EC_KEY_free(ecdh);
   1576 #endif
   1577 	EVP_MD_CTX_cleanup(&md_ctx);
   1578 	return(-1);
   1579 	}
   1580 
   1581 int ssl3_get_certificate_request(SSL *s)
   1582 	{
   1583 	int ok,ret=0;
   1584 	unsigned long n,nc,l;
   1585 	unsigned int llen,ctype_num,i;
   1586 	X509_NAME *xn=NULL;
   1587 	const unsigned char *p,*q;
   1588 	unsigned char *d;
   1589 	STACK_OF(X509_NAME) *ca_sk=NULL;
   1590 
   1591 	n=s->method->ssl_get_message(s,
   1592 		SSL3_ST_CR_CERT_REQ_A,
   1593 		SSL3_ST_CR_CERT_REQ_B,
   1594 		-1,
   1595 		s->max_cert_list,
   1596 		&ok);
   1597 
   1598 	if (!ok) return((int)n);
   1599 
   1600 	s->s3->tmp.cert_req=0;
   1601 
   1602 	if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)
   1603 		{
   1604 		s->s3->tmp.reuse_message=1;
   1605 		return(1);
   1606 		}
   1607 
   1608 	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST)
   1609 		{
   1610 		ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
   1611 		SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_WRONG_MESSAGE_TYPE);
   1612 		goto err;
   1613 		}
   1614 
   1615 	/* TLS does not like anon-DH with client cert */
   1616 	if (s->version > SSL3_VERSION)
   1617 		{
   1618 		l=s->s3->tmp.new_cipher->algorithms;
   1619 		if (l & SSL_aNULL)
   1620 			{
   1621 			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
   1622 			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER);
   1623 			goto err;
   1624 			}
   1625 		}
   1626 
   1627 	p=d=(unsigned char *)s->init_msg;
   1628 
   1629 	if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)
   1630 		{
   1631 		SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
   1632 		goto err;
   1633 		}
   1634 
   1635 	/* get the certificate types */
   1636 	ctype_num= *(p++);
   1637 	if (ctype_num > SSL3_CT_NUMBER)
   1638 		ctype_num=SSL3_CT_NUMBER;
   1639 	for (i=0; i<ctype_num; i++)
   1640 		s->s3->tmp.ctype[i]= p[i];
   1641 	p+=ctype_num;
   1642 
   1643 	/* get the CA RDNs */
   1644 	n2s(p,llen);
   1645 #if 0
   1646 {
   1647 FILE *out;
   1648 out=fopen("/tmp/vsign.der","w");
   1649 fwrite(p,1,llen,out);
   1650 fclose(out);
   1651 }
   1652 #endif
   1653 
   1654 	if ((llen+ctype_num+2+1) != n)
   1655 		{
   1656 		ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
   1657 		SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_LENGTH_MISMATCH);
   1658 		goto err;
   1659 		}
   1660 
   1661 	for (nc=0; nc<llen; )
   1662 		{
   1663 		n2s(p,l);
   1664 		if ((l+nc+2) > llen)
   1665 			{
   1666 			if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
   1667 				goto cont; /* netscape bugs */
   1668 			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
   1669 			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_TOO_LONG);
   1670 			goto err;
   1671 			}
   1672 
   1673 		q=p;
   1674 
   1675 		if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL)
   1676 			{
   1677 			/* If netscape tolerance is on, ignore errors */
   1678 			if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)
   1679 				goto cont;
   1680 			else
   1681 				{
   1682 				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
   1683 				SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_ASN1_LIB);
   1684 				goto err;
   1685 				}
   1686 			}
   1687 
   1688 		if (q != (p+l))
   1689 			{
   1690 			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
   1691 			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);
   1692 			goto err;
   1693 			}
   1694 		if (!sk_X509_NAME_push(ca_sk,xn))
   1695 			{
   1696 			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
   1697 			goto err;
   1698 			}
   1699 
   1700 		p+=l;
   1701 		nc+=l+2;
   1702 		}
   1703 
   1704 	if (0)
   1705 		{
   1706 cont:
   1707 		ERR_clear_error();
   1708 		}
   1709 
   1710 	/* we should setup a certificate to return.... */
   1711 	s->s3->tmp.cert_req=1;
   1712 	s->s3->tmp.ctype_num=ctype_num;
   1713 	if (s->s3->tmp.ca_names != NULL)
   1714 		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
   1715 	s->s3->tmp.ca_names=ca_sk;
   1716 	ca_sk=NULL;
   1717 
   1718 	ret=1;
   1719 err:
   1720 	if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);
   1721 	return(ret);
   1722 	}
   1723 
   1724 static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
   1725 	{
   1726 	return(X509_NAME_cmp(*a,*b));
   1727 	}
   1728 #ifndef OPENSSL_NO_TLSEXT
   1729 int ssl3_get_new_session_ticket(SSL *s)
   1730 	{
   1731 	int ok,al,ret=0, ticklen;
   1732 	long n;
   1733 	const unsigned char *p;
   1734 	unsigned char *d;
   1735 
   1736 	n=s->method->ssl_get_message(s,
   1737 		SSL3_ST_CR_SESSION_TICKET_A,
   1738 		SSL3_ST_CR_SESSION_TICKET_B,
   1739 		-1,
   1740 		16384,
   1741 		&ok);
   1742 
   1743 	if (!ok)
   1744 		return((int)n);
   1745 
   1746 	if (s->s3->tmp.message_type == SSL3_MT_FINISHED)
   1747 		{
   1748 		s->s3->tmp.reuse_message=1;
   1749 		return(1);
   1750 		}
   1751 	if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET)
   1752 		{
   1753 		al=SSL_AD_UNEXPECTED_MESSAGE;
   1754 		SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_BAD_MESSAGE_TYPE);
   1755 		goto f_err;
   1756 		}
   1757 	if (n < 6)
   1758 		{
   1759 		/* need at least ticket_lifetime_hint + ticket length */
   1760 		al = SSL3_AL_FATAL,SSL_AD_DECODE_ERROR;
   1761 		SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH);
   1762 		goto f_err;
   1763 		}
   1764 
   1765 	p=d=(unsigned char *)s->init_msg;
   1766 	n2l(p, s->session->tlsext_tick_lifetime_hint);
   1767 	n2s(p, ticklen);
   1768 	/* ticket_lifetime_hint + ticket_length + ticket */
   1769 	if (ticklen + 6 != n)
   1770 		{
   1771 		al = SSL3_AL_FATAL,SSL_AD_DECODE_ERROR;
   1772 		SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH);
   1773 		goto f_err;
   1774 		}
   1775 	if (s->session->tlsext_tick)
   1776 		{
   1777 		OPENSSL_free(s->session->tlsext_tick);
   1778 		s->session->tlsext_ticklen = 0;
   1779 		}
   1780 	s->session->tlsext_tick = OPENSSL_malloc(ticklen);
   1781 	if (!s->session->tlsext_tick)
   1782 		{
   1783 		SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,ERR_R_MALLOC_FAILURE);
   1784 		goto err;
   1785 		}
   1786 	memcpy(s->session->tlsext_tick, p, ticklen);
   1787 	s->session->tlsext_ticklen = ticklen;
   1788 	/* There are two ways to detect a resumed ticket sesion.
   1789 	 * One is to set an appropriate session ID and then the server
   1790 	 * must return a match in ServerHello. This allows the normal
   1791 	 * client session ID matching to work and we know much
   1792 	 * earlier that the ticket has been accepted.
   1793 	 *
   1794 	 * The other way is to set zero length session ID when the
   1795 	 * ticket is presented and rely on the handshake to determine
   1796 	 * session resumption.
   1797 	 *
   1798 	 * We choose the former approach because this fits in with
   1799 	 * assumptions elsewhere in OpenSSL. The session ID is set
   1800 	 * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the
   1801 	 * ticket.
   1802 	 */
   1803 	EVP_Digest(p, ticklen,
   1804 			s->session->session_id, &s->session->session_id_length,
   1805 #ifndef OPENSSL_NO_SHA256
   1806 							EVP_sha256(), NULL);
   1807 #else
   1808 							EVP_sha1(), NULL);
   1809 #endif
   1810 	ret=1;
   1811 	return(ret);
   1812 f_err:
   1813 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
   1814 err:
   1815 	return(-1);
   1816 	}
   1817 
   1818 int ssl3_get_cert_status(SSL *s)
   1819 	{
   1820 	int ok, al;
   1821 	unsigned long resplen;
   1822 	long n;
   1823 	const unsigned char *p;
   1824 
   1825 	n=s->method->ssl_get_message(s,
   1826 		SSL3_ST_CR_CERT_STATUS_A,
   1827 		SSL3_ST_CR_CERT_STATUS_B,
   1828 		SSL3_MT_CERTIFICATE_STATUS,
   1829 		16384,
   1830 		&ok);
   1831 
   1832 	if (!ok) return((int)n);
   1833 	if (n < 4)
   1834 		{
   1835 		/* need at least status type + length */
   1836 		al = SSL_AD_DECODE_ERROR;
   1837 		SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_LENGTH_MISMATCH);
   1838 		goto f_err;
   1839 		}
   1840 	p = (unsigned char *)s->init_msg;
   1841 	if (*p++ != TLSEXT_STATUSTYPE_ocsp)
   1842 		{
   1843 		al = SSL_AD_DECODE_ERROR;
   1844 		SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_UNSUPPORTED_STATUS_TYPE);
   1845 		goto f_err;
   1846 		}
   1847 	n2l3(p, resplen);
   1848 	if (resplen + 4 != (unsigned long)n)
   1849 		{
   1850 		al = SSL_AD_DECODE_ERROR;
   1851 		SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_LENGTH_MISMATCH);
   1852 		goto f_err;
   1853 		}
   1854 	if (s->tlsext_ocsp_resp)
   1855 		OPENSSL_free(s->tlsext_ocsp_resp);
   1856 	s->tlsext_ocsp_resp = BUF_memdup(p, resplen);
   1857 	if (!s->tlsext_ocsp_resp)
   1858 		{
   1859 		al = SSL_AD_INTERNAL_ERROR;
   1860 		SSLerr(SSL_F_SSL3_GET_CERT_STATUS,ERR_R_MALLOC_FAILURE);
   1861 		goto f_err;
   1862 		}
   1863 	s->tlsext_ocsp_resplen = resplen;
   1864 	if (s->ctx->tlsext_status_cb)
   1865 		{
   1866 		int ret;
   1867 		ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
   1868 		if (ret == 0)
   1869 			{
   1870 			al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
   1871 			SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_INVALID_STATUS_RESPONSE);
   1872 			goto f_err;
   1873 			}
   1874 		if (ret < 0)
   1875 			{
   1876 			al = SSL_AD_INTERNAL_ERROR;
   1877 			SSLerr(SSL_F_SSL3_GET_CERT_STATUS,ERR_R_MALLOC_FAILURE);
   1878 			goto f_err;
   1879 			}
   1880 		}
   1881 	return 1;
   1882 f_err:
   1883 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
   1884 	return(-1);
   1885 	}
   1886 #endif
   1887 
   1888 int ssl3_get_server_done(SSL *s)
   1889 	{
   1890 	int ok,ret=0;
   1891 	long n;
   1892 
   1893 	n=s->method->ssl_get_message(s,
   1894 		SSL3_ST_CR_SRVR_DONE_A,
   1895 		SSL3_ST_CR_SRVR_DONE_B,
   1896 		SSL3_MT_SERVER_DONE,
   1897 		30, /* should be very small, like 0 :-) */
   1898 		&ok);
   1899 
   1900 	if (!ok) return((int)n);
   1901 	if (n > 0)
   1902 		{
   1903 		/* should contain no data */
   1904 		ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
   1905 		SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH);
   1906 		return -1;
   1907 		}
   1908 	ret=1;
   1909 	return(ret);
   1910 	}
   1911 
   1912 
   1913 int ssl3_send_client_key_exchange(SSL *s)
   1914 	{
   1915 	unsigned char *p,*d;
   1916 	int n;
   1917 	unsigned long l;
   1918 #ifndef OPENSSL_NO_RSA
   1919 	unsigned char *q;
   1920 	EVP_PKEY *pkey=NULL;
   1921 #endif
   1922 #ifndef OPENSSL_NO_KRB5
   1923 	KSSL_ERR kssl_err;
   1924 #endif /* OPENSSL_NO_KRB5 */
   1925 #ifndef OPENSSL_NO_ECDH
   1926 	EC_KEY *clnt_ecdh = NULL;
   1927 	const EC_POINT *srvr_ecpoint = NULL;
   1928 	EVP_PKEY *srvr_pub_pkey = NULL;
   1929 	unsigned char *encodedPoint = NULL;
   1930 	int encoded_pt_len = 0;
   1931 	BN_CTX * bn_ctx = NULL;
   1932 #endif
   1933 
   1934 	if (s->state == SSL3_ST_CW_KEY_EXCH_A)
   1935 		{
   1936 		d=(unsigned char *)s->init_buf->data;
   1937 		p= &(d[4]);
   1938 
   1939 		l=s->s3->tmp.new_cipher->algorithms;
   1940 
   1941 		/* Fool emacs indentation */
   1942 		if (0) {}
   1943 #ifndef OPENSSL_NO_RSA
   1944 		else if (l & SSL_kRSA)
   1945 			{
   1946 			RSA *rsa;
   1947 			unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
   1948 
   1949 			if (s->session->sess_cert->peer_rsa_tmp != NULL)
   1950 				rsa=s->session->sess_cert->peer_rsa_tmp;
   1951 			else
   1952 				{
   1953 				pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
   1954 				if ((pkey == NULL) ||
   1955 					(pkey->type != EVP_PKEY_RSA) ||
   1956 					(pkey->pkey.rsa == NULL))
   1957 					{
   1958 					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
   1959 					goto err;
   1960 					}
   1961 				rsa=pkey->pkey.rsa;
   1962 				EVP_PKEY_free(pkey);
   1963 				}
   1964 
   1965 			tmp_buf[0]=s->client_version>>8;
   1966 			tmp_buf[1]=s->client_version&0xff;
   1967 			if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
   1968 					goto err;
   1969 
   1970 			s->session->master_key_length=sizeof tmp_buf;
   1971 
   1972 			q=p;
   1973 			/* Fix buf for TLS and beyond */
   1974 			if (s->version > SSL3_VERSION)
   1975 				p+=2;
   1976 			n=RSA_public_encrypt(sizeof tmp_buf,
   1977 				tmp_buf,p,rsa,RSA_PKCS1_PADDING);
   1978 #ifdef PKCS1_CHECK
   1979 			if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
   1980 			if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
   1981 #endif
   1982 			if (n <= 0)
   1983 				{
   1984 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
   1985 				goto err;
   1986 				}
   1987 
   1988 			/* Fix buf for TLS and beyond */
   1989 			if (s->version > SSL3_VERSION)
   1990 				{
   1991 				s2n(n,q);
   1992 				n+=2;
   1993 				}
   1994 
   1995 			s->session->master_key_length=
   1996 				s->method->ssl3_enc->generate_master_secret(s,
   1997 					s->session->master_key,
   1998 					tmp_buf,sizeof tmp_buf);
   1999 			OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);
   2000 			}
   2001 #endif
   2002 #ifndef OPENSSL_NO_KRB5
   2003 		else if (l & SSL_kKRB5)
   2004 			{
   2005 			krb5_error_code	krb5rc;
   2006 			KSSL_CTX	*kssl_ctx = s->kssl_ctx;
   2007 			/*  krb5_data	krb5_ap_req;  */
   2008 			krb5_data	*enc_ticket;
   2009 			krb5_data	authenticator, *authp = NULL;
   2010 			EVP_CIPHER_CTX	ciph_ctx;
   2011 			EVP_CIPHER	*enc = NULL;
   2012 			unsigned char	iv[EVP_MAX_IV_LENGTH];
   2013 			unsigned char	tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
   2014 			unsigned char	epms[SSL_MAX_MASTER_KEY_LENGTH
   2015 						+ EVP_MAX_IV_LENGTH];
   2016 			int 		padl, outl = sizeof(epms);
   2017 
   2018 			EVP_CIPHER_CTX_init(&ciph_ctx);
   2019 
   2020 #ifdef KSSL_DEBUG
   2021 			printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
   2022 			        l, SSL_kKRB5);
   2023 #endif	/* KSSL_DEBUG */
   2024 
   2025 			authp = NULL;
   2026 #ifdef KRB5SENDAUTH
   2027 			if (KRB5SENDAUTH)  authp = &authenticator;
   2028 #endif	/* KRB5SENDAUTH */
   2029 
   2030 			krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
   2031 				&kssl_err);
   2032 			enc = kssl_map_enc(kssl_ctx->enctype);
   2033 			if (enc == NULL)
   2034 			    goto err;
   2035 #ifdef KSSL_DEBUG
   2036 			{
   2037 			printf("kssl_cget_tkt rtn %d\n", krb5rc);
   2038 			if (krb5rc && kssl_err.text)
   2039 			  printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
   2040 			}
   2041 #endif	/* KSSL_DEBUG */
   2042 
   2043 			if (krb5rc)
   2044 				{
   2045 				ssl3_send_alert(s,SSL3_AL_FATAL,
   2046 						SSL_AD_HANDSHAKE_FAILURE);
   2047 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
   2048 						kssl_err.reason);
   2049 				goto err;
   2050 				}
   2051 
   2052 			/*  20010406 VRS - Earlier versions used KRB5 AP_REQ
   2053 			**  in place of RFC 2712 KerberosWrapper, as in:
   2054 			**
   2055 			**  Send ticket (copy to *p, set n = length)
   2056 			**  n = krb5_ap_req.length;
   2057 			**  memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
   2058 			**  if (krb5_ap_req.data)
   2059 			**    kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
   2060 			**
   2061 			**  Now using real RFC 2712 KerberosWrapper
   2062 			**  (Thanks to Simon Wilkinson <sxw (at) sxw.org.uk>)
   2063 			**  Note: 2712 "opaque" types are here replaced
   2064 			**  with a 2-byte length followed by the value.
   2065 			**  Example:
   2066 			**  KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
   2067 			**  Where "xx xx" = length bytes.  Shown here with
   2068 			**  optional authenticator omitted.
   2069 			*/
   2070 
   2071 			/*  KerberosWrapper.Ticket		*/
   2072 			s2n(enc_ticket->length,p);
   2073 			memcpy(p, enc_ticket->data, enc_ticket->length);
   2074 			p+= enc_ticket->length;
   2075 			n = enc_ticket->length + 2;
   2076 
   2077 			/*  KerberosWrapper.Authenticator	*/
   2078 			if (authp  &&  authp->length)
   2079 				{
   2080 				s2n(authp->length,p);
   2081 				memcpy(p, authp->data, authp->length);
   2082 				p+= authp->length;
   2083 				n+= authp->length + 2;
   2084 
   2085 				free(authp->data);
   2086 				authp->data = NULL;
   2087 				authp->length = 0;
   2088 				}
   2089 			else
   2090 				{
   2091 				s2n(0,p);/*  null authenticator length	*/
   2092 				n+=2;
   2093 				}
   2094 
   2095 			    tmp_buf[0]=s->client_version>>8;
   2096 			    tmp_buf[1]=s->client_version&0xff;
   2097 			    if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
   2098 				goto err;
   2099 
   2100 			/*  20010420 VRS.  Tried it this way; failed.
   2101 			**	EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
   2102 			**	EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
   2103 			**				kssl_ctx->length);
   2104 			**	EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
   2105 			*/
   2106 
   2107 			memset(iv, 0, sizeof iv);  /* per RFC 1510 */
   2108 			EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
   2109 				kssl_ctx->key,iv);
   2110 			EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
   2111 				sizeof tmp_buf);
   2112 			EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
   2113 			outl += padl;
   2114 			if (outl > sizeof epms)
   2115 				{
   2116 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
   2117 				goto err;
   2118 				}
   2119 			EVP_CIPHER_CTX_cleanup(&ciph_ctx);
   2120 
   2121 			/*  KerberosWrapper.EncryptedPreMasterSecret	*/
   2122 			s2n(outl,p);
   2123 			memcpy(p, epms, outl);
   2124 			p+=outl;
   2125 			n+=outl + 2;
   2126 
   2127 			s->session->master_key_length=
   2128 			        s->method->ssl3_enc->generate_master_secret(s,
   2129 					s->session->master_key,
   2130 					tmp_buf, sizeof tmp_buf);
   2131 
   2132 			OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
   2133 			OPENSSL_cleanse(epms, outl);
   2134 			}
   2135 #endif
   2136 #ifndef OPENSSL_NO_DH
   2137 		else if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
   2138 			{
   2139 			DH *dh_srvr,*dh_clnt;
   2140 
   2141 			if (s->session->sess_cert == NULL)
   2142 				{
   2143 				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
   2144 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
   2145 				goto err;
   2146 			        }
   2147 
   2148 			if (s->session->sess_cert->peer_dh_tmp != NULL)
   2149 				dh_srvr=s->session->sess_cert->peer_dh_tmp;
   2150 			else
   2151 				{
   2152 				/* we get them from the cert */
   2153 				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
   2154 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
   2155 				goto err;
   2156 				}
   2157 
   2158 			/* generate a new random key */
   2159 			if ((dh_clnt=DHparams_dup(dh_srvr)) == NULL)
   2160 				{
   2161 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
   2162 				goto err;
   2163 				}
   2164 			if (!DH_generate_key(dh_clnt))
   2165 				{
   2166 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
   2167 				goto err;
   2168 				}
   2169 
   2170 			/* use the 'p' output buffer for the DH key, but
   2171 			 * make sure to clear it out afterwards */
   2172 
   2173 			n=DH_compute_key(p,dh_srvr->pub_key,dh_clnt);
   2174 
   2175 			if (n <= 0)
   2176 				{
   2177 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
   2178 				goto err;
   2179 				}
   2180 
   2181 			/* generate master key from the result */
   2182 			s->session->master_key_length=
   2183 				s->method->ssl3_enc->generate_master_secret(s,
   2184 					s->session->master_key,p,n);
   2185 			/* clean up */
   2186 			memset(p,0,n);
   2187 
   2188 			/* send off the data */
   2189 			n=BN_num_bytes(dh_clnt->pub_key);
   2190 			s2n(n,p);
   2191 			BN_bn2bin(dh_clnt->pub_key,p);
   2192 			n+=2;
   2193 
   2194 			DH_free(dh_clnt);
   2195 
   2196 			/* perhaps clean things up a bit EAY EAY EAY EAY*/
   2197 			}
   2198 #endif
   2199 
   2200 #ifndef OPENSSL_NO_ECDH
   2201 		else if ((l & SSL_kECDH) || (l & SSL_kECDHE))
   2202 			{
   2203 			const EC_GROUP *srvr_group = NULL;
   2204 			EC_KEY *tkey;
   2205 			int ecdh_clnt_cert = 0;
   2206 			int field_size = 0;
   2207 
   2208 			/* Did we send out the client's
   2209 			 * ECDH share for use in premaster
   2210 			 * computation as part of client certificate?
   2211 			 * If so, set ecdh_clnt_cert to 1.
   2212 			 */
   2213 			if ((l & SSL_kECDH) && (s->cert != NULL))
   2214 				{
   2215 				/* XXX: For now, we do not support client
   2216 				 * authentication using ECDH certificates.
   2217 				 * To add such support, one needs to add
   2218 				 * code that checks for appropriate
   2219 				 * conditions and sets ecdh_clnt_cert to 1.
   2220 				 * For example, the cert have an ECC
   2221 				 * key on the same curve as the server's
   2222 				 * and the key should be authorized for
   2223 				 * key agreement.
   2224 				 *
   2225 				 * One also needs to add code in ssl3_connect
   2226 				 * to skip sending the certificate verify
   2227 				 * message.
   2228 				 *
   2229 				 * if ((s->cert->key->privatekey != NULL) &&
   2230 				 *     (s->cert->key->privatekey->type ==
   2231 				 *      EVP_PKEY_EC) && ...)
   2232 				 * ecdh_clnt_cert = 1;
   2233 				 */
   2234 				}
   2235 
   2236 			if (s->session->sess_cert->peer_ecdh_tmp != NULL)
   2237 				{
   2238 				tkey = s->session->sess_cert->peer_ecdh_tmp;
   2239 				}
   2240 			else
   2241 				{
   2242 				/* Get the Server Public Key from Cert */
   2243 				srvr_pub_pkey = X509_get_pubkey(s->session-> \
   2244 				    sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
   2245 				if ((srvr_pub_pkey == NULL) ||
   2246 				    (srvr_pub_pkey->type != EVP_PKEY_EC) ||
   2247 				    (srvr_pub_pkey->pkey.ec == NULL))
   2248 					{
   2249 					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
   2250 					    ERR_R_INTERNAL_ERROR);
   2251 					goto err;
   2252 					}
   2253 
   2254 				tkey = srvr_pub_pkey->pkey.ec;
   2255 				}
   2256 
   2257 			srvr_group   = EC_KEY_get0_group(tkey);
   2258 			srvr_ecpoint = EC_KEY_get0_public_key(tkey);
   2259 
   2260 			if ((srvr_group == NULL) || (srvr_ecpoint == NULL))
   2261 				{
   2262 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
   2263 				    ERR_R_INTERNAL_ERROR);
   2264 				goto err;
   2265 				}
   2266 
   2267 			if ((clnt_ecdh=EC_KEY_new()) == NULL)
   2268 				{
   2269 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
   2270 				goto err;
   2271 				}
   2272 
   2273 			if (!EC_KEY_set_group(clnt_ecdh, srvr_group))
   2274 				{
   2275 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
   2276 				goto err;
   2277 				}
   2278 			if (ecdh_clnt_cert)
   2279 				{
   2280 				/* Reuse key info from our certificate
   2281 				 * We only need our private key to perform
   2282 				 * the ECDH computation.
   2283 				 */
   2284 				const BIGNUM *priv_key;
   2285 				tkey = s->cert->key->privatekey->pkey.ec;
   2286 				priv_key = EC_KEY_get0_private_key(tkey);
   2287 				if (priv_key == NULL)
   2288 					{
   2289 					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
   2290 					goto err;
   2291 					}
   2292 				if (!EC_KEY_set_private_key(clnt_ecdh, priv_key))
   2293 					{
   2294 					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
   2295 					goto err;
   2296 					}
   2297 				}
   2298 			else
   2299 				{
   2300 				/* Generate a new ECDH key pair */
   2301 				if (!(EC_KEY_generate_key(clnt_ecdh)))
   2302 					{
   2303 					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
   2304 					goto err;
   2305 					}
   2306 				}
   2307 
   2308 			/* use the 'p' output buffer for the ECDH key, but
   2309 			 * make sure to clear it out afterwards
   2310 			 */
   2311 
   2312 			field_size = EC_GROUP_get_degree(srvr_group);
   2313 			if (field_size <= 0)
   2314 				{
   2315 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
   2316 				       ERR_R_ECDH_LIB);
   2317 				goto err;
   2318 				}
   2319 			n=ECDH_compute_key(p, (field_size+7)/8, srvr_ecpoint, clnt_ecdh, NULL);
   2320 			if (n <= 0)
   2321 				{
   2322 				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
   2323 				       ERR_R_ECDH_LIB);
   2324 				goto err;
   2325 				}
   2326 
   2327 			/* generate master key from the result */
   2328 			s->session->master_key_length = s->method->ssl3_enc \
   2329 			    -> generate_master_secret(s,
   2330 				s->session->master_key,
   2331 				p, n);
   2332 
   2333 			memset(p, 0, n); /* clean up */
   2334 
   2335 			if (ecdh_clnt_cert)
   2336 				{
   2337 				/* Send empty client key exch message */
   2338 				n = 0;
   2339 				}
   2340 			else
   2341 				{
   2342 				/* First check the size of encoding and
   2343 				 * allocate memory accordingly.
   2344 				 */
   2345 				encoded_pt_len =
   2346 				    EC_POINT_point2oct(srvr_group,
   2347 					EC_KEY_get0_public_key(clnt_ecdh),
   2348 					POINT_CONVERSION_UNCOMPRESSED,
   2349 					NULL, 0, NULL);
   2350 
   2351 				encodedPoint = (unsigned char *)
   2352 				    OPENSSL_malloc(encoded_pt_len *
   2353 					sizeof(unsigned char));
   2354 				bn_ctx = BN_CTX_new();
   2355 				if ((encodedPoint == NULL) ||
   2356 				    (bn_ctx == NULL))
   2357 					{
   2358 					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
   2359 					goto err;
   2360 					}
   2361 
   2362 				/* Encode the public key */
   2363 				n = EC_POINT_point2oct(srvr_group,
   2364 				    EC_KEY_get0_public_key(clnt_ecdh),
   2365 				    POINT_CONVERSION_UNCOMPRESSED,
   2366 				    encodedPoint, encoded_pt_len, bn_ctx);
   2367 
   2368 				*p = n; /* length of encoded point */
   2369 				/* Encoded point will be copied here */
   2370 				p += 1;
   2371 				/* copy the point */
   2372 				memcpy((unsigned char *)p, encodedPoint, n);
   2373 				/* increment n to account for length field */
   2374 				n += 1;
   2375 				}
   2376 
   2377 			/* Free allocated memory */
   2378 			BN_CTX_free(bn_ctx);
   2379 			if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
   2380 			if (clnt_ecdh != NULL)
   2381 				 EC_KEY_free(clnt_ecdh);
   2382 			EVP_PKEY_free(srvr_pub_pkey);
   2383 			}
   2384 #endif /* !OPENSSL_NO_ECDH */
   2385 		else
   2386 			{
   2387 			ssl3_send_alert(s, SSL3_AL_FATAL,
   2388 			    SSL_AD_HANDSHAKE_FAILURE);
   2389 			SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
   2390 			    ERR_R_INTERNAL_ERROR);
   2391 			goto err;
   2392 			}
   2393 
   2394 		*(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
   2395 		l2n3(n,d);
   2396 
   2397 		s->state=SSL3_ST_CW_KEY_EXCH_B;
   2398 		/* number of bytes to write */
   2399 		s->init_num=n+4;
   2400 		s->init_off=0;
   2401 		}
   2402 
   2403 	/* SSL3_ST_CW_KEY_EXCH_B */
   2404 	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
   2405 err:
   2406 #ifndef OPENSSL_NO_ECDH
   2407 	BN_CTX_free(bn_ctx);
   2408 	if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
   2409 	if (clnt_ecdh != NULL)
   2410 		EC_KEY_free(clnt_ecdh);
   2411 	EVP_PKEY_free(srvr_pub_pkey);
   2412 #endif
   2413 	return(-1);
   2414 	}
   2415 
   2416 int ssl3_send_client_verify(SSL *s)
   2417 	{
   2418 	unsigned char *p,*d;
   2419 	unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
   2420 	EVP_PKEY *pkey;
   2421 #ifndef OPENSSL_NO_RSA
   2422 	unsigned u=0;
   2423 #endif
   2424 	unsigned long n;
   2425 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
   2426 	int j;
   2427 #endif
   2428 
   2429 	if (s->state == SSL3_ST_CW_CERT_VRFY_A)
   2430 		{
   2431 		d=(unsigned char *)s->init_buf->data;
   2432 		p= &(d[4]);
   2433 		pkey=s->cert->key->privatekey;
   2434 
   2435 		s->method->ssl3_enc->cert_verify_mac(s,&(s->s3->finish_dgst2),
   2436 			&(data[MD5_DIGEST_LENGTH]));
   2437 
   2438 #ifndef OPENSSL_NO_RSA
   2439 		if (pkey->type == EVP_PKEY_RSA)
   2440 			{
   2441 			s->method->ssl3_enc->cert_verify_mac(s,
   2442 				&(s->s3->finish_dgst1),&(data[0]));
   2443 			if (RSA_sign(NID_md5_sha1, data,
   2444 					 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
   2445 					&(p[2]), &u, pkey->pkey.rsa) <= 0 )
   2446 				{
   2447 				SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
   2448 				goto err;
   2449 				}
   2450 			s2n(u,p);
   2451 			n=u+2;
   2452 			}
   2453 		else
   2454 #endif
   2455 #ifndef OPENSSL_NO_DSA
   2456 			if (pkey->type == EVP_PKEY_DSA)
   2457 			{
   2458 			if (!DSA_sign(pkey->save_type,
   2459 				&(data[MD5_DIGEST_LENGTH]),
   2460 				SHA_DIGEST_LENGTH,&(p[2]),
   2461 				(unsigned int *)&j,pkey->pkey.dsa))
   2462 				{
   2463 				SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
   2464 				goto err;
   2465 				}
   2466 			s2n(j,p);
   2467 			n=j+2;
   2468 			}
   2469 		else
   2470 #endif
   2471 #ifndef OPENSSL_NO_ECDSA
   2472 			if (pkey->type == EVP_PKEY_EC)
   2473 			{
   2474 			if (!ECDSA_sign(pkey->save_type,
   2475 				&(data[MD5_DIGEST_LENGTH]),
   2476 				SHA_DIGEST_LENGTH,&(p[2]),
   2477 				(unsigned int *)&j,pkey->pkey.ec))
   2478 				{
   2479 				SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
   2480 				    ERR_R_ECDSA_LIB);
   2481 				goto err;
   2482 				}
   2483 			s2n(j,p);
   2484 			n=j+2;
   2485 			}
   2486 		else
   2487 #endif
   2488 			{
   2489 			SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
   2490 			goto err;
   2491 			}
   2492 		*(d++)=SSL3_MT_CERTIFICATE_VERIFY;
   2493 		l2n3(n,d);
   2494 
   2495 		s->state=SSL3_ST_CW_CERT_VRFY_B;
   2496 		s->init_num=(int)n+4;
   2497 		s->init_off=0;
   2498 		}
   2499 	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
   2500 err:
   2501 	return(-1);
   2502 	}
   2503 
   2504 int ssl3_send_client_certificate(SSL *s)
   2505 	{
   2506 	X509 *x509=NULL;
   2507 	EVP_PKEY *pkey=NULL;
   2508 	int i;
   2509 	unsigned long l;
   2510 
   2511 	if (s->state ==	SSL3_ST_CW_CERT_A)
   2512 		{
   2513 		if ((s->cert == NULL) ||
   2514 			(s->cert->key->x509 == NULL) ||
   2515 			(s->cert->key->privatekey == NULL))
   2516 			s->state=SSL3_ST_CW_CERT_B;
   2517 		else
   2518 			s->state=SSL3_ST_CW_CERT_C;
   2519 		}
   2520 
   2521 	/* We need to get a client cert */
   2522 	if (s->state == SSL3_ST_CW_CERT_B)
   2523 		{
   2524 		/* If we get an error, we need to
   2525 		 * ssl->rwstate=SSL_X509_LOOKUP; return(-1);
   2526 		 * We then get retied later */
   2527 		i=0;
   2528 		i = ssl_do_client_cert_cb(s, &x509, &pkey);
   2529 		if (i < 0)
   2530 			{
   2531 			s->rwstate=SSL_X509_LOOKUP;
   2532 			return(-1);
   2533 			}
   2534 		s->rwstate=SSL_NOTHING;
   2535 		if ((i == 1) && (pkey != NULL) && (x509 != NULL))
   2536 			{
   2537 			s->state=SSL3_ST_CW_CERT_B;
   2538 			if (	!SSL_use_certificate(s,x509) ||
   2539 				!SSL_use_PrivateKey(s,pkey))
   2540 				i=0;
   2541 			}
   2542 		else if (i == 1)
   2543 			{
   2544 			i=0;
   2545 			SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
   2546 			}
   2547 
   2548 		if (x509 != NULL) X509_free(x509);
   2549 		if (pkey != NULL) EVP_PKEY_free(pkey);
   2550 		if (i == 0)
   2551 			{
   2552 			if (s->version == SSL3_VERSION)
   2553 				{
   2554 				s->s3->tmp.cert_req=0;
   2555 				ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_NO_CERTIFICATE);
   2556 				return(1);
   2557 				}
   2558 			else
   2559 				{
   2560 				s->s3->tmp.cert_req=2;
   2561 				}
   2562 			}
   2563 
   2564 		/* Ok, we have a cert */
   2565 		s->state=SSL3_ST_CW_CERT_C;
   2566 		}
   2567 
   2568 	if (s->state == SSL3_ST_CW_CERT_C)
   2569 		{
   2570 		s->state=SSL3_ST_CW_CERT_D;
   2571 		l=ssl3_output_cert_chain(s,
   2572 			(s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
   2573 		s->init_num=(int)l;
   2574 		s->init_off=0;
   2575 		}
   2576 	/* SSL3_ST_CW_CERT_D */
   2577 	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
   2578 	}
   2579 
   2580 #define has_bits(i,m)	(((i)&(m)) == (m))
   2581 
   2582 int ssl3_check_cert_and_algorithm(SSL *s)
   2583 	{
   2584 	int i,idx;
   2585 	long algs;
   2586 	EVP_PKEY *pkey=NULL;
   2587 	SESS_CERT *sc;
   2588 #ifndef OPENSSL_NO_RSA
   2589 	RSA *rsa;
   2590 #endif
   2591 #ifndef OPENSSL_NO_DH
   2592 	DH *dh;
   2593 #endif
   2594 
   2595 	sc=s->session->sess_cert;
   2596 
   2597 	algs=s->s3->tmp.new_cipher->algorithms;
   2598 
   2599 	/* we don't have a certificate */
   2600 	if (algs & (SSL_aDH|SSL_aNULL|SSL_aKRB5))
   2601 		return(1);
   2602 
   2603 	if (sc == NULL)
   2604 		{
   2605 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,ERR_R_INTERNAL_ERROR);
   2606 		goto err;
   2607 		}
   2608 
   2609 #ifndef OPENSSL_NO_RSA
   2610 	rsa=s->session->sess_cert->peer_rsa_tmp;
   2611 #endif
   2612 #ifndef OPENSSL_NO_DH
   2613 	dh=s->session->sess_cert->peer_dh_tmp;
   2614 #endif
   2615 
   2616 	/* This is the passed certificate */
   2617 
   2618 	idx=sc->peer_cert_type;
   2619 #ifndef OPENSSL_NO_ECDH
   2620 	if (idx == SSL_PKEY_ECC)
   2621 		{
   2622 		if (check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509,
   2623 		    s->s3->tmp.new_cipher) == 0)
   2624 			{ /* check failed */
   2625 			SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_BAD_ECC_CERT);
   2626 			goto f_err;
   2627 			}
   2628 		else
   2629 			{
   2630 			return 1;
   2631 			}
   2632 		}
   2633 #endif
   2634 	pkey=X509_get_pubkey(sc->peer_pkeys[idx].x509);
   2635 	i=X509_certificate_type(sc->peer_pkeys[idx].x509,pkey);
   2636 	EVP_PKEY_free(pkey);
   2637 
   2638 
   2639 	/* Check that we have a certificate if we require one */
   2640 	if ((algs & SSL_aRSA) && !has_bits(i,EVP_PK_RSA|EVP_PKT_SIGN))
   2641 		{
   2642 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_SIGNING_CERT);
   2643 		goto f_err;
   2644 		}
   2645 #ifndef OPENSSL_NO_DSA
   2646 	else if ((algs & SSL_aDSS) && !has_bits(i,EVP_PK_DSA|EVP_PKT_SIGN))
   2647 		{
   2648 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DSA_SIGNING_CERT);
   2649 		goto f_err;
   2650 		}
   2651 #endif
   2652 #ifndef OPENSSL_NO_RSA
   2653 	if ((algs & SSL_kRSA) &&
   2654 		!(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL)))
   2655 		{
   2656 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT);
   2657 		goto f_err;
   2658 		}
   2659 #endif
   2660 #ifndef OPENSSL_NO_DH
   2661 	if ((algs & SSL_kEDH) &&
   2662 		!(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL)))
   2663 		{
   2664 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY);
   2665 		goto f_err;
   2666 		}
   2667 	else if ((algs & SSL_kDHr) && !has_bits(i,EVP_PK_DH|EVP_PKS_RSA))
   2668 		{
   2669 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT);
   2670 		goto f_err;
   2671 		}
   2672 #ifndef OPENSSL_NO_DSA
   2673 	else if ((algs & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA))
   2674 		{
   2675 		SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT);
   2676 		goto f_err;
   2677 		}
   2678 #endif
   2679 #endif
   2680 
   2681 	if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i,EVP_PKT_EXP))
   2682 		{
   2683 #ifndef OPENSSL_NO_RSA
   2684 		if (algs & SSL_kRSA)
   2685 			{
   2686 			if (rsa == NULL
   2687 			    || RSA_size(rsa)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
   2688 				{
   2689 				SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
   2690 				goto f_err;
   2691 				}
   2692 			}
   2693 		else
   2694 #endif
   2695 #ifndef OPENSSL_NO_DH
   2696 			if (algs & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
   2697 			    {
   2698 			    if (dh == NULL
   2699 				|| DH_size(dh)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
   2700 				{
   2701 				SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_DH_KEY);
   2702 				goto f_err;
   2703 				}
   2704 			}
   2705 		else
   2706 #endif
   2707 			{
   2708 			SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
   2709 			goto f_err;
   2710 			}
   2711 		}
   2712 	return(1);
   2713 f_err:
   2714 	ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
   2715 err:
   2716 	return(0);
   2717 	}
   2718 
   2719 
   2720 #ifndef OPENSSL_NO_ECDH
   2721 /* This is the complement of nid2curve_id in s3_srvr.c. */
   2722 static int curve_id2nid(int curve_id)
   2723 {
   2724 	/* ECC curves from draft-ietf-tls-ecc-01.txt (Mar 15, 2001)
   2725 	 * (no changes in draft-ietf-tls-ecc-03.txt [June 2003]) */
   2726 	static int nid_list[26] =
   2727 	{
   2728 		0,
   2729 		NID_sect163k1, /* sect163k1 (1) */
   2730 		NID_sect163r1, /* sect163r1 (2) */
   2731 		NID_sect163r2, /* sect163r2 (3) */
   2732 		NID_sect193r1, /* sect193r1 (4) */
   2733 		NID_sect193r2, /* sect193r2 (5) */
   2734 		NID_sect233k1, /* sect233k1 (6) */
   2735 		NID_sect233r1, /* sect233r1 (7) */
   2736 		NID_sect239k1, /* sect239k1 (8) */
   2737 		NID_sect283k1, /* sect283k1 (9) */
   2738 		NID_sect283r1, /* sect283r1 (10) */
   2739 		NID_sect409k1, /* sect409k1 (11) */
   2740 		NID_sect409r1, /* sect409r1 (12) */
   2741 		NID_sect571k1, /* sect571k1 (13) */
   2742 		NID_sect571r1, /* sect571r1 (14) */
   2743 		NID_secp160k1, /* secp160k1 (15) */
   2744 		NID_secp160r1, /* secp160r1 (16) */
   2745 		NID_secp160r2, /* secp160r2 (17) */
   2746 		NID_secp192k1, /* secp192k1 (18) */
   2747 		NID_X9_62_prime192v1, /* secp192r1 (19) */
   2748 		NID_secp224k1, /* secp224k1 (20) */
   2749 		NID_secp224r1, /* secp224r1 (21) */
   2750 		NID_secp256k1, /* secp256k1 (22) */
   2751 		NID_X9_62_prime256v1, /* secp256r1 (23) */
   2752 		NID_secp384r1, /* secp384r1 (24) */
   2753 		NID_secp521r1  /* secp521r1 (25) */
   2754 	};
   2755 
   2756 	if ((curve_id < 1) || (curve_id > 25)) return 0;
   2757 
   2758 	return nid_list[curve_id];
   2759 }
   2760 #endif
   2761 
   2762 /* Check to see if handshake is full or resumed. Usually this is just a
   2763  * case of checking to see if a cache hit has occurred. In the case of
   2764  * session tickets we have to check the next message to be sure.
   2765  */
   2766 
   2767 #ifndef OPENSSL_NO_TLSEXT
   2768 int ssl3_check_finished(SSL *s)
   2769 	{
   2770 	int ok;
   2771 	long n;
   2772 	/* If we have no ticket or session ID is non-zero length (a match of
   2773 	 * a non-zero session length would never reach here) it cannot be a
   2774 	 * resumed session.
   2775 	 */
   2776 	if (!s->session->tlsext_tick || s->session->session_id_length)
   2777 		return 1;
   2778 	/* this function is called when we really expect a Certificate
   2779 	 * message, so permit appropriate message length */
   2780 	n=s->method->ssl_get_message(s,
   2781 		SSL3_ST_CR_CERT_A,
   2782 		SSL3_ST_CR_CERT_B,
   2783 		-1,
   2784 		s->max_cert_list,
   2785 		&ok);
   2786 	if (!ok) return((int)n);
   2787 	s->s3->tmp.reuse_message = 1;
   2788 	if ((s->s3->tmp.message_type == SSL3_MT_FINISHED)
   2789 		|| (s->s3->tmp.message_type == SSL3_MT_NEWSESSION_TICKET))
   2790 		return 2;
   2791 
   2792 	return 1;
   2793 	}
   2794 #endif
   2795 
   2796 int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey)
   2797 	{
   2798 	int i = 0;
   2799 #ifndef OPENSSL_NO_ENGINE
   2800 	if (s->ctx->client_cert_engine)
   2801 		{
   2802 		i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
   2803 						SSL_get_client_CA_list(s),
   2804 						px509, ppkey, NULL, NULL, NULL);
   2805 		if (i != 0)
   2806 			return i;
   2807 		}
   2808 #endif
   2809 	if (s->ctx->client_cert_cb)
   2810 		i = s->ctx->client_cert_cb(s,px509,ppkey);
   2811 	return i;
   2812 	}
   2813