s3_srvr.c revision 112439
1/* ssl/s3_srvr.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@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@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@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@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-2002 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@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@cryptsoft.com).  This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#define REUSE_CIPHER_BUG
113#define NETSCAPE_HANG_BUG
114
115
116#include <stdio.h>
117#include "ssl_locl.h"
118#include "kssl_lcl.h"
119#include <openssl/buffer.h>
120#include <openssl/rand.h>
121#include <openssl/objects.h>
122#include <openssl/evp.h>
123#include <openssl/x509.h>
124#include <openssl/krb5_asn.h>
125#include <openssl/md5.h>
126#include "cryptlib.h"
127
128static SSL_METHOD *ssl3_get_server_method(int ver);
129static int ssl3_get_client_hello(SSL *s);
130static int ssl3_check_client_hello(SSL *s);
131static int ssl3_send_server_hello(SSL *s);
132static int ssl3_send_server_key_exchange(SSL *s);
133static int ssl3_send_certificate_request(SSL *s);
134static int ssl3_send_server_done(SSL *s);
135static int ssl3_get_client_key_exchange(SSL *s);
136static int ssl3_get_client_certificate(SSL *s);
137static int ssl3_get_cert_verify(SSL *s);
138static int ssl3_send_hello_request(SSL *s);
139
140static SSL_METHOD *ssl3_get_server_method(int ver)
141	{
142	if (ver == SSL3_VERSION)
143		return(SSLv3_server_method());
144	else
145		return(NULL);
146	}
147
148SSL_METHOD *SSLv3_server_method(void)
149	{
150	static int init=1;
151	static SSL_METHOD SSLv3_server_data;
152
153	if (init)
154		{
155		CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);
156
157		if (init)
158			{
159			memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(),
160				sizeof(SSL_METHOD));
161			SSLv3_server_data.ssl_accept=ssl3_accept;
162			SSLv3_server_data.get_ssl_method=ssl3_get_server_method;
163			init=0;
164			}
165
166		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
167		}
168	return(&SSLv3_server_data);
169	}
170
171int ssl3_accept(SSL *s)
172	{
173	BUF_MEM *buf;
174	unsigned long l,Time=time(NULL);
175	void (*cb)(const SSL *ssl,int type,int val)=NULL;
176	long num1;
177	int ret= -1;
178	int new_state,state,skip=0;
179
180	RAND_add(&Time,sizeof(Time),0);
181	ERR_clear_error();
182	clear_sys_error();
183
184	if (s->info_callback != NULL)
185		cb=s->info_callback;
186	else if (s->ctx->info_callback != NULL)
187		cb=s->ctx->info_callback;
188
189	/* init things to blank */
190	s->in_handshake++;
191	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
192
193	if (s->cert == NULL)
194		{
195		SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
196		return(-1);
197		}
198
199	for (;;)
200		{
201		state=s->state;
202
203		switch (s->state)
204			{
205		case SSL_ST_RENEGOTIATE:
206			s->new_session=1;
207			/* s->state=SSL_ST_ACCEPT; */
208
209		case SSL_ST_BEFORE:
210		case SSL_ST_ACCEPT:
211		case SSL_ST_BEFORE|SSL_ST_ACCEPT:
212		case SSL_ST_OK|SSL_ST_ACCEPT:
213
214			s->server=1;
215			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
216
217			if ((s->version>>8) != 3)
218				{
219				SSLerr(SSL_F_SSL3_ACCEPT, ERR_R_INTERNAL_ERROR);
220				return -1;
221				}
222			s->type=SSL_ST_ACCEPT;
223
224			if (s->init_buf == NULL)
225				{
226				if ((buf=BUF_MEM_new()) == NULL)
227					{
228					ret= -1;
229					goto end;
230					}
231				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
232					{
233					ret= -1;
234					goto end;
235					}
236				s->init_buf=buf;
237				}
238
239			if (!ssl3_setup_buffers(s))
240				{
241				ret= -1;
242				goto end;
243				}
244
245			s->init_num=0;
246
247			if (s->state != SSL_ST_RENEGOTIATE)
248				{
249				/* Ok, we now need to push on a buffering BIO so that
250				 * the output is sent in a way that TCP likes :-)
251				 */
252				if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
253
254				ssl3_init_finished_mac(s);
255				s->state=SSL3_ST_SR_CLNT_HELLO_A;
256				s->ctx->stats.sess_accept++;
257				}
258			else
259				{
260				/* s->state == SSL_ST_RENEGOTIATE,
261				 * we will just send a HelloRequest */
262				s->ctx->stats.sess_accept_renegotiate++;
263				s->state=SSL3_ST_SW_HELLO_REQ_A;
264				}
265			break;
266
267		case SSL3_ST_SW_HELLO_REQ_A:
268		case SSL3_ST_SW_HELLO_REQ_B:
269
270			s->shutdown=0;
271			ret=ssl3_send_hello_request(s);
272			if (ret <= 0) goto end;
273			s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
274			s->state=SSL3_ST_SW_FLUSH;
275			s->init_num=0;
276
277			ssl3_init_finished_mac(s);
278			break;
279
280		case SSL3_ST_SW_HELLO_REQ_C:
281			s->state=SSL_ST_OK;
282			break;
283
284		case SSL3_ST_SR_CLNT_HELLO_A:
285		case SSL3_ST_SR_CLNT_HELLO_B:
286		case SSL3_ST_SR_CLNT_HELLO_C:
287
288			s->shutdown=0;
289			ret=ssl3_get_client_hello(s);
290			if (ret <= 0) goto end;
291			s->new_session = 2;
292			s->state=SSL3_ST_SW_SRVR_HELLO_A;
293			s->init_num=0;
294			break;
295
296		case SSL3_ST_SW_SRVR_HELLO_A:
297		case SSL3_ST_SW_SRVR_HELLO_B:
298			ret=ssl3_send_server_hello(s);
299			if (ret <= 0) goto end;
300
301			if (s->hit)
302				s->state=SSL3_ST_SW_CHANGE_A;
303			else
304				s->state=SSL3_ST_SW_CERT_A;
305			s->init_num=0;
306			break;
307
308		case SSL3_ST_SW_CERT_A:
309		case SSL3_ST_SW_CERT_B:
310			/* Check if it is anon DH */
311			if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
312				{
313				ret=ssl3_send_server_certificate(s);
314				if (ret <= 0) goto end;
315				}
316			else
317				skip=1;
318			s->state=SSL3_ST_SW_KEY_EXCH_A;
319			s->init_num=0;
320			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
1468				/* The Klima-Pokorny-Rosa extension of Bleichenbacher's attack
1469				 * (http://eprint.iacr.org/2003/052/) exploits the version
1470				 * number check as a "bad version oracle" -- an alert would
1471				 * reveal that the plaintext corresponding to some ciphertext
1472				 * made up by the adversary is properly formatted except
1473				 * that the version number is wrong.  To avoid such attacks,
1474				 * we should treat this just like any other decryption error. */
1475				p[0] = (char)(int) "CAN-2003-0131 patch 2003-03-19";
1476				}
1477			}
1478
1479		if (al != -1)
1480			{
1481			/* Some decryption failure -- use random value instead as countermeasure
1482			 * against Bleichenbacher's attack on PKCS #1 v1.5 RSA padding
1483			 * (see RFC 2246, section 7.4.7.1). */
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			}
1490
1491		s->session->master_key_length=
1492			s->method->ssl3_enc->generate_master_secret(s,
1493				s->session->master_key,
1494				p,i);
1495		OPENSSL_cleanse(p,i);
1496		}
1497	else
1498#endif
1499#ifndef OPENSSL_NO_DH
1500		if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1501		{
1502		n2s(p,i);
1503		if (n != i+2)
1504			{
1505			if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG))
1506				{
1507				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1508				goto err;
1509				}
1510			else
1511				{
1512				p-=2;
1513				i=(int)n;
1514				}
1515			}
1516
1517		if (n == 0L) /* the parameters are in the cert */
1518			{
1519			al=SSL_AD_HANDSHAKE_FAILURE;
1520			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_DECODE_DH_CERTS);
1521			goto f_err;
1522			}
1523		else
1524			{
1525			if (s->s3->tmp.dh == NULL)
1526				{
1527				al=SSL_AD_HANDSHAKE_FAILURE;
1528				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1529				goto f_err;
1530				}
1531			else
1532				dh_srvr=s->s3->tmp.dh;
1533			}
1534
1535		pub=BN_bin2bn(p,i,NULL);
1536		if (pub == NULL)
1537			{
1538			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BN_LIB);
1539			goto err;
1540			}
1541
1542		i=DH_compute_key(p,pub,dh_srvr);
1543
1544		if (i <= 0)
1545			{
1546			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1547			goto err;
1548			}
1549
1550		DH_free(s->s3->tmp.dh);
1551		s->s3->tmp.dh=NULL;
1552
1553		BN_clear_free(pub);
1554		pub=NULL;
1555		s->session->master_key_length=
1556			s->method->ssl3_enc->generate_master_secret(s,
1557				s->session->master_key,p,i);
1558		OPENSSL_cleanse(p,i);
1559		}
1560	else
1561#endif
1562#ifndef OPENSSL_NO_KRB5
1563        if (l & SSL_kKRB5)
1564                {
1565                krb5_error_code		krb5rc;
1566		krb5_data		enc_ticket;
1567		krb5_data		authenticator;
1568		krb5_data		enc_pms;
1569                KSSL_CTX		*kssl_ctx = s->kssl_ctx;
1570		EVP_CIPHER_CTX		ciph_ctx;
1571		EVP_CIPHER		*enc = NULL;
1572		unsigned char		iv[EVP_MAX_IV_LENGTH];
1573		unsigned char		pms[SSL_MAX_MASTER_KEY_LENGTH
1574                                               + EVP_MAX_BLOCK_LENGTH];
1575		int                     padl, outl;
1576		krb5_timestamp		authtime = 0;
1577		krb5_ticket_times	ttimes;
1578
1579		EVP_CIPHER_CTX_init(&ciph_ctx);
1580
1581                if (!kssl_ctx)  kssl_ctx = kssl_ctx_new();
1582
1583		n2s(p,i);
1584		enc_ticket.length = i;
1585		enc_ticket.data = (char *)p;
1586		p+=enc_ticket.length;
1587
1588		n2s(p,i);
1589		authenticator.length = i;
1590		authenticator.data = (char *)p;
1591		p+=authenticator.length;
1592
1593		n2s(p,i);
1594		enc_pms.length = i;
1595		enc_pms.data = (char *)p;
1596		p+=enc_pms.length;
1597
1598		/* Note that the length is checked again below,
1599		** after decryption
1600		*/
1601		if(enc_pms.length > sizeof pms)
1602			{
1603			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1604			       SSL_R_DATA_LENGTH_TOO_LONG);
1605			goto err;
1606			}
1607
1608		if (n != enc_ticket.length + authenticator.length +
1609						enc_pms.length + 6)
1610			{
1611			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1612				SSL_R_DATA_LENGTH_TOO_LONG);
1613			goto err;
1614			}
1615
1616                if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes,
1617					&kssl_err)) != 0)
1618                        {
1619#ifdef KSSL_DEBUG
1620                        printf("kssl_sget_tkt rtn %d [%d]\n",
1621                                krb5rc, kssl_err.reason);
1622                        if (kssl_err.text)
1623                                printf("kssl_err text= %s\n", kssl_err.text);
1624#endif	/* KSSL_DEBUG */
1625                        SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1626                                kssl_err.reason);
1627                        goto err;
1628                        }
1629
1630		/*  Note: no authenticator is not considered an error,
1631		**  but will return authtime == 0.
1632		*/
1633		if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator,
1634					&authtime, &kssl_err)) != 0)
1635			{
1636#ifdef KSSL_DEBUG
1637                        printf("kssl_check_authent rtn %d [%d]\n",
1638                                krb5rc, kssl_err.reason);
1639                        if (kssl_err.text)
1640                                printf("kssl_err text= %s\n", kssl_err.text);
1641#endif	/* KSSL_DEBUG */
1642                        SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1643                                kssl_err.reason);
1644                        goto err;
1645			}
1646
1647		if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0)
1648			{
1649			SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, krb5rc);
1650                        goto err;
1651			}
1652
1653#ifdef KSSL_DEBUG
1654                kssl_ctx_show(kssl_ctx);
1655#endif	/* KSSL_DEBUG */
1656
1657		enc = kssl_map_enc(kssl_ctx->enctype);
1658                if (enc == NULL)
1659                    goto err;
1660
1661		memset(iv, 0, sizeof iv);	/* per RFC 1510 */
1662
1663		if (!EVP_DecryptInit_ex(&ciph_ctx,enc,NULL,kssl_ctx->key,iv))
1664			{
1665			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1666				SSL_R_DECRYPTION_FAILED);
1667			goto err;
1668			}
1669		if (!EVP_DecryptUpdate(&ciph_ctx, pms,&outl,
1670					(unsigned char *)enc_pms.data, enc_pms.length))
1671			{
1672			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1673				SSL_R_DECRYPTION_FAILED);
1674			goto err;
1675			}
1676		if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1677			{
1678			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1679				SSL_R_DATA_LENGTH_TOO_LONG);
1680			goto err;
1681			}
1682		if (!EVP_DecryptFinal_ex(&ciph_ctx,&(pms[outl]),&padl))
1683			{
1684			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1685				SSL_R_DECRYPTION_FAILED);
1686			goto err;
1687			}
1688		outl += padl;
1689		if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1690			{
1691			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1692				SSL_R_DATA_LENGTH_TOO_LONG);
1693			goto err;
1694			}
1695		EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1696
1697                s->session->master_key_length=
1698                        s->method->ssl3_enc->generate_master_secret(s,
1699                                s->session->master_key, pms, outl);
1700
1701                if (kssl_ctx->client_princ)
1702                        {
1703                        int len = strlen(kssl_ctx->client_princ);
1704                        if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
1705                                {
1706                                s->session->krb5_client_princ_len = len;
1707                                memcpy(s->session->krb5_client_princ,kssl_ctx->client_princ,len);
1708                                }
1709                        }
1710
1711
1712                /*  Was doing kssl_ctx_free() here,
1713		**  but it caused problems for apache.
1714                **  kssl_ctx = kssl_ctx_free(kssl_ctx);
1715                **  if (s->kssl_ctx)  s->kssl_ctx = NULL;
1716                */
1717                }
1718	else
1719#endif	/* OPENSSL_NO_KRB5 */
1720		{
1721		al=SSL_AD_HANDSHAKE_FAILURE;
1722		SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1723				SSL_R_UNKNOWN_CIPHER_TYPE);
1724		goto f_err;
1725		}
1726
1727	return(1);
1728f_err:
1729	ssl3_send_alert(s,SSL3_AL_FATAL,al);
1730#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA)
1731err:
1732#endif
1733	return(-1);
1734	}
1735
1736static int ssl3_get_cert_verify(SSL *s)
1737	{
1738	EVP_PKEY *pkey=NULL;
1739	unsigned char *p;
1740	int al,ok,ret=0;
1741	long n;
1742	int type=0,i,j;
1743	X509 *peer;
1744
1745	n=ssl3_get_message(s,
1746		SSL3_ST_SR_CERT_VRFY_A,
1747		SSL3_ST_SR_CERT_VRFY_B,
1748		-1,
1749		514, /* 514? */
1750		&ok);
1751
1752	if (!ok) return((int)n);
1753
1754	if (s->session->peer != NULL)
1755		{
1756		peer=s->session->peer;
1757		pkey=X509_get_pubkey(peer);
1758		type=X509_certificate_type(peer,pkey);
1759		}
1760	else
1761		{
1762		peer=NULL;
1763		pkey=NULL;
1764		}
1765
1766	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
1767		{
1768		s->s3->tmp.reuse_message=1;
1769		if ((peer != NULL) && (type | EVP_PKT_SIGN))
1770			{
1771			al=SSL_AD_UNEXPECTED_MESSAGE;
1772			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
1773			goto f_err;
1774			}
1775		ret=1;
1776		goto end;
1777		}
1778
1779	if (peer == NULL)
1780		{
1781		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_NO_CLIENT_CERT_RECEIVED);
1782		al=SSL_AD_UNEXPECTED_MESSAGE;
1783		goto f_err;
1784		}
1785
1786	if (!(type & EVP_PKT_SIGN))
1787		{
1788		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
1789		al=SSL_AD_ILLEGAL_PARAMETER;
1790		goto f_err;
1791		}
1792
1793	if (s->s3->change_cipher_spec)
1794		{
1795		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY);
1796		al=SSL_AD_UNEXPECTED_MESSAGE;
1797		goto f_err;
1798		}
1799
1800	/* we now have a signature that we need to verify */
1801	p=(unsigned char *)s->init_msg;
1802	n2s(p,i);
1803	n-=2;
1804	if (i > n)
1805		{
1806		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_LENGTH_MISMATCH);
1807		al=SSL_AD_DECODE_ERROR;
1808		goto f_err;
1809		}
1810
1811	j=EVP_PKEY_size(pkey);
1812	if ((i > j) || (n > j) || (n <= 0))
1813		{
1814		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_WRONG_SIGNATURE_SIZE);
1815		al=SSL_AD_DECODE_ERROR;
1816		goto f_err;
1817		}
1818
1819#ifndef OPENSSL_NO_RSA
1820	if (pkey->type == EVP_PKEY_RSA)
1821		{
1822		i=RSA_verify(NID_md5_sha1, s->s3->tmp.cert_verify_md,
1823			MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH, p, i,
1824							pkey->pkey.rsa);
1825		if (i < 0)
1826			{
1827			al=SSL_AD_DECRYPT_ERROR;
1828			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
1829			goto f_err;
1830			}
1831		if (i == 0)
1832			{
1833			al=SSL_AD_DECRYPT_ERROR;
1834			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
1835			goto f_err;
1836			}
1837		}
1838	else
1839#endif
1840#ifndef OPENSSL_NO_DSA
1841		if (pkey->type == EVP_PKEY_DSA)
1842		{
1843		j=DSA_verify(pkey->save_type,
1844			&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
1845			SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
1846		if (j <= 0)
1847			{
1848			/* bad signature */
1849			al=SSL_AD_DECRYPT_ERROR;
1850			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_DSA_SIGNATURE);
1851			goto f_err;
1852			}
1853		}
1854	else
1855#endif
1856		{
1857		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,ERR_R_INTERNAL_ERROR);
1858		al=SSL_AD_UNSUPPORTED_CERTIFICATE;
1859		goto f_err;
1860		}
1861
1862
1863	ret=1;
1864	if (0)
1865		{
1866f_err:
1867		ssl3_send_alert(s,SSL3_AL_FATAL,al);
1868		}
1869end:
1870	EVP_PKEY_free(pkey);
1871	return(ret);
1872	}
1873
1874static int ssl3_get_client_certificate(SSL *s)
1875	{
1876	int i,ok,al,ret= -1;
1877	X509 *x=NULL;
1878	unsigned long l,nc,llen,n;
1879	unsigned char *p,*d,*q;
1880	STACK_OF(X509) *sk=NULL;
1881
1882	n=ssl3_get_message(s,
1883		SSL3_ST_SR_CERT_A,
1884		SSL3_ST_SR_CERT_B,
1885		-1,
1886		s->max_cert_list,
1887		&ok);
1888
1889	if (!ok) return((int)n);
1890
1891	if	(s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
1892		{
1893		if (	(s->verify_mode & SSL_VERIFY_PEER) &&
1894			(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1895			{
1896			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1897			al=SSL_AD_HANDSHAKE_FAILURE;
1898			goto f_err;
1899			}
1900		/* If tls asked for a client cert, the client must return a 0 list */
1901		if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
1902			{
1903			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
1904			al=SSL_AD_UNEXPECTED_MESSAGE;
1905			goto f_err;
1906			}
1907		s->s3->tmp.reuse_message=1;
1908		return(1);
1909		}
1910
1911	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
1912		{
1913		al=SSL_AD_UNEXPECTED_MESSAGE;
1914		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
1915		goto f_err;
1916		}
1917	d=p=(unsigned char *)s->init_msg;
1918
1919	if ((sk=sk_X509_new_null()) == NULL)
1920		{
1921		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1922		goto err;
1923		}
1924
1925	n2l3(p,llen);
1926	if (llen+3 != n)
1927		{
1928		al=SSL_AD_DECODE_ERROR;
1929		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
1930		goto f_err;
1931		}
1932	for (nc=0; nc<llen; )
1933		{
1934		n2l3(p,l);
1935		if ((l+nc+3) > llen)
1936			{
1937			al=SSL_AD_DECODE_ERROR;
1938			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1939			goto f_err;
1940			}
1941
1942		q=p;
1943		x=d2i_X509(NULL,&p,l);
1944		if (x == NULL)
1945			{
1946			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_ASN1_LIB);
1947			goto err;
1948			}
1949		if (p != (q+l))
1950			{
1951			al=SSL_AD_DECODE_ERROR;
1952			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1953			goto f_err;
1954			}
1955		if (!sk_X509_push(sk,x))
1956			{
1957			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1958			goto err;
1959			}
1960		x=NULL;
1961		nc+=l+3;
1962		}
1963
1964	if (sk_X509_num(sk) <= 0)
1965		{
1966		/* TLS does not mind 0 certs returned */
1967		if (s->version == SSL3_VERSION)
1968			{
1969			al=SSL_AD_HANDSHAKE_FAILURE;
1970			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATES_RETURNED);
1971			goto f_err;
1972			}
1973		/* Fail for TLS only if we required a certificate */
1974		else if ((s->verify_mode & SSL_VERIFY_PEER) &&
1975			 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1976			{
1977			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1978			al=SSL_AD_HANDSHAKE_FAILURE;
1979			goto f_err;
1980			}
1981		}
1982	else
1983		{
1984		i=ssl_verify_cert_chain(s,sk);
1985		if (!i)
1986			{
1987			al=ssl_verify_alarm_type(s->verify_result);
1988			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
1989			goto f_err;
1990			}
1991		}
1992
1993	if (s->session->peer != NULL) /* This should not be needed */
1994		X509_free(s->session->peer);
1995	s->session->peer=sk_X509_shift(sk);
1996	s->session->verify_result = s->verify_result;
1997
1998	/* With the current implementation, sess_cert will always be NULL
1999	 * when we arrive here. */
2000	if (s->session->sess_cert == NULL)
2001		{
2002		s->session->sess_cert = ssl_sess_cert_new();
2003		if (s->session->sess_cert == NULL)
2004			{
2005			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, ERR_R_MALLOC_FAILURE);
2006			goto err;
2007			}
2008		}
2009	if (s->session->sess_cert->cert_chain != NULL)
2010		sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2011	s->session->sess_cert->cert_chain=sk;
2012	/* Inconsistency alert: cert_chain does *not* include the
2013	 * peer's own certificate, while we do include it in s3_clnt.c */
2014
2015	sk=NULL;
2016
2017	ret=1;
2018	if (0)
2019		{
2020f_err:
2021		ssl3_send_alert(s,SSL3_AL_FATAL,al);
2022		}
2023err:
2024	if (x != NULL) X509_free(x);
2025	if (sk != NULL) sk_X509_pop_free(sk,X509_free);
2026	return(ret);
2027	}
2028
2029int ssl3_send_server_certificate(SSL *s)
2030	{
2031	unsigned long l;
2032	X509 *x;
2033
2034	if (s->state == SSL3_ST_SW_CERT_A)
2035		{
2036		x=ssl_get_server_send_cert(s);
2037		if (x == NULL &&
2038                        /* VRS: allow null cert if auth == KRB5 */
2039                        (s->s3->tmp.new_cipher->algorithms
2040                                & (SSL_MKEY_MASK|SSL_AUTH_MASK))
2041                        != (SSL_aKRB5|SSL_kKRB5))
2042			{
2043			SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
2044			return(0);
2045			}
2046
2047		l=ssl3_output_cert_chain(s,x);
2048		s->state=SSL3_ST_SW_CERT_B;
2049		s->init_num=(int)l;
2050		s->init_off=0;
2051		}
2052
2053	/* SSL3_ST_SW_CERT_B */
2054	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2055	}
2056