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