Changed a comment.
[openssl.git] / ssl / s3_srvr.c
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 #define REUSE_CIPHER_BUG
60
61 #include <stdio.h>
62 #include <openssl/buffer.h>
63 #include <openssl/rand.h>
64 #include <openssl/objects.h>
65 #include <openssl/md5.h>
66 #include <openssl/sha.h>
67 #include <openssl/evp.h>
68 #include <openssl/x509.h>
69 #include "ssl_locl.h"
70
71 static SSL_METHOD *ssl3_get_server_method(int ver);
72 static int ssl3_get_client_hello(SSL *s);
73 static int ssl3_send_server_hello(SSL *s);
74 static int ssl3_send_server_key_exchange(SSL *s);
75 static int ssl3_send_certificate_request(SSL *s);
76 static int ssl3_send_server_done(SSL *s);
77 static int ssl3_get_cert_verify(SSL *s);
78 static int ssl3_get_client_key_exchange(SSL *s);
79 static int ssl3_get_client_certificate(SSL *s);
80 static int ssl3_send_hello_request(SSL *s);
81
82 static SSL_METHOD *ssl3_get_server_method(int ver)
83         {
84         if (ver == SSL3_VERSION)
85                 return(SSLv3_server_method());
86         else
87                 return(NULL);
88         }
89
90 SSL_METHOD *SSLv3_server_method(void)
91         {
92         static int init=1;
93         static SSL_METHOD SSLv3_server_data;
94
95         if (init)
96                 {
97                 memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(),
98                         sizeof(SSL_METHOD));
99                 SSLv3_server_data.ssl_accept=ssl3_accept;
100                 SSLv3_server_data.get_ssl_method=ssl3_get_server_method;
101                 init=0;
102                 }
103         return(&SSLv3_server_data);
104         }
105
106 int ssl3_accept(SSL *s)
107         {
108         BUF_MEM *buf;
109         unsigned long l,Time=time(NULL);
110         void (*cb)()=NULL;
111         long num1;
112         int ret= -1;
113         CERT *ct;
114         int new_state,state,skip=0;
115
116         RAND_seed(&Time,sizeof(Time));
117         ERR_clear_error();
118         clear_sys_error();
119
120         if (s->info_callback != NULL)
121                 cb=s->info_callback;
122         else if (s->ctx->info_callback != NULL)
123                 cb=s->ctx->info_callback;
124
125         /* init things to blank */
126         if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
127         s->in_handshake++;
128
129 #ifdef undef
130         /* FIX THIS EAY EAY EAY */
131         /* we don't actually need a cert, we just need a cert or a DH_tmp */
132         if (((s->session == NULL) || (s->session->sess_cert == NULL)) &&
133                 (s->cert == NULL))
134                 {
135                 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
136                 ret= -1;
137                 goto end;
138                 }
139 #endif
140
141         for (;;)
142                 {
143                 state=s->state;
144
145                 switch (s->state)
146                         {
147                 case SSL_ST_RENEGOTIATE:
148                         s->new_session=1;
149                         /* s->state=SSL_ST_ACCEPT; */
150
151                 case SSL_ST_BEFORE:
152                 case SSL_ST_ACCEPT:
153                 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
154                 case SSL_ST_OK|SSL_ST_ACCEPT:
155
156                         s->server=1;
157                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
158
159                         if ((s->version>>8) != 3)
160                                 abort();
161                         /* s->version=SSL3_VERSION; */
162                         s->type=SSL_ST_ACCEPT;
163
164                         if (s->init_buf == NULL)
165                                 {
166                                 if ((buf=BUF_MEM_new()) == NULL)
167                                         {
168                                         ret= -1;
169                                         goto end;
170                                         }
171                                 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
172                                         {
173                                         ret= -1;
174                                         goto end;
175                                         }
176                                 s->init_buf=buf;
177                                 }
178
179                         if (!ssl3_setup_buffers(s))
180                                 {
181                                 ret= -1;
182                                 goto end;
183                                 }
184
185                         /* Ok, we now need to push on a buffering BIO so that
186                          * the output is sent in a way that TCP likes :-)
187                          */
188                         if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
189
190                         s->init_num=0;
191
192                         if (s->state != SSL_ST_RENEGOTIATE)
193                                 {
194                                 s->state=SSL3_ST_SR_CLNT_HELLO_A;
195                                 ssl3_init_finished_mac(s);
196                                 s->ctx->stats.sess_accept++;
197                                 }
198                         else
199                                 {
200                                 s->ctx->stats.sess_accept_renegotiate++;
201                                 s->state=SSL3_ST_SW_HELLO_REQ_A;
202                                 }
203                         break;
204
205                 case SSL3_ST_SW_HELLO_REQ_A:
206                 case SSL3_ST_SW_HELLO_REQ_B:
207
208                         s->shutdown=0;
209                         ret=ssl3_send_hello_request(s);
210                         if (ret <= 0) goto end;
211                         s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
212                         s->state=SSL3_ST_SW_FLUSH;
213                         s->init_num=0;
214
215                         ssl3_init_finished_mac(s);
216                         break;
217
218                 case SSL3_ST_SW_HELLO_REQ_C:
219                         s->state=SSL_ST_OK;
220                         ret=1;
221                         goto end;
222                         /* break; */
223
224                 case SSL3_ST_SR_CLNT_HELLO_A:
225                 case SSL3_ST_SR_CLNT_HELLO_B:
226                 case SSL3_ST_SR_CLNT_HELLO_C:
227
228                         s->shutdown=0;
229                         ret=ssl3_get_client_hello(s);
230                         if (ret <= 0) goto end;
231                         s->state=SSL3_ST_SW_SRVR_HELLO_A;
232                         s->init_num=0;
233                         break;
234
235                 case SSL3_ST_SW_SRVR_HELLO_A:
236                 case SSL3_ST_SW_SRVR_HELLO_B:
237                         ret=ssl3_send_server_hello(s);
238                         if (ret <= 0) goto end;
239
240                         if (s->hit)
241                                 s->state=SSL3_ST_SW_CHANGE_A;
242                         else
243                                 s->state=SSL3_ST_SW_CERT_A;
244                         s->init_num=0;
245                         break;
246
247                 case SSL3_ST_SW_CERT_A:
248                 case SSL3_ST_SW_CERT_B:
249                         /* Check if it is anon DH */
250                         if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
251                                 {
252                                 ret=ssl3_send_server_certificate(s);
253                                 if (ret <= 0) goto end;
254                                 }
255                         else
256                                 skip=1;
257                         s->state=SSL3_ST_SW_KEY_EXCH_A;
258                         s->init_num=0;
259                         break;
260
261                 case SSL3_ST_SW_KEY_EXCH_A:
262                 case SSL3_ST_SW_KEY_EXCH_B:
263                         l=s->s3->tmp.new_cipher->algorithms;
264                         if (s->session->sess_cert == NULL)
265                                 {
266                                 if (s->cert != NULL)
267                                         {
268                                         CRYPTO_add(&s->cert->references,1,CRYPTO_LOCK_SSL_CERT);
269                                         s->session->sess_cert=s->cert;
270                                         }
271                                 }
272                         ct=s->session->sess_cert;
273
274                         /* clear this, it may get reset by
275                          * send_server_key_exchange */
276                         if (s->options & SSL_OP_EPHEMERAL_RSA)
277                                 s->s3->tmp.use_rsa_tmp=1;
278                         else
279                                 s->s3->tmp.use_rsa_tmp=0;
280
281                         /* only send if a DH key exchange, fortezza or
282                          * RSA but we have a sign only certificate */
283                         if (s->s3->tmp.use_rsa_tmp
284                             || (l & (SSL_DH|SSL_kFZA))
285                             || ((l & SSL_kRSA)
286                                 && (ct->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
287                                     || (SSL_IS_EXPORT(l)
288                                         && EVP_PKEY_size(ct->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_EXPORT_PKEYLENGTH(l)
289                                         )
290                                     )
291                                 )
292                             )
293                                 {
294                                 ret=ssl3_send_server_key_exchange(s);
295                                 if (ret <= 0) goto end;
296                                 }
297                         else
298                                 skip=1;
299
300                         s->state=SSL3_ST_SW_CERT_REQ_A;
301                         s->init_num=0;
302                         break;
303
304                 case SSL3_ST_SW_CERT_REQ_A:
305                 case SSL3_ST_SW_CERT_REQ_B:
306                         if (!(s->verify_mode & SSL_VERIFY_PEER) ||
307                                 ((s->session->peer != NULL) &&
308                                  (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)))
309                                 {
310                                 /* no cert request */
311                                 skip=1;
312                                 s->s3->tmp.cert_request=0;
313                                 s->state=SSL3_ST_SW_SRVR_DONE_A;
314                                 }
315                         else
316                                 {
317                                 s->s3->tmp.cert_request=1;
318                                 ret=ssl3_send_certificate_request(s);
319                                 if (ret <= 0) goto end;
320                                 s->state=SSL3_ST_SW_SRVR_DONE_A;
321                                 s->init_num=0;
322                                 }
323                         break;
324
325                 case SSL3_ST_SW_SRVR_DONE_A:
326                 case SSL3_ST_SW_SRVR_DONE_B:
327                         ret=ssl3_send_server_done(s);
328                         if (ret <= 0) goto end;
329                         s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
330                         s->state=SSL3_ST_SW_FLUSH;
331                         s->init_num=0;
332                         break;
333                 
334                 case SSL3_ST_SW_FLUSH:
335                         /* number of bytes to be flushed */
336                         num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
337                         if (num1 > 0)
338                                 {
339                                 s->rwstate=SSL_WRITING;
340                                 num1=BIO_flush(s->wbio);
341                                 if (num1 <= 0) { ret= -1; goto end; }
342                                 s->rwstate=SSL_NOTHING;
343                                 }
344
345                         s->state=s->s3->tmp.next_state;
346                         break;
347
348                 case SSL3_ST_SR_CERT_A:
349                 case SSL3_ST_SR_CERT_B:
350                         /* could be sent for a DH cert, even if we
351                          * have not asked for it :-) */
352                         ret=ssl3_get_client_certificate(s);
353                         if (ret <= 0) goto end;
354                         s->init_num=0;
355                         s->state=SSL3_ST_SR_KEY_EXCH_A;
356                         break;
357
358                 case SSL3_ST_SR_KEY_EXCH_A:
359                 case SSL3_ST_SR_KEY_EXCH_B:
360                         ret=ssl3_get_client_key_exchange(s);
361                         if (ret <= 0) goto end;
362                         s->state=SSL3_ST_SR_CERT_VRFY_A;
363                         s->init_num=0;
364
365                         /* We need to get hashes here so if there is
366                          * a client cert, it can be verified */ 
367                         s->method->ssl3_enc->cert_verify_mac(s,
368                                 &(s->s3->finish_dgst1),
369                                 &(s->s3->tmp.finish_md[0]));
370                         s->method->ssl3_enc->cert_verify_mac(s,
371                                 &(s->s3->finish_dgst2),
372                                 &(s->s3->tmp.finish_md[MD5_DIGEST_LENGTH]));
373
374                         break;
375
376                 case SSL3_ST_SR_CERT_VRFY_A:
377                 case SSL3_ST_SR_CERT_VRFY_B:
378
379                         /* we should decide if we expected this one */
380                         ret=ssl3_get_cert_verify(s);
381                         if (ret <= 0) goto end;
382
383                         s->state=SSL3_ST_SR_FINISHED_A;
384                         s->init_num=0;
385                         break;
386
387                 case SSL3_ST_SR_FINISHED_A:
388                 case SSL3_ST_SR_FINISHED_B:
389                         ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
390                                 SSL3_ST_SR_FINISHED_B);
391                         if (ret <= 0) goto end;
392                         if (s->hit)
393                                 s->state=SSL_ST_OK;
394                         else
395                                 s->state=SSL3_ST_SW_CHANGE_A;
396                         s->init_num=0;
397                         break;
398
399                 case SSL3_ST_SW_CHANGE_A:
400                 case SSL3_ST_SW_CHANGE_B:
401
402                         s->session->cipher=s->s3->tmp.new_cipher;
403                         if (!s->method->ssl3_enc->setup_key_block(s))
404                                 { ret= -1; goto end; }
405
406                         ret=ssl3_send_change_cipher_spec(s,
407                                 SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
408
409                         if (ret <= 0) goto end;
410                         s->state=SSL3_ST_SW_FINISHED_A;
411                         s->init_num=0;
412
413                         if (!s->method->ssl3_enc->change_cipher_state(s,
414                                 SSL3_CHANGE_CIPHER_SERVER_WRITE))
415                                 {
416                                 ret= -1;
417                                 goto end;
418                                 }
419
420                         break;
421
422                 case SSL3_ST_SW_FINISHED_A:
423                 case SSL3_ST_SW_FINISHED_B:
424                         ret=ssl3_send_finished(s,
425                                 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
426                                 s->method->ssl3_enc->server_finished,
427                                 s->method->ssl3_enc->server_finished_len);
428                         if (ret <= 0) goto end;
429                         s->state=SSL3_ST_SW_FLUSH;
430                         if (s->hit)
431                                 s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
432                         else
433                                 s->s3->tmp.next_state=SSL_ST_OK;
434                         s->init_num=0;
435                         break;
436
437                 case SSL_ST_OK:
438                         /* clean a few things up */
439                         ssl3_cleanup_key_block(s);
440
441                         BUF_MEM_free(s->init_buf);
442                         s->init_buf=NULL;
443
444                         /* remove buffering on output */
445                         ssl_free_wbio_buffer(s);
446
447                         s->new_session=0;
448                         s->init_num=0;
449
450                         ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
451
452                         s->ctx->stats.sess_accept_good++;
453                         /* s->server=1; */
454                         s->handshake_func=ssl3_accept;
455                         ret=1;
456
457                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
458
459                         goto end;
460                         /* break; */
461
462                 default:
463                         SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_UNKNOWN_STATE);
464                         ret= -1;
465                         goto end;
466                         /* break; */
467                         }
468                 
469                 if (!s->s3->tmp.reuse_message && !skip)
470                         {
471                         if (s->debug)
472                                 {
473                                 if ((ret=BIO_flush(s->wbio)) <= 0)
474                                         goto end;
475                                 }
476
477
478                         if ((cb != NULL) && (s->state != state))
479                                 {
480                                 new_state=s->state;
481                                 s->state=state;
482                                 cb(s,SSL_CB_ACCEPT_LOOP,1);
483                                 s->state=new_state;
484                                 }
485                         }
486                 skip=0;
487                 }
488 end:
489         /* BIO_flush(s->wbio); */
490
491         if (cb != NULL)
492                 cb(s,SSL_CB_ACCEPT_EXIT,ret);
493         s->in_handshake--;
494         return(ret);
495         }
496
497 static int ssl3_send_hello_request(SSL *s)
498         {
499         unsigned char *p;
500
501         if (s->state == SSL3_ST_SW_HELLO_REQ_A)
502                 {
503                 p=(unsigned char *)s->init_buf->data;
504                 *(p++)=SSL3_MT_CLIENT_REQUEST;
505                 *(p++)=0;
506                 *(p++)=0;
507                 *(p++)=0;
508
509                 s->state=SSL3_ST_SW_HELLO_REQ_B;
510                 /* number of bytes to write */
511                 s->init_num=4;
512                 s->init_off=0;
513                 }
514
515         /* SSL3_ST_SW_HELLO_REQ_B */
516         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
517         }
518
519 static int ssl3_get_client_hello(SSL *s)
520         {
521         int i,j,ok,al,ret= -1;
522         long n;
523         unsigned long id;
524         unsigned char *p,*d,*q;
525         SSL_CIPHER *c;
526         SSL_COMP *comp=NULL;
527         STACK_OF(SSL_CIPHER) *ciphers=NULL;
528
529         /* We do this so that we will respond with our native type.
530          * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
531          * This down switching should be handled by a different method.
532          * If we are SSLv3, we will respond with SSLv3, even if prompted with
533          * TLSv1.
534          */
535         if (s->state == SSL3_ST_SR_CLNT_HELLO_A)
536                 {
537                 s->first_packet=1;
538                 s->state=SSL3_ST_SR_CLNT_HELLO_B;
539                 }
540         n=ssl3_get_message(s,
541                 SSL3_ST_SR_CLNT_HELLO_B,
542                 SSL3_ST_SR_CLNT_HELLO_C,
543                 SSL3_MT_CLIENT_HELLO,
544                 SSL3_RT_MAX_PLAIN_LENGTH,
545                 &ok);
546
547         if (!ok) return((int)n);
548         d=p=(unsigned char *)s->init_buf->data;
549
550         /* The version number has already been checked in ssl3_get_message.
551          * I a native TLSv1/SSLv3 method, the match must be correct except
552          * perhaps for the first message */
553 /*      s->client_version=(((int)p[0])<<8)|(int)p[1]; */
554         p+=2;
555
556         /* load the client random */
557         memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE);
558         p+=SSL3_RANDOM_SIZE;
559
560         /* get the session-id */
561         j= *(p++);
562
563         s->hit=0;
564         if (j == 0)
565                 {
566                 if (!ssl_get_new_session(s,1))
567                         goto err;
568                 }
569         else
570                 {
571                 i=ssl_get_prev_session(s,p,j);
572                 if (i == 1)
573                         { /* previous session */
574                         s->hit=1;
575                         }
576                 else
577                         {
578                         if (!ssl_get_new_session(s,1))
579                                 goto err;
580                         }
581                 }
582
583         p+=j;
584         n2s(p,i);
585         if ((i == 0) && (j != 0))
586                 {
587                 /* we need a cipher if we are not resuming a session */
588                 al=SSL_AD_ILLEGAL_PARAMETER;
589                 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
590                 goto f_err;
591                 }
592         if ((i+p) > (d+n))
593                 {
594                 /* not enough data */
595                 al=SSL_AD_DECODE_ERROR;
596                 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
597                 goto f_err;
598                 }
599         if ((i > 0) && (ssl_bytes_to_cipher_list(s,p,i,&(ciphers))
600                 == NULL))
601                 {
602                 goto err;
603                 }
604         p+=i;
605
606         /* If it is a hit, check that the cipher is in the list */
607         if ((s->hit) && (i > 0))
608                 {
609                 j=0;
610                 id=s->session->cipher->id;
611
612 #ifdef CIPHER_DEBUG
613                 printf("client sent %d ciphers\n",sk_num(ciphers));
614 #endif
615                 for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
616                         {
617                         c=sk_SSL_CIPHER_value(ciphers,i);
618 #ifdef CIPHER_DEBUG
619                         printf("client [%2d of %2d]:%s\n",
620                                 i,sk_num(ciphers),SSL_CIPHER_get_name(c));
621 #endif
622                         if (c->id == id)
623                                 {
624                                 j=1;
625                                 break;
626                                 }
627                         }
628                 if (j == 0)
629                         {
630                         if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
631                                 {
632                                 /* Very bad for multi-threading.... */
633                                 s->session->cipher=sk_SSL_CIPHER_value(ciphers,
634                                                                        0);
635                                 }
636                         else
637                                 {
638                                 /* we need to have the cipher in the cipher
639                                  * list if we are asked to reuse it */
640                                 al=SSL_AD_ILLEGAL_PARAMETER;
641                                 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
642                                 goto f_err;
643                                 }
644                         }
645                 }
646
647         /* compression */
648         i= *(p++);
649         q=p;
650         for (j=0; j<i; j++)
651                 {
652                 if (p[j] == 0) break;
653                 }
654
655         p+=i;
656         if (j >= i)
657                 {
658                 /* no compress */
659                 al=SSL_AD_DECODE_ERROR;
660                 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_COMPRESSION_SPECIFIED);
661                 goto f_err;
662                 }
663
664         /* Worst case, we will use the NULL compression, but if we have other
665          * options, we will now look for them.  We have i-1 compression
666          * algorithms from the client, starting at q. */
667         s->s3->tmp.new_compression=NULL;
668         if (s->ctx->comp_methods != NULL)
669                 { /* See if we have a match */
670                 int m,nn,o,v,done=0;
671
672                 nn=sk_SSL_COMP_num(s->ctx->comp_methods);
673                 for (m=0; m<nn; m++)
674                         {
675                         comp=sk_SSL_COMP_value(s->ctx->comp_methods,m);
676                         v=comp->id;
677                         for (o=0; o<i; o++)
678                                 {
679                                 if (v == q[o])
680                                         {
681                                         done=1;
682                                         break;
683                                         }
684                                 }
685                         if (done) break;
686                         }
687                 if (done)
688                         s->s3->tmp.new_compression=comp;
689                 else
690                         comp=NULL;
691                 }
692
693         /* TLS does not mind if there is extra stuff */
694         if (s->version == SSL3_VERSION)
695                 {
696                 if (p > (d+n))
697                         {
698                         /* wrong number of bytes,
699                          * there could be more to follow */
700                         al=SSL_AD_DECODE_ERROR;
701                         SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
702                         goto f_err;
703                         }
704                 }
705
706         /* Given s->session->ciphers and ssl_get_ciphers_by_id(s), we must
707          * pick a cipher */
708
709         if (!s->hit)
710                 {
711                 s->session->compress_meth=(comp == NULL)?0:comp->id;
712                 if (s->session->ciphers != NULL)
713                         sk_SSL_CIPHER_free(s->session->ciphers);
714                 s->session->ciphers=ciphers;
715                 if (ciphers == NULL)
716                         {
717                         al=SSL_AD_ILLEGAL_PARAMETER;
718                         SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_PASSED);
719                         goto f_err;
720                         }
721                 ciphers=NULL;
722                 c=ssl3_choose_cipher(s,s->session->ciphers,
723                                      ssl_get_ciphers_by_id(s));
724
725                 if (c == NULL)
726                         {
727                         al=SSL_AD_HANDSHAKE_FAILURE;
728                         SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_SHARED_CIPHER);
729                         goto f_err;
730                         }
731                 s->s3->tmp.new_cipher=c;
732                 }
733         else
734                 {
735                 /* Session-id reuse */
736 #ifdef REUSE_CIPHER_BUG
737                 STACK_OF(SSL_CIPHER) *sk;
738                 SSL_CIPHER *nc=NULL;
739                 SSL_CIPHER *ec=NULL;
740
741                 if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG)
742                         {
743                         sk=s->session->ciphers;
744                         for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
745                                 {
746                                 c=sk_SSL_CIPHER_value(sk,i);
747                                 if (c->algorithms & SSL_eNULL)
748                                         nc=c;
749                                 if (SSL_C_IS_EXPORT(c))
750                                         ec=c;
751                                 }
752                         if (nc != NULL)
753                                 s->s3->tmp.new_cipher=nc;
754                         else if (ec != NULL)
755                                 s->s3->tmp.new_cipher=ec;
756                         else
757                                 s->s3->tmp.new_cipher=s->session->cipher;
758                         }
759                 else
760 #endif
761                 s->s3->tmp.new_cipher=s->session->cipher;
762                 }
763         
764         /* we now have the following setup. 
765          * client_random
766          * cipher_list          - our prefered list of ciphers
767          * ciphers              - the clients prefered list of ciphers
768          * compression          - basically ignored right now
769          * ssl version is set   - sslv3
770          * s->session           - The ssl session has been setup.
771          * s->hit               - sesson reuse flag
772          * s->tmp.new_cipher    - the new cipher to use.
773          */
774
775         ret=1;
776         if (0)
777                 {
778 f_err:
779                 ssl3_send_alert(s,SSL3_AL_FATAL,al);
780                 }
781 err:
782         if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
783         return(ret);
784         }
785
786 static int ssl3_send_server_hello(SSL *s)
787         {
788         unsigned char *buf;
789         unsigned char *p,*d;
790         int i,sl;
791         unsigned long l,Time;
792
793         if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
794                 {
795                 buf=(unsigned char *)s->init_buf->data;
796                 p=s->s3->server_random;
797                 Time=time(NULL);                        /* Time */
798                 l2n(Time,p);
799                 RAND_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
800                 /* Do the message type and length last */
801                 d=p= &(buf[4]);
802
803                 *(p++)=s->version>>8;
804                 *(p++)=s->version&0xff;
805
806                 /* Random stuff */
807                 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
808                 p+=SSL3_RANDOM_SIZE;
809
810                 /* now in theory we have 3 options to sending back the
811                  * session id.  If it is a re-use, we send back the
812                  * old session-id, if it is a new session, we send
813                  * back the new session-id or we send back a 0 length
814                  * session-id if we want it to be single use.
815                  * Currently I will not implement the '0' length session-id
816                  * 12-Jan-98 - I'll now support the '0' length stuff.
817                  */
818                 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
819                         s->session->session_id_length=0;
820
821                 sl=s->session->session_id_length;
822                 *(p++)=sl;
823                 memcpy(p,s->session->session_id,sl);
824                 p+=sl;
825
826                 /* put the cipher */
827                 i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
828                 p+=i;
829
830                 /* put the compression method */
831                 if (s->s3->tmp.new_compression == NULL)
832                         *(p++)=0;
833                 else
834                         *(p++)=s->s3->tmp.new_compression->id;
835
836                 /* do the header */
837                 l=(p-d);
838                 d=buf;
839                 *(d++)=SSL3_MT_SERVER_HELLO;
840                 l2n3(l,d);
841
842                 s->state=SSL3_ST_CW_CLNT_HELLO_B;
843                 /* number of bytes to write */
844                 s->init_num=p-buf;
845                 s->init_off=0;
846                 }
847
848         /* SSL3_ST_CW_CLNT_HELLO_B */
849         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
850         }
851
852 static int ssl3_send_server_done(SSL *s)
853         {
854         unsigned char *p;
855
856         if (s->state == SSL3_ST_SW_SRVR_DONE_A)
857                 {
858                 p=(unsigned char *)s->init_buf->data;
859
860                 /* do the header */
861                 *(p++)=SSL3_MT_SERVER_DONE;
862                 *(p++)=0;
863                 *(p++)=0;
864                 *(p++)=0;
865
866                 s->state=SSL3_ST_SW_SRVR_DONE_B;
867                 /* number of bytes to write */
868                 s->init_num=4;
869                 s->init_off=0;
870                 }
871
872         /* SSL3_ST_CW_CLNT_HELLO_B */
873         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
874         }
875
876 static int ssl3_send_server_key_exchange(SSL *s)
877         {
878 #ifndef NO_RSA
879         unsigned char *q;
880         int j,num;
881         RSA *rsa;
882         unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
883 #endif
884 #ifndef NO_DH
885         DH *dh,*dhp;
886 #endif
887         EVP_PKEY *pkey;
888         unsigned char *p,*d;
889         int al,i;
890         unsigned long type;
891         int n;
892         CERT *cert;
893         BIGNUM *r[4];
894         int nr[4],kn;
895         BUF_MEM *buf;
896         EVP_MD_CTX md_ctx;
897
898         if (s->state == SSL3_ST_SW_KEY_EXCH_A)
899                 {
900                 type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
901                 cert=s->session->sess_cert;
902
903                 buf=s->init_buf;
904
905                 r[0]=r[1]=r[2]=r[3]=NULL;
906                 n=0;
907 #ifndef NO_RSA
908                 if (type & SSL_kRSA)
909                         {
910                         rsa=cert->rsa_tmp;
911                         if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
912                                 {
913                                 rsa=s->cert->rsa_tmp_cb(s,
914                                       SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
915                                       SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
916                                 CRYPTO_add(&rsa->references,1,CRYPTO_LOCK_RSA);
917                                 cert->rsa_tmp=rsa;
918                                 }
919                         if (rsa == NULL)
920                                 {
921                                 al=SSL_AD_HANDSHAKE_FAILURE;
922                                 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
923                                 goto f_err;
924                                 }
925                         r[0]=rsa->n;
926                         r[1]=rsa->e;
927                         s->s3->tmp.use_rsa_tmp=1;
928                         }
929                 else
930 #endif
931 #ifndef NO_DH
932                         if (type & SSL_kEDH)
933                         {
934                         dhp=cert->dh_tmp;
935                         if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
936                                 dhp=s->cert->dh_tmp_cb(s,
937                                       !SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
938                                       SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
939                         if (dhp == NULL)
940                                 {
941                                 al=SSL_AD_HANDSHAKE_FAILURE;
942                                 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
943                                 goto f_err;
944                                 }
945                         if ((dh=DHparams_dup(dhp)) == NULL)
946                                 {
947                                 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
948                                 goto err;
949                                 }
950
951                         s->s3->tmp.dh=dh;
952                         if ((dhp->pub_key == NULL ||
953                              dhp->priv_key == NULL ||
954                              (s->options & SSL_OP_SINGLE_DH_USE)))
955                                 {
956                                 if(!DH_generate_key(dh))
957                                     {
958                                     SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
959                                            ERR_R_DH_LIB);
960                                     goto err;
961                                     }
962                                 }
963                         else
964                                 {
965                                 dh->pub_key=BN_dup(dhp->pub_key);
966                                 dh->priv_key=BN_dup(dhp->priv_key);
967                                 if ((dh->pub_key == NULL) ||
968                                         (dh->priv_key == NULL))
969                                         {
970                                         SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
971                                         goto err;
972                                         }
973                                 }
974                         r[0]=dh->p;
975                         r[1]=dh->g;
976                         r[2]=dh->pub_key;
977                         }
978                 else 
979 #endif
980                         {
981                         al=SSL_AD_HANDSHAKE_FAILURE;
982                         SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
983                         goto f_err;
984                         }
985                 for (i=0; r[i] != NULL; i++)
986                         {
987                         nr[i]=BN_num_bytes(r[i]);
988                         n+=2+nr[i];
989                         }
990
991                 if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
992                         {
993                         if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
994                                 == NULL)
995                                 {
996                                 al=SSL_AD_DECODE_ERROR;
997                                 goto f_err;
998                                 }
999                         kn=EVP_PKEY_size(pkey);
1000                         }
1001                 else
1002                         {
1003                         pkey=NULL;
1004                         kn=0;
1005                         }
1006
1007                 if (!BUF_MEM_grow(buf,n+4+kn))
1008                         {
1009                         SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1010                         goto err;
1011                         }
1012                 d=(unsigned char *)s->init_buf->data;
1013                 p= &(d[4]);
1014
1015                 for (i=0; r[i] != NULL; i++)
1016                         {
1017                         s2n(nr[i],p);
1018                         BN_bn2bin(r[i],p);
1019                         p+=nr[i];
1020                         }
1021
1022                 /* not anonymous */
1023                 if (pkey != NULL)
1024                         {
1025                         /* n is the length of the params, they start at &(d[4])
1026                          * and p points to the space at the end. */
1027 #ifndef NO_RSA
1028                         if (pkey->type == EVP_PKEY_RSA)
1029                                 {
1030                                 q=md_buf;
1031                                 j=0;
1032                                 for (num=2; num > 0; num--)
1033                                         {
1034                                         EVP_DigestInit(&md_ctx,(num == 2)
1035                                                 ?s->ctx->md5:s->ctx->sha1);
1036                                         EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1037                                         EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1038                                         EVP_DigestUpdate(&md_ctx,&(d[4]),n);
1039                                         EVP_DigestFinal(&md_ctx,q,
1040                                                 (unsigned int *)&i);
1041                                         q+=i;
1042                                         j+=i;
1043                                         }
1044                                 i=RSA_private_encrypt(j,md_buf,&(p[2]),
1045                                         pkey->pkey.rsa,RSA_PKCS1_PADDING);
1046                                 if (i <= 0)
1047                                         {
1048                                         SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1049                                         goto err;
1050                                         }
1051                                 s2n(i,p);
1052                                 n+=i+2;
1053                                 }
1054                         else
1055 #endif
1056 #if !defined(NO_DSA)
1057                                 if (pkey->type == EVP_PKEY_DSA)
1058                                 {
1059                                 /* lets do DSS */
1060                                 EVP_SignInit(&md_ctx,EVP_dss1());
1061                                 EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1062                                 EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1063                                 EVP_SignUpdate(&md_ctx,&(d[4]),n);
1064                                 if (!EVP_SignFinal(&md_ctx,&(p[2]),
1065                                         (unsigned int *)&i,pkey))
1066                                         {
1067                                         SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1068                                         goto err;
1069                                         }
1070                                 s2n(i,p);
1071                                 n+=i+2;
1072                                 }
1073                         else
1074 #endif
1075                                 {
1076                                 /* Is this error check actually needed? */
1077                                 al=SSL_AD_HANDSHAKE_FAILURE;
1078                                 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1079                                 goto f_err;
1080                                 }
1081                         }
1082
1083                 *(d++)=SSL3_MT_SERVER_KEY_EXCHANGE;
1084                 l2n3(n,d);
1085
1086                 /* we should now have things packed up, so lets send
1087                  * it off */
1088                 s->init_num=n+4;
1089                 s->init_off=0;
1090                 }
1091
1092         /* SSL3_ST_SW_KEY_EXCH_B */
1093         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1094 f_err:
1095         ssl3_send_alert(s,SSL3_AL_FATAL,al);
1096 err:
1097         return(-1);
1098         }
1099
1100 static int ssl3_send_certificate_request(SSL *s)
1101         {
1102         unsigned char *p,*d;
1103         int i,j,nl,off,n;
1104         STACK_OF(X509_NAME) *sk=NULL;
1105         X509_NAME *name;
1106         BUF_MEM *buf;
1107
1108         if (s->state == SSL3_ST_SW_CERT_REQ_A)
1109                 {
1110                 buf=s->init_buf;
1111
1112                 d=p=(unsigned char *)&(buf->data[4]);
1113
1114                 /* get the list of acceptable cert types */
1115                 p++;
1116                 n=ssl3_get_req_cert_type(s,p);
1117                 d[0]=n;
1118                 p+=n;
1119                 n++;
1120
1121                 off=n;
1122                 p+=2;
1123                 n+=2;
1124
1125                 sk=SSL_get_client_CA_list(s);
1126                 nl=0;
1127                 if (sk != NULL)
1128                         {
1129                         for (i=0; i<sk_X509_NAME_num(sk); i++)
1130                                 {
1131                                 name=sk_X509_NAME_value(sk,i);
1132                                 j=i2d_X509_NAME(name,NULL);
1133                                 if (!BUF_MEM_grow(buf,4+n+j+2))
1134                                         {
1135                                         SSLerr(SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1136                                         goto err;
1137                                         }
1138                                 p=(unsigned char *)&(buf->data[4+n]);
1139                                 if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1140                                         {
1141                                         s2n(j,p);
1142                                         i2d_X509_NAME(name,&p);
1143                                         n+=2+j;
1144                                         nl+=2+j;
1145                                         }
1146                                 else
1147                                         {
1148                                         d=p;
1149                                         i2d_X509_NAME(name,&p);
1150                                         j-=2; s2n(j,d); j+=2;
1151                                         n+=j;
1152                                         nl+=j;
1153                                         }
1154                                 }
1155                         }
1156                 /* else no CA names */
1157                 p=(unsigned char *)&(buf->data[4+off]);
1158                 s2n(nl,p);
1159
1160                 d=(unsigned char *)buf->data;
1161                 *(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1162                 l2n3(n,d);
1163
1164                 /* we should now have things packed up, so lets send
1165                  * it off */
1166
1167                 s->init_num=n+4;
1168                 s->init_off=0;
1169                 }
1170
1171         /* SSL3_ST_SW_CERT_REQ_B */
1172         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1173 err:
1174         return(-1);
1175         }
1176
1177 static int ssl3_get_client_key_exchange(SSL *s)
1178         {
1179         int i,al,ok;
1180         long n;
1181         unsigned long l;
1182         unsigned char *p;
1183 #ifndef NO_RSA
1184         RSA *rsa=NULL;
1185         EVP_PKEY *pkey=NULL;
1186 #endif
1187 #ifndef NO_DH
1188         BIGNUM *pub=NULL;
1189         DH *dh_srvr;
1190 #endif
1191
1192         n=ssl3_get_message(s,
1193                 SSL3_ST_SR_KEY_EXCH_A,
1194                 SSL3_ST_SR_KEY_EXCH_B,
1195                 SSL3_MT_CLIENT_KEY_EXCHANGE,
1196                 400, /* ???? */
1197                 &ok);
1198
1199         if (!ok) return((int)n);
1200         p=(unsigned char *)s->init_buf->data;
1201
1202         l=s->s3->tmp.new_cipher->algorithms;
1203
1204 #ifndef NO_RSA
1205         if (l & SSL_kRSA)
1206                 {
1207                 /* FIX THIS UP EAY EAY EAY EAY */
1208                 if (s->s3->tmp.use_rsa_tmp)
1209                         {
1210                         if ((s->session->sess_cert != NULL) &&
1211                                 (s->session->sess_cert->rsa_tmp != NULL))
1212                                 rsa=s->session->sess_cert->rsa_tmp;
1213                         else if ((s->cert != NULL) &&
1214                                 (s->cert->rsa_tmp != NULL))
1215                                 rsa=s->cert->rsa_tmp;
1216                         /* Don't do a callback because rsa_tmp should
1217                          * be sent already */
1218                         if (rsa == NULL)
1219                                 {
1220                                 al=SSL_AD_HANDSHAKE_FAILURE;
1221                                 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_PKEY);
1222                                 goto f_err;
1223
1224                                 }
1225                         }
1226                 else
1227                         {
1228                         pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1229                         if (    (pkey == NULL) ||
1230                                 (pkey->type != EVP_PKEY_RSA) ||
1231                                 (pkey->pkey.rsa == NULL))
1232                                 {
1233                                 al=SSL_AD_HANDSHAKE_FAILURE;
1234                                 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_RSA_CERTIFICATE);
1235                                 goto f_err;
1236                                 }
1237                         rsa=pkey->pkey.rsa;
1238                         }
1239
1240                 /* TLS */
1241                 if (s->version > SSL3_VERSION)
1242                         {
1243                         n2s(p,i);
1244                         if (n != i+2)
1245                                 {
1246                                 if (!(s->options & SSL_OP_TLS_D5_BUG))
1247                                         {
1248                                         SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
1249                                         goto err;
1250                                         }
1251                                 else
1252                                         p-=2;
1253                                 }
1254                         else
1255                                 n=i;
1256                         }
1257
1258                 i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
1259
1260 #if 1
1261                 /* If a bad decrypt, use a random master key */
1262                 if ((i != SSL_MAX_MASTER_KEY_LENGTH) ||
1263                         ((p[0] != (s->client_version>>8)) ||
1264                          (p[1] != (s->client_version & 0xff))))
1265                         {
1266                         int bad=1;
1267
1268                         if ((i == SSL_MAX_MASTER_KEY_LENGTH) &&
1269                                 (p[0] == (s->version>>8)) &&
1270                                 (p[1] == 0))
1271                                 {
1272                                 if (s->options & SSL_OP_TLS_ROLLBACK_BUG)
1273                                         bad=0;
1274                                 }
1275                         if (bad)
1276                                 {
1277                                 p[0]=(s->version>>8);
1278                                 p[1]=(s->version & 0xff);
1279                                 RAND_bytes(&(p[2]),SSL_MAX_MASTER_KEY_LENGTH-2);
1280                                 i=SSL_MAX_MASTER_KEY_LENGTH;
1281                                 }
1282                         /* else, an SSLeay bug, ssl only server, tls client */
1283                         }
1284 #else
1285                 if (i != SSL_MAX_MASTER_KEY_LENGTH)
1286                         {
1287                         al=SSL_AD_DECODE_ERROR;
1288                         SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1289                         goto f_err;
1290                         }
1291
1292                 if ((p[0] != (s->version>>8)) || (p[1] != (s->version & 0xff)))
1293                         {
1294                         al=SSL_AD_DECODE_ERROR;
1295                         SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1296                         goto f_err;
1297                         }
1298 #endif
1299
1300                 s->session->master_key_length=
1301                         s->method->ssl3_enc->generate_master_secret(s,
1302                                 s->session->master_key,
1303                                 p,i);
1304                 memset(p,0,i);
1305                 }
1306         else
1307 #endif
1308 #ifndef NO_DH
1309                 if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1310                 {
1311                 n2s(p,i);
1312                 if (n != i+2)
1313                         {
1314                         if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG))
1315                                 {
1316                                 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1317                                 goto err;
1318                                 }
1319                         else
1320                                 {
1321                                 p-=2;
1322                                 i=(int)n;
1323                                 }
1324                         }
1325
1326                 if (n == 0L) /* the parameters are in the cert */
1327                         {
1328                         al=SSL_AD_HANDSHAKE_FAILURE;
1329                         SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_DECODE_DH_CERTS);
1330                         goto f_err;
1331                         }
1332                 else
1333                         {
1334                         if (s->s3->tmp.dh == NULL)
1335                                 {
1336                                 al=SSL_AD_HANDSHAKE_FAILURE;
1337                                 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1338                                 goto f_err;
1339                                 }
1340                         else
1341                                 dh_srvr=s->s3->tmp.dh;
1342                         }
1343
1344                 pub=BN_bin2bn(p,i,NULL);
1345                 if (pub == NULL)
1346                         {
1347                         SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BN_LIB);
1348                         goto err;
1349                         }
1350
1351                 i=DH_compute_key(p,pub,dh_srvr);
1352
1353                 if (i <= 0)
1354                         {
1355                         SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1356                         goto err;
1357                         }
1358
1359                 DH_free(s->s3->tmp.dh);
1360                 s->s3->tmp.dh=NULL;
1361
1362                 BN_clear_free(pub);
1363                 pub=NULL;
1364                 s->session->master_key_length=
1365                         s->method->ssl3_enc->generate_master_secret(s,
1366                                 s->session->master_key,p,i);
1367                 }
1368         else
1369 #endif
1370                 {
1371                 al=SSL_AD_HANDSHAKE_FAILURE;
1372                 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNKNOWN_CIPHER_TYPE);
1373                 goto f_err;
1374                 }
1375
1376         return(1);
1377 f_err:
1378         ssl3_send_alert(s,SSL3_AL_FATAL,al);
1379 #if !defined(NO_DH) || !defined(NO_RSA)
1380 err:
1381 #endif
1382         return(-1);
1383         }
1384
1385 static int ssl3_get_cert_verify(SSL *s)
1386         {
1387         EVP_PKEY *pkey=NULL;
1388         unsigned char *p;
1389         int al,ok,ret=0;
1390         long n;
1391         int type=0,i,j;
1392         X509 *peer;
1393
1394         n=ssl3_get_message(s,
1395                 SSL3_ST_SR_CERT_VRFY_A,
1396                 SSL3_ST_SR_CERT_VRFY_B,
1397                 -1,
1398                 512, /* 512? */
1399                 &ok);
1400
1401         if (!ok) return((int)n);
1402
1403         if (s->session->peer != NULL)
1404                 {
1405                 peer=s->session->peer;
1406                 pkey=X509_get_pubkey(peer);
1407                 type=X509_certificate_type(peer,pkey);
1408                 }
1409         else
1410                 {
1411                 peer=NULL;
1412                 pkey=NULL;
1413                 }
1414
1415         if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
1416                 {
1417                 s->s3->tmp.reuse_message=1;
1418                 if ((peer != NULL) && (type | EVP_PKT_SIGN))
1419                         {
1420                         al=SSL_AD_UNEXPECTED_MESSAGE;
1421                         SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
1422                         goto f_err;
1423                         }
1424                 ret=1;
1425                 goto end;
1426                 }
1427
1428         if (peer == NULL)
1429                 {
1430                 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_NO_CLIENT_CERT_RECEIVED);
1431                 al=SSL_AD_UNEXPECTED_MESSAGE;
1432                 goto f_err;
1433                 }
1434
1435         if (!(type & EVP_PKT_SIGN))
1436                 {
1437                 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
1438                 al=SSL_AD_ILLEGAL_PARAMETER;
1439                 goto f_err;
1440                 }
1441
1442         if (s->s3->change_cipher_spec)
1443                 {
1444                 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY);
1445                 al=SSL_AD_UNEXPECTED_MESSAGE;
1446                 goto f_err;
1447                 }
1448
1449         /* we now have a signature that we need to verify */
1450         p=(unsigned char *)s->init_buf->data;
1451         n2s(p,i);
1452         n-=2;
1453         if (i > n)
1454                 {
1455                 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_LENGTH_MISMATCH);
1456                 al=SSL_AD_DECODE_ERROR;
1457                 goto f_err;
1458                 }
1459
1460         j=EVP_PKEY_size(pkey);
1461         if ((i > j) || (n > j) || (n <= 0))
1462                 {
1463                 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_WRONG_SIGNATURE_SIZE);
1464                 al=SSL_AD_DECODE_ERROR;
1465                 goto f_err;
1466                 }
1467
1468 #ifndef NO_RSA 
1469         if (pkey->type == EVP_PKEY_RSA)
1470                 {
1471                 i=RSA_public_decrypt(i,p,p,pkey->pkey.rsa,RSA_PKCS1_PADDING);
1472                 if (i < 0)
1473                         {
1474                         al=SSL_AD_DECRYPT_ERROR;
1475                         SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
1476                         goto f_err;
1477                         }
1478                 if ((i != (MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH)) ||
1479                         memcmp(&(s->s3->tmp.finish_md[0]),p,
1480                                 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH))
1481                         {
1482                         al=SSL_AD_DECRYPT_ERROR;
1483                         SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
1484                         goto f_err;
1485                         }
1486                 }
1487         else
1488 #endif
1489 #ifndef NO_DSA
1490                 if (pkey->type == EVP_PKEY_DSA)
1491                 {
1492                 j=DSA_verify(pkey->save_type,
1493                         &(s->s3->tmp.finish_md[MD5_DIGEST_LENGTH]),
1494                         SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
1495                 if (j <= 0)
1496                         {
1497                         /* bad signature */
1498                         al=SSL_AD_DECRYPT_ERROR;
1499                         SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_DSA_SIGNATURE);
1500                         goto f_err;
1501                         }
1502                 }
1503         else
1504 #endif
1505                 {
1506                 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_INTERNAL_ERROR);
1507                 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
1508                 goto f_err;
1509                 }
1510
1511
1512         ret=1;
1513         if (0)
1514                 {
1515 f_err:
1516                 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1517                 }
1518 end:
1519         EVP_PKEY_free(pkey);
1520         return(ret);
1521         }
1522
1523 static int ssl3_get_client_certificate(SSL *s)
1524         {
1525         int i,ok,al,ret= -1;
1526         X509 *x=NULL;
1527         unsigned long l,nc,llen,n;
1528         unsigned char *p,*d,*q;
1529         STACK_OF(X509) *sk=NULL;
1530
1531         n=ssl3_get_message(s,
1532                 SSL3_ST_SR_CERT_A,
1533                 SSL3_ST_SR_CERT_B,
1534                 -1,
1535 #if defined(MSDOS) && !defined(WIN32)
1536                 1024*30, /* 30k max cert list :-) */
1537 #else
1538                 1024*100, /* 100k max cert list :-) */
1539 #endif
1540                 &ok);
1541
1542         if (!ok) return((int)n);
1543
1544         if      (s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
1545                 {
1546                 if (    (s->verify_mode & SSL_VERIFY_PEER) &&
1547                         (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1548                         {
1549                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1550                         al=SSL_AD_HANDSHAKE_FAILURE;
1551                         goto f_err;
1552                         }
1553                 /* If tls asked for a client cert we must return a 0 list */
1554                 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
1555                         {
1556                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
1557                         al=SSL_AD_UNEXPECTED_MESSAGE;
1558                         goto f_err;
1559                         }
1560                 s->s3->tmp.reuse_message=1;
1561                 return(1);
1562                 }
1563
1564         if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
1565                 {
1566                 al=SSL_AD_UNEXPECTED_MESSAGE;
1567                 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
1568                 goto f_err;
1569                 }
1570         d=p=(unsigned char *)s->init_buf->data;
1571
1572         if ((sk=sk_X509_new_null()) == NULL)
1573                 {
1574                 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1575                 goto err;
1576                 }
1577
1578         n2l3(p,llen);
1579         if (llen+3 != n)
1580                 {
1581                 al=SSL_AD_DECODE_ERROR;
1582                 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
1583                 goto f_err;
1584                 }
1585         for (nc=0; nc<llen; )
1586                 {
1587                 n2l3(p,l);
1588                 if ((l+nc+3) > llen)
1589                         {
1590                         al=SSL_AD_DECODE_ERROR;
1591                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1592                         goto f_err;
1593                         }
1594
1595                 q=p;
1596                 x=d2i_X509(NULL,&p,l);
1597                 if (x == NULL)
1598                         {
1599                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_ASN1_LIB);
1600                         goto err;
1601                         }
1602                 if (p != (q+l))
1603                         {
1604                         al=SSL_AD_DECODE_ERROR;
1605                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1606                         goto f_err;
1607                         }
1608                 if (!sk_X509_push(sk,x))
1609                         {
1610                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1611                         goto err;
1612                         }
1613                 x=NULL;
1614                 nc+=l+3;
1615                 }
1616
1617         if (sk_X509_num(sk) <= 0)
1618                 {
1619                 /* TLS does not mind 0 certs returned */
1620                 if (s->version == SSL3_VERSION)
1621                         {
1622                         al=SSL_AD_HANDSHAKE_FAILURE;
1623                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATES_RETURNED);
1624                         goto f_err;
1625                         }
1626                 /* Fail for TLS only if we required a certificate */
1627                 else if ((s->verify_mode & SSL_VERIFY_PEER) &&
1628                          (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1629                         {
1630                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1631                         al=SSL_AD_HANDSHAKE_FAILURE;
1632                         goto f_err;
1633                         }
1634                 }
1635         else
1636                 {
1637                 i=ssl_verify_cert_chain(s,sk);
1638                 if (!i)
1639                         {
1640                         al=ssl_verify_alarm_type(s->verify_result);
1641                         SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
1642                         goto f_err;
1643                         }
1644                 }
1645
1646         /* This should not be needed */
1647         if (s->session->peer != NULL)
1648                 X509_free(s->session->peer);
1649         s->session->peer=sk_X509_shift(sk);
1650
1651         s->session->sess_cert->cert_chain=sk;
1652
1653         sk=NULL;
1654
1655         ret=1;
1656         if (0)
1657                 {
1658 f_err:
1659                 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1660                 }
1661 err:
1662         if (x != NULL) X509_free(x);
1663         if (sk != NULL) sk_X509_pop_free(sk,X509_free);
1664         return(ret);
1665         }
1666
1667 int ssl3_send_server_certificate(SSL *s)
1668         {
1669         unsigned long l;
1670         X509 *x;
1671
1672         if (s->state == SSL3_ST_SW_CERT_A)
1673                 {
1674                 x=ssl_get_server_send_cert(s);
1675                 if (x == NULL)
1676                         {
1677                         SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,SSL_R_INTERNAL_ERROR);
1678                         return(0);
1679                         }
1680
1681                 l=ssl3_output_cert_chain(s,x);
1682                 s->state=SSL3_ST_SW_CERT_B;
1683                 s->init_num=(int)l;
1684                 s->init_off=0;
1685                 }
1686
1687         /* SSL3_ST_SW_CERT_B */
1688         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1689         }