Home | History | Annotate | Download | only in ssl
      1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      2  * All rights reserved.
      3  *
      4  * This package is an SSL implementation written
      5  * by Eric Young (eay (at) 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 (at) 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 (at) 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 (at) 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-2002 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 (at) 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 (at) cryptsoft.com).  This product includes software written by Tim
    107  * Hudson (tjh (at) cryptsoft.com). */
    108 /* ====================================================================
    109  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
    110  * ECC cipher suite support in OpenSSL originally developed by
    111  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. */
    112 
    113 #include <assert.h>
    114 #include <limits.h>
    115 #include <stdio.h>
    116 #include <string.h>
    117 
    118 #include <openssl/buf.h>
    119 #include <openssl/evp.h>
    120 #include <openssl/mem.h>
    121 #include <openssl/md5.h>
    122 #include <openssl/obj.h>
    123 #include <openssl/rand.h>
    124 #include <openssl/sha.h>
    125 #include <openssl/x509.h>
    126 
    127 #include "ssl_locl.h"
    128 
    129 /* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
    130 int ssl3_do_write(SSL *s, int type)
    131 	{
    132 	int ret;
    133 
    134 	ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
    135 	                     s->init_num);
    136 	if (ret < 0) return(-1);
    137 	if (type == SSL3_RT_HANDSHAKE)
    138 		/* should not be done for 'Hello Request's, but in that case
    139 		 * we'll ignore the result anyway */
    140 		ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret);
    141 
    142 	if (ret == s->init_num)
    143 		{
    144 		if (s->msg_callback)
    145 			s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
    146 		return(1);
    147 		}
    148 	s->init_off+=ret;
    149 	s->init_num-=ret;
    150 	return(0);
    151 	}
    152 
    153 int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
    154 	{
    155 	unsigned char *p;
    156 	int i;
    157 	unsigned long l;
    158 
    159 	if (s->state == a)
    160 		{
    161 		p = ssl_handshake_start(s);
    162 
    163 		i=s->method->ssl3_enc->final_finish_mac(s,
    164 			sender,slen,s->s3->tmp.finish_md);
    165 		if (i == 0)
    166 			return 0;
    167 		s->s3->tmp.finish_md_len = i;
    168 		memcpy(p, s->s3->tmp.finish_md, i);
    169 		l=i;
    170 
    171                 /* Log the master secret, if logging is enabled. */
    172                 if (!ssl_ctx_log_master_secret(s->ctx,
    173 				s->s3->client_random, SSL3_RANDOM_SIZE,
    174 				s->session->master_key, s->session->master_key_length))
    175 			{
    176 			return 0;
    177 			}
    178 
    179                 /* Copy the finished so we can use it for
    180                    renegotiation checks */
    181                 if(s->type == SSL_ST_CONNECT)
    182                         {
    183                          assert(i <= EVP_MAX_MD_SIZE);
    184                          memcpy(s->s3->previous_client_finished,
    185                              s->s3->tmp.finish_md, i);
    186                          s->s3->previous_client_finished_len=i;
    187                         }
    188                 else
    189                         {
    190                         assert(i <= EVP_MAX_MD_SIZE);
    191                         memcpy(s->s3->previous_server_finished,
    192                             s->s3->tmp.finish_md, i);
    193                         s->s3->previous_server_finished_len=i;
    194                         }
    195 
    196 		ssl_set_handshake_header(s, SSL3_MT_FINISHED, l);
    197 		s->state=b;
    198 		}
    199 
    200 	/* SSL3_ST_SEND_xxxxxx_HELLO_B */
    201 	return ssl_do_write(s);
    202 	}
    203 
    204 /* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */
    205 static void ssl3_take_mac(SSL *s)
    206 	{
    207 	const char *sender;
    208 	int slen;
    209 	/* If no new cipher setup return immediately: other functions will
    210 	 * set the appropriate error.
    211 	 */
    212 	if (s->s3->tmp.new_cipher == NULL)
    213 		return;
    214 	if (s->state & SSL_ST_CONNECT)
    215 		{
    216 		sender=s->method->ssl3_enc->server_finished_label;
    217 		slen=s->method->ssl3_enc->server_finished_label_len;
    218 		}
    219 	else
    220 		{
    221 		sender=s->method->ssl3_enc->client_finished_label;
    222 		slen=s->method->ssl3_enc->client_finished_label_len;
    223 		}
    224 
    225 	s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
    226 		sender,slen,s->s3->tmp.peer_finish_md);
    227 	}
    228 
    229 int ssl3_get_finished(SSL *s, int a, int b)
    230 	{
    231 	int al,i,ok;
    232 	long n;
    233 	unsigned char *p;
    234 
    235 	n=s->method->ssl_get_message(s,
    236 		a,
    237 		b,
    238 		SSL3_MT_FINISHED,
    239 		64, /* should actually be 36+4 :-) */
    240 		SSL_GET_MESSAGE_DONT_HASH_MESSAGE,
    241 		&ok);
    242 
    243 	if (!ok) return((int)n);
    244 
    245 	/* Snapshot the finished hash before incorporating the new message. */
    246 	ssl3_take_mac(s);
    247 	ssl3_hash_current_message(s);
    248 
    249 	/* If this occurs, we have missed a message.
    250 	 * TODO(davidben): Is this check now redundant with
    251 	 * SSL3_FLAGS_EXPECT_CCS? */
    252 	if (!s->s3->change_cipher_spec)
    253 		{
    254 		al=SSL_AD_UNEXPECTED_MESSAGE;
    255 		OPENSSL_PUT_ERROR(SSL, ssl3_get_finished, SSL_R_GOT_A_FIN_BEFORE_A_CCS);
    256 		goto f_err;
    257 		}
    258 	s->s3->change_cipher_spec=0;
    259 
    260 	p = s->init_msg;
    261 	i = s->s3->tmp.peer_finish_md_len;
    262 
    263 	if (i != n)
    264 		{
    265 		al=SSL_AD_DECODE_ERROR;
    266 		OPENSSL_PUT_ERROR(SSL, ssl3_get_finished, SSL_R_BAD_DIGEST_LENGTH);
    267 		goto f_err;
    268 		}
    269 
    270 	if (CRYPTO_memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
    271 		{
    272 		al=SSL_AD_DECRYPT_ERROR;
    273 		OPENSSL_PUT_ERROR(SSL, ssl3_get_finished, SSL_R_DIGEST_CHECK_FAILED);
    274 		goto f_err;
    275 		}
    276 
    277         /* Copy the finished so we can use it for
    278            renegotiation checks */
    279         if(s->type == SSL_ST_ACCEPT)
    280                 {
    281                 assert(i <= EVP_MAX_MD_SIZE);
    282                 memcpy(s->s3->previous_client_finished,
    283                     s->s3->tmp.peer_finish_md, i);
    284                 s->s3->previous_client_finished_len=i;
    285                 }
    286         else
    287                 {
    288                 assert(i <= EVP_MAX_MD_SIZE);
    289                 memcpy(s->s3->previous_server_finished,
    290                     s->s3->tmp.peer_finish_md, i);
    291                 s->s3->previous_server_finished_len=i;
    292                 }
    293 
    294 	return(1);
    295 f_err:
    296 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
    297 	return(0);
    298 	}
    299 
    300 /* for these 2 messages, we need to
    301  * ssl->enc_read_ctx			re-init
    302  * ssl->s3->read_sequence		zero
    303  * ssl->s3->read_mac_secret		re-init
    304  * ssl->session->read_sym_enc		assign
    305  * ssl->session->read_compression	assign
    306  * ssl->session->read_hash		assign
    307  */
    308 int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
    309 	{
    310 	unsigned char *p;
    311 
    312 	if (s->state == a)
    313 		{
    314 		p=(unsigned char *)s->init_buf->data;
    315 		*p=SSL3_MT_CCS;
    316 		s->init_num=1;
    317 		s->init_off=0;
    318 
    319 		s->state=b;
    320 		}
    321 
    322 	/* SSL3_ST_CW_CHANGE_B */
    323 	return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
    324 	}
    325 
    326 unsigned long ssl3_output_cert_chain(SSL *s, CERT_PKEY *cpk)
    327 	{
    328 	unsigned char *p;
    329 	unsigned long l = 3 + SSL_HM_HEADER_LENGTH(s);
    330 
    331 	if (!ssl_add_cert_chain(s, cpk, &l))
    332 		return 0;
    333 
    334 	l -= 3 + SSL_HM_HEADER_LENGTH(s);
    335 	p = ssl_handshake_start(s);
    336 	l2n3(l,p);
    337 	l += 3;
    338 	ssl_set_handshake_header(s, SSL3_MT_CERTIFICATE, l);
    339 	return l + SSL_HM_HEADER_LENGTH(s);
    340 	}
    341 
    342 /* Obtain handshake message of message type 'mt' (any if mt == -1),
    343  * maximum acceptable body length 'max'.
    344  * The first four bytes (msg_type and length) are read in state 'st1',
    345  * the body is read in state 'stn'.
    346  */
    347 long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int hash_message, int *ok)
    348 	{
    349 	unsigned char *p;
    350 	unsigned long l;
    351 	long n;
    352 	int i,al;
    353 
    354 	if (s->s3->tmp.reuse_message)
    355 		{
    356 		/* A SSL_GET_MESSAGE_DONT_HASH_MESSAGE call cannot be combined
    357 		 * with reuse_message; the SSL_GET_MESSAGE_DONT_HASH_MESSAGE
    358 		 * would have to have been applied to the previous call. */
    359 		assert(hash_message != SSL_GET_MESSAGE_DONT_HASH_MESSAGE);
    360 		s->s3->tmp.reuse_message=0;
    361 		if ((mt >= 0) && (s->s3->tmp.message_type != mt))
    362 			{
    363 			al=SSL_AD_UNEXPECTED_MESSAGE;
    364 			OPENSSL_PUT_ERROR(SSL, ssl3_get_message, SSL_R_UNEXPECTED_MESSAGE);
    365 			goto f_err;
    366 			}
    367 		*ok=1;
    368 		s->init_msg = (uint8_t*)s->init_buf->data + 4;
    369 		s->init_num = (int)s->s3->tmp.message_size;
    370 		return s->init_num;
    371 		}
    372 
    373 	p=(unsigned char *)s->init_buf->data;
    374 
    375 	if (s->state == st1) /* s->init_num < 4 */
    376 		{
    377 		int skip_message;
    378 
    379 		do
    380 			{
    381 			while (s->init_num < 4)
    382 				{
    383 				i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,
    384 					&p[s->init_num],4 - s->init_num, 0);
    385 				if (i <= 0)
    386 					{
    387 					s->rwstate=SSL_READING;
    388 					*ok = 0;
    389 					return i;
    390 					}
    391 				s->init_num+=i;
    392 				}
    393 
    394 			skip_message = 0;
    395 			if (!s->server)
    396 				if (p[0] == SSL3_MT_HELLO_REQUEST)
    397 					/* The server may always send 'Hello Request' messages --
    398 					 * we are doing a handshake anyway now, so ignore them
    399 					 * if their format is correct. Does not count for
    400 					 * 'Finished' MAC. */
    401 					if (p[1] == 0 && p[2] == 0 &&p[3] == 0)
    402 						{
    403 						s->init_num = 0;
    404 						skip_message = 1;
    405 
    406 						if (s->msg_callback)
    407 							s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg);
    408 						}
    409 			}
    410 		while (skip_message);
    411 
    412 		/* s->init_num == 4 */
    413 
    414 		if ((mt >= 0) && (*p != mt))
    415 			{
    416 			al=SSL_AD_UNEXPECTED_MESSAGE;
    417 			OPENSSL_PUT_ERROR(SSL, ssl3_get_message, SSL_R_UNEXPECTED_MESSAGE);
    418 			goto f_err;
    419 			}
    420 		if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
    421 					(st1 == SSL3_ST_SR_CERT_A) &&
    422 					(stn == SSL3_ST_SR_CERT_B))
    423 			{
    424 			/* At this point we have got an MS SGC second client
    425 			 * hello (maybe we should always allow the client to
    426 			 * start a new handshake?). We need to restart the mac.
    427 			 * Don't increment {num,total}_renegotiations because
    428 			 * we have not completed the handshake. */
    429 			ssl3_init_finished_mac(s);
    430 			}
    431 
    432 		s->s3->tmp.message_type= *(p++);
    433 
    434 		n2l3(p,l);
    435 		if (l > (unsigned long)max)
    436 			{
    437 			al=SSL_AD_ILLEGAL_PARAMETER;
    438 			OPENSSL_PUT_ERROR(SSL, ssl3_get_message, SSL_R_EXCESSIVE_MESSAGE_SIZE);
    439 			goto f_err;
    440 			}
    441 		if (l > (INT_MAX-4)) /* BUF_MEM_grow takes an 'int' parameter */
    442 			{
    443 			al=SSL_AD_ILLEGAL_PARAMETER;
    444 			OPENSSL_PUT_ERROR(SSL, ssl3_get_message, SSL_R_EXCESSIVE_MESSAGE_SIZE);
    445 			goto f_err;
    446 			}
    447 		if (l && !BUF_MEM_grow_clean(s->init_buf,(int)l+4))
    448 			{
    449 			OPENSSL_PUT_ERROR(SSL, ssl3_get_message, ERR_R_BUF_LIB);
    450 			goto err;
    451 			}
    452 		s->s3->tmp.message_size=l;
    453 		s->state=stn;
    454 
    455 		s->init_msg = (uint8_t*)s->init_buf->data + 4;
    456 		s->init_num = 0;
    457 		}
    458 
    459 	/* next state (stn) */
    460 	p = s->init_msg;
    461 	n = s->s3->tmp.message_size - s->init_num;
    462 	while (n > 0)
    463 		{
    464 		i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0);
    465 		if (i <= 0)
    466 			{
    467 			s->rwstate=SSL_READING;
    468 			*ok = 0;
    469 			return i;
    470 			}
    471 		s->init_num += i;
    472 		n -= i;
    473 		}
    474 
    475 	/* Feed this message into MAC computation. */
    476 	if (hash_message != SSL_GET_MESSAGE_DONT_HASH_MESSAGE)
    477 		ssl3_hash_current_message(s);
    478 	if (s->msg_callback)
    479 		s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg);
    480 	*ok=1;
    481 	return s->init_num;
    482 f_err:
    483 	ssl3_send_alert(s,SSL3_AL_FATAL,al);
    484 err:
    485 	*ok=0;
    486 	return(-1);
    487 	}
    488 
    489 void ssl3_hash_current_message(SSL *s)
    490 	{
    491 	/* The handshake header (different size between DTLS and TLS) is included in the hash. */
    492 	size_t header_len = s->init_msg - (uint8_t *)s->init_buf->data;
    493 	ssl3_finish_mac(s, (uint8_t *)s->init_buf->data, s->init_num + header_len);
    494 	}
    495 
    496 /* ssl3_cert_verify_hash is documented as needing EVP_MAX_MD_SIZE because that
    497  * is sufficient pre-TLS1.2 as well. */
    498 OPENSSL_COMPILE_ASSERT(EVP_MAX_MD_SIZE > MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
    499 	combined_tls_hash_fits_in_max);
    500 
    501 int ssl3_cert_verify_hash(SSL *s, uint8_t *out, size_t *out_len, const EVP_MD **out_md, EVP_PKEY *pkey)
    502 	{
    503 	/* For TLS v1.2 send signature algorithm and signature using
    504 	 * agreed digest and cached handshake records. Otherwise, use
    505 	 * SHA1 or MD5 + SHA1 depending on key type.  */
    506 	if (SSL_USE_SIGALGS(s))
    507 		{
    508 		const uint8_t *hdata;
    509 		size_t hdatalen;
    510 		EVP_MD_CTX mctx;
    511 		unsigned len;
    512 
    513 		if (!BIO_mem_contents(s->s3->handshake_buffer, &hdata, &hdatalen))
    514 			{
    515 			OPENSSL_PUT_ERROR(SSL, ssl3_cert_verify_hash, ERR_R_INTERNAL_ERROR);
    516 			return 0;
    517 			}
    518 		EVP_MD_CTX_init(&mctx);
    519 		if (!EVP_DigestInit_ex(&mctx, *out_md, NULL)
    520 			|| !EVP_DigestUpdate(&mctx, hdata, hdatalen)
    521 			|| !EVP_DigestFinal(&mctx, out, &len))
    522 			{
    523 			OPENSSL_PUT_ERROR(SSL, ssl3_cert_verify_hash, ERR_R_EVP_LIB);
    524 			EVP_MD_CTX_cleanup(&mctx);
    525 			return 0;
    526 			}
    527 		*out_len = len;
    528 		}
    529 	else if (pkey->type == EVP_PKEY_RSA)
    530 		{
    531 		if (s->method->ssl3_enc->cert_verify_mac(s, NID_md5, out) == 0 ||
    532 			s->method->ssl3_enc->cert_verify_mac(s,
    533 				NID_sha1, out + MD5_DIGEST_LENGTH) == 0)
    534 			return 0;
    535 		*out_len = MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH;
    536 		/* Using a NULL signature MD makes EVP_PKEY_sign perform
    537 		 * a raw RSA signature, rather than wrapping in a
    538 		 * DigestInfo. */
    539 		*out_md = NULL;
    540 		}
    541 	else if (pkey->type == EVP_PKEY_EC)
    542 		{
    543 		if (s->method->ssl3_enc->cert_verify_mac(s, NID_sha1, out) == 0)
    544 			return 0;
    545 		*out_len = SHA_DIGEST_LENGTH;
    546 		*out_md = EVP_sha1();
    547 		}
    548 	else
    549 		{
    550 		OPENSSL_PUT_ERROR(SSL, ssl3_cert_verify_hash, ERR_R_INTERNAL_ERROR);
    551 		return 0;
    552 		}
    553 	return 1;
    554 	}
    555 
    556 int ssl_cert_type(X509 *x, EVP_PKEY *pkey)
    557 	{
    558 	EVP_PKEY *pk;
    559 	int ret= -1,i;
    560 
    561 	if (pkey == NULL)
    562 		pk=X509_get_pubkey(x);
    563 	else
    564 		pk=pkey;
    565 	if (pk == NULL) goto err;
    566 
    567 	i=pk->type;
    568 	if (i == EVP_PKEY_RSA)
    569 		{
    570 		ret=SSL_PKEY_RSA_ENC;
    571 		}
    572 	else if (i == EVP_PKEY_EC)
    573 		{
    574 		ret = SSL_PKEY_ECC;
    575 		}
    576 
    577 err:
    578 	if(!pkey) EVP_PKEY_free(pk);
    579 	return(ret);
    580 	}
    581 
    582 int ssl_verify_alarm_type(long type)
    583 	{
    584 	int al;
    585 
    586 	switch(type)
    587 		{
    588 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
    589 	case X509_V_ERR_UNABLE_TO_GET_CRL:
    590 	case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
    591 		al=SSL_AD_UNKNOWN_CA;
    592 		break;
    593 	case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
    594 	case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
    595 	case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
    596 	case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
    597 	case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
    598 	case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
    599 	case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
    600 	case X509_V_ERR_CERT_NOT_YET_VALID:
    601 	case X509_V_ERR_CRL_NOT_YET_VALID:
    602 	case X509_V_ERR_CERT_UNTRUSTED:
    603 	case X509_V_ERR_CERT_REJECTED:
    604 		al=SSL_AD_BAD_CERTIFICATE;
    605 		break;
    606 	case X509_V_ERR_CERT_SIGNATURE_FAILURE:
    607 	case X509_V_ERR_CRL_SIGNATURE_FAILURE:
    608 		al=SSL_AD_DECRYPT_ERROR;
    609 		break;
    610 	case X509_V_ERR_CERT_HAS_EXPIRED:
    611 	case X509_V_ERR_CRL_HAS_EXPIRED:
    612 		al=SSL_AD_CERTIFICATE_EXPIRED;
    613 		break;
    614 	case X509_V_ERR_CERT_REVOKED:
    615 		al=SSL_AD_CERTIFICATE_REVOKED;
    616 		break;
    617 	case X509_V_ERR_OUT_OF_MEM:
    618 		al=SSL_AD_INTERNAL_ERROR;
    619 		break;
    620 	case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
    621 	case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
    622 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
    623 	case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
    624 	case X509_V_ERR_CERT_CHAIN_TOO_LONG:
    625 	case X509_V_ERR_PATH_LENGTH_EXCEEDED:
    626 	case X509_V_ERR_INVALID_CA:
    627 		al=SSL_AD_UNKNOWN_CA;
    628 		break;
    629 	case X509_V_ERR_APPLICATION_VERIFICATION:
    630 		al=SSL_AD_HANDSHAKE_FAILURE;
    631 		break;
    632 	case X509_V_ERR_INVALID_PURPOSE:
    633 		al=SSL_AD_UNSUPPORTED_CERTIFICATE;
    634 		break;
    635 	default:
    636 		al=SSL_AD_CERTIFICATE_UNKNOWN;
    637 		break;
    638 		}
    639 	return(al);
    640 	}
    641 
    642 int ssl3_setup_read_buffer(SSL *s)
    643 	{
    644 	unsigned char *p;
    645 	size_t len,align=0,headerlen;
    646 
    647 	if (SSL_IS_DTLS(s))
    648 		headerlen = DTLS1_RT_HEADER_LENGTH;
    649 	else
    650 		headerlen = SSL3_RT_HEADER_LENGTH;
    651 
    652 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
    653 	align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1);
    654 #endif
    655 
    656 	if (s->s3->rbuf.buf == NULL)
    657 		{
    658 		len = SSL3_RT_MAX_PLAIN_LENGTH
    659 			+ SSL3_RT_MAX_ENCRYPTED_OVERHEAD
    660 			+ headerlen + align;
    661 		if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
    662 			{
    663 			s->s3->init_extra = 1;
    664 			len += SSL3_RT_MAX_EXTRA;
    665 			}
    666 		if ((p=OPENSSL_malloc(len)) == NULL)
    667 			goto err;
    668 		s->s3->rbuf.buf = p;
    669 		s->s3->rbuf.len = len;
    670 		}
    671 
    672 	s->packet= &(s->s3->rbuf.buf[0]);
    673 	return 1;
    674 
    675 err:
    676 	OPENSSL_PUT_ERROR(SSL, ssl3_setup_read_buffer, ERR_R_MALLOC_FAILURE);
    677 	return 0;
    678 	}
    679 
    680 int ssl3_setup_write_buffer(SSL *s)
    681 	{
    682 	unsigned char *p;
    683 	size_t len,align=0,headerlen;
    684 
    685 	if (SSL_IS_DTLS(s))
    686 		headerlen = DTLS1_RT_HEADER_LENGTH + 1;
    687 	else
    688 		headerlen = SSL3_RT_HEADER_LENGTH;
    689 
    690 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
    691 	align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1);
    692 #endif
    693 
    694 	if (s->s3->wbuf.buf == NULL)
    695 		{
    696 		len = s->max_send_fragment
    697 			+ SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
    698 			+ headerlen + align;
    699 		/* Account for 1/n-1 record splitting. */
    700 		if (s->mode & SSL_MODE_CBC_RECORD_SPLITTING)
    701 			len += headerlen + align + 1
    702 				+ SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD;
    703 
    704 		if ((p=OPENSSL_malloc(len)) == NULL)
    705 			goto err;
    706 		s->s3->wbuf.buf = p;
    707 		s->s3->wbuf.len = len;
    708 		}
    709 
    710 	return 1;
    711 
    712 err:
    713 	OPENSSL_PUT_ERROR(SSL, ssl3_setup_write_buffer, ERR_R_MALLOC_FAILURE);
    714 	return 0;
    715 	}
    716 
    717 
    718 int ssl3_setup_buffers(SSL *s)
    719 	{
    720 	if (!ssl3_setup_read_buffer(s))
    721 		return 0;
    722 	if (!ssl3_setup_write_buffer(s))
    723 		return 0;
    724 	return 1;
    725 	}
    726 
    727 int ssl3_release_write_buffer(SSL *s)
    728 	{
    729 	if (s->s3->wbuf.buf != NULL)
    730 		{
    731 		OPENSSL_free(s->s3->wbuf.buf);
    732 		s->s3->wbuf.buf = NULL;
    733 		}
    734 	return 1;
    735 	}
    736 
    737 int ssl3_release_read_buffer(SSL *s)
    738 	{
    739 	if (s->s3->rbuf.buf != NULL)
    740 		{
    741 		OPENSSL_free(s->s3->rbuf.buf);
    742 		s->s3->rbuf.buf = NULL;
    743 		}
    744 	return 1;
    745 	}
    746 
    747