s3_srvr.c revision 109998
11590Srgrimes/* ssl/s3_srvr.c */
21590Srgrimes/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
31590Srgrimes * All rights reserved.
41590Srgrimes *
51590Srgrimes * This package is an SSL implementation written
61590Srgrimes * by Eric Young (eay@cryptsoft.com).
71590Srgrimes * The implementation was written so as to conform with Netscapes SSL.
81590Srgrimes *
91590Srgrimes * This library is free for commercial and non-commercial use as long as
101590Srgrimes * the following conditions are aheared to.  The following conditions
111590Srgrimes * apply to all code found in this distribution, be it the RC4, RSA,
121590Srgrimes * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
131590Srgrimes * included with this distribution is covered by the same copyright terms
141590Srgrimes * except that the holder is Tim Hudson (tjh@cryptsoft.com).
151590Srgrimes *
161590Srgrimes * Copyright remains Eric Young's, and as such any Copyright notices in
171590Srgrimes * the code are not to be removed.
181590Srgrimes * If this package is used in a product, Eric Young should be given attribution
191590Srgrimes * as the author of the parts of the library used.
201590Srgrimes * This can be in the form of a textual message at program startup or
211590Srgrimes * in documentation (online or textual) provided with the package.
221590Srgrimes *
231590Srgrimes * Redistribution and use in source and binary forms, with or without
241590Srgrimes * modification, are permitted provided that the following conditions
251590Srgrimes * are met:
261590Srgrimes * 1. Redistributions of source code must retain the copyright
271590Srgrimes *    notice, this list of conditions and the following disclaimer.
281590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
291590Srgrimes *    notice, this list of conditions and the following disclaimer in the
3087693Smarkm *    documentation and/or other materials provided with the distribution.
311590Srgrimes * 3. All advertising materials mentioning features or use of this software
3287693Smarkm *    must display the following acknowledgement:
3387693Smarkm *    "This product includes cryptographic software written by
341590Srgrimes *     Eric Young (eay@cryptsoft.com)"
351590Srgrimes *    The word 'cryptographic' can be left out if the rouines from the library
361590Srgrimes *    being used are not cryptographic related :-).
371590Srgrimes * 4. If you include any Windows specific code (or a derivative thereof) from
3880381Ssheldonh *    the apps directory (application code) you must include an acknowledgement:
3980381Ssheldonh *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
401590Srgrimes *
411590Srgrimes * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
421590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
431590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
441590Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
451590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
461590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
471590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
481590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
491590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
501590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
511590Srgrimes * SUCH DAMAGE.
521590Srgrimes *
531590Srgrimes * The licence and distribution terms for any publically available version or
541590Srgrimes * derivative of this code cannot be changed.  i.e. this code cannot simply be
551590Srgrimes * copied and put under another distribution licence
561590Srgrimes * [including the GNU Public Licence.]
571590Srgrimes */
581590Srgrimes/* ====================================================================
59282950Sbapt * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
60282950Sbapt *
61282950Sbapt * Redistribution and use in source and binary forms, with or without
62282950Sbapt * modification, are permitted provided that the following conditions
63282950Sbapt * are met:
641590Srgrimes *
651590Srgrimes * 1. Redistributions of source code must retain the above copyright
661590Srgrimes *    notice, this list of conditions and the following disclaimer.
671590Srgrimes *
681590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
69282950Sbapt *    notice, this list of conditions and the following disclaimer in
70282950Sbapt *    the documentation and/or other materials provided with the
711590Srgrimes *    distribution.
721590Srgrimes *
731590Srgrimes * 3. All advertising materials mentioning features or use of this
741590Srgrimes *    software must display the following acknowledgment:
751590Srgrimes *    "This product includes software developed by the OpenSSL Project
761590Srgrimes *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
771590Srgrimes *
781590Srgrimes * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
791590Srgrimes *    endorse or promote products derived from this software without
801590Srgrimes *    prior written permission. For written permission, please contact
81282950Sbapt *    openssl-core@openssl.org.
821590Srgrimes *
831590Srgrimes * 5. Products derived from this software may not be called "OpenSSL"
841590Srgrimes *    nor may "OpenSSL" appear in their names without prior written
851590Srgrimes *    permission of the OpenSSL Project.
861590Srgrimes *
871590Srgrimes * 6. Redistributions of any form whatsoever must retain the following
881590Srgrimes *    acknowledgment:
891590Srgrimes *    "This product includes software developed by the OpenSSL Project
901590Srgrimes *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
911590Srgrimes *
921590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
931590Srgrimes * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
941590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
951590Srgrimes * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
961590Srgrimes * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
971590Srgrimes * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
981590Srgrimes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
991590Srgrimes * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1001590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
1011590Srgrimes * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1021590Srgrimes * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
1031590Srgrimes * OF THE POSSIBILITY OF SUCH DAMAGE.
10480381Ssheldonh * ====================================================================
1051590Srgrimes *
1061590Srgrimes * This product includes cryptographic software written by Eric Young
1071590Srgrimes * (eay@cryptsoft.com).  This product includes software written by Tim
1081590Srgrimes * Hudson (tjh@cryptsoft.com).
1091590Srgrimes *
1101590Srgrimes */
1111590Srgrimes
1121590Srgrimes#define REUSE_CIPHER_BUG
1131590Srgrimes#define NETSCAPE_HANG_BUG
1141590Srgrimes
1151590Srgrimes
1161590Srgrimes#include <stdio.h>
1171590Srgrimes#include "ssl_locl.h"
1181590Srgrimes#include "kssl_lcl.h"
1191590Srgrimes#include <openssl/buffer.h>
1201590Srgrimes#include <openssl/rand.h>
1211590Srgrimes#include <openssl/objects.h>
1221590Srgrimes#include <openssl/evp.h>
1231590Srgrimes#include <openssl/x509.h>
1241590Srgrimes#include <openssl/krb5_asn.h>
1251590Srgrimes#include <openssl/md5.h>
1261590Srgrimes#include "cryptlib.h"
1271590Srgrimes
128282950Sbaptstatic SSL_METHOD *ssl3_get_server_method(int ver);
129282950Sbaptstatic int ssl3_get_client_hello(SSL *s);
1301590Srgrimesstatic int ssl3_check_client_hello(SSL *s);
1311590Srgrimesstatic int ssl3_send_server_hello(SSL *s);
1321590Srgrimesstatic int ssl3_send_server_key_exchange(SSL *s);
1331590Srgrimesstatic int ssl3_send_certificate_request(SSL *s);
1341590Srgrimesstatic int ssl3_send_server_done(SSL *s);
1351590Srgrimesstatic int ssl3_get_client_key_exchange(SSL *s);
1361590Srgrimesstatic int ssl3_get_client_certificate(SSL *s);
1371590Srgrimesstatic int ssl3_get_cert_verify(SSL *s);
1381590Srgrimesstatic int ssl3_send_hello_request(SSL *s);
1391590Srgrimes
14080381Ssheldonhstatic SSL_METHOD *ssl3_get_server_method(int ver)
1411590Srgrimes	{
1421590Srgrimes	if (ver == SSL3_VERSION)
1431590Srgrimes		return(SSLv3_server_method());
1441590Srgrimes	else
1451590Srgrimes		return(NULL);
1461590Srgrimes	}
147282950Sbapt
1481590SrgrimesSSL_METHOD *SSLv3_server_method(void)
1491590Srgrimes	{
1501590Srgrimes	static int init=1;
1511590Srgrimes	static SSL_METHOD SSLv3_server_data;
1521590Srgrimes
15380381Ssheldonh	if (init)
1541590Srgrimes		{
1551590Srgrimes		CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);
1561590Srgrimes
1571590Srgrimes		if (init)
1581590Srgrimes			{
1591590Srgrimes			memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(),
1601590Srgrimes				sizeof(SSL_METHOD));
1611590Srgrimes			SSLv3_server_data.ssl_accept=ssl3_accept;
16280381Ssheldonh			SSLv3_server_data.get_ssl_method=ssl3_get_server_method;
1631590Srgrimes			init=0;
1641590Srgrimes			}
165282950Sbapt
1661590Srgrimes		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
1671590Srgrimes		}
1681590Srgrimes	return(&SSLv3_server_data);
1691590Srgrimes	}
1701590Srgrimes
1711590Srgrimesint ssl3_accept(SSL *s)
1721590Srgrimes	{
1731590Srgrimes	BUF_MEM *buf;
1741590Srgrimes	unsigned long l,Time=time(NULL);
1751590Srgrimes	void (*cb)(const SSL *ssl,int type,int val)=NULL;
176282950Sbapt	long num1;
177282950Sbapt	int ret= -1;
1781590Srgrimes	int new_state,state,skip=0;
1791590Srgrimes
1801590Srgrimes	RAND_add(&Time,sizeof(Time),0);
1811590Srgrimes	ERR_clear_error();
1821590Srgrimes	clear_sys_error();
1831590Srgrimes
1841590Srgrimes	if (s->info_callback != NULL)
1851590Srgrimes		cb=s->info_callback;
1861590Srgrimes	else if (s->ctx->info_callback != NULL)
1871590Srgrimes		cb=s->ctx->info_callback;
1881590Srgrimes
1891590Srgrimes	/* init things to blank */
1901590Srgrimes	s->in_handshake++;
1911590Srgrimes	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
1921590Srgrimes
1931590Srgrimes	if (s->cert == NULL)
1941590Srgrimes		{
1951590Srgrimes		SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
1961590Srgrimes		return(-1);
1971590Srgrimes		}
1981590Srgrimes
1991590Srgrimes	for (;;)
2001590Srgrimes		{
2011590Srgrimes		state=s->state;
2021590Srgrimes
203282950Sbapt		switch (s->state)
2041590Srgrimes			{
2051590Srgrimes		case SSL_ST_RENEGOTIATE:
2061590Srgrimes			s->new_session=1;
2071590Srgrimes			/* s->state=SSL_ST_ACCEPT; */
2081590Srgrimes
2091590Srgrimes		case SSL_ST_BEFORE:
2101590Srgrimes		case SSL_ST_ACCEPT:
2111590Srgrimes		case SSL_ST_BEFORE|SSL_ST_ACCEPT:
2121590Srgrimes		case SSL_ST_OK|SSL_ST_ACCEPT:
2131590Srgrimes
2141590Srgrimes			s->server=1;
2151590Srgrimes			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
2161590Srgrimes
2171590Srgrimes			if ((s->version>>8) != 3)
2181590Srgrimes				{
2191590Srgrimes				SSLerr(SSL_F_SSL3_ACCEPT, ERR_R_INTERNAL_ERROR);
2201590Srgrimes				return -1;
221282950Sbapt				}
222282950Sbapt			s->type=SSL_ST_ACCEPT;
2231590Srgrimes
2241590Srgrimes			if (s->init_buf == NULL)
2251590Srgrimes				{
2261590Srgrimes				if ((buf=BUF_MEM_new()) == NULL)
2271590Srgrimes					{
2281590Srgrimes					ret= -1;
2291590Srgrimes					goto end;
2301590Srgrimes					}
2311590Srgrimes				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
2321590Srgrimes					{
2331590Srgrimes					ret= -1;
2341590Srgrimes					goto end;
2351590Srgrimes					}
2361590Srgrimes				s->init_buf=buf;
2371590Srgrimes				}
2381590Srgrimes
2391590Srgrimes			if (!ssl3_setup_buffers(s))
2401590Srgrimes				{
2411590Srgrimes				ret= -1;
2421590Srgrimes				goto end;
2431590Srgrimes				}
2441590Srgrimes
2451590Srgrimes			s->init_num=0;
2461590Srgrimes
2471590Srgrimes			if (s->state != SSL_ST_RENEGOTIATE)
2481590Srgrimes				{
2491590Srgrimes				/* Ok, we now need to push on a buffering BIO so that
2501590Srgrimes				 * the output is sent in a way that TCP likes :-)
2511590Srgrimes				 */
2521590Srgrimes				if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
2531590Srgrimes
254282950Sbapt				ssl3_init_finished_mac(s);
255282950Sbapt				s->state=SSL3_ST_SR_CLNT_HELLO_A;
2561590Srgrimes				s->ctx->stats.sess_accept++;
2571590Srgrimes				}
2581590Srgrimes			else
2591590Srgrimes				{
2601590Srgrimes				/* s->state == SSL_ST_RENEGOTIATE,
2611590Srgrimes				 * we will just send a HelloRequest */
2621590Srgrimes				s->ctx->stats.sess_accept_renegotiate++;
2631590Srgrimes				s->state=SSL3_ST_SW_HELLO_REQ_A;
2641590Srgrimes				}
2651590Srgrimes			break;
2661590Srgrimes
2671590Srgrimes		case SSL3_ST_SW_HELLO_REQ_A:
2681590Srgrimes		case SSL3_ST_SW_HELLO_REQ_B:
2691590Srgrimes
2701590Srgrimes			s->shutdown=0;
2711590Srgrimes			ret=ssl3_send_hello_request(s);
2721590Srgrimes			if (ret <= 0) goto end;
2731590Srgrimes			s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
2741590Srgrimes			s->state=SSL3_ST_SW_FLUSH;
2751590Srgrimes			s->init_num=0;
2761590Srgrimes
2771590Srgrimes			ssl3_init_finished_mac(s);
2781590Srgrimes			break;
2791590Srgrimes
2801590Srgrimes		case SSL3_ST_SW_HELLO_REQ_C:
281282950Sbapt			s->state=SSL_ST_OK;
2821590Srgrimes			break;
2831590Srgrimes
2841590Srgrimes		case SSL3_ST_SR_CLNT_HELLO_A:
2851590Srgrimes		case SSL3_ST_SR_CLNT_HELLO_B:
2861590Srgrimes		case SSL3_ST_SR_CLNT_HELLO_C:
2871590Srgrimes
2881590Srgrimes			s->shutdown=0;
2891590Srgrimes			ret=ssl3_get_client_hello(s);
2901590Srgrimes			if (ret <= 0) goto end;
2911590Srgrimes			s->new_session = 2;
2921590Srgrimes			s->state=SSL3_ST_SW_SRVR_HELLO_A;
2931590Srgrimes			s->init_num=0;
2941590Srgrimes			break;
2951590Srgrimes
2961590Srgrimes		case SSL3_ST_SW_SRVR_HELLO_A:
2971590Srgrimes		case SSL3_ST_SW_SRVR_HELLO_B:
2981590Srgrimes			ret=ssl3_send_server_hello(s);
2991590Srgrimes			if (ret <= 0) goto end;
3001590Srgrimes
3011590Srgrimes			if (s->hit)
3021590Srgrimes				s->state=SSL3_ST_SW_CHANGE_A;
3031590Srgrimes			else
3041590Srgrimes				s->state=SSL3_ST_SW_CERT_A;
305282950Sbapt			s->init_num=0;
3061590Srgrimes			break;
3071590Srgrimes
3081590Srgrimes		case SSL3_ST_SW_CERT_A:
3091590Srgrimes		case SSL3_ST_SW_CERT_B:
3101590Srgrimes			/* Check if it is anon DH */
3111590Srgrimes			if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
3121590Srgrimes				{
3131590Srgrimes				ret=ssl3_send_server_certificate(s);
3141590Srgrimes				if (ret <= 0) goto end;
3151590Srgrimes				}
3161590Srgrimes			else
3171590Srgrimes				skip=1;
3181590Srgrimes			s->state=SSL3_ST_SW_KEY_EXCH_A;
3191590Srgrimes			s->init_num=0;
3201590Srgrimes			break;
321
322		case SSL3_ST_SW_KEY_EXCH_A:
323		case SSL3_ST_SW_KEY_EXCH_B:
324			l=s->s3->tmp.new_cipher->algorithms;
325
326			/* clear this, it may get reset by
327			 * send_server_key_exchange */
328			if ((s->options & SSL_OP_EPHEMERAL_RSA)
329#ifndef OPENSSL_NO_KRB5
330				&& !(l & SSL_KRB5)
331#endif /* OPENSSL_NO_KRB5 */
332				)
333				/* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
334				 * even when forbidden by protocol specs
335				 * (handshake may fail as clients are not required to
336				 * be able to handle this) */
337				s->s3->tmp.use_rsa_tmp=1;
338			else
339				s->s3->tmp.use_rsa_tmp=0;
340
341			/* only send if a DH key exchange, fortezza or
342			 * RSA but we have a sign only certificate */
343			if (s->s3->tmp.use_rsa_tmp
344			    || (l & (SSL_DH|SSL_kFZA))
345			    || ((l & SSL_kRSA)
346				&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
347				    || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
348					&& EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
349					)
350				    )
351				)
352			    )
353				{
354				ret=ssl3_send_server_key_exchange(s);
355				if (ret <= 0) goto end;
356				}
357			else
358				skip=1;
359
360			s->state=SSL3_ST_SW_CERT_REQ_A;
361			s->init_num=0;
362			break;
363
364		case SSL3_ST_SW_CERT_REQ_A:
365		case SSL3_ST_SW_CERT_REQ_B:
366			if (/* don't request cert unless asked for it: */
367				!(s->verify_mode & SSL_VERIFY_PEER) ||
368				/* if SSL_VERIFY_CLIENT_ONCE is set,
369				 * don't request cert during re-negotiation: */
370				((s->session->peer != NULL) &&
371				 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
372				/* never request cert in anonymous ciphersuites
373				 * (see section "Certificate request" in SSL 3 drafts
374				 * and in RFC 2246): */
375				((s->s3->tmp.new_cipher->algorithms & SSL_aNULL) &&
376				 /* ... except when the application insists on verification
377				  * (against the specs, but s3_clnt.c accepts this for SSL 3) */
378				 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
379                                 /* never request cert in Kerberos ciphersuites */
380                                (s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
381				{
382				/* no cert request */
383				skip=1;
384				s->s3->tmp.cert_request=0;
385				s->state=SSL3_ST_SW_SRVR_DONE_A;
386				}
387			else
388				{
389				s->s3->tmp.cert_request=1;
390				ret=ssl3_send_certificate_request(s);
391				if (ret <= 0) goto end;
392#ifndef NETSCAPE_HANG_BUG
393				s->state=SSL3_ST_SW_SRVR_DONE_A;
394#else
395				s->state=SSL3_ST_SW_FLUSH;
396				s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
397#endif
398				s->init_num=0;
399				}
400			break;
401
402		case SSL3_ST_SW_SRVR_DONE_A:
403		case SSL3_ST_SW_SRVR_DONE_B:
404			ret=ssl3_send_server_done(s);
405			if (ret <= 0) goto end;
406			s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
407			s->state=SSL3_ST_SW_FLUSH;
408			s->init_num=0;
409			break;
410
411		case SSL3_ST_SW_FLUSH:
412			/* number of bytes to be flushed */
413			num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
414			if (num1 > 0)
415				{
416				s->rwstate=SSL_WRITING;
417				num1=BIO_flush(s->wbio);
418				if (num1 <= 0) { ret= -1; goto end; }
419				s->rwstate=SSL_NOTHING;
420				}
421
422			s->state=s->s3->tmp.next_state;
423			break;
424
425		case SSL3_ST_SR_CERT_A:
426		case SSL3_ST_SR_CERT_B:
427			/* Check for second client hello (MS SGC) */
428			ret = ssl3_check_client_hello(s);
429			if (ret <= 0)
430				goto end;
431			if (ret == 2)
432				s->state = SSL3_ST_SR_CLNT_HELLO_C;
433			else {
434				/* could be sent for a DH cert, even if we
435				 * have not asked for it :-) */
436				ret=ssl3_get_client_certificate(s);
437				if (ret <= 0) goto end;
438				s->init_num=0;
439				s->state=SSL3_ST_SR_KEY_EXCH_A;
440			}
441			break;
442
443		case SSL3_ST_SR_KEY_EXCH_A:
444		case SSL3_ST_SR_KEY_EXCH_B:
445			ret=ssl3_get_client_key_exchange(s);
446			if (ret <= 0) goto end;
447			s->state=SSL3_ST_SR_CERT_VRFY_A;
448			s->init_num=0;
449
450			/* We need to get hashes here so if there is
451			 * a client cert, it can be verified */
452			s->method->ssl3_enc->cert_verify_mac(s,
453				&(s->s3->finish_dgst1),
454				&(s->s3->tmp.cert_verify_md[0]));
455			s->method->ssl3_enc->cert_verify_mac(s,
456				&(s->s3->finish_dgst2),
457				&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
458
459			break;
460
461		case SSL3_ST_SR_CERT_VRFY_A:
462		case SSL3_ST_SR_CERT_VRFY_B:
463
464			/* we should decide if we expected this one */
465			ret=ssl3_get_cert_verify(s);
466			if (ret <= 0) goto end;
467
468			s->state=SSL3_ST_SR_FINISHED_A;
469			s->init_num=0;
470			break;
471
472		case SSL3_ST_SR_FINISHED_A:
473		case SSL3_ST_SR_FINISHED_B:
474			ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
475				SSL3_ST_SR_FINISHED_B);
476			if (ret <= 0) goto end;
477			if (s->hit)
478				s->state=SSL_ST_OK;
479			else
480				s->state=SSL3_ST_SW_CHANGE_A;
481			s->init_num=0;
482			break;
483
484		case SSL3_ST_SW_CHANGE_A:
485		case SSL3_ST_SW_CHANGE_B:
486
487			s->session->cipher=s->s3->tmp.new_cipher;
488			if (!s->method->ssl3_enc->setup_key_block(s))
489				{ ret= -1; goto end; }
490
491			ret=ssl3_send_change_cipher_spec(s,
492				SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
493
494			if (ret <= 0) goto end;
495			s->state=SSL3_ST_SW_FINISHED_A;
496			s->init_num=0;
497
498			if (!s->method->ssl3_enc->change_cipher_state(s,
499				SSL3_CHANGE_CIPHER_SERVER_WRITE))
500				{
501				ret= -1;
502				goto end;
503				}
504
505			break;
506
507		case SSL3_ST_SW_FINISHED_A:
508		case SSL3_ST_SW_FINISHED_B:
509			ret=ssl3_send_finished(s,
510				SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
511				s->method->ssl3_enc->server_finished_label,
512				s->method->ssl3_enc->server_finished_label_len);
513			if (ret <= 0) goto end;
514			s->state=SSL3_ST_SW_FLUSH;
515			if (s->hit)
516				s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
517			else
518				s->s3->tmp.next_state=SSL_ST_OK;
519			s->init_num=0;
520			break;
521
522		case SSL_ST_OK:
523			/* clean a few things up */
524			ssl3_cleanup_key_block(s);
525
526			BUF_MEM_free(s->init_buf);
527			s->init_buf=NULL;
528
529			/* remove buffering on output */
530			ssl_free_wbio_buffer(s);
531
532			s->init_num=0;
533
534			if (s->new_session == 2) /* skipped if we just sent a HelloRequest */
535				{
536				/* actually not necessarily a 'new' session unless
537				 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
538
539				s->new_session=0;
540
541				ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
542
543				s->ctx->stats.sess_accept_good++;
544				/* s->server=1; */
545				s->handshake_func=ssl3_accept;
546
547				if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
548				}
549
550			ret = 1;
551			goto end;
552			/* break; */
553
554		default:
555			SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_UNKNOWN_STATE);
556			ret= -1;
557			goto end;
558			/* break; */
559			}
560
561		if (!s->s3->tmp.reuse_message && !skip)
562			{
563			if (s->debug)
564				{
565				if ((ret=BIO_flush(s->wbio)) <= 0)
566					goto end;
567				}
568
569
570			if ((cb != NULL) && (s->state != state))
571				{
572				new_state=s->state;
573				s->state=state;
574				cb(s,SSL_CB_ACCEPT_LOOP,1);
575				s->state=new_state;
576				}
577			}
578		skip=0;
579		}
580end:
581	/* BIO_flush(s->wbio); */
582
583	s->in_handshake--;
584	if (cb != NULL)
585		cb(s,SSL_CB_ACCEPT_EXIT,ret);
586	return(ret);
587	}
588
589static int ssl3_send_hello_request(SSL *s)
590	{
591	unsigned char *p;
592
593	if (s->state == SSL3_ST_SW_HELLO_REQ_A)
594		{
595		p=(unsigned char *)s->init_buf->data;
596		*(p++)=SSL3_MT_HELLO_REQUEST;
597		*(p++)=0;
598		*(p++)=0;
599		*(p++)=0;
600
601		s->state=SSL3_ST_SW_HELLO_REQ_B;
602		/* number of bytes to write */
603		s->init_num=4;
604		s->init_off=0;
605		}
606
607	/* SSL3_ST_SW_HELLO_REQ_B */
608	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
609	}
610
611static int ssl3_check_client_hello(SSL *s)
612	{
613	int ok;
614	long n;
615
616	/* this function is called when we really expect a Certificate message,
617	 * so permit appropriate message length */
618	n=ssl3_get_message(s,
619		SSL3_ST_SR_CERT_A,
620		SSL3_ST_SR_CERT_B,
621		-1,
622		s->max_cert_list,
623		&ok);
624	if (!ok) return((int)n);
625	s->s3->tmp.reuse_message = 1;
626	if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO)
627		{
628		/* Throw away what we have done so far in the current handshake,
629		 * which will now be aborted. (A full SSL_clear would be too much.)
630		 * I hope that tmp.dh is the only thing that may need to be cleared
631		 * when a handshake is not completed ... */
632#ifndef OPENSSL_NO_DH
633		if (s->s3->tmp.dh != NULL)
634			{
635			DH_free(s->s3->tmp.dh);
636			s->s3->tmp.dh = NULL;
637			}
638#endif
639		return 2;
640		}
641	return 1;
642}
643
644static int ssl3_get_client_hello(SSL *s)
645	{
646	int i,j,ok,al,ret= -1;
647	long n;
648	unsigned long id;
649	unsigned char *p,*d,*q;
650	SSL_CIPHER *c;
651	SSL_COMP *comp=NULL;
652	STACK_OF(SSL_CIPHER) *ciphers=NULL;
653
654	/* We do this so that we will respond with our native type.
655	 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
656	 * This down switching should be handled by a different method.
657	 * If we are SSLv3, we will respond with SSLv3, even if prompted with
658	 * TLSv1.
659	 */
660	if (s->state == SSL3_ST_SR_CLNT_HELLO_A)
661		{
662		s->first_packet=1;
663		s->state=SSL3_ST_SR_CLNT_HELLO_B;
664		}
665	n=ssl3_get_message(s,
666		SSL3_ST_SR_CLNT_HELLO_B,
667		SSL3_ST_SR_CLNT_HELLO_C,
668		SSL3_MT_CLIENT_HELLO,
669		SSL3_RT_MAX_PLAIN_LENGTH,
670		&ok);
671
672	if (!ok) return((int)n);
673	d=p=(unsigned char *)s->init_msg;
674
675	/* use version from inside client hello, not from record header
676	 * (may differ: see RFC 2246, Appendix E, second paragraph) */
677	s->client_version=(((int)p[0])<<8)|(int)p[1];
678	p+=2;
679
680	if (s->client_version < s->version)
681		{
682		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_WRONG_VERSION_NUMBER);
683		if ((s->client_version>>8) == SSL3_VERSION_MAJOR)
684			{
685			/* similar to ssl3_get_record, send alert using remote version number */
686			s->version = s->client_version;
687			}
688		al = SSL_AD_PROTOCOL_VERSION;
689		goto f_err;
690		}
691
692	/* load the client random */
693	memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE);
694	p+=SSL3_RANDOM_SIZE;
695
696	/* get the session-id */
697	j= *(p++);
698
699	s->hit=0;
700	/* Versions before 0.9.7 always allow session reuse during renegotiation
701	 * (i.e. when s->new_session is true), option
702	 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is new with 0.9.7.
703	 * Maybe this optional behaviour should always have been the default,
704	 * but we cannot safely change the default behaviour (or new applications
705	 * might be written that become totally unsecure when compiled with
706	 * an earlier library version)
707	 */
708	if (j == 0 || (s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
709		{
710		if (!ssl_get_new_session(s,1))
711			goto err;
712		}
713	else
714		{
715		i=ssl_get_prev_session(s,p,j);
716		if (i == 1)
717			{ /* previous session */
718			s->hit=1;
719			}
720		else if (i == -1)
721			goto err;
722		else /* i == 0 */
723			{
724			if (!ssl_get_new_session(s,1))
725				goto err;
726			}
727		}
728
729	p+=j;
730	n2s(p,i);
731	if ((i == 0) && (j != 0))
732		{
733		/* we need a cipher if we are not resuming a session */
734		al=SSL_AD_ILLEGAL_PARAMETER;
735		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
736		goto f_err;
737		}
738	if ((p+i) >= (d+n))
739		{
740		/* not enough data */
741		al=SSL_AD_DECODE_ERROR;
742		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
743		goto f_err;
744		}
745	if ((i > 0) && (ssl_bytes_to_cipher_list(s,p,i,&(ciphers))
746		== NULL))
747		{
748		goto err;
749		}
750	p+=i;
751
752	/* If it is a hit, check that the cipher is in the list */
753	if ((s->hit) && (i > 0))
754		{
755		j=0;
756		id=s->session->cipher->id;
757
758#ifdef CIPHER_DEBUG
759		printf("client sent %d ciphers\n",sk_num(ciphers));
760#endif
761		for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
762			{
763			c=sk_SSL_CIPHER_value(ciphers,i);
764#ifdef CIPHER_DEBUG
765			printf("client [%2d of %2d]:%s\n",
766				i,sk_num(ciphers),SSL_CIPHER_get_name(c));
767#endif
768			if (c->id == id)
769				{
770				j=1;
771				break;
772				}
773			}
774		if (j == 0)
775			{
776			if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
777				{
778				/* Very bad for multi-threading.... */
779				s->session->cipher=sk_SSL_CIPHER_value(ciphers,
780								       0);
781				}
782			else
783				{
784				/* we need to have the cipher in the cipher
785				 * list if we are asked to reuse it */
786				al=SSL_AD_ILLEGAL_PARAMETER;
787				SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
788				goto f_err;
789				}
790			}
791		}
792
793	/* compression */
794	i= *(p++);
795	if ((p+i) > (d+n))
796		{
797		/* not enough data */
798		al=SSL_AD_DECODE_ERROR;
799		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
800		goto f_err;
801		}
802	q=p;
803	for (j=0; j<i; j++)
804		{
805		if (p[j] == 0) break;
806		}
807
808	p+=i;
809	if (j >= i)
810		{
811		/* no compress */
812		al=SSL_AD_DECODE_ERROR;
813		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_COMPRESSION_SPECIFIED);
814		goto f_err;
815		}
816
817	/* Worst case, we will use the NULL compression, but if we have other
818	 * options, we will now look for them.  We have i-1 compression
819	 * algorithms from the client, starting at q. */
820	s->s3->tmp.new_compression=NULL;
821	if (s->ctx->comp_methods != NULL)
822		{ /* See if we have a match */
823		int m,nn,o,v,done=0;
824
825		nn=sk_SSL_COMP_num(s->ctx->comp_methods);
826		for (m=0; m<nn; m++)
827			{
828			comp=sk_SSL_COMP_value(s->ctx->comp_methods,m);
829			v=comp->id;
830			for (o=0; o<i; o++)
831				{
832				if (v == q[o])
833					{
834					done=1;
835					break;
836					}
837				}
838			if (done) break;
839			}
840		if (done)
841			s->s3->tmp.new_compression=comp;
842		else
843			comp=NULL;
844		}
845
846	/* TLS does not mind if there is extra stuff */
847	if (s->version == SSL3_VERSION)
848		{
849		if (p < (d+n))
850			{
851			/* wrong number of bytes,
852			 * there could be more to follow */
853			al=SSL_AD_DECODE_ERROR;
854			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
855			goto f_err;
856			}
857		}
858
859	/* Given s->session->ciphers and SSL_get_ciphers, we must
860	 * pick a cipher */
861
862	if (!s->hit)
863		{
864		s->session->compress_meth=(comp == NULL)?0:comp->id;
865		if (s->session->ciphers != NULL)
866			sk_SSL_CIPHER_free(s->session->ciphers);
867		s->session->ciphers=ciphers;
868		if (ciphers == NULL)
869			{
870			al=SSL_AD_ILLEGAL_PARAMETER;
871			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_PASSED);
872			goto f_err;
873			}
874		ciphers=NULL;
875		c=ssl3_choose_cipher(s,s->session->ciphers,
876				     SSL_get_ciphers(s));
877
878		if (c == NULL)
879			{
880			al=SSL_AD_HANDSHAKE_FAILURE;
881			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_SHARED_CIPHER);
882			goto f_err;
883			}
884		s->s3->tmp.new_cipher=c;
885		}
886	else
887		{
888		/* Session-id reuse */
889#ifdef REUSE_CIPHER_BUG
890		STACK_OF(SSL_CIPHER) *sk;
891		SSL_CIPHER *nc=NULL;
892		SSL_CIPHER *ec=NULL;
893
894		if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG)
895			{
896			sk=s->session->ciphers;
897			for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
898				{
899				c=sk_SSL_CIPHER_value(sk,i);
900				if (c->algorithms & SSL_eNULL)
901					nc=c;
902				if (SSL_C_IS_EXPORT(c))
903					ec=c;
904				}
905			if (nc != NULL)
906				s->s3->tmp.new_cipher=nc;
907			else if (ec != NULL)
908				s->s3->tmp.new_cipher=ec;
909			else
910				s->s3->tmp.new_cipher=s->session->cipher;
911			}
912		else
913#endif
914		s->s3->tmp.new_cipher=s->session->cipher;
915		}
916
917	/* we now have the following setup.
918	 * client_random
919	 * cipher_list 		- our prefered list of ciphers
920	 * ciphers 		- the clients prefered list of ciphers
921	 * compression		- basically ignored right now
922	 * ssl version is set	- sslv3
923	 * s->session		- The ssl session has been setup.
924	 * s->hit		- session reuse flag
925	 * s->tmp.new_cipher	- the new cipher to use.
926	 */
927
928	ret=1;
929	if (0)
930		{
931f_err:
932		ssl3_send_alert(s,SSL3_AL_FATAL,al);
933		}
934err:
935	if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
936	return(ret);
937	}
938
939static int ssl3_send_server_hello(SSL *s)
940	{
941	unsigned char *buf;
942	unsigned char *p,*d;
943	int i,sl;
944	unsigned long l,Time;
945
946	if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
947		{
948		buf=(unsigned char *)s->init_buf->data;
949		p=s->s3->server_random;
950		Time=time(NULL);			/* Time */
951		l2n(Time,p);
952		RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
953		/* Do the message type and length last */
954		d=p= &(buf[4]);
955
956		*(p++)=s->version>>8;
957		*(p++)=s->version&0xff;
958
959		/* Random stuff */
960		memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
961		p+=SSL3_RANDOM_SIZE;
962
963		/* now in theory we have 3 options to sending back the
964		 * session id.  If it is a re-use, we send back the
965		 * old session-id, if it is a new session, we send
966		 * back the new session-id or we send back a 0 length
967		 * session-id if we want it to be single use.
968		 * Currently I will not implement the '0' length session-id
969		 * 12-Jan-98 - I'll now support the '0' length stuff.
970		 */
971		if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
972			s->session->session_id_length=0;
973
974		sl=s->session->session_id_length;
975		if (sl > sizeof s->session->session_id)
976			{
977			SSLerr(SSL_F_SSL3_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
978			return -1;
979			}
980		*(p++)=sl;
981		memcpy(p,s->session->session_id,sl);
982		p+=sl;
983
984		/* put the cipher */
985		i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
986		p+=i;
987
988		/* put the compression method */
989		if (s->s3->tmp.new_compression == NULL)
990			*(p++)=0;
991		else
992			*(p++)=s->s3->tmp.new_compression->id;
993
994		/* do the header */
995		l=(p-d);
996		d=buf;
997		*(d++)=SSL3_MT_SERVER_HELLO;
998		l2n3(l,d);
999
1000		s->state=SSL3_ST_CW_CLNT_HELLO_B;
1001		/* number of bytes to write */
1002		s->init_num=p-buf;
1003		s->init_off=0;
1004		}
1005
1006	/* SSL3_ST_CW_CLNT_HELLO_B */
1007	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1008	}
1009
1010static int ssl3_send_server_done(SSL *s)
1011	{
1012	unsigned char *p;
1013
1014	if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1015		{
1016		p=(unsigned char *)s->init_buf->data;
1017
1018		/* do the header */
1019		*(p++)=SSL3_MT_SERVER_DONE;
1020		*(p++)=0;
1021		*(p++)=0;
1022		*(p++)=0;
1023
1024		s->state=SSL3_ST_SW_SRVR_DONE_B;
1025		/* number of bytes to write */
1026		s->init_num=4;
1027		s->init_off=0;
1028		}
1029
1030	/* SSL3_ST_CW_CLNT_HELLO_B */
1031	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1032	}
1033
1034static int ssl3_send_server_key_exchange(SSL *s)
1035	{
1036#ifndef OPENSSL_NO_RSA
1037	unsigned char *q;
1038	int j,num;
1039	RSA *rsa;
1040	unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1041	unsigned int u;
1042#endif
1043#ifndef OPENSSL_NO_DH
1044	DH *dh=NULL,*dhp;
1045#endif
1046	EVP_PKEY *pkey;
1047	unsigned char *p,*d;
1048	int al,i;
1049	unsigned long type;
1050	int n;
1051	CERT *cert;
1052	BIGNUM *r[4];
1053	int nr[4],kn;
1054	BUF_MEM *buf;
1055	EVP_MD_CTX md_ctx;
1056
1057	EVP_MD_CTX_init(&md_ctx);
1058	if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1059		{
1060		type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
1061		cert=s->cert;
1062
1063		buf=s->init_buf;
1064
1065		r[0]=r[1]=r[2]=r[3]=NULL;
1066		n=0;
1067#ifndef OPENSSL_NO_RSA
1068		if (type & SSL_kRSA)
1069			{
1070			rsa=cert->rsa_tmp;
1071			if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
1072				{
1073				rsa=s->cert->rsa_tmp_cb(s,
1074				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1075				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1076				if(rsa == NULL)
1077				{
1078					al=SSL_AD_HANDSHAKE_FAILURE;
1079					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
1080					goto f_err;
1081				}
1082				RSA_up_ref(rsa);
1083				cert->rsa_tmp=rsa;
1084				}
1085			if (rsa == NULL)
1086				{
1087				al=SSL_AD_HANDSHAKE_FAILURE;
1088				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
1089				goto f_err;
1090				}
1091			r[0]=rsa->n;
1092			r[1]=rsa->e;
1093			s->s3->tmp.use_rsa_tmp=1;
1094			}
1095		else
1096#endif
1097#ifndef OPENSSL_NO_DH
1098			if (type & SSL_kEDH)
1099			{
1100			dhp=cert->dh_tmp;
1101			if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
1102				dhp=s->cert->dh_tmp_cb(s,
1103				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1104				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1105			if (dhp == NULL)
1106				{
1107				al=SSL_AD_HANDSHAKE_FAILURE;
1108				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1109				goto f_err;
1110				}
1111
1112			if (s->s3->tmp.dh != NULL)
1113				{
1114				DH_free(dh);
1115				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1116				goto err;
1117				}
1118
1119			if ((dh=DHparams_dup(dhp)) == NULL)
1120				{
1121				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1122				goto err;
1123				}
1124
1125			s->s3->tmp.dh=dh;
1126			if ((dhp->pub_key == NULL ||
1127			     dhp->priv_key == NULL ||
1128			     (s->options & SSL_OP_SINGLE_DH_USE)))
1129				{
1130				if(!DH_generate_key(dh))
1131				    {
1132				    SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
1133					   ERR_R_DH_LIB);
1134				    goto err;
1135				    }
1136				}
1137			else
1138				{
1139				dh->pub_key=BN_dup(dhp->pub_key);
1140				dh->priv_key=BN_dup(dhp->priv_key);
1141				if ((dh->pub_key == NULL) ||
1142					(dh->priv_key == NULL))
1143					{
1144					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1145					goto err;
1146					}
1147				}
1148			r[0]=dh->p;
1149			r[1]=dh->g;
1150			r[2]=dh->pub_key;
1151			}
1152		else
1153#endif
1154			{
1155			al=SSL_AD_HANDSHAKE_FAILURE;
1156			SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1157			goto f_err;
1158			}
1159		for (i=0; r[i] != NULL; i++)
1160			{
1161			nr[i]=BN_num_bytes(r[i]);
1162			n+=2+nr[i];
1163			}
1164
1165		if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
1166			{
1167			if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
1168				== NULL)
1169				{
1170				al=SSL_AD_DECODE_ERROR;
1171				goto f_err;
1172				}
1173			kn=EVP_PKEY_size(pkey);
1174			}
1175		else
1176			{
1177			pkey=NULL;
1178			kn=0;
1179			}
1180
1181		if (!BUF_MEM_grow_clean(buf,n+4+kn))
1182			{
1183			SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1184			goto err;
1185			}
1186		d=(unsigned char *)s->init_buf->data;
1187		p= &(d[4]);
1188
1189		for (i=0; r[i] != NULL; i++)
1190			{
1191			s2n(nr[i],p);
1192			BN_bn2bin(r[i],p);
1193			p+=nr[i];
1194			}
1195
1196		/* not anonymous */
1197		if (pkey != NULL)
1198			{
1199			/* n is the length of the params, they start at &(d[4])
1200			 * and p points to the space at the end. */
1201#ifndef OPENSSL_NO_RSA
1202			if (pkey->type == EVP_PKEY_RSA)
1203				{
1204				q=md_buf;
1205				j=0;
1206				for (num=2; num > 0; num--)
1207					{
1208					EVP_DigestInit_ex(&md_ctx,(num == 2)
1209						?s->ctx->md5:s->ctx->sha1, NULL);
1210					EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1211					EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1212					EVP_DigestUpdate(&md_ctx,&(d[4]),n);
1213					EVP_DigestFinal_ex(&md_ctx,q,
1214						(unsigned int *)&i);
1215					q+=i;
1216					j+=i;
1217					}
1218				if (RSA_sign(NID_md5_sha1, md_buf, j,
1219					&(p[2]), &u, pkey->pkey.rsa) <= 0)
1220					{
1221					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1222					goto err;
1223					}
1224				s2n(u,p);
1225				n+=u+2;
1226				}
1227			else
1228#endif
1229#if !defined(OPENSSL_NO_DSA)
1230				if (pkey->type == EVP_PKEY_DSA)
1231				{
1232				/* lets do DSS */
1233				EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
1234				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1235				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1236				EVP_SignUpdate(&md_ctx,&(d[4]),n);
1237				if (!EVP_SignFinal(&md_ctx,&(p[2]),
1238					(unsigned int *)&i,pkey))
1239					{
1240					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1241					goto err;
1242					}
1243				s2n(i,p);
1244				n+=i+2;
1245				}
1246			else
1247#endif
1248				{
1249				/* Is this error check actually needed? */
1250				al=SSL_AD_HANDSHAKE_FAILURE;
1251				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1252				goto f_err;
1253				}
1254			}
1255
1256		*(d++)=SSL3_MT_SERVER_KEY_EXCHANGE;
1257		l2n3(n,d);
1258
1259		/* we should now have things packed up, so lets send
1260		 * it off */
1261		s->init_num=n+4;
1262		s->init_off=0;
1263		}
1264
1265	s->state = SSL3_ST_SW_KEY_EXCH_B;
1266	EVP_MD_CTX_cleanup(&md_ctx);
1267	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1268f_err:
1269	ssl3_send_alert(s,SSL3_AL_FATAL,al);
1270err:
1271	EVP_MD_CTX_cleanup(&md_ctx);
1272	return(-1);
1273	}
1274
1275static int ssl3_send_certificate_request(SSL *s)
1276	{
1277	unsigned char *p,*d;
1278	int i,j,nl,off,n;
1279	STACK_OF(X509_NAME) *sk=NULL;
1280	X509_NAME *name;
1281	BUF_MEM *buf;
1282
1283	if (s->state == SSL3_ST_SW_CERT_REQ_A)
1284		{
1285		buf=s->init_buf;
1286
1287		d=p=(unsigned char *)&(buf->data[4]);
1288
1289		/* get the list of acceptable cert types */
1290		p++;
1291		n=ssl3_get_req_cert_type(s,p);
1292		d[0]=n;
1293		p+=n;
1294		n++;
1295
1296		off=n;
1297		p+=2;
1298		n+=2;
1299
1300		sk=SSL_get_client_CA_list(s);
1301		nl=0;
1302		if (sk != NULL)
1303			{
1304			for (i=0; i<sk_X509_NAME_num(sk); i++)
1305				{
1306				name=sk_X509_NAME_value(sk,i);
1307				j=i2d_X509_NAME(name,NULL);
1308				if (!BUF_MEM_grow_clean(buf,4+n+j+2))
1309					{
1310					SSLerr(SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1311					goto err;
1312					}
1313				p=(unsigned char *)&(buf->data[4+n]);
1314				if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1315					{
1316					s2n(j,p);
1317					i2d_X509_NAME(name,&p);
1318					n+=2+j;
1319					nl+=2+j;
1320					}
1321				else
1322					{
1323					d=p;
1324					i2d_X509_NAME(name,&p);
1325					j-=2; s2n(j,d); j+=2;
1326					n+=j;
1327					nl+=j;
1328					}
1329				}
1330			}
1331		/* else no CA names */
1332		p=(unsigned char *)&(buf->data[4+off]);
1333		s2n(nl,p);
1334
1335		d=(unsigned char *)buf->data;
1336		*(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1337		l2n3(n,d);
1338
1339		/* we should now have things packed up, so lets send
1340		 * it off */
1341
1342		s->init_num=n+4;
1343		s->init_off=0;
1344#ifdef NETSCAPE_HANG_BUG
1345		p=(unsigned char *)s->init_buf->data + s->init_num;
1346
1347		/* do the header */
1348		*(p++)=SSL3_MT_SERVER_DONE;
1349		*(p++)=0;
1350		*(p++)=0;
1351		*(p++)=0;
1352		s->init_num += 4;
1353#endif
1354
1355		}
1356
1357	/* SSL3_ST_SW_CERT_REQ_B */
1358	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1359err:
1360	return(-1);
1361	}
1362
1363static int ssl3_get_client_key_exchange(SSL *s)
1364	{
1365	int i,al,ok;
1366	long n;
1367	unsigned long l;
1368	unsigned char *p;
1369#ifndef OPENSSL_NO_RSA
1370	RSA *rsa=NULL;
1371	EVP_PKEY *pkey=NULL;
1372#endif
1373#ifndef OPENSSL_NO_DH
1374	BIGNUM *pub=NULL;
1375	DH *dh_srvr;
1376#endif
1377#ifndef OPENSSL_NO_KRB5
1378        KSSL_ERR kssl_err;
1379#endif /* OPENSSL_NO_KRB5 */
1380
1381	n=ssl3_get_message(s,
1382		SSL3_ST_SR_KEY_EXCH_A,
1383		SSL3_ST_SR_KEY_EXCH_B,
1384		SSL3_MT_CLIENT_KEY_EXCHANGE,
1385		2048, /* ??? */
1386		&ok);
1387
1388	if (!ok) return((int)n);
1389	p=(unsigned char *)s->init_msg;
1390
1391	l=s->s3->tmp.new_cipher->algorithms;
1392
1393#ifndef OPENSSL_NO_RSA
1394	if (l & SSL_kRSA)
1395		{
1396		/* FIX THIS UP EAY EAY EAY EAY */
1397		if (s->s3->tmp.use_rsa_tmp)
1398			{
1399			if ((s->cert != NULL) && (s->cert->rsa_tmp != NULL))
1400				rsa=s->cert->rsa_tmp;
1401			/* Don't do a callback because rsa_tmp should
1402			 * be sent already */
1403			if (rsa == NULL)
1404				{
1405				al=SSL_AD_HANDSHAKE_FAILURE;
1406				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_PKEY);
1407				goto f_err;
1408
1409				}
1410			}
1411		else
1412			{
1413			pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1414			if (	(pkey == NULL) ||
1415				(pkey->type != EVP_PKEY_RSA) ||
1416				(pkey->pkey.rsa == NULL))
1417				{
1418				al=SSL_AD_HANDSHAKE_FAILURE;
1419				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_RSA_CERTIFICATE);
1420				goto f_err;
1421				}
1422			rsa=pkey->pkey.rsa;
1423			}
1424
1425		/* TLS */
1426		if (s->version > SSL3_VERSION)
1427			{
1428			n2s(p,i);
1429			if (n != i+2)
1430				{
1431				if (!(s->options & SSL_OP_TLS_D5_BUG))
1432					{
1433					SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
1434					goto err;
1435					}
1436				else
1437					p-=2;
1438				}
1439			else
1440				n=i;
1441			}
1442
1443		i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
1444
1445		al = -1;
1446
1447		if (i != SSL_MAX_MASTER_KEY_LENGTH)
1448			{
1449			al=SSL_AD_DECODE_ERROR;
1450			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1451			}
1452
1453		if ((al == -1) && !((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
1454			{
1455			/* The premaster secret must contain the same version number as the
1456			 * ClientHello to detect version rollback attacks (strangely, the
1457			 * protocol does not offer such protection for DH ciphersuites).
1458			 * However, buggy clients exist that send the negotiated protocol
1459			 * version instead if the server does not support the requested
1460			 * protocol version.
1461			 * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such clients. */
1462			if (!((s->options & SSL_OP_TLS_ROLLBACK_BUG) &&
1463				(p[0] == (s->version>>8)) && (p[1] == (s->version & 0xff))))
1464				{
1465				al=SSL_AD_DECODE_ERROR;
1466				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1467				goto f_err;
1468				}
1469			}
1470
1471		if (al != -1)
1472			{
1473#if 0
1474			goto f_err;
1475#else
1476			/* Some decryption failure -- use random value instead as countermeasure
1477			 * against Bleichenbacher's attack on PKCS #1 v1.5 RSA padding
1478			 * (see RFC 2246, section 7.4.7.1).
1479			 * But note that due to length and protocol version checking, the
1480			 * attack is impractical anyway (see section 5 in D. Bleichenbacher:
1481			 * "Chosen Ciphertext Attacks Against Protocols Based on the RSA
1482			 * Encryption Standard PKCS #1", CRYPTO '98, LNCS 1462, pp. 1-12).
1483			 */
1484			ERR_clear_error();
1485			i = SSL_MAX_MASTER_KEY_LENGTH;
1486			p[0] = s->client_version >> 8;
1487			p[1] = s->client_version & 0xff;
1488			RAND_pseudo_bytes(p+2, i-2); /* should be RAND_bytes, but we cannot work around a failure */
1489#endif
1490			}
1491
1492		s->session->master_key_length=
1493			s->method->ssl3_enc->generate_master_secret(s,
1494				s->session->master_key,
1495				p,i);
1496		OPENSSL_cleanse(p,i);
1497		}
1498	else
1499#endif
1500#ifndef OPENSSL_NO_DH
1501		if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1502		{
1503		n2s(p,i);
1504		if (n != i+2)
1505			{
1506			if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG))
1507				{
1508				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1509				goto err;
1510				}
1511			else
1512				{
1513				p-=2;
1514				i=(int)n;
1515				}
1516			}
1517
1518		if (n == 0L) /* the parameters are in the cert */
1519			{
1520			al=SSL_AD_HANDSHAKE_FAILURE;
1521			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_DECODE_DH_CERTS);
1522			goto f_err;
1523			}
1524		else
1525			{
1526			if (s->s3->tmp.dh == NULL)
1527				{
1528				al=SSL_AD_HANDSHAKE_FAILURE;
1529				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1530				goto f_err;
1531				}
1532			else
1533				dh_srvr=s->s3->tmp.dh;
1534			}
1535
1536		pub=BN_bin2bn(p,i,NULL);
1537		if (pub == NULL)
1538			{
1539			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BN_LIB);
1540			goto err;
1541			}
1542
1543		i=DH_compute_key(p,pub,dh_srvr);
1544
1545		if (i <= 0)
1546			{
1547			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1548			goto err;
1549			}
1550
1551		DH_free(s->s3->tmp.dh);
1552		s->s3->tmp.dh=NULL;
1553
1554		BN_clear_free(pub);
1555		pub=NULL;
1556		s->session->master_key_length=
1557			s->method->ssl3_enc->generate_master_secret(s,
1558				s->session->master_key,p,i);
1559		OPENSSL_cleanse(p,i);
1560		}
1561	else
1562#endif
1563#ifndef OPENSSL_NO_KRB5
1564        if (l & SSL_kKRB5)
1565                {
1566                krb5_error_code		krb5rc;
1567		krb5_data		enc_ticket;
1568		krb5_data		authenticator;
1569		krb5_data		enc_pms;
1570                KSSL_CTX		*kssl_ctx = s->kssl_ctx;
1571		EVP_CIPHER_CTX		ciph_ctx;
1572		EVP_CIPHER		*enc = NULL;
1573		unsigned char		iv[EVP_MAX_IV_LENGTH];
1574		unsigned char		pms[SSL_MAX_MASTER_KEY_LENGTH
1575                                               + EVP_MAX_BLOCK_LENGTH];
1576		int                     padl, outl;
1577		krb5_timestamp		authtime = 0;
1578		krb5_ticket_times	ttimes;
1579
1580		EVP_CIPHER_CTX_init(&ciph_ctx);
1581
1582                if (!kssl_ctx)  kssl_ctx = kssl_ctx_new();
1583
1584		n2s(p,i);
1585		enc_ticket.length = i;
1586		enc_ticket.data = (char *)p;
1587		p+=enc_ticket.length;
1588
1589		n2s(p,i);
1590		authenticator.length = i;
1591		authenticator.data = (char *)p;
1592		p+=authenticator.length;
1593
1594		n2s(p,i);
1595		enc_pms.length = i;
1596		enc_pms.data = (char *)p;
1597		p+=enc_pms.length;
1598
1599		/* Note that the length is checked again below,
1600		** after decryption
1601		*/
1602		if(enc_pms.length > sizeof pms)
1603			{
1604			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1605			       SSL_R_DATA_LENGTH_TOO_LONG);
1606			goto err;
1607			}
1608
1609		if (n != enc_ticket.length + authenticator.length +
1610						enc_pms.length + 6)
1611			{
1612			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1613				SSL_R_DATA_LENGTH_TOO_LONG);
1614			goto err;
1615			}
1616
1617                if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes,
1618					&kssl_err)) != 0)
1619                        {
1620#ifdef KSSL_DEBUG
1621                        printf("kssl_sget_tkt rtn %d [%d]\n",
1622                                krb5rc, kssl_err.reason);
1623                        if (kssl_err.text)
1624                                printf("kssl_err text= %s\n", kssl_err.text);
1625#endif	/* KSSL_DEBUG */
1626                        SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1627                                kssl_err.reason);
1628                        goto err;
1629                        }
1630
1631		/*  Note: no authenticator is not considered an error,
1632		**  but will return authtime == 0.
1633		*/
1634		if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator,
1635					&authtime, &kssl_err)) != 0)
1636			{
1637#ifdef KSSL_DEBUG
1638                        printf("kssl_check_authent rtn %d [%d]\n",
1639                                krb5rc, kssl_err.reason);
1640                        if (kssl_err.text)
1641                                printf("kssl_err text= %s\n", kssl_err.text);
1642#endif	/* KSSL_DEBUG */
1643                        SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1644                                kssl_err.reason);
1645                        goto err;
1646			}
1647
1648		if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0)
1649			{
1650			SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, krb5rc);
1651                        goto err;
1652			}
1653
1654#ifdef KSSL_DEBUG
1655                kssl_ctx_show(kssl_ctx);
1656#endif	/* KSSL_DEBUG */
1657
1658		enc = kssl_map_enc(kssl_ctx->enctype);
1659                if (enc == NULL)
1660                    goto err;
1661
1662		memset(iv, 0, sizeof iv);	/* per RFC 1510 */
1663
1664		if (!EVP_DecryptInit_ex(&ciph_ctx,enc,NULL,kssl_ctx->key,iv))
1665			{
1666			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1667				SSL_R_DECRYPTION_FAILED);
1668			goto err;
1669			}
1670		if (!EVP_DecryptUpdate(&ciph_ctx, pms,&outl,
1671					(unsigned char *)enc_pms.data, enc_pms.length))
1672			{
1673			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1674				SSL_R_DECRYPTION_FAILED);
1675			goto err;
1676			}
1677		if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1678			{
1679			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1680				SSL_R_DATA_LENGTH_TOO_LONG);
1681			goto err;
1682			}
1683		if (!EVP_DecryptFinal_ex(&ciph_ctx,&(pms[outl]),&padl))
1684			{
1685			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1686				SSL_R_DECRYPTION_FAILED);
1687			goto err;
1688			}
1689		outl += padl;
1690		if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1691			{
1692			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1693				SSL_R_DATA_LENGTH_TOO_LONG);
1694			goto err;
1695			}
1696		EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1697
1698                s->session->master_key_length=
1699                        s->method->ssl3_enc->generate_master_secret(s,
1700                                s->session->master_key, pms, outl);
1701
1702                if (kssl_ctx->client_princ)
1703                        {
1704                        int len = strlen(kssl_ctx->client_princ);
1705                        if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
1706                                {
1707                                s->session->krb5_client_princ_len = len;
1708                                memcpy(s->session->krb5_client_princ,kssl_ctx->client_princ,len);
1709                                }
1710                        }
1711
1712
1713                /*  Was doing kssl_ctx_free() here,
1714		**  but it caused problems for apache.
1715                **  kssl_ctx = kssl_ctx_free(kssl_ctx);
1716                **  if (s->kssl_ctx)  s->kssl_ctx = NULL;
1717                */
1718                }
1719	else
1720#endif	/* OPENSSL_NO_KRB5 */
1721		{
1722		al=SSL_AD_HANDSHAKE_FAILURE;
1723		SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1724				SSL_R_UNKNOWN_CIPHER_TYPE);
1725		goto f_err;
1726		}
1727
1728	return(1);
1729f_err:
1730	ssl3_send_alert(s,SSL3_AL_FATAL,al);
1731#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA)
1732err:
1733#endif
1734	return(-1);
1735	}
1736
1737static int ssl3_get_cert_verify(SSL *s)
1738	{
1739	EVP_PKEY *pkey=NULL;
1740	unsigned char *p;
1741	int al,ok,ret=0;
1742	long n;
1743	int type=0,i,j;
1744	X509 *peer;
1745
1746	n=ssl3_get_message(s,
1747		SSL3_ST_SR_CERT_VRFY_A,
1748		SSL3_ST_SR_CERT_VRFY_B,
1749		-1,
1750		514, /* 514? */
1751		&ok);
1752
1753	if (!ok) return((int)n);
1754
1755	if (s->session->peer != NULL)
1756		{
1757		peer=s->session->peer;
1758		pkey=X509_get_pubkey(peer);
1759		type=X509_certificate_type(peer,pkey);
1760		}
1761	else
1762		{
1763		peer=NULL;
1764		pkey=NULL;
1765		}
1766
1767	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
1768		{
1769		s->s3->tmp.reuse_message=1;
1770		if ((peer != NULL) && (type | EVP_PKT_SIGN))
1771			{
1772			al=SSL_AD_UNEXPECTED_MESSAGE;
1773			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
1774			goto f_err;
1775			}
1776		ret=1;
1777		goto end;
1778		}
1779
1780	if (peer == NULL)
1781		{
1782		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_NO_CLIENT_CERT_RECEIVED);
1783		al=SSL_AD_UNEXPECTED_MESSAGE;
1784		goto f_err;
1785		}
1786
1787	if (!(type & EVP_PKT_SIGN))
1788		{
1789		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
1790		al=SSL_AD_ILLEGAL_PARAMETER;
1791		goto f_err;
1792		}
1793
1794	if (s->s3->change_cipher_spec)
1795		{
1796		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY);
1797		al=SSL_AD_UNEXPECTED_MESSAGE;
1798		goto f_err;
1799		}
1800
1801	/* we now have a signature that we need to verify */
1802	p=(unsigned char *)s->init_msg;
1803	n2s(p,i);
1804	n-=2;
1805	if (i > n)
1806		{
1807		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_LENGTH_MISMATCH);
1808		al=SSL_AD_DECODE_ERROR;
1809		goto f_err;
1810		}
1811
1812	j=EVP_PKEY_size(pkey);
1813	if ((i > j) || (n > j) || (n <= 0))
1814		{
1815		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_WRONG_SIGNATURE_SIZE);
1816		al=SSL_AD_DECODE_ERROR;
1817		goto f_err;
1818		}
1819
1820#ifndef OPENSSL_NO_RSA
1821	if (pkey->type == EVP_PKEY_RSA)
1822		{
1823		i=RSA_verify(NID_md5_sha1, s->s3->tmp.cert_verify_md,
1824			MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH, p, i,
1825							pkey->pkey.rsa);
1826		if (i < 0)
1827			{
1828			al=SSL_AD_DECRYPT_ERROR;
1829			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
1830			goto f_err;
1831			}
1832		if (i == 0)
1833			{
1834			al=SSL_AD_DECRYPT_ERROR;
1835			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
1836			goto f_err;
1837			}
1838		}
1839	else
1840#endif
1841#ifndef OPENSSL_NO_DSA
1842		if (pkey->type == EVP_PKEY_DSA)
1843		{
1844		j=DSA_verify(pkey->save_type,
1845			&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
1846			SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
1847		if (j <= 0)
1848			{
1849			/* bad signature */
1850			al=SSL_AD_DECRYPT_ERROR;
1851			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_DSA_SIGNATURE);
1852			goto f_err;
1853			}
1854		}
1855	else
1856#endif
1857		{
1858		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,ERR_R_INTERNAL_ERROR);
1859		al=SSL_AD_UNSUPPORTED_CERTIFICATE;
1860		goto f_err;
1861		}
1862
1863
1864	ret=1;
1865	if (0)
1866		{
1867f_err:
1868		ssl3_send_alert(s,SSL3_AL_FATAL,al);
1869		}
1870end:
1871	EVP_PKEY_free(pkey);
1872	return(ret);
1873	}
1874
1875static int ssl3_get_client_certificate(SSL *s)
1876	{
1877	int i,ok,al,ret= -1;
1878	X509 *x=NULL;
1879	unsigned long l,nc,llen,n;
1880	unsigned char *p,*d,*q;
1881	STACK_OF(X509) *sk=NULL;
1882
1883	n=ssl3_get_message(s,
1884		SSL3_ST_SR_CERT_A,
1885		SSL3_ST_SR_CERT_B,
1886		-1,
1887		s->max_cert_list,
1888		&ok);
1889
1890	if (!ok) return((int)n);
1891
1892	if	(s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
1893		{
1894		if (	(s->verify_mode & SSL_VERIFY_PEER) &&
1895			(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1896			{
1897			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1898			al=SSL_AD_HANDSHAKE_FAILURE;
1899			goto f_err;
1900			}
1901		/* If tls asked for a client cert, the client must return a 0 list */
1902		if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
1903			{
1904			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
1905			al=SSL_AD_UNEXPECTED_MESSAGE;
1906			goto f_err;
1907			}
1908		s->s3->tmp.reuse_message=1;
1909		return(1);
1910		}
1911
1912	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
1913		{
1914		al=SSL_AD_UNEXPECTED_MESSAGE;
1915		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
1916		goto f_err;
1917		}
1918	d=p=(unsigned char *)s->init_msg;
1919
1920	if ((sk=sk_X509_new_null()) == NULL)
1921		{
1922		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1923		goto err;
1924		}
1925
1926	n2l3(p,llen);
1927	if (llen+3 != n)
1928		{
1929		al=SSL_AD_DECODE_ERROR;
1930		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
1931		goto f_err;
1932		}
1933	for (nc=0; nc<llen; )
1934		{
1935		n2l3(p,l);
1936		if ((l+nc+3) > llen)
1937			{
1938			al=SSL_AD_DECODE_ERROR;
1939			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1940			goto f_err;
1941			}
1942
1943		q=p;
1944		x=d2i_X509(NULL,&p,l);
1945		if (x == NULL)
1946			{
1947			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_ASN1_LIB);
1948			goto err;
1949			}
1950		if (p != (q+l))
1951			{
1952			al=SSL_AD_DECODE_ERROR;
1953			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1954			goto f_err;
1955			}
1956		if (!sk_X509_push(sk,x))
1957			{
1958			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1959			goto err;
1960			}
1961		x=NULL;
1962		nc+=l+3;
1963		}
1964
1965	if (sk_X509_num(sk) <= 0)
1966		{
1967		/* TLS does not mind 0 certs returned */
1968		if (s->version == SSL3_VERSION)
1969			{
1970			al=SSL_AD_HANDSHAKE_FAILURE;
1971			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATES_RETURNED);
1972			goto f_err;
1973			}
1974		/* Fail for TLS only if we required a certificate */
1975		else if ((s->verify_mode & SSL_VERIFY_PEER) &&
1976			 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1977			{
1978			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1979			al=SSL_AD_HANDSHAKE_FAILURE;
1980			goto f_err;
1981			}
1982		}
1983	else
1984		{
1985		i=ssl_verify_cert_chain(s,sk);
1986		if (!i)
1987			{
1988			al=ssl_verify_alarm_type(s->verify_result);
1989			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
1990			goto f_err;
1991			}
1992		}
1993
1994	if (s->session->peer != NULL) /* This should not be needed */
1995		X509_free(s->session->peer);
1996	s->session->peer=sk_X509_shift(sk);
1997	s->session->verify_result = s->verify_result;
1998
1999	/* With the current implementation, sess_cert will always be NULL
2000	 * when we arrive here. */
2001	if (s->session->sess_cert == NULL)
2002		{
2003		s->session->sess_cert = ssl_sess_cert_new();
2004		if (s->session->sess_cert == NULL)
2005			{
2006			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, ERR_R_MALLOC_FAILURE);
2007			goto err;
2008			}
2009		}
2010	if (s->session->sess_cert->cert_chain != NULL)
2011		sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2012	s->session->sess_cert->cert_chain=sk;
2013	/* Inconsistency alert: cert_chain does *not* include the
2014	 * peer's own certificate, while we do include it in s3_clnt.c */
2015
2016	sk=NULL;
2017
2018	ret=1;
2019	if (0)
2020		{
2021f_err:
2022		ssl3_send_alert(s,SSL3_AL_FATAL,al);
2023		}
2024err:
2025	if (x != NULL) X509_free(x);
2026	if (sk != NULL) sk_X509_pop_free(sk,X509_free);
2027	return(ret);
2028	}
2029
2030int ssl3_send_server_certificate(SSL *s)
2031	{
2032	unsigned long l;
2033	X509 *x;
2034
2035	if (s->state == SSL3_ST_SW_CERT_A)
2036		{
2037		x=ssl_get_server_send_cert(s);
2038		if (x == NULL &&
2039                        /* VRS: allow null cert if auth == KRB5 */
2040                        (s->s3->tmp.new_cipher->algorithms
2041                                & (SSL_MKEY_MASK|SSL_AUTH_MASK))
2042                        != (SSL_aKRB5|SSL_kKRB5))
2043			{
2044			SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
2045			return(0);
2046			}
2047
2048		l=ssl3_output_cert_chain(s,x);
2049		s->state=SSL3_ST_SW_CERT_B;
2050		s->init_num=(int)l;
2051		s->init_off=0;
2052		}
2053
2054	/* SSL3_ST_SW_CERT_B */
2055	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2056	}
2057