s3_srvr.c revision 186872
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-2005 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 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113 *
114 * Portions of the attached software ("Contribution") are developed by
115 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
116 *
117 * The Contribution is licensed pursuant to the OpenSSL open source
118 * license provided above.
119 *
120 * ECC cipher suite support in OpenSSL originally written by
121 * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
122 *
123 */
124
125#define REUSE_CIPHER_BUG
126#define NETSCAPE_HANG_BUG
127
128#include <stdio.h>
129#include "ssl_locl.h"
130#include "kssl_lcl.h"
131#include <openssl/buffer.h>
132#include <openssl/rand.h>
133#include <openssl/objects.h>
134#include <openssl/evp.h>
135#include <openssl/x509.h>
136#ifndef OPENSSL_NO_DH
137#include <openssl/dh.h>
138#endif
139#include <openssl/bn.h>
140#ifndef OPENSSL_NO_KRB5
141#include <openssl/krb5_asn.h>
142#endif
143#include <openssl/md5.h>
144
145static SSL_METHOD *ssl3_get_server_method(int ver);
146
147#ifndef OPENSSL_NO_ECDH
148static int nid2curve_id(int nid);
149#endif
150
151static SSL_METHOD *ssl3_get_server_method(int ver)
152	{
153	if (ver == SSL3_VERSION)
154		return(SSLv3_server_method());
155	else
156		return(NULL);
157	}
158
159IMPLEMENT_ssl3_meth_func(SSLv3_server_method,
160			ssl3_accept,
161			ssl_undefined_function,
162			ssl3_get_server_method)
163
164int ssl3_accept(SSL *s)
165	{
166	BUF_MEM *buf;
167	unsigned long l,Time=(unsigned long)time(NULL);
168	void (*cb)(const SSL *ssl,int type,int val)=NULL;
169	long num1;
170	int ret= -1;
171	int new_state,state,skip=0;
172
173	RAND_add(&Time,sizeof(Time),0);
174	ERR_clear_error();
175	clear_sys_error();
176
177	if (s->info_callback != NULL)
178		cb=s->info_callback;
179	else if (s->ctx->info_callback != NULL)
180		cb=s->ctx->info_callback;
181
182	/* init things to blank */
183	s->in_handshake++;
184	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
185
186	if (s->cert == NULL)
187		{
188		SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
189		return(-1);
190		}
191
192	for (;;)
193		{
194		state=s->state;
195
196		switch (s->state)
197			{
198		case SSL_ST_RENEGOTIATE:
199			s->new_session=1;
200			/* s->state=SSL_ST_ACCEPT; */
201
202		case SSL_ST_BEFORE:
203		case SSL_ST_ACCEPT:
204		case SSL_ST_BEFORE|SSL_ST_ACCEPT:
205		case SSL_ST_OK|SSL_ST_ACCEPT:
206
207			s->server=1;
208			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
209
210			if ((s->version>>8) != 3)
211				{
212				SSLerr(SSL_F_SSL3_ACCEPT, ERR_R_INTERNAL_ERROR);
213				return -1;
214				}
215			s->type=SSL_ST_ACCEPT;
216
217			if (s->init_buf == NULL)
218				{
219				if ((buf=BUF_MEM_new()) == NULL)
220					{
221					ret= -1;
222					goto end;
223					}
224				if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
225					{
226					ret= -1;
227					goto end;
228					}
229				s->init_buf=buf;
230				}
231
232			if (!ssl3_setup_buffers(s))
233				{
234				ret= -1;
235				goto end;
236				}
237
238			s->init_num=0;
239
240			if (s->state != SSL_ST_RENEGOTIATE)
241				{
242				/* Ok, we now need to push on a buffering BIO so that
243				 * the output is sent in a way that TCP likes :-)
244				 */
245				if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
246
247				ssl3_init_finished_mac(s);
248				s->state=SSL3_ST_SR_CLNT_HELLO_A;
249				s->ctx->stats.sess_accept++;
250				}
251			else
252				{
253				/* s->state == SSL_ST_RENEGOTIATE,
254				 * we will just send a HelloRequest */
255				s->ctx->stats.sess_accept_renegotiate++;
256				s->state=SSL3_ST_SW_HELLO_REQ_A;
257				}
258			break;
259
260		case SSL3_ST_SW_HELLO_REQ_A:
261		case SSL3_ST_SW_HELLO_REQ_B:
262
263			s->shutdown=0;
264			ret=ssl3_send_hello_request(s);
265			if (ret <= 0) goto end;
266			s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
267			s->state=SSL3_ST_SW_FLUSH;
268			s->init_num=0;
269
270			ssl3_init_finished_mac(s);
271			break;
272
273		case SSL3_ST_SW_HELLO_REQ_C:
274			s->state=SSL_ST_OK;
275			break;
276
277		case SSL3_ST_SR_CLNT_HELLO_A:
278		case SSL3_ST_SR_CLNT_HELLO_B:
279		case SSL3_ST_SR_CLNT_HELLO_C:
280
281			s->shutdown=0;
282			ret=ssl3_get_client_hello(s);
283			if (ret <= 0) goto end;
284			s->new_session = 2;
285			s->state=SSL3_ST_SW_SRVR_HELLO_A;
286			s->init_num=0;
287			break;
288
289		case SSL3_ST_SW_SRVR_HELLO_A:
290		case SSL3_ST_SW_SRVR_HELLO_B:
291			ret=ssl3_send_server_hello(s);
292			if (ret <= 0) goto end;
293
294			if (s->hit)
295				s->state=SSL3_ST_SW_CHANGE_A;
296			else
297				s->state=SSL3_ST_SW_CERT_A;
298			s->init_num=0;
299			break;
300
301		case SSL3_ST_SW_CERT_A:
302		case SSL3_ST_SW_CERT_B:
303			/* Check if it is anon DH or anon ECDH or KRB5 */
304			if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL)
305				&& !(s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
306				{
307				ret=ssl3_send_server_certificate(s);
308				if (ret <= 0) goto end;
309				}
310			else
311				skip=1;
312			s->state=SSL3_ST_SW_KEY_EXCH_A;
313			s->init_num=0;
314			break;
315
316		case SSL3_ST_SW_KEY_EXCH_A:
317		case SSL3_ST_SW_KEY_EXCH_B:
318			l=s->s3->tmp.new_cipher->algorithms;
319
320			/* clear this, it may get reset by
321			 * send_server_key_exchange */
322			if ((s->options & SSL_OP_EPHEMERAL_RSA)
323#ifndef OPENSSL_NO_KRB5
324				&& !(l & SSL_KRB5)
325#endif /* OPENSSL_NO_KRB5 */
326				)
327				/* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
328				 * even when forbidden by protocol specs
329				 * (handshake may fail as clients are not required to
330				 * be able to handle this) */
331				s->s3->tmp.use_rsa_tmp=1;
332			else
333				s->s3->tmp.use_rsa_tmp=0;
334
335
336			/* only send if a DH key exchange, fortezza or
337			 * RSA but we have a sign only certificate
338			 *
339			 * For ECC ciphersuites, we send a serverKeyExchange
340			 * message only if the cipher suite is either
341			 * ECDH-anon or ECDHE. In other cases, the
342			 * server certificate contains the server's
343			 * public key for key exchange.
344			 */
345			if (s->s3->tmp.use_rsa_tmp
346			    || (l & SSL_kECDHE)
347			    || (l & (SSL_DH|SSL_kFZA))
348			    || ((l & SSL_kRSA)
349				&& (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
350				    || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
351					&& EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
352					)
353				    )
354				)
355			    )
356				{
357				ret=ssl3_send_server_key_exchange(s);
358				if (ret <= 0) goto end;
359				}
360			else
361				skip=1;
362
363			s->state=SSL3_ST_SW_CERT_REQ_A;
364			s->init_num=0;
365			break;
366
367		case SSL3_ST_SW_CERT_REQ_A:
368		case SSL3_ST_SW_CERT_REQ_B:
369			if (/* don't request cert unless asked for it: */
370				!(s->verify_mode & SSL_VERIFY_PEER) ||
371				/* if SSL_VERIFY_CLIENT_ONCE is set,
372				 * don't request cert during re-negotiation: */
373				((s->session->peer != NULL) &&
374				 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
375				/* never request cert in anonymous ciphersuites
376				 * (see section "Certificate request" in SSL 3 drafts
377				 * and in RFC 2246): */
378				((s->s3->tmp.new_cipher->algorithms & SSL_aNULL) &&
379				 /* ... except when the application insists on verification
380				  * (against the specs, but s3_clnt.c accepts this for SSL 3) */
381				 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
382                                 /* never request cert in Kerberos ciphersuites */
383                                (s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
384				{
385				/* no cert request */
386				skip=1;
387				s->s3->tmp.cert_request=0;
388				s->state=SSL3_ST_SW_SRVR_DONE_A;
389				}
390			else
391				{
392				s->s3->tmp.cert_request=1;
393				ret=ssl3_send_certificate_request(s);
394				if (ret <= 0) goto end;
395#ifndef NETSCAPE_HANG_BUG
396				s->state=SSL3_ST_SW_SRVR_DONE_A;
397#else
398				s->state=SSL3_ST_SW_FLUSH;
399				s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
400#endif
401				s->init_num=0;
402				}
403			break;
404
405		case SSL3_ST_SW_SRVR_DONE_A:
406		case SSL3_ST_SW_SRVR_DONE_B:
407			ret=ssl3_send_server_done(s);
408			if (ret <= 0) goto end;
409			s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
410			s->state=SSL3_ST_SW_FLUSH;
411			s->init_num=0;
412			break;
413
414		case SSL3_ST_SW_FLUSH:
415			/* number of bytes to be flushed */
416			num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
417			if (num1 > 0)
418				{
419				s->rwstate=SSL_WRITING;
420				num1=BIO_flush(s->wbio);
421				if (num1 <= 0) { ret= -1; goto end; }
422				s->rwstate=SSL_NOTHING;
423				}
424
425			s->state=s->s3->tmp.next_state;
426			break;
427
428		case SSL3_ST_SR_CERT_A:
429		case SSL3_ST_SR_CERT_B:
430			/* Check for second client hello (MS SGC) */
431			ret = ssl3_check_client_hello(s);
432			if (ret <= 0)
433				goto end;
434			if (ret == 2)
435				s->state = SSL3_ST_SR_CLNT_HELLO_C;
436			else {
437				if (s->s3->tmp.cert_request)
438					{
439					ret=ssl3_get_client_certificate(s);
440					if (ret <= 0) goto end;
441					}
442				s->init_num=0;
443				s->state=SSL3_ST_SR_KEY_EXCH_A;
444			}
445			break;
446
447		case SSL3_ST_SR_KEY_EXCH_A:
448		case SSL3_ST_SR_KEY_EXCH_B:
449			ret=ssl3_get_client_key_exchange(s);
450			if (ret <= 0)
451				goto end;
452			if (ret == 2)
453				{
454				/* For the ECDH ciphersuites when
455				 * the client sends its ECDH pub key in
456				 * a certificate, the CertificateVerify
457				 * message is not sent.
458				 */
459				s->state=SSL3_ST_SR_FINISHED_A;
460				s->init_num = 0;
461				}
462			else
463				{
464				s->state=SSL3_ST_SR_CERT_VRFY_A;
465				s->init_num=0;
466
467				/* We need to get hashes here so if there is
468				 * a client cert, it can be verified
469				 */
470				s->method->ssl3_enc->cert_verify_mac(s,
471				    &(s->s3->finish_dgst1),
472				    &(s->s3->tmp.cert_verify_md[0]));
473				s->method->ssl3_enc->cert_verify_mac(s,
474				    &(s->s3->finish_dgst2),
475				    &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
476				}
477			break;
478
479		case SSL3_ST_SR_CERT_VRFY_A:
480		case SSL3_ST_SR_CERT_VRFY_B:
481
482			/* we should decide if we expected this one */
483			ret=ssl3_get_cert_verify(s);
484			if (ret <= 0) goto end;
485
486			s->state=SSL3_ST_SR_FINISHED_A;
487			s->init_num=0;
488			break;
489
490		case SSL3_ST_SR_FINISHED_A:
491		case SSL3_ST_SR_FINISHED_B:
492			ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
493				SSL3_ST_SR_FINISHED_B);
494			if (ret <= 0) goto end;
495			if (s->hit)
496				s->state=SSL_ST_OK;
497			else
498				s->state=SSL3_ST_SW_CHANGE_A;
499			s->init_num=0;
500			break;
501
502		case SSL3_ST_SW_CHANGE_A:
503		case SSL3_ST_SW_CHANGE_B:
504
505			s->session->cipher=s->s3->tmp.new_cipher;
506			if (!s->method->ssl3_enc->setup_key_block(s))
507				{ ret= -1; goto end; }
508
509			ret=ssl3_send_change_cipher_spec(s,
510				SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
511
512			if (ret <= 0) goto end;
513			s->state=SSL3_ST_SW_FINISHED_A;
514			s->init_num=0;
515
516			if (!s->method->ssl3_enc->change_cipher_state(s,
517				SSL3_CHANGE_CIPHER_SERVER_WRITE))
518				{
519				ret= -1;
520				goto end;
521				}
522
523			break;
524
525		case SSL3_ST_SW_FINISHED_A:
526		case SSL3_ST_SW_FINISHED_B:
527			ret=ssl3_send_finished(s,
528				SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
529				s->method->ssl3_enc->server_finished_label,
530				s->method->ssl3_enc->server_finished_label_len);
531			if (ret <= 0) goto end;
532			s->state=SSL3_ST_SW_FLUSH;
533			if (s->hit)
534				s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
535			else
536				s->s3->tmp.next_state=SSL_ST_OK;
537			s->init_num=0;
538			break;
539
540		case SSL_ST_OK:
541			/* clean a few things up */
542			ssl3_cleanup_key_block(s);
543
544			BUF_MEM_free(s->init_buf);
545			s->init_buf=NULL;
546
547			/* remove buffering on output */
548			ssl_free_wbio_buffer(s);
549
550			s->init_num=0;
551
552			if (s->new_session == 2) /* skipped if we just sent a HelloRequest */
553				{
554				/* actually not necessarily a 'new' session unless
555				 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
556
557				s->new_session=0;
558
559				ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
560
561				s->ctx->stats.sess_accept_good++;
562				/* s->server=1; */
563				s->handshake_func=ssl3_accept;
564
565				if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
566				}
567
568			ret = 1;
569			goto end;
570			/* break; */
571
572		default:
573			SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_UNKNOWN_STATE);
574			ret= -1;
575			goto end;
576			/* break; */
577			}
578
579		if (!s->s3->tmp.reuse_message && !skip)
580			{
581			if (s->debug)
582				{
583				if ((ret=BIO_flush(s->wbio)) <= 0)
584					goto end;
585				}
586
587
588			if ((cb != NULL) && (s->state != state))
589				{
590				new_state=s->state;
591				s->state=state;
592				cb(s,SSL_CB_ACCEPT_LOOP,1);
593				s->state=new_state;
594				}
595			}
596		skip=0;
597		}
598end:
599	/* BIO_flush(s->wbio); */
600
601	s->in_handshake--;
602	if (cb != NULL)
603		cb(s,SSL_CB_ACCEPT_EXIT,ret);
604	return(ret);
605	}
606
607int ssl3_send_hello_request(SSL *s)
608	{
609	unsigned char *p;
610
611	if (s->state == SSL3_ST_SW_HELLO_REQ_A)
612		{
613		p=(unsigned char *)s->init_buf->data;
614		*(p++)=SSL3_MT_HELLO_REQUEST;
615		*(p++)=0;
616		*(p++)=0;
617		*(p++)=0;
618
619		s->state=SSL3_ST_SW_HELLO_REQ_B;
620		/* number of bytes to write */
621		s->init_num=4;
622		s->init_off=0;
623		}
624
625	/* SSL3_ST_SW_HELLO_REQ_B */
626	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
627	}
628
629int ssl3_check_client_hello(SSL *s)
630	{
631	int ok;
632	long n;
633
634	/* this function is called when we really expect a Certificate message,
635	 * so permit appropriate message length */
636	n=s->method->ssl_get_message(s,
637		SSL3_ST_SR_CERT_A,
638		SSL3_ST_SR_CERT_B,
639		-1,
640		s->max_cert_list,
641		&ok);
642	if (!ok) return((int)n);
643	s->s3->tmp.reuse_message = 1;
644	if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO)
645		{
646		/* Throw away what we have done so far in the current handshake,
647		 * which will now be aborted. (A full SSL_clear would be too much.)
648		 * I hope that tmp.dh is the only thing that may need to be cleared
649		 * when a handshake is not completed ... */
650#ifndef OPENSSL_NO_DH
651		if (s->s3->tmp.dh != NULL)
652			{
653			DH_free(s->s3->tmp.dh);
654			s->s3->tmp.dh = NULL;
655			}
656#endif
657		return 2;
658		}
659	return 1;
660}
661
662int ssl3_get_client_hello(SSL *s)
663	{
664	int i,j,ok,al,ret= -1;
665	unsigned int cookie_len;
666	long n;
667	unsigned long id;
668	unsigned char *p,*d,*q;
669	SSL_CIPHER *c;
670#ifndef OPENSSL_NO_COMP
671	SSL_COMP *comp=NULL;
672#endif
673	STACK_OF(SSL_CIPHER) *ciphers=NULL;
674
675	/* We do this so that we will respond with our native type.
676	 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
677	 * This down switching should be handled by a different method.
678	 * If we are SSLv3, we will respond with SSLv3, even if prompted with
679	 * TLSv1.
680	 */
681	if (s->state == SSL3_ST_SR_CLNT_HELLO_A)
682		{
683		s->state=SSL3_ST_SR_CLNT_HELLO_B;
684		}
685	s->first_packet=1;
686	n=s->method->ssl_get_message(s,
687		SSL3_ST_SR_CLNT_HELLO_B,
688		SSL3_ST_SR_CLNT_HELLO_C,
689		SSL3_MT_CLIENT_HELLO,
690		SSL3_RT_MAX_PLAIN_LENGTH,
691		&ok);
692
693	if (!ok) return((int)n);
694	s->first_packet=0;
695	d=p=(unsigned char *)s->init_msg;
696
697	/* use version from inside client hello, not from record header
698	 * (may differ: see RFC 2246, Appendix E, second paragraph) */
699	s->client_version=(((int)p[0])<<8)|(int)p[1];
700	p+=2;
701
702	if (s->client_version < s->version)
703		{
704		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_WRONG_VERSION_NUMBER);
705		if ((s->client_version>>8) == SSL3_VERSION_MAJOR)
706			{
707			/* similar to ssl3_get_record, send alert using remote version number */
708			s->version = s->client_version;
709			}
710		al = SSL_AD_PROTOCOL_VERSION;
711		goto f_err;
712		}
713
714	/* load the client random */
715	memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE);
716	p+=SSL3_RANDOM_SIZE;
717
718	/* get the session-id */
719	j= *(p++);
720
721	s->hit=0;
722	/* Versions before 0.9.7 always allow session reuse during renegotiation
723	 * (i.e. when s->new_session is true), option
724	 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is new with 0.9.7.
725	 * Maybe this optional behaviour should always have been the default,
726	 * but we cannot safely change the default behaviour (or new applications
727	 * might be written that become totally unsecure when compiled with
728	 * an earlier library version)
729	 */
730	if (j == 0 || (s->new_session && (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))
731		{
732		if (!ssl_get_new_session(s,1))
733			goto err;
734		}
735	else
736		{
737		i=ssl_get_prev_session(s,p,j);
738		if (i == 1)
739			{ /* previous session */
740			s->hit=1;
741			}
742		else if (i == -1)
743			goto err;
744		else /* i == 0 */
745			{
746			if (!ssl_get_new_session(s,1))
747				goto err;
748			}
749		}
750
751	p+=j;
752
753	if (SSL_version(s) == DTLS1_VERSION)
754		{
755		/* cookie stuff */
756		cookie_len = *(p++);
757
758		if ( (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) &&
759			s->d1->send_cookie == 0)
760			{
761			/* HelloVerifyMessage has already been sent */
762			if ( cookie_len != s->d1->cookie_len)
763				{
764				al = SSL_AD_HANDSHAKE_FAILURE;
765				SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_COOKIE_MISMATCH);
766				goto f_err;
767				}
768			}
769
770		/*
771		 * The ClientHello may contain a cookie even if the
772		 * HelloVerify message has not been sent--make sure that it
773		 * does not cause an overflow.
774		 */
775		if ( cookie_len > sizeof(s->d1->rcvd_cookie))
776			{
777			/* too much data */
778			al = SSL_AD_DECODE_ERROR;
779			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_COOKIE_MISMATCH);
780			goto f_err;
781			}
782
783		/* verify the cookie if appropriate option is set. */
784		if ( (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) &&
785			cookie_len > 0)
786			{
787			memcpy(s->d1->rcvd_cookie, p, cookie_len);
788
789			if ( s->ctx->app_verify_cookie_cb != NULL)
790				{
791				if ( s->ctx->app_verify_cookie_cb(s, s->d1->rcvd_cookie,
792					cookie_len) == 0)
793					{
794					al=SSL_AD_HANDSHAKE_FAILURE;
795					SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,
796						SSL_R_COOKIE_MISMATCH);
797					goto f_err;
798					}
799				/* else cookie verification succeeded */
800				}
801			else if ( memcmp(s->d1->rcvd_cookie, s->d1->cookie,
802						  s->d1->cookie_len) != 0) /* default verification */
803				{
804					al=SSL_AD_HANDSHAKE_FAILURE;
805					SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,
806						SSL_R_COOKIE_MISMATCH);
807					goto f_err;
808				}
809			}
810
811		p += cookie_len;
812		}
813
814	n2s(p,i);
815	if ((i == 0) && (j != 0))
816		{
817		/* we need a cipher if we are not resuming a session */
818		al=SSL_AD_ILLEGAL_PARAMETER;
819		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
820		goto f_err;
821		}
822	if ((p+i) >= (d+n))
823		{
824		/* not enough data */
825		al=SSL_AD_DECODE_ERROR;
826		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
827		goto f_err;
828		}
829	if ((i > 0) && (ssl_bytes_to_cipher_list(s,p,i,&(ciphers))
830		== NULL))
831		{
832		goto err;
833		}
834	p+=i;
835
836	/* If it is a hit, check that the cipher is in the list */
837	if ((s->hit) && (i > 0))
838		{
839		j=0;
840		id=s->session->cipher->id;
841
842#ifdef CIPHER_DEBUG
843		printf("client sent %d ciphers\n",sk_num(ciphers));
844#endif
845		for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
846			{
847			c=sk_SSL_CIPHER_value(ciphers,i);
848#ifdef CIPHER_DEBUG
849			printf("client [%2d of %2d]:%s\n",
850				i,sk_num(ciphers),SSL_CIPHER_get_name(c));
851#endif
852			if (c->id == id)
853				{
854				j=1;
855				break;
856				}
857			}
858		if (j == 0)
859			{
860			if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
861				{
862				/* Very bad for multi-threading.... */
863				s->session->cipher=sk_SSL_CIPHER_value(ciphers, 0);
864				}
865			else
866				{
867				/* we need to have the cipher in the cipher
868				 * list if we are asked to reuse it */
869				al=SSL_AD_ILLEGAL_PARAMETER;
870				SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
871				goto f_err;
872				}
873			}
874		}
875
876	/* compression */
877	i= *(p++);
878	if ((p+i) > (d+n))
879		{
880		/* not enough data */
881		al=SSL_AD_DECODE_ERROR;
882		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
883		goto f_err;
884		}
885	q=p;
886	for (j=0; j<i; j++)
887		{
888		if (p[j] == 0) break;
889		}
890
891	p+=i;
892	if (j >= i)
893		{
894		/* no compress */
895		al=SSL_AD_DECODE_ERROR;
896		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_COMPRESSION_SPECIFIED);
897		goto f_err;
898		}
899
900	/* Worst case, we will use the NULL compression, but if we have other
901	 * options, we will now look for them.  We have i-1 compression
902	 * algorithms from the client, starting at q. */
903	s->s3->tmp.new_compression=NULL;
904#ifndef OPENSSL_NO_COMP
905	if (s->ctx->comp_methods != NULL)
906		{ /* See if we have a match */
907		int m,nn,o,v,done=0;
908
909		nn=sk_SSL_COMP_num(s->ctx->comp_methods);
910		for (m=0; m<nn; m++)
911			{
912			comp=sk_SSL_COMP_value(s->ctx->comp_methods,m);
913			v=comp->id;
914			for (o=0; o<i; o++)
915				{
916				if (v == q[o])
917					{
918					done=1;
919					break;
920					}
921				}
922			if (done) break;
923			}
924		if (done)
925			s->s3->tmp.new_compression=comp;
926		else
927			comp=NULL;
928		}
929#endif
930
931	/* TLS does not mind if there is extra stuff */
932#if 0   /* SSL 3.0 does not mind either, so we should disable this test
933         * (was enabled in 0.9.6d through 0.9.6j and 0.9.7 through 0.9.7b,
934         * in earlier SSLeay/OpenSSL releases this test existed but was buggy) */
935	if (s->version == SSL3_VERSION)
936		{
937		if (p < (d+n))
938			{
939			/* wrong number of bytes,
940			 * there could be more to follow */
941			al=SSL_AD_DECODE_ERROR;
942			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
943			goto f_err;
944			}
945		}
946#endif
947
948	/* Given s->session->ciphers and SSL_get_ciphers, we must
949	 * pick a cipher */
950
951	if (!s->hit)
952		{
953#ifdef OPENSSL_NO_COMP
954		s->session->compress_meth=0;
955#else
956		s->session->compress_meth=(comp == NULL)?0:comp->id;
957#endif
958		if (s->session->ciphers != NULL)
959			sk_SSL_CIPHER_free(s->session->ciphers);
960		s->session->ciphers=ciphers;
961		if (ciphers == NULL)
962			{
963			al=SSL_AD_ILLEGAL_PARAMETER;
964			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_PASSED);
965			goto f_err;
966			}
967		ciphers=NULL;
968		c=ssl3_choose_cipher(s,s->session->ciphers,
969				     SSL_get_ciphers(s));
970
971		if (c == NULL)
972			{
973			al=SSL_AD_HANDSHAKE_FAILURE;
974			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_SHARED_CIPHER);
975			goto f_err;
976			}
977		s->s3->tmp.new_cipher=c;
978		}
979	else
980		{
981		/* Session-id reuse */
982#ifdef REUSE_CIPHER_BUG
983		STACK_OF(SSL_CIPHER) *sk;
984		SSL_CIPHER *nc=NULL;
985		SSL_CIPHER *ec=NULL;
986
987		if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG)
988			{
989			sk=s->session->ciphers;
990			for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
991				{
992				c=sk_SSL_CIPHER_value(sk,i);
993				if (c->algorithms & SSL_eNULL)
994					nc=c;
995				if (SSL_C_IS_EXPORT(c))
996					ec=c;
997				}
998			if (nc != NULL)
999				s->s3->tmp.new_cipher=nc;
1000			else if (ec != NULL)
1001				s->s3->tmp.new_cipher=ec;
1002			else
1003				s->s3->tmp.new_cipher=s->session->cipher;
1004			}
1005		else
1006#endif
1007		s->s3->tmp.new_cipher=s->session->cipher;
1008		}
1009
1010	/* we now have the following setup.
1011	 * client_random
1012	 * cipher_list 		- our prefered list of ciphers
1013	 * ciphers 		- the clients prefered list of ciphers
1014	 * compression		- basically ignored right now
1015	 * ssl version is set	- sslv3
1016	 * s->session		- The ssl session has been setup.
1017	 * s->hit		- session reuse flag
1018	 * s->tmp.new_cipher	- the new cipher to use.
1019	 */
1020
1021	ret=1;
1022	if (0)
1023		{
1024f_err:
1025		ssl3_send_alert(s,SSL3_AL_FATAL,al);
1026		}
1027err:
1028	if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
1029	return(ret);
1030	}
1031
1032int ssl3_send_server_hello(SSL *s)
1033	{
1034	unsigned char *buf;
1035	unsigned char *p,*d;
1036	int i,sl;
1037	unsigned long l,Time;
1038
1039	if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
1040		{
1041		buf=(unsigned char *)s->init_buf->data;
1042		p=s->s3->server_random;
1043		Time=(unsigned long)time(NULL);			/* Time */
1044		l2n(Time,p);
1045		if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0)
1046			return -1;
1047		/* Do the message type and length last */
1048		d=p= &(buf[4]);
1049
1050		*(p++)=s->version>>8;
1051		*(p++)=s->version&0xff;
1052
1053		/* Random stuff */
1054		memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
1055		p+=SSL3_RANDOM_SIZE;
1056
1057		/* now in theory we have 3 options to sending back the
1058		 * session id.  If it is a re-use, we send back the
1059		 * old session-id, if it is a new session, we send
1060		 * back the new session-id or we send back a 0 length
1061		 * session-id if we want it to be single use.
1062		 * Currently I will not implement the '0' length session-id
1063		 * 12-Jan-98 - I'll now support the '0' length stuff.
1064		 */
1065		if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
1066			s->session->session_id_length=0;
1067
1068		sl=s->session->session_id_length;
1069		if (sl > (int)sizeof(s->session->session_id))
1070			{
1071			SSLerr(SSL_F_SSL3_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
1072			return -1;
1073			}
1074		*(p++)=sl;
1075		memcpy(p,s->session->session_id,sl);
1076		p+=sl;
1077
1078		/* put the cipher */
1079		i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
1080		p+=i;
1081
1082		/* put the compression method */
1083#ifdef OPENSSL_NO_COMP
1084			*(p++)=0;
1085#else
1086		if (s->s3->tmp.new_compression == NULL)
1087			*(p++)=0;
1088		else
1089			*(p++)=s->s3->tmp.new_compression->id;
1090#endif
1091
1092		/* do the header */
1093		l=(p-d);
1094		d=buf;
1095		*(d++)=SSL3_MT_SERVER_HELLO;
1096		l2n3(l,d);
1097
1098		s->state=SSL3_ST_CW_CLNT_HELLO_B;
1099		/* number of bytes to write */
1100		s->init_num=p-buf;
1101		s->init_off=0;
1102		}
1103
1104	/* SSL3_ST_CW_CLNT_HELLO_B */
1105	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1106	}
1107
1108int ssl3_send_server_done(SSL *s)
1109	{
1110	unsigned char *p;
1111
1112	if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1113		{
1114		p=(unsigned char *)s->init_buf->data;
1115
1116		/* do the header */
1117		*(p++)=SSL3_MT_SERVER_DONE;
1118		*(p++)=0;
1119		*(p++)=0;
1120		*(p++)=0;
1121
1122		s->state=SSL3_ST_SW_SRVR_DONE_B;
1123		/* number of bytes to write */
1124		s->init_num=4;
1125		s->init_off=0;
1126		}
1127
1128	/* SSL3_ST_CW_CLNT_HELLO_B */
1129	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1130	}
1131
1132int ssl3_send_server_key_exchange(SSL *s)
1133	{
1134#ifndef OPENSSL_NO_RSA
1135	unsigned char *q;
1136	int j,num;
1137	RSA *rsa;
1138	unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1139	unsigned int u;
1140#endif
1141#ifndef OPENSSL_NO_DH
1142	DH *dh=NULL,*dhp;
1143#endif
1144#ifndef OPENSSL_NO_ECDH
1145	EC_KEY *ecdh=NULL, *ecdhp;
1146	unsigned char *encodedPoint = NULL;
1147	int encodedlen = 0;
1148	int curve_id = 0;
1149	BN_CTX *bn_ctx = NULL;
1150#endif
1151	EVP_PKEY *pkey;
1152	unsigned char *p,*d;
1153	int al,i;
1154	unsigned long type;
1155	int n;
1156	CERT *cert;
1157	BIGNUM *r[4];
1158	int nr[4],kn;
1159	BUF_MEM *buf;
1160	EVP_MD_CTX md_ctx;
1161
1162	EVP_MD_CTX_init(&md_ctx);
1163	if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1164		{
1165		type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
1166		cert=s->cert;
1167
1168		buf=s->init_buf;
1169
1170		r[0]=r[1]=r[2]=r[3]=NULL;
1171		n=0;
1172#ifndef OPENSSL_NO_RSA
1173		if (type & SSL_kRSA)
1174			{
1175			rsa=cert->rsa_tmp;
1176			if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
1177				{
1178				rsa=s->cert->rsa_tmp_cb(s,
1179				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1180				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1181				if(rsa == NULL)
1182				{
1183					al=SSL_AD_HANDSHAKE_FAILURE;
1184					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
1185					goto f_err;
1186				}
1187				RSA_up_ref(rsa);
1188				cert->rsa_tmp=rsa;
1189				}
1190			if (rsa == NULL)
1191				{
1192				al=SSL_AD_HANDSHAKE_FAILURE;
1193				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
1194				goto f_err;
1195				}
1196			r[0]=rsa->n;
1197			r[1]=rsa->e;
1198			s->s3->tmp.use_rsa_tmp=1;
1199			}
1200		else
1201#endif
1202#ifndef OPENSSL_NO_DH
1203			if (type & SSL_kEDH)
1204			{
1205			dhp=cert->dh_tmp;
1206			if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
1207				dhp=s->cert->dh_tmp_cb(s,
1208				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1209				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1210			if (dhp == NULL)
1211				{
1212				al=SSL_AD_HANDSHAKE_FAILURE;
1213				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1214				goto f_err;
1215				}
1216
1217			if (s->s3->tmp.dh != NULL)
1218				{
1219				DH_free(dh);
1220				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1221				goto err;
1222				}
1223
1224			if ((dh=DHparams_dup(dhp)) == NULL)
1225				{
1226				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1227				goto err;
1228				}
1229
1230			s->s3->tmp.dh=dh;
1231			if ((dhp->pub_key == NULL ||
1232			     dhp->priv_key == NULL ||
1233			     (s->options & SSL_OP_SINGLE_DH_USE)))
1234				{
1235				if(!DH_generate_key(dh))
1236				    {
1237				    SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
1238					   ERR_R_DH_LIB);
1239				    goto err;
1240				    }
1241				}
1242			else
1243				{
1244				dh->pub_key=BN_dup(dhp->pub_key);
1245				dh->priv_key=BN_dup(dhp->priv_key);
1246				if ((dh->pub_key == NULL) ||
1247					(dh->priv_key == NULL))
1248					{
1249					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1250					goto err;
1251					}
1252				}
1253			r[0]=dh->p;
1254			r[1]=dh->g;
1255			r[2]=dh->pub_key;
1256			}
1257		else
1258#endif
1259#ifndef OPENSSL_NO_ECDH
1260			if (type & SSL_kECDHE)
1261			{
1262			const EC_GROUP *group;
1263
1264			ecdhp=cert->ecdh_tmp;
1265			if ((ecdhp == NULL) && (s->cert->ecdh_tmp_cb != NULL))
1266				{
1267				ecdhp=s->cert->ecdh_tmp_cb(s,
1268				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1269				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1270				}
1271			if (ecdhp == NULL)
1272				{
1273				al=SSL_AD_HANDSHAKE_FAILURE;
1274				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_ECDH_KEY);
1275				goto f_err;
1276				}
1277
1278			if (s->s3->tmp.ecdh != NULL)
1279				{
1280				EC_KEY_free(s->s3->tmp.ecdh);
1281				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1282				goto err;
1283				}
1284
1285			/* Duplicate the ECDH structure. */
1286			if (ecdhp == NULL)
1287				{
1288				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1289				goto err;
1290				}
1291			if (!EC_KEY_up_ref(ecdhp))
1292				{
1293				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1294				goto err;
1295				}
1296			ecdh = ecdhp;
1297
1298			s->s3->tmp.ecdh=ecdh;
1299			if ((EC_KEY_get0_public_key(ecdh) == NULL) ||
1300			    (EC_KEY_get0_private_key(ecdh) == NULL) ||
1301			    (s->options & SSL_OP_SINGLE_ECDH_USE))
1302				{
1303				if(!EC_KEY_generate_key(ecdh))
1304				    {
1305				    SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1306				    goto err;
1307				    }
1308				}
1309
1310			if (((group = EC_KEY_get0_group(ecdh)) == NULL) ||
1311			    (EC_KEY_get0_public_key(ecdh)  == NULL) ||
1312			    (EC_KEY_get0_private_key(ecdh) == NULL))
1313				{
1314				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1315				goto err;
1316				}
1317
1318			if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
1319			    (EC_GROUP_get_degree(group) > 163))
1320				{
1321				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
1322				goto err;
1323				}
1324
1325			/* XXX: For now, we only support ephemeral ECDH
1326			 * keys over named (not generic) curves. For
1327			 * supported named curves, curve_id is non-zero.
1328			 */
1329			if ((curve_id =
1330			    nid2curve_id(EC_GROUP_get_curve_name(group)))
1331			    == 0)
1332				{
1333				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1334				goto err;
1335				}
1336
1337			/* Encode the public key.
1338			 * First check the size of encoding and
1339			 * allocate memory accordingly.
1340			 */
1341			encodedlen = EC_POINT_point2oct(group,
1342			    EC_KEY_get0_public_key(ecdh),
1343			    POINT_CONVERSION_UNCOMPRESSED,
1344			    NULL, 0, NULL);
1345
1346			encodedPoint = (unsigned char *)
1347			    OPENSSL_malloc(encodedlen*sizeof(unsigned char));
1348			bn_ctx = BN_CTX_new();
1349			if ((encodedPoint == NULL) || (bn_ctx == NULL))
1350				{
1351				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1352				goto err;
1353				}
1354
1355
1356			encodedlen = EC_POINT_point2oct(group,
1357			    EC_KEY_get0_public_key(ecdh),
1358			    POINT_CONVERSION_UNCOMPRESSED,
1359			    encodedPoint, encodedlen, bn_ctx);
1360
1361			if (encodedlen == 0)
1362				{
1363				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1364				goto err;
1365				}
1366
1367			BN_CTX_free(bn_ctx);  bn_ctx=NULL;
1368
1369			/* XXX: For now, we only support named (not
1370			 * generic) curves in ECDH ephemeral key exchanges.
1371			 * In this situation, we need four additional bytes
1372			 * to encode the entire ServerECDHParams
1373			 * structure.
1374			 */
1375			n = 4 + encodedlen;
1376
1377			/* We'll generate the serverKeyExchange message
1378			 * explicitly so we can set these to NULLs
1379			 */
1380			r[0]=NULL;
1381			r[1]=NULL;
1382			r[2]=NULL;
1383			r[3]=NULL;
1384			}
1385		else
1386#endif /* !OPENSSL_NO_ECDH */
1387			{
1388			al=SSL_AD_HANDSHAKE_FAILURE;
1389			SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1390			goto f_err;
1391			}
1392		for (i=0; r[i] != NULL; i++)
1393			{
1394			nr[i]=BN_num_bytes(r[i]);
1395			n+=2+nr[i];
1396			}
1397
1398		if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
1399			{
1400			if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
1401				== NULL)
1402				{
1403				al=SSL_AD_DECODE_ERROR;
1404				goto f_err;
1405				}
1406			kn=EVP_PKEY_size(pkey);
1407			}
1408		else
1409			{
1410			pkey=NULL;
1411			kn=0;
1412			}
1413
1414		if (!BUF_MEM_grow_clean(buf,n+4+kn))
1415			{
1416			SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1417			goto err;
1418			}
1419		d=(unsigned char *)s->init_buf->data;
1420		p= &(d[4]);
1421
1422		for (i=0; r[i] != NULL; i++)
1423			{
1424			s2n(nr[i],p);
1425			BN_bn2bin(r[i],p);
1426			p+=nr[i];
1427			}
1428
1429#ifndef OPENSSL_NO_ECDH
1430		if (type & SSL_kECDHE)
1431			{
1432			/* XXX: For now, we only support named (not generic) curves.
1433			 * In this situation, the serverKeyExchange message has:
1434			 * [1 byte CurveType], [2 byte CurveName]
1435			 * [1 byte length of encoded point], followed by
1436			 * the actual encoded point itself
1437			 */
1438			*p = NAMED_CURVE_TYPE;
1439			p += 1;
1440			*p = 0;
1441			p += 1;
1442			*p = curve_id;
1443			p += 1;
1444			*p = encodedlen;
1445			p += 1;
1446			memcpy((unsigned char*)p,
1447			    (unsigned char *)encodedPoint,
1448			    encodedlen);
1449			OPENSSL_free(encodedPoint);
1450			p += encodedlen;
1451			}
1452#endif
1453
1454		/* not anonymous */
1455		if (pkey != NULL)
1456			{
1457			/* n is the length of the params, they start at &(d[4])
1458			 * and p points to the space at the end. */
1459#ifndef OPENSSL_NO_RSA
1460			if (pkey->type == EVP_PKEY_RSA)
1461				{
1462				q=md_buf;
1463				j=0;
1464				for (num=2; num > 0; num--)
1465					{
1466					EVP_DigestInit_ex(&md_ctx,(num == 2)
1467						?s->ctx->md5:s->ctx->sha1, NULL);
1468					EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1469					EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1470					EVP_DigestUpdate(&md_ctx,&(d[4]),n);
1471					EVP_DigestFinal_ex(&md_ctx,q,
1472						(unsigned int *)&i);
1473					q+=i;
1474					j+=i;
1475					}
1476				if (RSA_sign(NID_md5_sha1, md_buf, j,
1477					&(p[2]), &u, pkey->pkey.rsa) <= 0)
1478					{
1479					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1480					goto err;
1481					}
1482				s2n(u,p);
1483				n+=u+2;
1484				}
1485			else
1486#endif
1487#if !defined(OPENSSL_NO_DSA)
1488				if (pkey->type == EVP_PKEY_DSA)
1489				{
1490				/* lets do DSS */
1491				EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
1492				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1493				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1494				EVP_SignUpdate(&md_ctx,&(d[4]),n);
1495				if (!EVP_SignFinal(&md_ctx,&(p[2]),
1496					(unsigned int *)&i,pkey))
1497					{
1498					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1499					goto err;
1500					}
1501				s2n(i,p);
1502				n+=i+2;
1503				}
1504			else
1505#endif
1506#if !defined(OPENSSL_NO_ECDSA)
1507				if (pkey->type == EVP_PKEY_EC)
1508				{
1509				/* let's do ECDSA */
1510				EVP_SignInit_ex(&md_ctx,EVP_ecdsa(), NULL);
1511				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1512				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1513				EVP_SignUpdate(&md_ctx,&(d[4]),n);
1514				if (!EVP_SignFinal(&md_ctx,&(p[2]),
1515					(unsigned int *)&i,pkey))
1516					{
1517					SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_ECDSA);
1518					goto err;
1519					}
1520				s2n(i,p);
1521				n+=i+2;
1522				}
1523			else
1524#endif
1525				{
1526				/* Is this error check actually needed? */
1527				al=SSL_AD_HANDSHAKE_FAILURE;
1528				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1529				goto f_err;
1530				}
1531			}
1532
1533		*(d++)=SSL3_MT_SERVER_KEY_EXCHANGE;
1534		l2n3(n,d);
1535
1536		/* we should now have things packed up, so lets send
1537		 * it off */
1538		s->init_num=n+4;
1539		s->init_off=0;
1540		}
1541
1542	s->state = SSL3_ST_SW_KEY_EXCH_B;
1543	EVP_MD_CTX_cleanup(&md_ctx);
1544	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1545f_err:
1546	ssl3_send_alert(s,SSL3_AL_FATAL,al);
1547err:
1548#ifndef OPENSSL_NO_ECDH
1549	if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1550	BN_CTX_free(bn_ctx);
1551#endif
1552	EVP_MD_CTX_cleanup(&md_ctx);
1553	return(-1);
1554	}
1555
1556int ssl3_send_certificate_request(SSL *s)
1557	{
1558	unsigned char *p,*d;
1559	int i,j,nl,off,n;
1560	STACK_OF(X509_NAME) *sk=NULL;
1561	X509_NAME *name;
1562	BUF_MEM *buf;
1563
1564	if (s->state == SSL3_ST_SW_CERT_REQ_A)
1565		{
1566		buf=s->init_buf;
1567
1568		d=p=(unsigned char *)&(buf->data[4]);
1569
1570		/* get the list of acceptable cert types */
1571		p++;
1572		n=ssl3_get_req_cert_type(s,p);
1573		d[0]=n;
1574		p+=n;
1575		n++;
1576
1577		off=n;
1578		p+=2;
1579		n+=2;
1580
1581		sk=SSL_get_client_CA_list(s);
1582		nl=0;
1583		if (sk != NULL)
1584			{
1585			for (i=0; i<sk_X509_NAME_num(sk); i++)
1586				{
1587				name=sk_X509_NAME_value(sk,i);
1588				j=i2d_X509_NAME(name,NULL);
1589				if (!BUF_MEM_grow_clean(buf,4+n+j+2))
1590					{
1591					SSLerr(SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1592					goto err;
1593					}
1594				p=(unsigned char *)&(buf->data[4+n]);
1595				if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1596					{
1597					s2n(j,p);
1598					i2d_X509_NAME(name,&p);
1599					n+=2+j;
1600					nl+=2+j;
1601					}
1602				else
1603					{
1604					d=p;
1605					i2d_X509_NAME(name,&p);
1606					j-=2; s2n(j,d); j+=2;
1607					n+=j;
1608					nl+=j;
1609					}
1610				}
1611			}
1612		/* else no CA names */
1613		p=(unsigned char *)&(buf->data[4+off]);
1614		s2n(nl,p);
1615
1616		d=(unsigned char *)buf->data;
1617		*(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1618		l2n3(n,d);
1619
1620		/* we should now have things packed up, so lets send
1621		 * it off */
1622
1623		s->init_num=n+4;
1624		s->init_off=0;
1625#ifdef NETSCAPE_HANG_BUG
1626		p=(unsigned char *)s->init_buf->data + s->init_num;
1627
1628		/* do the header */
1629		*(p++)=SSL3_MT_SERVER_DONE;
1630		*(p++)=0;
1631		*(p++)=0;
1632		*(p++)=0;
1633		s->init_num += 4;
1634#endif
1635
1636		s->state = SSL3_ST_SW_CERT_REQ_B;
1637		}
1638
1639	/* SSL3_ST_SW_CERT_REQ_B */
1640	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1641err:
1642	return(-1);
1643	}
1644
1645int ssl3_get_client_key_exchange(SSL *s)
1646	{
1647	int i,al,ok;
1648	long n;
1649	unsigned long l;
1650	unsigned char *p;
1651#ifndef OPENSSL_NO_RSA
1652	RSA *rsa=NULL;
1653	EVP_PKEY *pkey=NULL;
1654#endif
1655#ifndef OPENSSL_NO_DH
1656	BIGNUM *pub=NULL;
1657	DH *dh_srvr;
1658#endif
1659#ifndef OPENSSL_NO_KRB5
1660        KSSL_ERR kssl_err;
1661#endif /* OPENSSL_NO_KRB5 */
1662
1663#ifndef OPENSSL_NO_ECDH
1664	EC_KEY *srvr_ecdh = NULL;
1665	EVP_PKEY *clnt_pub_pkey = NULL;
1666	EC_POINT *clnt_ecpoint = NULL;
1667	BN_CTX *bn_ctx = NULL;
1668#endif
1669
1670	n=s->method->ssl_get_message(s,
1671		SSL3_ST_SR_KEY_EXCH_A,
1672		SSL3_ST_SR_KEY_EXCH_B,
1673		SSL3_MT_CLIENT_KEY_EXCHANGE,
1674		2048, /* ??? */
1675		&ok);
1676
1677	if (!ok) return((int)n);
1678	p=(unsigned char *)s->init_msg;
1679
1680	l=s->s3->tmp.new_cipher->algorithms;
1681
1682#ifndef OPENSSL_NO_RSA
1683	if (l & SSL_kRSA)
1684		{
1685		/* FIX THIS UP EAY EAY EAY EAY */
1686		if (s->s3->tmp.use_rsa_tmp)
1687			{
1688			if ((s->cert != NULL) && (s->cert->rsa_tmp != NULL))
1689				rsa=s->cert->rsa_tmp;
1690			/* Don't do a callback because rsa_tmp should
1691			 * be sent already */
1692			if (rsa == NULL)
1693				{
1694				al=SSL_AD_HANDSHAKE_FAILURE;
1695				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_PKEY);
1696				goto f_err;
1697
1698				}
1699			}
1700		else
1701			{
1702			pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1703			if (	(pkey == NULL) ||
1704				(pkey->type != EVP_PKEY_RSA) ||
1705				(pkey->pkey.rsa == NULL))
1706				{
1707				al=SSL_AD_HANDSHAKE_FAILURE;
1708				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_RSA_CERTIFICATE);
1709				goto f_err;
1710				}
1711			rsa=pkey->pkey.rsa;
1712			}
1713
1714		/* TLS */
1715		if (s->version > SSL3_VERSION)
1716			{
1717			n2s(p,i);
1718			if (n != i+2)
1719				{
1720				if (!(s->options & SSL_OP_TLS_D5_BUG))
1721					{
1722					SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
1723					goto err;
1724					}
1725				else
1726					p-=2;
1727				}
1728			else
1729				n=i;
1730			}
1731
1732		i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
1733
1734		al = -1;
1735
1736		if (i != SSL_MAX_MASTER_KEY_LENGTH)
1737			{
1738			al=SSL_AD_DECODE_ERROR;
1739			/* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */
1740			}
1741
1742		if ((al == -1) && !((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
1743			{
1744			/* The premaster secret must contain the same version number as the
1745			 * ClientHello to detect version rollback attacks (strangely, the
1746			 * protocol does not offer such protection for DH ciphersuites).
1747			 * However, buggy clients exist that send the negotiated protocol
1748			 * version instead if the server does not support the requested
1749			 * protocol version.
1750			 * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such clients. */
1751			if (!((s->options & SSL_OP_TLS_ROLLBACK_BUG) &&
1752				(p[0] == (s->version>>8)) && (p[1] == (s->version & 0xff))))
1753				{
1754				al=SSL_AD_DECODE_ERROR;
1755				/* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER); */
1756
1757				/* The Klima-Pokorny-Rosa extension of Bleichenbacher's attack
1758				 * (http://eprint.iacr.org/2003/052/) exploits the version
1759				 * number check as a "bad version oracle" -- an alert would
1760				 * reveal that the plaintext corresponding to some ciphertext
1761				 * made up by the adversary is properly formatted except
1762				 * that the version number is wrong.  To avoid such attacks,
1763				 * we should treat this just like any other decryption error. */
1764				}
1765			}
1766
1767		if (al != -1)
1768			{
1769			/* Some decryption failure -- use random value instead as countermeasure
1770			 * against Bleichenbacher's attack on PKCS #1 v1.5 RSA padding
1771			 * (see RFC 2246, section 7.4.7.1). */
1772			ERR_clear_error();
1773			i = SSL_MAX_MASTER_KEY_LENGTH;
1774			p[0] = s->client_version >> 8;
1775			p[1] = s->client_version & 0xff;
1776			if (RAND_pseudo_bytes(p+2, i-2) <= 0) /* should be RAND_bytes, but we cannot work around a failure */
1777				goto err;
1778			}
1779
1780		s->session->master_key_length=
1781			s->method->ssl3_enc->generate_master_secret(s,
1782				s->session->master_key,
1783				p,i);
1784		OPENSSL_cleanse(p,i);
1785		}
1786	else
1787#endif
1788#ifndef OPENSSL_NO_DH
1789		if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1790		{
1791		n2s(p,i);
1792		if (n != i+2)
1793			{
1794			if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG))
1795				{
1796				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1797				goto err;
1798				}
1799			else
1800				{
1801				p-=2;
1802				i=(int)n;
1803				}
1804			}
1805
1806		if (n == 0L) /* the parameters are in the cert */
1807			{
1808			al=SSL_AD_HANDSHAKE_FAILURE;
1809			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_DECODE_DH_CERTS);
1810			goto f_err;
1811			}
1812		else
1813			{
1814			if (s->s3->tmp.dh == NULL)
1815				{
1816				al=SSL_AD_HANDSHAKE_FAILURE;
1817				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1818				goto f_err;
1819				}
1820			else
1821				dh_srvr=s->s3->tmp.dh;
1822			}
1823
1824		pub=BN_bin2bn(p,i,NULL);
1825		if (pub == NULL)
1826			{
1827			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BN_LIB);
1828			goto err;
1829			}
1830
1831		i=DH_compute_key(p,pub,dh_srvr);
1832
1833		if (i <= 0)
1834			{
1835			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1836			goto err;
1837			}
1838
1839		DH_free(s->s3->tmp.dh);
1840		s->s3->tmp.dh=NULL;
1841
1842		BN_clear_free(pub);
1843		pub=NULL;
1844		s->session->master_key_length=
1845			s->method->ssl3_enc->generate_master_secret(s,
1846				s->session->master_key,p,i);
1847		OPENSSL_cleanse(p,i);
1848		}
1849	else
1850#endif
1851#ifndef OPENSSL_NO_KRB5
1852        if (l & SSL_kKRB5)
1853                {
1854                krb5_error_code		krb5rc;
1855		krb5_data		enc_ticket;
1856		krb5_data		authenticator;
1857		krb5_data		enc_pms;
1858                KSSL_CTX		*kssl_ctx = s->kssl_ctx;
1859		EVP_CIPHER_CTX		ciph_ctx;
1860		EVP_CIPHER		*enc = NULL;
1861		unsigned char		iv[EVP_MAX_IV_LENGTH];
1862		unsigned char		pms[SSL_MAX_MASTER_KEY_LENGTH
1863                                               + EVP_MAX_BLOCK_LENGTH];
1864		int                     padl, outl;
1865		krb5_timestamp		authtime = 0;
1866		krb5_ticket_times	ttimes;
1867
1868		EVP_CIPHER_CTX_init(&ciph_ctx);
1869
1870                if (!kssl_ctx)  kssl_ctx = kssl_ctx_new();
1871
1872		n2s(p,i);
1873		enc_ticket.length = i;
1874
1875		if (n < (int)enc_ticket.length + 6)
1876			{
1877			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1878				SSL_R_DATA_LENGTH_TOO_LONG);
1879			goto err;
1880			}
1881
1882		enc_ticket.data = (char *)p;
1883		p+=enc_ticket.length;
1884
1885		n2s(p,i);
1886		authenticator.length = i;
1887
1888		if (n < (int)(enc_ticket.length + authenticator.length) + 6)
1889			{
1890			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1891				SSL_R_DATA_LENGTH_TOO_LONG);
1892			goto err;
1893			}
1894
1895		authenticator.data = (char *)p;
1896		p+=authenticator.length;
1897
1898		n2s(p,i);
1899		enc_pms.length = i;
1900		enc_pms.data = (char *)p;
1901		p+=enc_pms.length;
1902
1903		/* Note that the length is checked again below,
1904		** after decryption
1905		*/
1906		if(enc_pms.length > sizeof pms)
1907			{
1908			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1909			       SSL_R_DATA_LENGTH_TOO_LONG);
1910			goto err;
1911			}
1912
1913		if (n != (long)(enc_ticket.length + authenticator.length +
1914						enc_pms.length + 6))
1915			{
1916			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1917				SSL_R_DATA_LENGTH_TOO_LONG);
1918			goto err;
1919			}
1920
1921                if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes,
1922					&kssl_err)) != 0)
1923                        {
1924#ifdef KSSL_DEBUG
1925                        printf("kssl_sget_tkt rtn %d [%d]\n",
1926                                krb5rc, kssl_err.reason);
1927                        if (kssl_err.text)
1928                                printf("kssl_err text= %s\n", kssl_err.text);
1929#endif	/* KSSL_DEBUG */
1930                        SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1931                                kssl_err.reason);
1932                        goto err;
1933                        }
1934
1935		/*  Note: no authenticator is not considered an error,
1936		**  but will return authtime == 0.
1937		*/
1938		if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator,
1939					&authtime, &kssl_err)) != 0)
1940			{
1941#ifdef KSSL_DEBUG
1942                        printf("kssl_check_authent rtn %d [%d]\n",
1943                                krb5rc, kssl_err.reason);
1944                        if (kssl_err.text)
1945                                printf("kssl_err text= %s\n", kssl_err.text);
1946#endif	/* KSSL_DEBUG */
1947                        SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1948                                kssl_err.reason);
1949                        goto err;
1950			}
1951
1952		if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0)
1953			{
1954			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, krb5rc);
1955                        goto err;
1956			}
1957
1958#ifdef KSSL_DEBUG
1959                kssl_ctx_show(kssl_ctx);
1960#endif	/* KSSL_DEBUG */
1961
1962		enc = kssl_map_enc(kssl_ctx->enctype);
1963                if (enc == NULL)
1964                    goto err;
1965
1966		memset(iv, 0, sizeof iv);	/* per RFC 1510 */
1967
1968		if (!EVP_DecryptInit_ex(&ciph_ctx,enc,NULL,kssl_ctx->key,iv))
1969			{
1970			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1971				SSL_R_DECRYPTION_FAILED);
1972			goto err;
1973			}
1974		if (!EVP_DecryptUpdate(&ciph_ctx, pms,&outl,
1975					(unsigned char *)enc_pms.data, enc_pms.length))
1976			{
1977			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1978				SSL_R_DECRYPTION_FAILED);
1979			goto err;
1980			}
1981		if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1982			{
1983			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1984				SSL_R_DATA_LENGTH_TOO_LONG);
1985			goto err;
1986			}
1987		if (!EVP_DecryptFinal_ex(&ciph_ctx,&(pms[outl]),&padl))
1988			{
1989			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1990				SSL_R_DECRYPTION_FAILED);
1991			goto err;
1992			}
1993		outl += padl;
1994		if (outl > SSL_MAX_MASTER_KEY_LENGTH)
1995			{
1996			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
1997				SSL_R_DATA_LENGTH_TOO_LONG);
1998			goto err;
1999			}
2000		if (!((p[0] == (s->client_version>>8)) && (p[1] == (s->client_version & 0xff))))
2001		    {
2002		    /* The premaster secret must contain the same version number as the
2003		     * ClientHello to detect version rollback attacks (strangely, the
2004		     * protocol does not offer such protection for DH ciphersuites).
2005		     * However, buggy clients exist that send random bytes instead of
2006		     * the protocol version.
2007		     * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such clients.
2008		     * (Perhaps we should have a separate BUG value for the Kerberos cipher)
2009		     */
2010		    if (!((s->options & SSL_OP_TLS_ROLLBACK_BUG) &&
2011			   (p[0] == (s->version>>8)) && (p[1] == (s->version & 0xff))))
2012		        {
2013			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2014			       SSL_AD_DECODE_ERROR);
2015			goto err;
2016			}
2017		    }
2018
2019		EVP_CIPHER_CTX_cleanup(&ciph_ctx);
2020
2021                s->session->master_key_length=
2022                        s->method->ssl3_enc->generate_master_secret(s,
2023                                s->session->master_key, pms, outl);
2024
2025                if (kssl_ctx->client_princ)
2026                        {
2027                        size_t len = strlen(kssl_ctx->client_princ);
2028                        if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
2029                                {
2030                                s->session->krb5_client_princ_len = len;
2031                                memcpy(s->session->krb5_client_princ,kssl_ctx->client_princ,len);
2032                                }
2033                        }
2034
2035
2036                /*  Was doing kssl_ctx_free() here,
2037		**  but it caused problems for apache.
2038                **  kssl_ctx = kssl_ctx_free(kssl_ctx);
2039                **  if (s->kssl_ctx)  s->kssl_ctx = NULL;
2040                */
2041                }
2042	else
2043#endif	/* OPENSSL_NO_KRB5 */
2044
2045#ifndef OPENSSL_NO_ECDH
2046		if ((l & SSL_kECDH) || (l & SSL_kECDHE))
2047		{
2048		int ret = 1;
2049		int field_size = 0;
2050		const EC_KEY   *tkey;
2051		const EC_GROUP *group;
2052		const BIGNUM *priv_key;
2053
2054                /* initialize structures for server's ECDH key pair */
2055		if ((srvr_ecdh = EC_KEY_new()) == NULL)
2056			{
2057                	SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2058			    ERR_R_MALLOC_FAILURE);
2059                	goto err;
2060			}
2061
2062		/* Let's get server private key and group information */
2063		if (l & SSL_kECDH)
2064			{
2065                        /* use the certificate */
2066			tkey = s->cert->pkeys[SSL_PKEY_ECC].privatekey->pkey.ec;
2067			}
2068		else
2069			{
2070			/* use the ephermeral values we saved when
2071			 * generating the ServerKeyExchange msg.
2072			 */
2073			tkey = s->s3->tmp.ecdh;
2074			}
2075
2076		group    = EC_KEY_get0_group(tkey);
2077		priv_key = EC_KEY_get0_private_key(tkey);
2078
2079		if (!EC_KEY_set_group(srvr_ecdh, group) ||
2080		    !EC_KEY_set_private_key(srvr_ecdh, priv_key))
2081			{
2082			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2083			       ERR_R_EC_LIB);
2084			goto err;
2085			}
2086
2087		/* Let's get client's public key */
2088		if ((clnt_ecpoint = EC_POINT_new(group)) == NULL)
2089			{
2090			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2091			    ERR_R_MALLOC_FAILURE);
2092			goto err;
2093			}
2094
2095                if (n == 0L)
2096                        {
2097			/* Client Publickey was in Client Certificate */
2098
2099			 if (l & SSL_kECDHE)
2100				 {
2101				 al=SSL_AD_HANDSHAKE_FAILURE;
2102				 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_ECDH_KEY);
2103				 goto f_err;
2104				 }
2105                        if (((clnt_pub_pkey=X509_get_pubkey(s->session->peer))
2106			    == NULL) ||
2107			    (clnt_pub_pkey->type != EVP_PKEY_EC))
2108                        	{
2109				/* XXX: For now, we do not support client
2110				 * authentication using ECDH certificates
2111				 * so this branch (n == 0L) of the code is
2112				 * never executed. When that support is
2113				 * added, we ought to ensure the key
2114				 * received in the certificate is
2115				 * authorized for key agreement.
2116				 * ECDH_compute_key implicitly checks that
2117				 * the two ECDH shares are for the same
2118				 * group.
2119				 */
2120                           	al=SSL_AD_HANDSHAKE_FAILURE;
2121                           	SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2122				    SSL_R_UNABLE_TO_DECODE_ECDH_CERTS);
2123                           	goto f_err;
2124                           	}
2125
2126			if (EC_POINT_copy(clnt_ecpoint,
2127			    EC_KEY_get0_public_key(clnt_pub_pkey->pkey.ec)) == 0)
2128				{
2129				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2130					ERR_R_EC_LIB);
2131				goto err;
2132				}
2133                        ret = 2; /* Skip certificate verify processing */
2134                        }
2135                else
2136                        {
2137			/* Get client's public key from encoded point
2138			 * in the ClientKeyExchange message.
2139			 */
2140			if ((bn_ctx = BN_CTX_new()) == NULL)
2141				{
2142				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2143				    ERR_R_MALLOC_FAILURE);
2144				goto err;
2145				}
2146
2147                        /* Get encoded point length */
2148                        i = *p;
2149			p += 1;
2150                        if (EC_POINT_oct2point(group,
2151			    clnt_ecpoint, p, i, bn_ctx) == 0)
2152				{
2153				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2154				    ERR_R_EC_LIB);
2155				goto err;
2156				}
2157                        /* p is pointing to somewhere in the buffer
2158                         * currently, so set it to the start
2159                         */
2160                        p=(unsigned char *)s->init_buf->data;
2161                        }
2162
2163		/* Compute the shared pre-master secret */
2164		field_size = EC_GROUP_get_degree(group);
2165		if (field_size <= 0)
2166			{
2167			SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2168			       ERR_R_ECDH_LIB);
2169			goto err;
2170			}
2171		i = ECDH_compute_key(p, (field_size+7)/8, clnt_ecpoint, srvr_ecdh, NULL);
2172                if (i <= 0)
2173                        {
2174                        SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2175			    ERR_R_ECDH_LIB);
2176                        goto err;
2177                        }
2178
2179		EVP_PKEY_free(clnt_pub_pkey);
2180		EC_POINT_free(clnt_ecpoint);
2181		if (srvr_ecdh != NULL)
2182			EC_KEY_free(srvr_ecdh);
2183		BN_CTX_free(bn_ctx);
2184
2185		/* Compute the master secret */
2186                s->session->master_key_length = s->method->ssl3_enc-> \
2187		    generate_master_secret(s, s->session->master_key, p, i);
2188
2189                OPENSSL_cleanse(p, i);
2190                return (ret);
2191		}
2192	else
2193#endif
2194		{
2195		al=SSL_AD_HANDSHAKE_FAILURE;
2196		SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
2197				SSL_R_UNKNOWN_CIPHER_TYPE);
2198		goto f_err;
2199		}
2200
2201	return(1);
2202f_err:
2203	ssl3_send_alert(s,SSL3_AL_FATAL,al);
2204#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_ECDH)
2205err:
2206#endif
2207#ifndef OPENSSL_NO_ECDH
2208	EVP_PKEY_free(clnt_pub_pkey);
2209	EC_POINT_free(clnt_ecpoint);
2210	if (srvr_ecdh != NULL)
2211		EC_KEY_free(srvr_ecdh);
2212	BN_CTX_free(bn_ctx);
2213#endif
2214	return(-1);
2215	}
2216
2217int ssl3_get_cert_verify(SSL *s)
2218	{
2219	EVP_PKEY *pkey=NULL;
2220	unsigned char *p;
2221	int al,ok,ret=0;
2222	long n;
2223	int type=0,i,j;
2224	X509 *peer;
2225
2226	n=s->method->ssl_get_message(s,
2227		SSL3_ST_SR_CERT_VRFY_A,
2228		SSL3_ST_SR_CERT_VRFY_B,
2229		-1,
2230		514, /* 514? */
2231		&ok);
2232
2233	if (!ok) return((int)n);
2234
2235	if (s->session->peer != NULL)
2236		{
2237		peer=s->session->peer;
2238		pkey=X509_get_pubkey(peer);
2239		type=X509_certificate_type(peer,pkey);
2240		}
2241	else
2242		{
2243		peer=NULL;
2244		pkey=NULL;
2245		}
2246
2247	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
2248		{
2249		s->s3->tmp.reuse_message=1;
2250		if ((peer != NULL) && (type | EVP_PKT_SIGN))
2251			{
2252			al=SSL_AD_UNEXPECTED_MESSAGE;
2253			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
2254			goto f_err;
2255			}
2256		ret=1;
2257		goto end;
2258		}
2259
2260	if (peer == NULL)
2261		{
2262		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_NO_CLIENT_CERT_RECEIVED);
2263		al=SSL_AD_UNEXPECTED_MESSAGE;
2264		goto f_err;
2265		}
2266
2267	if (!(type & EVP_PKT_SIGN))
2268		{
2269		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
2270		al=SSL_AD_ILLEGAL_PARAMETER;
2271		goto f_err;
2272		}
2273
2274	if (s->s3->change_cipher_spec)
2275		{
2276		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY);
2277		al=SSL_AD_UNEXPECTED_MESSAGE;
2278		goto f_err;
2279		}
2280
2281	/* we now have a signature that we need to verify */
2282	p=(unsigned char *)s->init_msg;
2283	n2s(p,i);
2284	n-=2;
2285	if (i > n)
2286		{
2287		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_LENGTH_MISMATCH);
2288		al=SSL_AD_DECODE_ERROR;
2289		goto f_err;
2290		}
2291
2292	j=EVP_PKEY_size(pkey);
2293	if ((i > j) || (n > j) || (n <= 0))
2294		{
2295		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_WRONG_SIGNATURE_SIZE);
2296		al=SSL_AD_DECODE_ERROR;
2297		goto f_err;
2298		}
2299
2300#ifndef OPENSSL_NO_RSA
2301	if (pkey->type == EVP_PKEY_RSA)
2302		{
2303		i=RSA_verify(NID_md5_sha1, s->s3->tmp.cert_verify_md,
2304			MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH, p, i,
2305							pkey->pkey.rsa);
2306		if (i < 0)
2307			{
2308			al=SSL_AD_DECRYPT_ERROR;
2309			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
2310			goto f_err;
2311			}
2312		if (i == 0)
2313			{
2314			al=SSL_AD_DECRYPT_ERROR;
2315			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
2316			goto f_err;
2317			}
2318		}
2319	else
2320#endif
2321#ifndef OPENSSL_NO_DSA
2322		if (pkey->type == EVP_PKEY_DSA)
2323		{
2324		j=DSA_verify(pkey->save_type,
2325			&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
2326			SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
2327		if (j <= 0)
2328			{
2329			/* bad signature */
2330			al=SSL_AD_DECRYPT_ERROR;
2331			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_DSA_SIGNATURE);
2332			goto f_err;
2333			}
2334		}
2335	else
2336#endif
2337#ifndef OPENSSL_NO_ECDSA
2338		if (pkey->type == EVP_PKEY_EC)
2339		{
2340		j=ECDSA_verify(pkey->save_type,
2341			&(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]),
2342			SHA_DIGEST_LENGTH,p,i,pkey->pkey.ec);
2343		if (j <= 0)
2344			{
2345			/* bad signature */
2346			al=SSL_AD_DECRYPT_ERROR;
2347			SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,
2348			    SSL_R_BAD_ECDSA_SIGNATURE);
2349			goto f_err;
2350			}
2351		}
2352	else
2353#endif
2354		{
2355		SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,ERR_R_INTERNAL_ERROR);
2356		al=SSL_AD_UNSUPPORTED_CERTIFICATE;
2357		goto f_err;
2358		}
2359
2360
2361	ret=1;
2362	if (0)
2363		{
2364f_err:
2365		ssl3_send_alert(s,SSL3_AL_FATAL,al);
2366		}
2367end:
2368	EVP_PKEY_free(pkey);
2369	return(ret);
2370	}
2371
2372int ssl3_get_client_certificate(SSL *s)
2373	{
2374	int i,ok,al,ret= -1;
2375	X509 *x=NULL;
2376	unsigned long l,nc,llen,n;
2377	const unsigned char *p,*q;
2378	unsigned char *d;
2379	STACK_OF(X509) *sk=NULL;
2380
2381	n=s->method->ssl_get_message(s,
2382		SSL3_ST_SR_CERT_A,
2383		SSL3_ST_SR_CERT_B,
2384		-1,
2385		s->max_cert_list,
2386		&ok);
2387
2388	if (!ok) return((int)n);
2389
2390	if	(s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
2391		{
2392		if (	(s->verify_mode & SSL_VERIFY_PEER) &&
2393			(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
2394			{
2395			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
2396			al=SSL_AD_HANDSHAKE_FAILURE;
2397			goto f_err;
2398			}
2399		/* If tls asked for a client cert, the client must return a 0 list */
2400		if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
2401			{
2402			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
2403			al=SSL_AD_UNEXPECTED_MESSAGE;
2404			goto f_err;
2405			}
2406		s->s3->tmp.reuse_message=1;
2407		return(1);
2408		}
2409
2410	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
2411		{
2412		al=SSL_AD_UNEXPECTED_MESSAGE;
2413		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
2414		goto f_err;
2415		}
2416	p=d=(unsigned char *)s->init_msg;
2417
2418	if ((sk=sk_X509_new_null()) == NULL)
2419		{
2420		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
2421		goto err;
2422		}
2423
2424	n2l3(p,llen);
2425	if (llen+3 != n)
2426		{
2427		al=SSL_AD_DECODE_ERROR;
2428		SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
2429		goto f_err;
2430		}
2431	for (nc=0; nc<llen; )
2432		{
2433		n2l3(p,l);
2434		if ((l+nc+3) > llen)
2435			{
2436			al=SSL_AD_DECODE_ERROR;
2437			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
2438			goto f_err;
2439			}
2440
2441		q=p;
2442		x=d2i_X509(NULL,&p,l);
2443		if (x == NULL)
2444			{
2445			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_ASN1_LIB);
2446			goto err;
2447			}
2448		if (p != (q+l))
2449			{
2450			al=SSL_AD_DECODE_ERROR;
2451			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
2452			goto f_err;
2453			}
2454		if (!sk_X509_push(sk,x))
2455			{
2456			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
2457			goto err;
2458			}
2459		x=NULL;
2460		nc+=l+3;
2461		}
2462
2463	if (sk_X509_num(sk) <= 0)
2464		{
2465		/* TLS does not mind 0 certs returned */
2466		if (s->version == SSL3_VERSION)
2467			{
2468			al=SSL_AD_HANDSHAKE_FAILURE;
2469			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATES_RETURNED);
2470			goto f_err;
2471			}
2472		/* Fail for TLS only if we required a certificate */
2473		else if ((s->verify_mode & SSL_VERIFY_PEER) &&
2474			 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
2475			{
2476			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
2477			al=SSL_AD_HANDSHAKE_FAILURE;
2478			goto f_err;
2479			}
2480		}
2481	else
2482		{
2483		i=ssl_verify_cert_chain(s,sk);
2484		if (i <= 0)
2485			{
2486			al=ssl_verify_alarm_type(s->verify_result);
2487			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
2488			goto f_err;
2489			}
2490		}
2491
2492	if (s->session->peer != NULL) /* This should not be needed */
2493		X509_free(s->session->peer);
2494	s->session->peer=sk_X509_shift(sk);
2495	s->session->verify_result = s->verify_result;
2496
2497	/* With the current implementation, sess_cert will always be NULL
2498	 * when we arrive here. */
2499	if (s->session->sess_cert == NULL)
2500		{
2501		s->session->sess_cert = ssl_sess_cert_new();
2502		if (s->session->sess_cert == NULL)
2503			{
2504			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, ERR_R_MALLOC_FAILURE);
2505			goto err;
2506			}
2507		}
2508	if (s->session->sess_cert->cert_chain != NULL)
2509		sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
2510	s->session->sess_cert->cert_chain=sk;
2511	/* Inconsistency alert: cert_chain does *not* include the
2512	 * peer's own certificate, while we do include it in s3_clnt.c */
2513
2514	sk=NULL;
2515
2516	ret=1;
2517	if (0)
2518		{
2519f_err:
2520		ssl3_send_alert(s,SSL3_AL_FATAL,al);
2521		}
2522err:
2523	if (x != NULL) X509_free(x);
2524	if (sk != NULL) sk_X509_pop_free(sk,X509_free);
2525	return(ret);
2526	}
2527
2528int ssl3_send_server_certificate(SSL *s)
2529	{
2530	unsigned long l;
2531	X509 *x;
2532
2533	if (s->state == SSL3_ST_SW_CERT_A)
2534		{
2535		x=ssl_get_server_send_cert(s);
2536		if (x == NULL &&
2537                        /* VRS: allow null cert if auth == KRB5 */
2538                        (s->s3->tmp.new_cipher->algorithms
2539                                & (SSL_MKEY_MASK|SSL_AUTH_MASK))
2540                        != (SSL_aKRB5|SSL_kKRB5))
2541			{
2542			SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
2543			return(0);
2544			}
2545
2546		l=ssl3_output_cert_chain(s,x);
2547		s->state=SSL3_ST_SW_CERT_B;
2548		s->init_num=(int)l;
2549		s->init_off=0;
2550		}
2551
2552	/* SSL3_ST_SW_CERT_B */
2553	return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2554	}
2555
2556
2557#ifndef OPENSSL_NO_ECDH
2558/* This is the complement of curve_id2nid in s3_clnt.c. */
2559static int nid2curve_id(int nid)
2560{
2561	/* ECC curves from draft-ietf-tls-ecc-01.txt (Mar 15, 2001)
2562	 * (no changes in draft-ietf-tls-ecc-03.txt [June 2003]) */
2563	switch (nid) {
2564	case NID_sect163k1: /* sect163k1 (1) */
2565		return 1;
2566	case NID_sect163r1: /* sect163r1 (2) */
2567		return 2;
2568	case NID_sect163r2: /* sect163r2 (3) */
2569		return 3;
2570	case NID_sect193r1: /* sect193r1 (4) */
2571		return 4;
2572	case NID_sect193r2: /* sect193r2 (5) */
2573		return 5;
2574	case NID_sect233k1: /* sect233k1 (6) */
2575		return 6;
2576	case NID_sect233r1: /* sect233r1 (7) */
2577		return 7;
2578	case NID_sect239k1: /* sect239k1 (8) */
2579		return 8;
2580	case NID_sect283k1: /* sect283k1 (9) */
2581		return 9;
2582	case NID_sect283r1: /* sect283r1 (10) */
2583		return 10;
2584	case NID_sect409k1: /* sect409k1 (11) */
2585		return 11;
2586	case NID_sect409r1: /* sect409r1 (12) */
2587		return 12;
2588	case NID_sect571k1: /* sect571k1 (13) */
2589		return 13;
2590	case NID_sect571r1: /* sect571r1 (14) */
2591		return 14;
2592	case NID_secp160k1: /* secp160k1 (15) */
2593		return 15;
2594	case NID_secp160r1: /* secp160r1 (16) */
2595		return 16;
2596	case NID_secp160r2: /* secp160r2 (17) */
2597		return 17;
2598	case NID_secp192k1: /* secp192k1 (18) */
2599		return 18;
2600	case NID_X9_62_prime192v1: /* secp192r1 (19) */
2601		return 19;
2602	case NID_secp224k1: /* secp224k1 (20) */
2603		return 20;
2604	case NID_secp224r1: /* secp224r1 (21) */
2605		return 21;
2606	case NID_secp256k1: /* secp256k1 (22) */
2607		return 22;
2608	case NID_X9_62_prime256v1: /* secp256r1 (23) */
2609		return 23;
2610	case NID_secp384r1: /* secp384r1 (24) */
2611		return 24;
2612	case NID_secp521r1:  /* secp521r1 (25) */
2613		return 25;
2614	default:
2615		return 0;
2616	}
2617}
2618#endif
2619