1/* ssl/s2_clnt.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-2001 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#include "ssl_locl.h"
113#ifndef OPENSSL_NO_SSL2
114#include <stdio.h>
115#include <openssl/rand.h>
116#include <openssl/buffer.h>
117#include <openssl/objects.h>
118#include <openssl/evp.h>
119
120static const SSL_METHOD *ssl2_get_client_method(int ver);
121static int get_server_finished(SSL *s);
122static int get_server_verify(SSL *s);
123static int get_server_hello(SSL *s);
124static int client_hello(SSL *s);
125static int client_master_key(SSL *s);
126static int client_finished(SSL *s);
127static int client_certificate(SSL *s);
128static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
129	unsigned char *to,int padding);
130#define BREAK	break
131
132static const SSL_METHOD *ssl2_get_client_method(int ver)
133	{
134	if (ver == SSL2_VERSION)
135		return(SSLv2_client_method());
136	else
137		return(NULL);
138	}
139
140IMPLEMENT_ssl2_meth_func(SSLv2_client_method,
141			ssl_undefined_function,
142			ssl2_connect,
143			ssl2_get_client_method)
144
145int ssl2_connect(SSL *s)
146	{
147	unsigned long l=(unsigned long)time(NULL);
148	BUF_MEM *buf=NULL;
149	int ret= -1;
150	void (*cb)(const SSL *ssl,int type,int val)=NULL;
151	int new_state,state;
152
153	RAND_add(&l,sizeof(l),0);
154	ERR_clear_error();
155	clear_sys_error();
156
157	if (s->info_callback != NULL)
158		cb=s->info_callback;
159	else if (s->ctx->info_callback != NULL)
160		cb=s->ctx->info_callback;
161
162	/* init things to blank */
163	s->in_handshake++;
164	if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
165
166	for (;;)
167		{
168		state=s->state;
169
170		switch (s->state)
171			{
172		case SSL_ST_BEFORE:
173		case SSL_ST_CONNECT:
174		case SSL_ST_BEFORE|SSL_ST_CONNECT:
175		case SSL_ST_OK|SSL_ST_CONNECT:
176
177			s->server=0;
178			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
179
180			s->version=SSL2_VERSION;
181			s->type=SSL_ST_CONNECT;
182
183			buf=s->init_buf;
184			if ((buf == NULL) && ((buf=BUF_MEM_new()) == NULL))
185				{
186				ret= -1;
187				goto end;
188				}
189			if (!BUF_MEM_grow(buf,
190				SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
191				{
192				if (buf == s->init_buf)
193					buf=NULL;
194				ret= -1;
195				goto end;
196				}
197			s->init_buf=buf;
198			buf=NULL;
199			s->init_num=0;
200			s->state=SSL2_ST_SEND_CLIENT_HELLO_A;
201			s->ctx->stats.sess_connect++;
202			s->handshake_func=ssl2_connect;
203			BREAK;
204
205		case SSL2_ST_SEND_CLIENT_HELLO_A:
206		case SSL2_ST_SEND_CLIENT_HELLO_B:
207			s->shutdown=0;
208			ret=client_hello(s);
209			if (ret <= 0) goto end;
210			s->init_num=0;
211			s->state=SSL2_ST_GET_SERVER_HELLO_A;
212			BREAK;
213
214		case SSL2_ST_GET_SERVER_HELLO_A:
215		case SSL2_ST_GET_SERVER_HELLO_B:
216			ret=get_server_hello(s);
217			if (ret <= 0) goto end;
218			s->init_num=0;
219			if (!s->hit) /* new session */
220				{
221				s->state=SSL2_ST_SEND_CLIENT_MASTER_KEY_A;
222				BREAK;
223				}
224			else
225				{
226				s->state=SSL2_ST_CLIENT_START_ENCRYPTION;
227				break;
228				}
229
230		case SSL2_ST_SEND_CLIENT_MASTER_KEY_A:
231		case SSL2_ST_SEND_CLIENT_MASTER_KEY_B:
232			ret=client_master_key(s);
233			if (ret <= 0) goto end;
234			s->init_num=0;
235			s->state=SSL2_ST_CLIENT_START_ENCRYPTION;
236			break;
237
238		case SSL2_ST_CLIENT_START_ENCRYPTION:
239			/* Ok, we now have all the stuff needed to
240			 * start encrypting, so lets fire it up :-) */
241			if (!ssl2_enc_init(s,1))
242				{
243				ret= -1;
244				goto end;
245				}
246			s->s2->clear_text=0;
247			s->state=SSL2_ST_SEND_CLIENT_FINISHED_A;
248			break;
249
250		case SSL2_ST_SEND_CLIENT_FINISHED_A:
251		case SSL2_ST_SEND_CLIENT_FINISHED_B:
252			ret=client_finished(s);
253			if (ret <= 0) goto end;
254			s->init_num=0;
255			s->state=SSL2_ST_GET_SERVER_VERIFY_A;
256			break;
257
258		case SSL2_ST_GET_SERVER_VERIFY_A:
259		case SSL2_ST_GET_SERVER_VERIFY_B:
260			ret=get_server_verify(s);
261			if (ret <= 0) goto end;
262			s->init_num=0;
263			s->state=SSL2_ST_GET_SERVER_FINISHED_A;
264			break;
265
266		case SSL2_ST_GET_SERVER_FINISHED_A:
267		case SSL2_ST_GET_SERVER_FINISHED_B:
268			ret=get_server_finished(s);
269			if (ret <= 0) goto end;
270			break;
271
272		case SSL2_ST_SEND_CLIENT_CERTIFICATE_A:
273		case SSL2_ST_SEND_CLIENT_CERTIFICATE_B:
274		case SSL2_ST_SEND_CLIENT_CERTIFICATE_C:
275		case SSL2_ST_SEND_CLIENT_CERTIFICATE_D:
276		case SSL2_ST_X509_GET_CLIENT_CERTIFICATE:
277			ret=client_certificate(s);
278			if (ret <= 0) goto end;
279			s->init_num=0;
280			s->state=SSL2_ST_GET_SERVER_FINISHED_A;
281			break;
282
283		case SSL_ST_OK:
284			if (s->init_buf != NULL)
285				{
286				BUF_MEM_free(s->init_buf);
287				s->init_buf=NULL;
288				}
289			s->init_num=0;
290		/*	ERR_clear_error();*/
291
292			/* If we want to cache session-ids in the client
293			 * and we successfully add the session-id to the
294			 * cache, and there is a callback, then pass it out.
295			 * 26/11/96 - eay - only add if not a re-used session.
296			 */
297
298			ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
299			if (s->hit) s->ctx->stats.sess_hit++;
300
301			ret=1;
302			/* s->server=0; */
303			s->ctx->stats.sess_connect_good++;
304
305			if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
306
307			goto end;
308			/* break; */
309		default:
310			SSLerr(SSL_F_SSL2_CONNECT,SSL_R_UNKNOWN_STATE);
311			return(-1);
312			/* break; */
313			}
314
315		if ((cb != NULL) && (s->state != state))
316			{
317			new_state=s->state;
318			s->state=state;
319			cb(s,SSL_CB_CONNECT_LOOP,1);
320			s->state=new_state;
321			}
322		}
323end:
324	s->in_handshake--;
325	if (buf != NULL)
326		BUF_MEM_free(buf);
327	if (cb != NULL)
328		cb(s,SSL_CB_CONNECT_EXIT,ret);
329	return(ret);
330	}
331
332static int get_server_hello(SSL *s)
333	{
334	unsigned char *buf;
335	unsigned char *p;
336	int i,j;
337	unsigned long len;
338	STACK_OF(SSL_CIPHER) *sk=NULL,*cl, *prio, *allow;
339
340	buf=(unsigned char *)s->init_buf->data;
341	p=buf;
342	if (s->state == SSL2_ST_GET_SERVER_HELLO_A)
343		{
344		i=ssl2_read(s,(char *)&(buf[s->init_num]),11-s->init_num);
345		if (i < (11-s->init_num))
346			return(ssl2_part_read(s,SSL_F_GET_SERVER_HELLO,i));
347		s->init_num = 11;
348
349		if (*(p++) != SSL2_MT_SERVER_HELLO)
350			{
351			if (p[-1] != SSL2_MT_ERROR)
352				{
353				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
354				SSLerr(SSL_F_GET_SERVER_HELLO,
355					SSL_R_READ_WRONG_PACKET_TYPE);
356				}
357			else
358				SSLerr(SSL_F_GET_SERVER_HELLO,
359					SSL_R_PEER_ERROR);
360			return(-1);
361			}
362#if 0
363		s->hit=(*(p++))?1:0;
364		/* Some [PPC?] compilers fail to increment p in above
365		   statement, e.g. one provided with Rhapsody 5.5, but
366		   most recent example XL C 11.1 for AIX, even without
367		   optimization flag... */
368#else
369		s->hit=(*p)?1:0; p++;
370#endif
371		s->s2->tmp.cert_type= *(p++);
372		n2s(p,i);
373		if (i < s->version) s->version=i;
374		n2s(p,i); s->s2->tmp.cert_length=i;
375		n2s(p,i); s->s2->tmp.csl=i;
376		n2s(p,i); s->s2->tmp.conn_id_length=i;
377		s->state=SSL2_ST_GET_SERVER_HELLO_B;
378		}
379
380	/* SSL2_ST_GET_SERVER_HELLO_B */
381	len = 11 + (unsigned long)s->s2->tmp.cert_length + (unsigned long)s->s2->tmp.csl + (unsigned long)s->s2->tmp.conn_id_length;
382	if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
383		{
384		SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_MESSAGE_TOO_LONG);
385		return -1;
386		}
387	j = (int)len - s->init_num;
388	i = ssl2_read(s,(char *)&(buf[s->init_num]),j);
389	if (i != j) return(ssl2_part_read(s,SSL_F_GET_SERVER_HELLO,i));
390	if (s->msg_callback)
391		s->msg_callback(0, s->version, 0, buf, (size_t)len, s, s->msg_callback_arg); /* SERVER-HELLO */
392
393	/* things are looking good */
394
395	p = buf + 11;
396	if (s->hit)
397		{
398		if (s->s2->tmp.cert_length != 0)
399			{
400			SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_REUSE_CERT_LENGTH_NOT_ZERO);
401			return(-1);
402			}
403		if (s->s2->tmp.cert_type != 0)
404			{
405			if (!(s->options &
406				SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG))
407				{
408				SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_REUSE_CERT_TYPE_NOT_ZERO);
409				return(-1);
410				}
411			}
412		if (s->s2->tmp.csl != 0)
413			{
414			SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_REUSE_CIPHER_LIST_NOT_ZERO);
415			return(-1);
416			}
417		}
418	else
419		{
420#ifdef undef
421		/* very bad */
422		memset(s->session->session_id,0,
423			SSL_MAX_SSL_SESSION_ID_LENGTH_IN_BYTES);
424		s->session->session_id_length=0;
425		*/
426#endif
427
428		/* we need to do this in case we were trying to reuse a
429		 * client session but others are already reusing it.
430		 * If this was a new 'blank' session ID, the session-id
431		 * length will still be 0 */
432		if (s->session->session_id_length > 0)
433			{
434			if (!ssl_get_new_session(s,0))
435				{
436				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
437				return(-1);
438				}
439			}
440
441		if (ssl2_set_certificate(s,s->s2->tmp.cert_type,
442			s->s2->tmp.cert_length,p) <= 0)
443			{
444			ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE);
445			return(-1);
446			}
447		p+=s->s2->tmp.cert_length;
448
449		if (s->s2->tmp.csl == 0)
450			{
451			ssl2_return_error(s,SSL2_PE_NO_CIPHER);
452			SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_NO_CIPHER_LIST);
453			return(-1);
454			}
455
456		/* We have just received a list of ciphers back from the
457		 * server.  We need to get the ones that match, then select
458		 * the one we want the most :-). */
459
460		/* load the ciphers */
461		sk=ssl_bytes_to_cipher_list(s,p,s->s2->tmp.csl,
462					    &s->session->ciphers);
463		p+=s->s2->tmp.csl;
464		if (sk == NULL)
465			{
466			ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
467			SSLerr(SSL_F_GET_SERVER_HELLO,ERR_R_MALLOC_FAILURE);
468			return(-1);
469			}
470
471		(void)sk_SSL_CIPHER_set_cmp_func(sk,ssl_cipher_ptr_id_cmp);
472
473		/* get the array of ciphers we will accept */
474		cl=SSL_get_ciphers(s);
475		(void)sk_SSL_CIPHER_set_cmp_func(cl,ssl_cipher_ptr_id_cmp);
476
477		/*
478		 * If server preference flag set, choose the first
479		 * (highest priority) cipher the server sends, otherwise
480		 * client preference has priority.
481		 */
482		if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
483		    {
484		    prio = sk;
485		    allow = cl;
486		    }
487		else
488		    {
489		    prio = cl;
490		    allow = sk;
491		    }
492		/* In theory we could have ciphers sent back that we
493		 * don't want to use but that does not matter since we
494		 * will check against the list we originally sent and
495		 * for performance reasons we should not bother to match
496		 * the two lists up just to check. */
497		for (i=0; i<sk_SSL_CIPHER_num(prio); i++)
498			{
499			if (sk_SSL_CIPHER_find(allow,
500					     sk_SSL_CIPHER_value(prio,i)) >= 0)
501				break;
502			}
503
504		if (i >= sk_SSL_CIPHER_num(prio))
505			{
506			ssl2_return_error(s,SSL2_PE_NO_CIPHER);
507			SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_NO_CIPHER_MATCH);
508			return(-1);
509			}
510		s->session->cipher=sk_SSL_CIPHER_value(prio,i);
511
512
513		if (s->session->peer != NULL) /* can't happen*/
514			{
515			ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
516			SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
517			return(-1);
518			}
519
520		s->session->peer = s->session->sess_cert->peer_key->x509;
521		/* peer_key->x509 has been set by ssl2_set_certificate. */
522		CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
523		}
524
525	if (s->session->sess_cert == NULL
526      || s->session->peer != s->session->sess_cert->peer_key->x509)
527		/* can't happen */
528		{
529		ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
530		SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
531		return(-1);
532		}
533
534	s->s2->conn_id_length=s->s2->tmp.conn_id_length;
535	if (s->s2->conn_id_length > sizeof s->s2->conn_id)
536		{
537		ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
538		SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_SSL2_CONNECTION_ID_TOO_LONG);
539		return -1;
540		}
541	memcpy(s->s2->conn_id,p,s->s2->tmp.conn_id_length);
542	return(1);
543	}
544
545static int client_hello(SSL *s)
546	{
547	unsigned char *buf;
548	unsigned char *p,*d;
549/*	CIPHER **cipher;*/
550	int i,n,j;
551
552	buf=(unsigned char *)s->init_buf->data;
553	if (s->state == SSL2_ST_SEND_CLIENT_HELLO_A)
554		{
555		if ((s->session == NULL) ||
556			(s->session->ssl_version != s->version))
557			{
558			if (!ssl_get_new_session(s,0))
559				{
560				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
561				return(-1);
562				}
563			}
564		/* else use the pre-loaded session */
565
566		p=buf;					/* header */
567		d=p+9;					/* data section */
568		*(p++)=SSL2_MT_CLIENT_HELLO;		/* type */
569		s2n(SSL2_VERSION,p);			/* version */
570		n=j=0;
571
572		n=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),d,0);
573		d+=n;
574
575		if (n == 0)
576			{
577			SSLerr(SSL_F_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
578			return(-1);
579			}
580
581		s2n(n,p);			/* cipher spec num bytes */
582
583		if ((s->session->session_id_length > 0) &&
584			(s->session->session_id_length <=
585			SSL2_MAX_SSL_SESSION_ID_LENGTH))
586			{
587			i=s->session->session_id_length;
588			s2n(i,p);		/* session id length */
589			memcpy(d,s->session->session_id,(unsigned int)i);
590			d+=i;
591			}
592		else
593			{
594			s2n(0,p);
595			}
596
597		s->s2->challenge_length=SSL2_CHALLENGE_LENGTH;
598		s2n(SSL2_CHALLENGE_LENGTH,p);		/* challenge length */
599		/*challenge id data*/
600		if (RAND_pseudo_bytes(s->s2->challenge,SSL2_CHALLENGE_LENGTH) <= 0)
601			return -1;
602		memcpy(d,s->s2->challenge,SSL2_CHALLENGE_LENGTH);
603		d+=SSL2_CHALLENGE_LENGTH;
604
605		s->state=SSL2_ST_SEND_CLIENT_HELLO_B;
606		s->init_num=d-buf;
607		s->init_off=0;
608		}
609	/* SSL2_ST_SEND_CLIENT_HELLO_B */
610	return(ssl2_do_write(s));
611	}
612
613static int client_master_key(SSL *s)
614	{
615	unsigned char *buf;
616	unsigned char *p,*d;
617	int clear,enc,karg,i;
618	SSL_SESSION *sess;
619	const EVP_CIPHER *c;
620	const EVP_MD *md;
621
622	buf=(unsigned char *)s->init_buf->data;
623	if (s->state == SSL2_ST_SEND_CLIENT_MASTER_KEY_A)
624		{
625
626		if (!ssl_cipher_get_evp(s->session,&c,&md,NULL,NULL,NULL))
627			{
628			ssl2_return_error(s,SSL2_PE_NO_CIPHER);
629			SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
630			return(-1);
631			}
632		sess=s->session;
633		p=buf;
634		d=p+10;
635		*(p++)=SSL2_MT_CLIENT_MASTER_KEY;/* type */
636
637		i=ssl_put_cipher_by_char(s,sess->cipher,p);
638		p+=i;
639
640		/* make key_arg data */
641		i=EVP_CIPHER_iv_length(c);
642		sess->key_arg_length=i;
643		if (i > SSL_MAX_KEY_ARG_LENGTH)
644			{
645			ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
646			SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
647			return -1;
648			}
649		if (i > 0)
650			if (RAND_pseudo_bytes(sess->key_arg,i) <= 0)
651				return -1;
652
653		/* make a master key */
654		i=EVP_CIPHER_key_length(c);
655		sess->master_key_length=i;
656		if (i > 0)
657			{
658			if (i > (int)sizeof(sess->master_key))
659				{
660				ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
661				SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
662				return -1;
663				}
664			if (RAND_bytes(sess->master_key,i) <= 0)
665				{
666				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
667				return(-1);
668				}
669			}
670
671		if (sess->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC)
672			enc=8;
673		else if (SSL_C_IS_EXPORT(sess->cipher))
674			enc=5;
675		else
676			enc=i;
677
678		if ((int)i < enc)
679			{
680			ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
681			SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_CIPHER_TABLE_SRC_ERROR);
682			return(-1);
683			}
684		clear=i-enc;
685		s2n(clear,p);
686		memcpy(d,sess->master_key,(unsigned int)clear);
687		d+=clear;
688
689		enc=ssl_rsa_public_encrypt(sess->sess_cert,enc,
690			&(sess->master_key[clear]),d,
691			(s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING);
692		if (enc <= 0)
693			{
694			ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
695			SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_PUBLIC_KEY_ENCRYPT_ERROR);
696			return(-1);
697			}
698#ifdef PKCS1_CHECK
699		if (s->options & SSL_OP_PKCS1_CHECK_1) d[1]++;
700		if (s->options & SSL_OP_PKCS1_CHECK_2)
701			sess->master_key[clear]++;
702#endif
703		s2n(enc,p);
704		d+=enc;
705		karg=sess->key_arg_length;
706		s2n(karg,p); /* key arg size */
707		if (karg > (int)sizeof(sess->key_arg))
708			{
709			ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
710			SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
711			return -1;
712			}
713		memcpy(d,sess->key_arg,(unsigned int)karg);
714		d+=karg;
715
716		s->state=SSL2_ST_SEND_CLIENT_MASTER_KEY_B;
717		s->init_num=d-buf;
718		s->init_off=0;
719		}
720
721	/* SSL2_ST_SEND_CLIENT_MASTER_KEY_B */
722	return(ssl2_do_write(s));
723	}
724
725static int client_finished(SSL *s)
726	{
727	unsigned char *p;
728
729	if (s->state == SSL2_ST_SEND_CLIENT_FINISHED_A)
730		{
731		p=(unsigned char *)s->init_buf->data;
732		*(p++)=SSL2_MT_CLIENT_FINISHED;
733		if (s->s2->conn_id_length > sizeof s->s2->conn_id)
734			{
735			SSLerr(SSL_F_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR);
736			return -1;
737			}
738		memcpy(p,s->s2->conn_id,(unsigned int)s->s2->conn_id_length);
739
740		s->state=SSL2_ST_SEND_CLIENT_FINISHED_B;
741		s->init_num=s->s2->conn_id_length+1;
742		s->init_off=0;
743		}
744	return(ssl2_do_write(s));
745	}
746
747/* read the data and then respond */
748static int client_certificate(SSL *s)
749	{
750	unsigned char *buf;
751	unsigned char *p,*d;
752	int i;
753	unsigned int n;
754	int cert_ch_len;
755	unsigned char *cert_ch;
756
757	buf=(unsigned char *)s->init_buf->data;
758
759	/* We have a cert associated with the SSL, so attach it to
760	 * the session if it does not have one */
761
762	if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_A)
763		{
764		i=ssl2_read(s,(char *)&(buf[s->init_num]),
765			SSL2_MAX_CERT_CHALLENGE_LENGTH+2-s->init_num);
766		if (i<(SSL2_MIN_CERT_CHALLENGE_LENGTH+2-s->init_num))
767			return(ssl2_part_read(s,SSL_F_CLIENT_CERTIFICATE,i));
768		s->init_num += i;
769		if (s->msg_callback)
770			s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s, s->msg_callback_arg); /* REQUEST-CERTIFICATE */
771
772		/* type=buf[0]; */
773		/* type eq x509 */
774		if (buf[1] != SSL2_AT_MD5_WITH_RSA_ENCRYPTION)
775			{
776			ssl2_return_error(s,SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE);
777			SSLerr(SSL_F_CLIENT_CERTIFICATE,SSL_R_BAD_AUTHENTICATION_TYPE);
778			return(-1);
779			}
780
781		if ((s->cert == NULL) ||
782			(s->cert->key->x509 == NULL) ||
783			(s->cert->key->privatekey == NULL))
784			{
785			s->state=SSL2_ST_X509_GET_CLIENT_CERTIFICATE;
786			}
787		else
788			s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
789		}
790
791	cert_ch = buf + 2;
792	cert_ch_len = s->init_num - 2;
793
794	if (s->state == SSL2_ST_X509_GET_CLIENT_CERTIFICATE)
795		{
796		X509 *x509=NULL;
797		EVP_PKEY *pkey=NULL;
798
799		/* If we get an error we need to
800		 * ssl->rwstate=SSL_X509_LOOKUP;
801		 * return(error);
802		 * We should then be retried when things are ok and we
803		 * can get a cert or not */
804
805		i=0;
806		if (s->ctx->client_cert_cb != NULL)
807			{
808			i=s->ctx->client_cert_cb(s,&(x509),&(pkey));
809			}
810
811		if (i < 0)
812			{
813			s->rwstate=SSL_X509_LOOKUP;
814			return(-1);
815			}
816		s->rwstate=SSL_NOTHING;
817
818		if ((i == 1) && (pkey != NULL) && (x509 != NULL))
819			{
820			s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
821			if (	!SSL_use_certificate(s,x509) ||
822				!SSL_use_PrivateKey(s,pkey))
823				{
824				i=0;
825				}
826			X509_free(x509);
827			EVP_PKEY_free(pkey);
828			}
829		else if (i == 1)
830			{
831			if (x509 != NULL) X509_free(x509);
832			if (pkey != NULL) EVP_PKEY_free(pkey);
833			SSLerr(SSL_F_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
834			i=0;
835			}
836
837		if (i == 0)
838			{
839			/* We have no client certificate to respond with
840			 * so send the correct error message back */
841			s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_B;
842			p=buf;
843			*(p++)=SSL2_MT_ERROR;
844			s2n(SSL2_PE_NO_CERTIFICATE,p);
845			s->init_off=0;
846			s->init_num=3;
847			/* Write is done at the end */
848			}
849		}
850
851	if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_B)
852		{
853		return(ssl2_do_write(s));
854		}
855
856	if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_C)
857		{
858		EVP_MD_CTX ctx;
859
860		/* ok, now we calculate the checksum
861		 * do it first so we can reuse buf :-) */
862		p=buf;
863		EVP_MD_CTX_init(&ctx);
864		EVP_SignInit_ex(&ctx,s->ctx->rsa_md5, NULL);
865		EVP_SignUpdate(&ctx,s->s2->key_material,
866			       s->s2->key_material_length);
867		EVP_SignUpdate(&ctx,cert_ch,(unsigned int)cert_ch_len);
868		i=i2d_X509(s->session->sess_cert->peer_key->x509,&p);
869		/* Don't update the signature if it fails - FIXME: probably should handle this better */
870		if(i > 0)
871			EVP_SignUpdate(&ctx,buf,(unsigned int)i);
872
873		p=buf;
874		d=p+6;
875		*(p++)=SSL2_MT_CLIENT_CERTIFICATE;
876		*(p++)=SSL2_CT_X509_CERTIFICATE;
877		n=i2d_X509(s->cert->key->x509,&d);
878		s2n(n,p);
879
880		if (!EVP_SignFinal(&ctx,d,&n,s->cert->key->privatekey))
881			{
882			/* this is not good.  If things have failed it
883			 * means there so something wrong with the key.
884			 * We will continue with a 0 length signature
885			 */
886			}
887		EVP_MD_CTX_cleanup(&ctx);
888		s2n(n,p);
889		d+=n;
890
891		s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_D;
892		s->init_num=d-buf;
893		s->init_off=0;
894		}
895	/* if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_D) */
896	return(ssl2_do_write(s));
897	}
898
899static int get_server_verify(SSL *s)
900	{
901	unsigned char *p;
902	int i, n, len;
903
904	p=(unsigned char *)s->init_buf->data;
905	if (s->state == SSL2_ST_GET_SERVER_VERIFY_A)
906		{
907		i=ssl2_read(s,(char *)&(p[s->init_num]),1-s->init_num);
908		if (i < (1-s->init_num))
909			return(ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i));
910		s->init_num += i;
911
912		s->state= SSL2_ST_GET_SERVER_VERIFY_B;
913		if (*p != SSL2_MT_SERVER_VERIFY)
914			{
915			if (p[0] != SSL2_MT_ERROR)
916				{
917				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
918				SSLerr(SSL_F_GET_SERVER_VERIFY,
919					SSL_R_READ_WRONG_PACKET_TYPE);
920				}
921			else
922				{
923				SSLerr(SSL_F_GET_SERVER_VERIFY,SSL_R_PEER_ERROR);
924				/* try to read the error message */
925				i=ssl2_read(s,(char *)&(p[s->init_num]),3-s->init_num);
926				return ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i);
927				}
928			return(-1);
929			}
930		}
931
932	p=(unsigned char *)s->init_buf->data;
933	len = 1 + s->s2->challenge_length;
934	n =  len - s->init_num;
935	i = ssl2_read(s,(char *)&(p[s->init_num]),n);
936	if (i < n)
937		return(ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i));
938	if (s->msg_callback)
939		s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* SERVER-VERIFY */
940	p += 1;
941
942	if (CRYPTO_memcmp(p,s->s2->challenge,s->s2->challenge_length) != 0)
943		{
944		ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
945		SSLerr(SSL_F_GET_SERVER_VERIFY,SSL_R_CHALLENGE_IS_DIFFERENT);
946		return(-1);
947		}
948	return(1);
949	}
950
951static int get_server_finished(SSL *s)
952	{
953	unsigned char *buf;
954	unsigned char *p;
955	int i, n, len;
956
957	buf=(unsigned char *)s->init_buf->data;
958	p=buf;
959	if (s->state == SSL2_ST_GET_SERVER_FINISHED_A)
960		{
961		i=ssl2_read(s,(char *)&(buf[s->init_num]),1-s->init_num);
962		if (i < (1-s->init_num))
963			return(ssl2_part_read(s,SSL_F_GET_SERVER_FINISHED,i));
964		s->init_num += i;
965
966		if (*p == SSL2_MT_REQUEST_CERTIFICATE)
967			{
968			s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_A;
969			return(1);
970			}
971		else if (*p != SSL2_MT_SERVER_FINISHED)
972			{
973			if (p[0] != SSL2_MT_ERROR)
974				{
975				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
976				SSLerr(SSL_F_GET_SERVER_FINISHED,SSL_R_READ_WRONG_PACKET_TYPE);
977				}
978			else
979				{
980				SSLerr(SSL_F_GET_SERVER_FINISHED,SSL_R_PEER_ERROR);
981				/* try to read the error message */
982				i=ssl2_read(s,(char *)&(p[s->init_num]),3-s->init_num);
983				return ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i);
984				}
985			return(-1);
986			}
987		s->state=SSL2_ST_GET_SERVER_FINISHED_B;
988		}
989
990	len = 1 + SSL2_SSL_SESSION_ID_LENGTH;
991	n = len - s->init_num;
992	i = ssl2_read(s,(char *)&(buf[s->init_num]), n);
993	if (i < n) /* XXX could be shorter than SSL2_SSL_SESSION_ID_LENGTH, that's the maximum */
994		return(ssl2_part_read(s,SSL_F_GET_SERVER_FINISHED,i));
995	s->init_num += i;
996	if (s->msg_callback)
997		s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s, s->msg_callback_arg); /* SERVER-FINISHED */
998
999	if (!s->hit) /* new session */
1000		{
1001		/* new session-id */
1002		/* Make sure we were not trying to re-use an old SSL_SESSION
1003		 * or bad things can happen */
1004		/* ZZZZZZZZZZZZZ */
1005		s->session->session_id_length=SSL2_SSL_SESSION_ID_LENGTH;
1006		memcpy(s->session->session_id,p+1,SSL2_SSL_SESSION_ID_LENGTH);
1007		}
1008	else
1009		{
1010		if (!(s->options & SSL_OP_MICROSOFT_SESS_ID_BUG))
1011			{
1012			if ((s->session->session_id_length > sizeof s->session->session_id)
1013			    || (0 != memcmp(buf + 1, s->session->session_id,
1014			                    (unsigned int)s->session->session_id_length)))
1015				{
1016				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
1017				SSLerr(SSL_F_GET_SERVER_FINISHED,SSL_R_SSL_SESSION_ID_IS_DIFFERENT);
1018				return(-1);
1019				}
1020			}
1021		}
1022	s->state = SSL_ST_OK;
1023	return(1);
1024	}
1025
1026/* loads in the certificate from the server */
1027int ssl2_set_certificate(SSL *s, int type, int len, const unsigned char *data)
1028	{
1029	STACK_OF(X509) *sk=NULL;
1030	EVP_PKEY *pkey=NULL;
1031	SESS_CERT *sc=NULL;
1032	int i;
1033	X509 *x509=NULL;
1034	int ret=0;
1035
1036	x509=d2i_X509(NULL,&data,(long)len);
1037	if (x509 == NULL)
1038		{
1039		SSLerr(SSL_F_SSL2_SET_CERTIFICATE,ERR_R_X509_LIB);
1040		goto err;
1041		}
1042
1043	if ((sk=sk_X509_new_null()) == NULL || !sk_X509_push(sk,x509))
1044		{
1045		SSLerr(SSL_F_SSL2_SET_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1046		goto err;
1047		}
1048
1049	i=ssl_verify_cert_chain(s,sk);
1050
1051	if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0))
1052		{
1053		SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
1054		goto err;
1055		}
1056	ERR_clear_error(); /* but we keep s->verify_result */
1057	s->session->verify_result = s->verify_result;
1058
1059	/* server's cert for this session */
1060	sc=ssl_sess_cert_new();
1061	if (sc == NULL)
1062		{
1063		ret= -1;
1064		goto err;
1065		}
1066	if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
1067	s->session->sess_cert=sc;
1068
1069	sc->peer_pkeys[SSL_PKEY_RSA_ENC].x509=x509;
1070	sc->peer_key= &(sc->peer_pkeys[SSL_PKEY_RSA_ENC]);
1071
1072	pkey=X509_get_pubkey(x509);
1073	x509=NULL;
1074	if (pkey == NULL)
1075		{
1076		SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY);
1077		goto err;
1078		}
1079	if (pkey->type != EVP_PKEY_RSA)
1080		{
1081		SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_PUBLIC_KEY_NOT_RSA);
1082		goto err;
1083		}
1084
1085	if (!ssl_set_peer_cert_type(sc,SSL2_CT_X509_CERTIFICATE))
1086		goto err;
1087	ret=1;
1088err:
1089	sk_X509_free(sk);
1090	X509_free(x509);
1091	EVP_PKEY_free(pkey);
1092	return(ret);
1093	}
1094
1095static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
1096	     unsigned char *to, int padding)
1097	{
1098	EVP_PKEY *pkey=NULL;
1099	int i= -1;
1100
1101	if ((sc == NULL) || (sc->peer_key->x509 == NULL) ||
1102		((pkey=X509_get_pubkey(sc->peer_key->x509)) == NULL))
1103		{
1104		SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,SSL_R_NO_PUBLICKEY);
1105		return(-1);
1106		}
1107	if (pkey->type != EVP_PKEY_RSA)
1108		{
1109		SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,SSL_R_PUBLIC_KEY_IS_NOT_RSA);
1110		goto end;
1111		}
1112
1113	/* we have the public key */
1114	i=RSA_public_encrypt(len,from,to,pkey->pkey.rsa,padding);
1115	if (i < 0)
1116		SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,ERR_R_RSA_LIB);
1117end:
1118	EVP_PKEY_free(pkey);
1119	return(i);
1120	}
1121#else /* !OPENSSL_NO_SSL2 */
1122
1123# if PEDANTIC
1124static void *dummy=&dummy;
1125# endif
1126
1127#endif
1128