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